function NegotiationUrlForm::validateForm

Same name and namespace in other branches
  1. 9 core/modules/language/src/Form/NegotiationUrlForm.php \Drupal\language\Form\NegotiationUrlForm::validateForm()
  2. 8.9.x core/modules/language/src/Form/NegotiationUrlForm.php \Drupal\language\Form\NegotiationUrlForm::validateForm()
  3. 11.x core/modules/language/src/Form/NegotiationUrlForm.php \Drupal\language\Form\NegotiationUrlForm::validateForm()

Overrides ConfigFormBase::validateForm

File

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

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 (str_contains($value, '/')) {
            // 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);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.