You are here

protected function BreadcrumbBuilder::applyBreadcrumb in Custom Breadcrumbs 1.x

Apply breadcrumb per settings.

Parameters

\Drupal\Core\Breadcrumb\Breadcrumb $breadcrumb: Breadcrumb object.

\Drupal\custom_breadcrumbs\Entity\CustomBreadcrumbs $customBreadcrumbs: Breadcrumb settings.

mixed $entity: Entity.

Throws

\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException

\Drupal\Component\Plugin\Exception\PluginNotFoundException

2 calls to BreadcrumbBuilder::applyBreadcrumb()
BreadcrumbBuilder::applyContentEntityBreadcrumb in src/BreadcrumbBuilder.php
Added breadcrumbs based content entity.
BreadcrumbBuilder::build in src/BreadcrumbBuilder.php
Builds the breadcrumb.

File

src/BreadcrumbBuilder.php, line 270

Class

BreadcrumbBuilder
Class BreadcrumbBuilder.

Namespace

Drupal\custom_breadcrumbs

Code

protected function applyBreadcrumb(Breadcrumb &$breadcrumb, CustomBreadcrumbs $customBreadcrumbs, $entity) {
  $paths = $customBreadcrumbs
    ->getMultiValues('breadcrumbPaths');
  $titles = $customBreadcrumbs
    ->getMultiValues('breadcrumbTitles');
  $extraContexts = $customBreadcrumbs
    ->getMultiValues('extraCacheContexts');
  $token_vars = [];
  if ($entity instanceof EntityInterface) {
    $token_vars = [
      CustomBreadcrumbsForm::getTokenEntity($entity
        ->getEntityTypeId()) => $entity,
    ];
  }
  foreach ($paths as $key => $path) {
    if (isset($titles[$key])) {
      $href = file_url_transform_relative($this->token
        ->replace($path, $token_vars, [
        'clear' => TRUE,
      ]));
      $link_title = $this->token
        ->replace($titles[$key], $token_vars, [
        'clear' => TRUE,
      ]);
      $link_title = Html::decodeEntities($link_title);

      // Skip empty href, for example when token is empty.
      if (empty($href) || empty($link_title)) {
        continue;
      }
      if ($href === '<nolink>') {
        $link = Link::createFromRoute($this
          ->prepareTitle($link_title), $href);
        $breadcrumb
          ->addLink($link);
      }
      else {
        if ($this
          ->checkHierarchyToken($href)) {
          $field_name = explode(':', $href)[1];
          $field_name = str_replace('>', '', $field_name);
          if ($entity instanceof EntityInterface) {
            if ($entity
              ->hasField($field_name)) {
              $term = $entity
                ->get($field_name)->entity;
              if ($term instanceof TermInterface) {
                $parents = $this
                  ->getAllParents($term
                  ->id());
                foreach (array_reverse($parents) as $parent) {
                  $link = $parent
                    ->toLink($this
                    ->prepareTitle($parent
                    ->label()));
                  $breadcrumb
                    ->addLink($link);
                  $breadcrumb
                    ->addCacheableDependency($parent);
                }
              }
            }
          }
          continue;
        }
        else {
          $url = Url::fromUserInput($href);
          $link = Link::fromTextAndUrl($this
            ->prepareTitle($link_title), $url);
          $breadcrumb
            ->addLink($link);
        }
      }
      $breadcrumb
        ->addCacheableDependency($entity);
      $breadcrumb
        ->addCacheableDependency($customBreadcrumbs);
    }
  }
  if (array_filter($extraContexts)) {
    $breadcrumb
      ->addCacheContexts($extraContexts);
  }
}