You are here

public function NegotiationUrlForm::validateForm in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/language/src/Form/NegotiationUrlForm.php \Drupal\language\Form\NegotiationUrlForm::validateForm()

Form validation handler.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Overrides FormBase::validateForm

File

core/modules/language/src/Form/NegotiationUrlForm.php, line 139

Class

NegotiationUrlForm
Configure the URL language negotiation method for this site.

Namespace

Drupal\language\Form

Code

public function validateForm(array &$form, FormStateInterface $form_state) {
  $languages = $this->languageManager
    ->getLanguages();

  // Count repeated values for uniqueness check.
  $count = array_count_values($form_state
    ->getValue('prefix'));
  $default_langcode = $this
    ->config('language.negotiation')
    ->get('selected_langcode');
  if ($default_langcode == LanguageInterface::LANGCODE_SITE_DEFAULT) {
    $default_langcode = $this->languageManager
      ->getDefaultLanguage()
      ->getId();
  }
  foreach ($languages as $langcode => $language) {
    $value = $form_state
      ->getValue([
      'prefix',
      $langcode,
    ]);
    if ($value === '') {
      if (!($default_langcode == $langcode) && $form_state
        ->getValue('language_negotiation_url_part') == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {

        // Throw a form error if the prefix is blank for a non-default language,
        // although it is required for selected negotiation type.
        $form_state
          ->setErrorByName("prefix][{$langcode}", $this
          ->t('The prefix may only be left blank for the <a href=":url">selected detection fallback language.</a>', [
          ':url' => Url::fromRoute('language.negotiation_selected')
            ->toString(),
        ]));
      }
    }
    elseif (strpos($value, '/') !== FALSE) {

      // Throw a form error if the string contains a slash,
      // which would not work.
      $form_state
        ->setErrorByName("prefix][{$langcode}", $this
        ->t('The prefix may not contain a slash.'));
    }
    elseif (isset($count[$value]) && $count[$value] > 1) {

      // Throw a form error if there are two languages with the same
      // domain/prefix.
      $form_state
        ->setErrorByName("prefix][{$langcode}", $this
        ->t('The prefix for %language, %value, is not unique.', [
        '%language' => $language
          ->getName(),
        '%value' => $value,
      ]));
    }
  }

  // Count repeated values for uniqueness check.
  $count = array_count_values($form_state
    ->getValue('domain'));
  foreach ($languages as $langcode => $language) {
    $value = $form_state
      ->getValue([
      'domain',
      $langcode,
    ]);
    if ($value === '') {
      if ($form_state
        ->getValue('language_negotiation_url_part') == LanguageNegotiationUrl::CONFIG_DOMAIN) {

        // Throw a form error if the domain is blank for a non-default language,
        // although it is required for selected negotiation type.
        $form_state
          ->setErrorByName("domain][{$langcode}", $this
          ->t('The domain may not be left blank for %language.', [
          '%language' => $language
            ->getName(),
        ]));
      }
    }
    elseif (isset($count[$value]) && $count[$value] > 1) {

      // Throw a form error if there are two languages with the same
      // domain/domain.
      $form_state
        ->setErrorByName("domain][{$langcode}", $this
        ->t('The domain for %language, %value, is not unique.', [
        '%language' => $language
          ->getName(),
        '%value' => $value,
      ]));
    }
  }

  // Domain names should not contain protocol and/or ports.
  foreach ($languages as $langcode => $language) {
    $value = $form_state
      ->getValue([
      'domain',
      $langcode,
    ]);
    if (!empty($value)) {

      // Ensure we have exactly one protocol when checking the hostname.
      $host = 'http://' . str_replace([
        'http://',
        'https://',
      ], '', $value);
      if (parse_url($host, PHP_URL_HOST) != $value) {
        $form_state
          ->setErrorByName("domain][{$langcode}", $this
          ->t('The domain for %language may only contain the domain name, not a trailing slash, protocol and/or port.', [
          '%language' => $language
            ->getName(),
        ]));
      }
    }
  }
  parent::validateForm($form, $form_state);
}