web-dev-qa-db-fra.com

Pré-processus Breadcrumb à partir du module

J'utilise actuellement le hook preprocess_breadcrumb dans mon fichier .theme pour personnaliser la sortie de mon fil d'Ariane comme suit:

function mytheme_preprocess_breadcrumb(&$variables){
    $node = \Drupal::routeMatch()->getParameter('node');
    $current_path = \Drupal::service('path.current')->getPath();
    $result = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);
    $crumbs = explode("/", $result);
    if($node){
        $variables['current_title'] = $node->getTitle();
        $variables['crumbs'] = $crumbs;
    }
}

J'utilise ensuite breadcrumb.html.twig pour utiliser ces nouvelles variables comme ça

    <nav role="navigation" aria-labelledby="system-breadcrumb">
    <h2 id="system-breadcrumb" class="visually-hidden">{{ 'You are here'|t }}</h2>
    <ul class="breadcrumbs">
        {% for crumb in crumbs %} 
            {% if loop.first %}
        <li><a href="./">Home</a></li>
        {% elseif loop.last %}
        <li class="current"><a href="#">{{ current_title }}</a></li> 
        {% elseif crumb == 'node' %}
        {% else %}
        <li> <a href="../{{ crumb }}">{{ crumb }}</a></li>
        {% endif %}
        {% endfor %}
    </ul>
</nav>
{% endif %}

Cependant, je l'aimerais plus si tout cela était encapsulé dans un module. Dans le fichier mymodule.module, j'ai

function mymodule_preprocess_breadcrumb(&$variables){
$node = \Drupal::routeMatch()->getParameter('node');
$current_path = \Drupal::service('path.current')->getPath();
$result = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);
$crumbs = explode("/", $result);
if($node){
    $variables['current_title'] = $node->getTitle();
    $variables['crumbs'] = $crumbs;
}

}

Mais cette fonction ne se déclenche jamais. Existe-t-il un moyen d'utiliser le hook preprocess_breadcrumb à partir d'un module?

4
Matt

Les crochets de prétraitement fonctionnent dans les thèmes et les modules. Peu importe où vous le mettez, la seule différence est que les modules ont une priorité plus élevée.

Ce que vous devez faire, c'est travailler sur la mise en cache. En raison des variables que vous insérez, vous avez besoin d'un contexte de cache sur url.path,

$variables['#cache']['contexts'][] = 'url.path';

Cela ne fait aucune différence pour la première exécution après avoir effacé le cache, mais garantit que le raccordement est exécuté pour chaque nouveau chemin.

3
4k4