domainStorage = $domain_storage; $this->renderer = $renderer; $this->validator = $validator; $this->entityTypeManager = $entity_type_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager')->getStorage('domain'), $container->get('renderer'), $container->get('domain.validator'), $container->get('entity_type.manager') ); } /** * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { $form = parent::form($form, $form_state); /** @var \Drupal\domain\Entity\Domain $domain */ $domain = $this->entity; // Create defaults if this is the first domain. $count_existing = $this->domainStorage->getQuery()->count()->execute(); if (!$count_existing) { $domain->addProperty('hostname', $this->domainStorage->createHostname()); $domain->addProperty('name', $this->config('system.site')->get('name')); } $form['domain_id'] = [ '#type' => 'value', '#value' => $domain->getDomainId(), ]; $form['hostname'] = [ '#type' => 'textfield', '#title' => $this->t('Hostname'), '#size' => 40, '#maxlength' => 80, '#default_value' => $domain->getCanonical(), '#description' => $this->t('The canonical hostname, using the full subdomain.example.com format. Leave off the http:// and the trailing slash and do not include any paths.
If this domain uses a custom http(s) port, you should specify it here, e.g.: subdomain.example.com:1234
The hostname may contain only lowercase alphanumeric characters, dots, dashes, and a colon (if using alternative ports).'), ]; $form['id'] = [ '#type' => 'machine_name', '#default_value' => !empty($domain->id()) ? $domain->id() : '', '#disabled' => !empty($domain->id()), '#machine_name' => [ 'source' => ['hostname'], 'exists' => [$this->domainStorage, 'load'], ], ]; $form['name'] = [ '#type' => 'textfield', '#title' => $this->t('Name'), '#size' => 40, '#maxlength' => 80, '#default_value' => $domain->label(), '#description' => $this->t('The human-readable name is shown in domain lists and may be used as the title tag.'), ]; // Do not use the :// suffix when storing data. $add_suffix = FALSE; $form['scheme'] = [ '#type' => 'radios', '#title' => $this->t('Domain URL scheme'), '#options' => [ 'http' => 'http://', 'https' => 'https://', 'variable' => 'Variable', ], '#default_value' => $domain->getRawScheme(), '#description' => $this->t('This URL scheme will be used when writing links and redirects to this domain and its resources. Selecting Variable will inherit the current scheme of the web request.'), ]; $form['status'] = [ '#type' => 'radios', '#title' => $this->t('Domain status'), '#options' => [1 => $this->t('Active'), 0 => $this->t('Inactive')], '#default_value' => (int) $domain->status(), '#description' => $this->t('"Inactive" domains are only accessible to user roles with that assigned permission.'), ]; $form['weight'] = [ '#type' => 'weight', '#title' => $this->t('Weight'), '#delta' => $count_existing + 1, '#default_value' => $domain->getWeight(), '#description' => $this->t('The sort order for this record. Lower values display first.'), ]; $form['is_default'] = [ '#type' => 'checkbox', '#title' => $this->t('Default domain'), '#default_value' => $domain->isDefault(), '#description' => $this->t('If a URL request fails to match a domain record, the settings for this domain will be used. Only one domain can be default.'), ]; $form['validate_url'] = [ '#type' => 'checkbox', '#title' => $this->t('Test server response'), '#default_value' => TRUE, '#description' => $this->t('Validate that url of the host is accessible to Drupal before saving.'), ]; $required = $this->validator->getRequiredFields(); foreach ($form as $key => $element) { if (in_array($key, $required)) { $form[$key]['#required'] = TRUE; } } return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { /** @var \Drupal\domain\DomainInterface $entity */ $entity = $this->entity; $hostname = $entity->getHostname(); $errors = $this->validator->validate($hostname); if (!empty($errors)) { // Render errors to display as message. $message = [ '#theme' => 'item_list', '#items' => $errors, ]; $message = $this->renderer->renderPlain($message); $form_state->setErrorByName('hostname', $message); } // Validate if the same hostname exists. // Do not use domain loader because it may change hostname. $existing = $this->domainStorage->loadByProperties(['hostname' => $hostname]); $existing = reset($existing); // If we have already registered a hostname, make sure we don't create a // duplicate. // We cannot check id() here, as the machine name is editable. if ($existing && $existing->getDomainId() != $entity->getDomainId()) { $form_state->setErrorByName('hostname', $this->t('The hostname is already registered.')); } // Check the domain response. First, clear the path value. $entity->setPath(); // Check the response. $response = $this->validator->checkResponse($entity); // If validate_url is set, then we must receive a 200 response. if ($entity->validate_url && $response != 200) { if (empty($response)) { $response = 500; } $form_state->setErrorByName('hostname', $this->t('The server request to @url returned a @response response. To proceed, disable the Test server response in the form.', ['@url' => $entity->getPath(), '@response' => $response])); } } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $status = parent::save($form, $form_state); if ($status == SAVED_NEW) { \Drupal::messenger()->addMessage($this->t('Domain record created.')); } else { \Drupal::messenger()->addMessage($this->t('Domain record updated.')); } $form_state->setRedirect('domain.admin'); } }