public function NegotiationUrlForm::validateForm in Drupal 9
Same name and namespace in other branches
- 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\FormCode
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);
}