LinkGenerator::generate

public LinkGenerator::generate($text, Url $url)

For anonymous users, the "active" class will be calculated on the server, because most sites serve each anonymous user the same cached page anyway. For authenticated users, the "active" class will be calculated on the client (through JavaScript), only data- attributes are added to links to prevent breaking the render cache. The JavaScript is added in system_page_attachments().

Overrides LinkGeneratorInterface::generate

See also

system_page_attachments()

File

core/lib/Drupal/Core/Utility/LinkGenerator.php, line 78

Class

LinkGenerator
Provides a class which generates a link with route names and parameters.

Namespace

Drupal\Core\Utility

Code

public function generate($text, Url $url) {
  // Performance: avoid Url::toString() needing to retrieve the URL generator
  // service from the container.
  $url->setUrlGenerator($this->urlGenerator);

  if (is_array($text)) {
    $text = $this->renderer->render($text);
  }

  // Start building a structured representation of our link to be altered later.
  $variables = array(
    'text' => $text,
    'url' => $url,
    'options' => $url->getOptions(),
  );

  // Merge in default options.
  $variables['options'] += array(
    'attributes' => array(),
    'query' => array(),
    'language' => NULL,
    'set_active_class' => FALSE,
    'absolute' => FALSE,
  );

  // Add a hreflang attribute if we know the language of this link's url and
  // hreflang has not already been set.
  if (!empty($variables['options']['language']) && !isset($variables['options']['attributes']['hreflang'])) {
    $variables['options']['attributes']['hreflang'] = $variables['options']['language']->getId();
  }

  // Ensure that query values are strings.
  array_walk($variables['options']['query'], function(&$value) {
    if ($value instanceof MarkupInterface) {
      $value = (string) $value;
    }
  });

  // Set the "active" class if the 'set_active_class' option is not empty.
  if (!empty($variables['options']['set_active_class']) && !$url->isExternal()) {
    // Add a "data-drupal-link-query" attribute to let the
    // drupal.active-link library know the query in a standardized manner.
    if (!empty($variables['options']['query'])) {
      $query = $variables['options']['query'];
      ksort($query);
      $variables['options']['attributes']['data-drupal-link-query'] = Json::encode($query);
    }

    // Add a "data-drupal-link-system-path" attribute to let the
    // drupal.active-link library know the path in a standardized manner.
    if ($url->isRouted() && !isset($variables['options']['attributes']['data-drupal-link-system-path'])) {
      // @todo System path is deprecated - use the route name and parameters.
      $system_path = $url->getInternalPath();
      // Special case for the front page.
      $variables['options']['attributes']['data-drupal-link-system-path'] = $system_path == '' ? '<front>' : $system_path;
    }
  }

  // Remove all HTML and PHP tags from a tooltip, calling expensive strip_tags()
  // only when a quick strpos() gives suspicion tags are present.
  if (isset($variables['options']['attributes']['title']) && strpos($variables['options']['attributes']['title'], '<') !== FALSE) {
    $variables['options']['attributes']['title'] = strip_tags($variables['options']['attributes']['title']);
  }

  // Allow other modules to modify the structure of the link.
  $this->moduleHandler->alter('link', $variables);
  $url = $variables['url'];

  // Move attributes out of options since generateFromRoute() doesn't need
  // them. Make sure the "href" comes first for testing purposes.
  $attributes = array('href' => '') + $variables['options']['attributes'];
  unset($variables['options']['attributes']);
  $url->setOptions($variables['options']);

  // External URLs can not have cacheable metadata.
  if ($url->isExternal()) {
    $generated_link = new GeneratedLink();
    $attributes['href'] = $url->toString(FALSE);
  }
  elseif ($url->isRouted() && $url->getRouteName() === '<nolink>') {
    $generated_link = new GeneratedNoLink();
    unset($attributes['href']);
  }
  else {
    $generated_url = $url->toString(TRUE);
    $generated_link = GeneratedLink::createFromObject($generated_url);
    // The result of the URL generator is a plain-text URL to use as the href
    // attribute, and it is escaped by \Drupal\Core\Template\Attribute.
    $attributes['href'] = $generated_url->getGeneratedUrl();
  }

  if (!($variables['text'] instanceof MarkupInterface)) {
    $variables['text'] = Html::escape($variables['text']);
  }
  $attributes = new Attribute($attributes);
  // This is safe because Attribute does escaping and $variables['text'] is
  // either rendered or escaped.
  return $generated_link->setGeneratedLink('<' . $generated_link::TAG . $attributes . '>' . $variables['text'] . '</' . $generated_link::TAG . '>');
}
doc_Drupal
2016-10-29 09:23:17
Comments
Leave a Comment

Please login to continue.