web-dev-qa-db-fra.com

Comment ajouter le titre actuel au fil d'Ariane sans fonction de prétraitement?

J'essaie de placer le titre dans mon chemin d'Ariane sans utiliser de fonction de prétraitement. Drupal 8 Ajouter le titre actuel au fil d'Ariane montre comment le faire avec la fonction de prétraitement qui n'est pas ce que j'essaie de faire.

Je veux que ma sortie soit comme ceci:

enter image description here

Voici ce qui a essayé et n'a pas encore fonctionné.

breadcrumb.html.twig

{#
/**
 * @file
 * Theme override for a breadcrumb trail.
 *
 * Available variables:
 * - breadcrumb: Breadcrumb trail items.
 */
#}
{% if breadcrumb %}
    <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
        <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
        <ol>{{ 'You are here:'|t }}
            {% for item in breadcrumb %}
                <li>
                    {% if item.url %}

                        <a href="{{ item.url }}">{{ item.text }}</a>
                    {% else %}
                        {{ item.text }}
                    {% endif %}
                </li>
                {{ '>'|t }} {{title}}
            {% endfor %}
        </ol>
    </nav>
{% endif %}

Et voici ce que je reçois:

enter image description here

Pour une raison quelconque, le titre n'est pas affiché lorsque j'utilise {{ title }}.

Qu'est-ce que je fais mal?

Pourquoi mon titre n'apparaît-il pas sur mon titre de fil d'Ariane?

5
itsdarrylnorris

Peu importe ce dont j'ai besoin pour utiliser la fonction de prétraitement car {{title}} ne faisait pas partie du breadcrumb.html.twig . J'ai fini par faire cela pour atteindre ce résultat:

mytheme.theme

<?php

function mytheme_preprocess_breadcrumb(&$variables){

        if(($node = \Drupal::routeMatch()->getParameter('node')) && $variables['breadcrumb']){
    // Adding the a divider of between home an the title of the page.
            $variables['breadcrumb'][] = array(
                'text' => '>'
            );
    // Adding the title of the page in the breadcrumb
            $variables['breadcrumb'][] = array(
                'text' => $node->getTitle(),
                'url' => $node->URL()
            );

        }
    }

breadcrumb.html.twig

{#
/**
 * @file
 * Theme override for a breadcrumb trail.
 *
 * Available variables:
 * - breadcrumb: Breadcrumb trail items.
 */
#}
{% if breadcrumb %}
    <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
        <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
        {{ 'You are here:'|t }}
        <div class="breadcrumb">
            {% for item in breadcrumb %}
                <span>
                    {% if item.url %}
                            <a href="{{ item.url }}">{{ item.text }}</a>
                    {% else %}
                        {{ item.text }}
                    {% endif %}
                </span>
            {% endfor %}
        </div>
    </nav>
{% endif %}

Pour plus d'informations sur ma résolution de ce problème, vous pouvez visiter - Light Skeleton - Breadcrumb D8 Port

2
itsdarrylnorris

Il existe également un crochet supplémentaire pour le fil d'Ariane, où vous pouvez les modifier d'une manière non spécifique au thème, au cas où le fil d'Ariane serait également utilisé ailleurs.

Je l'ai implémenté dans un projet:

/**
 * Implements hook_system_breadcrumb_alter().
 */
function yourmodule_system_breadcrumb_alter(array &$breadcrumb, RouteMatchInterface $route_match, array $context) {
  // Append the current page title to the breadcrumb for non-admin routes.
  if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {

    $title = \Drupal::service('title_resolver')
      ->getTitle($request, $route_match->getRouteObject());
    if (!empty($title)) {
      breadcrumb->addLink(Link::createFromRoute($title, '<none>'));
    }
  }
}

EDIT pour Drupal 8.2.x

J'ajoute beaucoup d'erreurs avec ce code, qui je crois est la meilleure approche pour modifier le fil d'Ariane a vu sur API Drupal . Voici donc le code pour Drupal 8.2.x

/**
 * Implements hook_system_breadcrumb_alter().
 */
function YOURMODULE_system_breadcrumb_alter(\Drupal\Core\Breadcrumb\Breadcrumb &$breadcrumb, \Drupal\Core\Routing\RouteMatchInterface $route_match, array $context) {
  // Append the current page title to the breadcrumb for non-admin routes.
  if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {

    $title = \Drupal::service('title_resolver')->getTitle(\Drupal::request(), $route_match->getRouteObject());
    if (!empty($title)) {
      $breadcrumb->addLink(\Drupal\Core\Link::createFromRoute($title, '<none>'));
    }
  }
}
6
Berdir

Par défaut, la variable {{title}} ne sera pas disponible dans breadcrumb.html.twig. Vous devez utiliser HOOK_preprocess_breadcrumb dans votre fichier .theme.

P.S: En D8, c'est une mauvaise pratique que si vous essayez d'afficher les données de la fonction de préprocesseur. Il n'y a rien de mal à ce que vous essayiez d'ajouter une variable supplémentaire dans le préprocesseur. Voici plus de précisions https://www.drupal.org/node/1920746

Dans le fichier YOUYTHEME.theme

function YOURTHEME_preprocess_breadcrumb(&$variables) {
  $request = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  $page_title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

  //this variable will avaliable in twig file. 
  $variables['breadcrumb'][] = array(
    'text' => $page_title
  );
}
4
adal

Il existe un nouveau module appelé Current Page Crumb qui peut vous aider.

La page courante Crumb étend le Drupal 8 fils d'Ariane du système principal pour ajouter le titre de la page actuelle en tant que fil d'Ariane uniquement. Les chemins d'administration ne sont pas modifiés. Le module n'a pas de configuration.

Et l'auteur a fait un article de blog parlant de la solution.

1
Adrian Cid Almaguer

Certaines des solutions suggérées peuvent rencontrer des problèmes avec le cache car la logique se produit dans le pré-processus (YOURTHEME_preprocess_breadcrumb(&$variables)). Je recommanderais d'utiliser certains modules contrib ou de mettre en œuvre leurs solutions:

Fil d'Ariane facile : remplace le fil d'Ariane principal par du fil d'Ariane configurable qui respecte les meilleures pratiques de Breadcrumb.

miette de page actuelle : étend le Drupal 8 fils d'Ariane du système principal pour ajouter le titre de la page actuelle en tant que fil d'Ariane uniquement en texte.

1
Cristina

La fonction de prétraitement pour le fil d'Ariane dans le noyau est:

function template_preprocess_breadcrumb(&$variables) {
  $variables['breadcrumb'] = array();
  /** @var \Drupal\Core\Link $link */
  foreach ($variables['links'] as $key => $link) {
    $variables['breadcrumb'][$key] = array('text' => $link->getText(), 'url' => $link->getUrl()->toString());
  }
}

Il ne fournit que le fil d'Ariane, rien d'autre. Donc, si vous souhaitez utiliser d'autres variables, vous devez les placer dans le tableau de variables de votre propre fonction de prétraitement.

1
4k4