Skip to content
Snippets Groups Projects
Unverified Commit 84a67e9f authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #1088112 by Liam Morland, mbovan, Krzysztof Domański, JeroenT,...

Issue #1088112 by Liam Morland, mbovan, Krzysztof Domański, JeroenT, ankithashetty, YurkinPark, jungle, raman.b, Lukas von Blarer, mrshowerman, alexpott, Berdir, darvanen, ao2: Introduce a token to get site's base URL
parent 47f50b9d
No related branches found
No related tags found
27 merge requests!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3600Issue #3344629: Passing null to parameter #1 ($haystack) of type string is deprecated,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
......@@ -37,9 +37,20 @@ function system_token_info() {
'name' => t("Email"),
'description' => t("The administrative email address for the site."),
];
$site['base-url'] = [
'name' => t("Base URL"),
'description' => t("The base URL of the site, currently: @base_url",
[
'@base_url' => \Drupal::service('router.request_context')->getCompleteBaseUrl(),
]),
];
$site['base-path'] = [
'name' => t("Base path"),
'description' => t("The base path of the site, currently: @base_path", ['@base_path' => \Drupal::request()->getBasePath()]),
];
$site['url'] = [
'name' => t("URL"),
'description' => t("The URL of the site's front page."),
'description' => t("The URL of the site's front page with the language prefix, if it exists."),
];
$site['url-brief'] = [
'name' => t("URL (brief)"),
......@@ -132,6 +143,16 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe
$replacements[$original] = $config->get('mail');
break;
case 'base-url':
$bubbleable_metadata->addCacheContexts(['url.site']);
$replacements[$original] = \Drupal::service('router.request_context')->getCompleteBaseUrl();
break;
case 'base-path':
$bubbleable_metadata->addCacheContexts(['url.site']);
$replacements[$original] = \Drupal::request()->getBasePath();
break;
case 'url':
/** @var \Drupal\Core\GeneratedUrl $result */
$result = Url::fromRoute('<front>', [], $url_options)->toString(TRUE);
......
......@@ -7,6 +7,7 @@
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Render\BubbleableMetadata;
use Symfony\Component\HttpFoundation\Request;
/**
* Generates text using placeholders for dummy content to check token
......@@ -104,6 +105,7 @@ public function testSystemSiteTokenReplacement() {
$tests['[site:mail]'] = $config->get('mail');
$tests['[site:url]'] = Url::fromRoute('<front>', [], $url_options)->toString();
$tests['[site:url-brief]'] = preg_replace(['!^https?://!', '!/$!'], '', Url::fromRoute('<front>', [], $url_options)->toString());
$tests['[site:base-url]'] = 'http://localhost';
$tests['[site:login-url]'] = Url::fromRoute('user.page', [], $url_options)->toString();
$base_bubbleable_metadata = new BubbleableMetadata();
......@@ -113,6 +115,7 @@ public function testSystemSiteTokenReplacement() {
$metadata_tests['[site:slogan]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.site'));
$metadata_tests['[site:mail]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.site'));
$bubbleable_metadata = clone $base_bubbleable_metadata;
$metadata_tests['[site:base-url]'] = $bubbleable_metadata->addCacheContexts(['url.site']);
$metadata_tests['[site:url]'] = $bubbleable_metadata->addCacheContexts(['url.site']);
$metadata_tests['[site:url-brief]'] = $bubbleable_metadata;
$metadata_tests['[site:login-url]'] = $bubbleable_metadata;
......@@ -126,6 +129,25 @@ public function testSystemSiteTokenReplacement() {
$this->assertEquals($expected, $output, new FormattableMarkup('System site information token %token replaced.', ['%token' => $input]));
$this->assertEquals($metadata_tests[$input], $bubbleable_metadata);
}
// Test [site:base-url] and [site:base-path] token with a subdirectory.
$request_stack = \Drupal::requestStack();
// Test request with subdirectory on homepage.
$server = [
'SCRIPT_NAME' => '/subdir/index.php',
'SCRIPT_FILENAME' => $this->root . '/subdir/index.php',
'SERVER_NAME' => 'http://localhost',
];
$request = Request::create('/subdir/', 'GET', [], [], [], $server);
$request->server->add($server);
$request_stack->push($request);
$bubbleable_metadata = new BubbleableMetadata();
$this->container->get('router.request_context')->setCompleteBaseUrl('http://localhost/subdir');
$this->assertEquals('http://localhost/subdir', $this->tokenService->replace('[site:base-url]', [], ['langcode' => $this->interfaceLanguage->getId()], $bubbleable_metadata));
$this->assertEquals((new BubbleableMetadata())->addCacheContexts(['url.site']), $bubbleable_metadata);
$bubbleable_metadata = new BubbleableMetadata();
$this->assertEquals('/subdir', $this->tokenService->replace('[site:base-path]', [], ['langcode' => $this->interfaceLanguage->getId()], $bubbleable_metadata));
$this->assertEquals((new BubbleableMetadata())->addCacheContexts(['url.site']), $bubbleable_metadata);
}
/**
......
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