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
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -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);
+22 −0
Original line number Diff line number Diff line
@@ -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);
  }

  /**