Skip to content
Snippets Groups Projects
Commit 9bd7daa8 authored by catch's avatar catch
Browse files

Issue #1272840 by attiks, pp: Add upgrade path for language domains and validation.

parent df643e13
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
......@@ -330,6 +330,19 @@ function language_negotiation_configure_url_form_validate($form, &$form_state) {
form_error($form['domain'][$langcode], t('The domain for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value)));
}
}
// Domain names should not contain protocol and/or ports.
foreach ($languages as $langcode => $name) {
$value = $form_state['values']['domain'][$langcode];
if (!empty($value)) {
// Ensure we have a protocol but only one protocol in the setting for
// parse_url() checking against the hostname.
$host = 'http://' . str_replace(array('http://', 'https://'), '', $value);
if (parse_url($host, PHP_URL_HOST) != $value) {
form_error($form['domain'][$langcode], t('The domain for %language may only contain the domain name, not a protocol and/or port.', array( '%language' => $name)));
}
}
}
}
/**
......
......@@ -206,6 +206,38 @@ function locale_schema() {
return $schema;
}
/**
* Converts language domains to new format.
*/
function locale_update_8001() {
$message = '';
$domains = locale_language_negotiation_url_domains();
// $used_domains keeps track of the domain names in use.
$used_domains = array();
foreach ($domains as $langcode => $domain) {
// Domain names can not contain protocol and/or ports.
if (!empty($domain)) {
$host = 'http://' . str_replace(array('http://', 'https://'), '', $domain);
if (parse_url($host, PHP_URL_HOST) != $domain) {
$domains[$langcode] = parse_url($host, PHP_URL_HOST);
}
if (array_key_exists($domain, $used_domains)) {
if (empty($message)) {
$message = 'Some languages are using the same domain name, you should change these domain names at ' . l('URL language detection configuration', 'admin/config/regional/language/configure/url' . '.');
}
}
else {
$used_domains[$domain] = $domain;
}
}
}
locale_language_negotiation_url_domains_save($domains);
if (!empty($message)) {
return $message;
}
}
/**
* @addtogroup updates-7.x-to-8.x
* @{
......
......@@ -2278,8 +2278,8 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
$this->assertResponse(404, "Unknown language path prefix should return 404");
// Setup for domain negotiation, first configure the language to have domain
// URL. We use https and a port to make sure that only the domain name is used.
$edit = array("domain[$langcode]" => "https://$language_domain:99");
// URL.
$edit = array("domain[$langcode]" => $language_domain);
$this->drupalPost("admin/config/regional/language/detection/url", $edit, t('Save configuration'));
// Set the site to use domain language negotiation.
......
......@@ -78,4 +78,18 @@ class LanguageUpgradePathTestCase extends UpgradePathTestCase {
$this->drupalGet('node/add/page');
$this->assertNoFieldByName('langcode');
}
/**
* Tests language domain upgrade path.
*/
public function testLanguageUrlUpgrade() {
$language_domain = 'ca.example.com';
db_update('languages')->fields(array('domain' => 'http://' . $language_domain . ':8888'))->condition('language', 'ca')->execute();
variable_set('locale_language_negotiation_url_part', 1);
$this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
$domains = locale_language_negotiation_url_domains();
$this->assertTrue($domains['ca'] == $language_domain, t('Language domain for Catalan properly upgraded.'));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment