web-dev-qa-db-fra.com

Comment faire un fil d'Ariane de taxonomie personnalisée

J'utilise Drupal 8.3.0-beta1 et j'ai besoin d'écrire un module personnalisé pour personnaliser le fil d'Ariane dans certains cas. L'un de ces cas consiste à personnaliser le fil d'Ariane dans le chemin taxonomie/terme /% mais avec mon code actuel il y a un problème:

Lorsque je visite taxonomie/terme /% le rappel "applique" de mon implémentation personnalisée de BreadcrumbBuilderInterface ne s'exécute pas. Cependant, il est appelé taxonomie/terme /%/modifier . C'est peut-être la raison pour laquelle le générateur de fil d'Ariane de base ne renvoie que " Accueil/" dans ce cas. Pensez-vous que ce soit un bug de base ou que j'ai fait quelque chose de mal?

Remarquez que j'ai une autre implémentation de BreadcrumbBuilderInterface pour les nœuds qui fonctionne bien. Voici mon code:

custom_breadcrumb.info.yml

name: 'Custom breadcrumbs'
description: 'Custom breadcrumbs implementation'
package: 'Custom'
# core: 8.x
type: module

version: '8.x-1.0'
core: '8.x'
project: 'custom_breadcrumb'
datestamp: 1443649740

custom_breadcrumb.services.yml

services:
  custom_breadcrumb.breadcrumb_blog:
    class: Drupal\custom_breadcrumb\Breadcrumb\BlogBreadcrumbBuilder
    tags:
      - { name: breadcrumb_builder, priority: 101 }

src/Breadcrumb/BlogBreadcrumbBuilder.php

<?php

namespace Drupal\custom_breadcrumb\Breadcrumb;

use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Routing\LinkGeneratorTrait;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Link;
use Drupal\taxonomy\Entity\Term;

class BlogBreadcrumbBuilder implements BreadcrumbBuilderInterface {
  use LinkGeneratorTrait;
  use StringTranslationTrait;

  /**
   * @inheritdoc
   */
  public function applies(RouteMatchInterface $route_match) {    
    // This breadcrumb apply only for blog taxonomy terms of vocabulary 'categoria_blog'.    
    $parameters = $route_match->getParameters()->all();

    /*
     * CORE BUG? applies callback gets called on "taxonomy/term/%/edit" but not in "taxonomy/term/%"
     * https://www.drupal.org/node/2622840
     */
    if (isset($parameters['taxonomy_term'])) {
      $term = $parameters['taxonomy_term'];

      if ($term->getVocabularyId() == 'categoria_blog') {
        return TRUE;
      }
    }

    return FALSE;
  }

  /**
   * @inheritdoc
   */
  public function build(RouteMatchInterface $route_match) {

    $parameters = $route_match->getParameters()->all();

    if (isset($parameters['taxonomy_term'])) {

      $term = $parameters['taxonomy_term'];

      // Breadcrumbs set up (cache settings are so important!).
      $breadcrumb = new \Drupal\Core\Breadcrumb\Breadcrumb();
      $breadcrumb->addCacheContexts(["url"]);
      $breadcrumb->addCacheTags(["taxonomy_term:{$term->id()}"]);

      $breadcrumb->addLink(Link::createFromRoute($term->getName(), '<none>'));
    }

    // Reverse order for this to work!!!.
    $breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
    return $breadcrumb;
  }
}
3
Roger

Le module de taxonomie fournit un service de fil d'Ariane par défaut et si vous regardez la déclaration de cela dans le fichier taxonomy.services.yml, vous verrez qu'il a une priorité de 1002.

Définir la priorité de votre service de fil d'Ariane à une valeur supérieure à celle-ci devrait obtenir Drupal pour utiliser votre fil d'Ariane plutôt que celui par défaut.

Quelque chose comme ça devrait faire l'affaire:

custom_breadcrumb.services.yml

services:
  custom_breadcrumb.breadcrumb_blog:
    class: Drupal\custom_breadcrumb\Breadcrumb\BlogBreadcrumbBuilder
    tags:
      - { name: breadcrumb_builder, priority: 10001 }
7
Stephen Cox

selon https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags

Une priorité plus élevée sera utilisée par rapport à une priorité plus faible.

et puisque l'implémentation par défaut de TermBreadcrumbBuilder a un priority de 1002 le priority doit être défini sur au moins 1003.

services:
custom_breadcrumb.breadcrumb_blog:
class: Drupal\custom_breadcrumb\Breadcrumb\BlogBreadcrumbBuilder
tags:
  - { name: breadcrumb_builder, priority: 10003 }
1
Lathan Britz