it-swarm.com.de

Wie implementiert man einen Breadcrumb?

Ich habe versucht, eine neue Breadcrumb-Überschreibung zu definieren, erhalte jedoch weiterhin die Standardeinstellung der Site.

Ich habe ein benutzerdefiniertes Modul erstellt, foo_breadcrumb:

   - modules/custom/foo_breadcrumb
     - foo_breadcrumb.info.yml
     - foo_breadcrumb.services.yml
     - src/
         - BreadcrumbBuild.php

Hier ist die foo_breadcrumb.services.yml:

services:
    foo_breadcrumb.breadcrumb:
        class: Drupal\foo_breadcrumb\BreadcrumbBuild
        tags:
            - { name: breadcrumb_builder, priority: 100 }

Innerhalb src/BreadcrumbBuild.php, Ich habe:

<?php

namespace Drupal\foo_breadcrumb;

use Drupal\Core\Breadcrumb\BreadcrumbBuilderBase;

class BreadcrumbBuild implements BreadcrumbManager {
    /**
     * {@inheritdoc}
     */
    public function applies(array $attributes) {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function build(array $attributes) {
        $breadcrumb[] = $this->l($this->t('Test'), NULL);
        $breadcrumb[] = $this->l($this->t('Test2'), 'test');
        return $breadcrumb;
    }
}
?>

Ich fing an, an der einzigen Beschreibung zu arbeiten, die ich auf Drupal 8 Breadcrumbs finden konnte, aber die Sache ist, dass es so scheint Ich habe eine ältere Version des PSR-4-Autoloading verwendet, die nicht mehr vorhanden ist (für den Datensatz bin ich auf 8.0.0-dev-beta3), und so habe ich mir angesehen, wie alle anderen Module in der Codebasis funktionieren.

Jetzt bin ich mir ziemlich sicher, dass dies richtig ist, damit das Modul geladen wird. Ich bin mir jedoch nicht sicher, ob

class BreadcrumbBuild extends BreadcrumbBuilderBase

ist richtig. Das Problem ist, dass das alte Tutorial, das ich mit Erwähnungen verknüpft habe, die sich von BreadcrumbBuilderBase erstrecken, aber die aktuelleren Dokumente scheinen es nicht zu erwähnen, und ich frage mich, ob es veraltet ist - und wie ich das tun soll.

Ebenso verstehe ich nicht wirklich was die services.yml Datei tut diesbezüglich, es gibt nirgendwo eine Dokumentation dafür.

18
njp

Ja, Breadcrumb hat sich geändert und die Dokumentation muss aktualisiert werden.

Ebenso verstehe ich nicht wirklich, was die Datei services.yml in dieser Hinsicht tut. Es gibt nirgendwo eine Dokumentation dafür.

Für Drupal 8: Der Crashkurs | DrupalCon Amsterdam 2014 , tolle Präsentation, ca. 47:02:

Drupal 8 in 2 Schritten:

  1. Erstellen Sie ein Werkzeug
  2. Verdrahten Sie es

Die Verkabelung kann variieren, der Ansatz ist der gleiche.

Wie wir den Brotkrumen "verkabeln":

Für http://www.palantir.net/blog/d8ftw-breadcrumbs-work :

Jetzt müssen wir dem System von unserer Klasse erzählen. Dazu definieren wir einen neuen Service (erinnern Sie sich an diese?), Der auf unsere neue Klasse verweist. Wir werden das in unserer * .services.yml-Datei tun, die genau für diesen Zweck existiert

Ähnlich wie bei einem "Info-Hook" in früheren Drupal -Versionen definieren wir einen Dienst namens mymodule.breadcrumb. Dies ist eine Instanz unserer Breadcrumb-Klasse. Bei Bedarf können wir Argumente an unsere übergeben Auch der Konstruktor unserer Klasse. Wichtig ist jedoch, dass wir den Service auch mit Tags versehen. Mit Tags versehene Services sind eine spezielle Funktion der Symfony DependencyInjection-Komponente und weisen das System an, unseren Builder automatisch mit dem Breadcrumb-Manager zu verbinden. Die Priorität gibt an, in welcher Reihenfolge verschiedene Builder arbeiten sollen aufgerufen werden, höchste zuerst. Falls zwei apply () -Methoden beide true zurückgeben, wird der Builder mit der höheren Priorität verwendet und der andere ignoriert.

Sie können diesen Code für Ihr Ziel verwenden:

Struktur (nicht viel wichtig):

- modules/custom/foo_breadcrumb
  - foo_breadcrumb.info.yml
  - foo_breadcrumb.services.yml
  - src/
    - Breadcrumb/
      - BlogBreadcrumbBuilder.php

foo_breadcrumb.services.yml:

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

BlogBreadcrumbBuilder.php:

class BlogBreadcrumbBuilder implements BreadcrumbBuilderInterface {
  use StringTranslationTrait;
  use LinkGeneratorTrait;

  /**
   * @inheritdoc
   */
  public function applies(RouteMatchInterface $route_match) {
    // This breadcrumb apply only for all articles
    $parameters = $route_match->getParameters()->all();
    if (isset($parameters['node'])) {
      return $parameters['node']->getType() == 'article';
    }
  }

  /**
   * @inheritdoc
   */
  public function build(RouteMatchInterface $route_match) {
    $breadcrumb = [Link::createFromRoute($this->t('Home'), '<front>')];
    $breadcrumb[] = Link::createFromRoute($this->t('Blog'), '<<<your route for blog>>>');
    return $breadcrumb;
  }
}

Denken Sie daran, den Cache am Ende zu löschen.

8
rpayanm

Jetzt geht das schon wieder los. Diese Antworten sind meistens richtig. Eine Sache, die Sie nicht vergessen können, sind "Cache-Tags" und "Cache-Kontexte".

Ich habe einen Taxonomiebegriff auf einem Knoten als Breadcrumb eingerichtet.

Ich habe es mit Ratschlägen aus diesem Beitrag zum Laufen gebracht, aber dann habe ich mich umgesehen und auf jeder Seite die gleichen Semmelbrösel bemerkt.

Kurz gesagt, stellen Sie sicher, dass Sie einige Cache-Kontexte und -Tags festlegen.

Hier ist mein Service in einem Gist: https://Gist.github.com/jonpugh/ccaeb01e173abbc6c88f7a332d271e4a

Hier ist meine build () -Methode:

/**
 * {@inheritdoc}
 */
public function build(RouteMatchInterface $route_match) {
  $node = $route_match->getParameter('node');
  $breadcrumb = new Breadcrumb();

  // By setting a "cache context" to the "url", each requested URL gets it's own cache.
  // This way a single breadcrumb isn't cached for all pages on the site.
  $breadcrumb->addCacheContexts(["url"]);

  // By adding "cache tags" for this specific node, the cache is invalidated when the node is edited.
  $breadcrumb->addCacheTags(["node:{$node->nid->value}"]);

  // Add "Home" breadcrumb link.
  $breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));

  // Given we have a taxonomy term reference field named "field_section", and that field has data,
  // Add that term as a breadcrumb link.
  if (!empty($node->field_section->entity)) {
    $breadcrumb->addLink($node->field_section->entity->toLink());
  }
  return $breadcrumb;
}
10
Jon Pugh

pdate 2016 Drupal 8

In der Dokumentation wird angegeben, dass Sie eine Instanz der Breadcrumb-Klasse zurückgeben müssen. Wenn Sie Probleme haben, es zum Laufen zu bringen. Hier ist die Lösung, die für mich funktioniert hat.

<?php

//modules/MY_MODULE/src/MyBreadcrumbBuilder.php

namespace Drupal\registration;

use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Link;

class MyBreadcrumbBuilder implements BreadcrumbBuilderInterface {

    /**
     * @inheritdoc
     */
    public function applies(RouteMatchInterface $route_match) {
        /* Allways use this. Change this is another module needs to use a new custom breadcrumb */
        return true;
        /* This code allows for only the registration page to get used by this breadcrumb
         * $parameters = explode('.', $route_match->getRouteName());
         * if ($parameters[0] === 'registration') {
         *     return true;
         * } else {
         *     return false;
         * }
         */
    }

    /**
     * @inheritdoc
     */
    public function build(RouteMatchInterface $route_match) {
        $parameters = explode('.', $route_match->getRouteName());
        $b = new Breadcrumb();
        if ($parameters[0] === 'registration') {
            /* If registration page use these links */
            $b->setLinks($this->buildRegistration($parameters[1]));
        }
        return $b;
    }

    /**
     * Creates all the links for the registration breadcrumb
     * @param type $page
     * @return type
     */
    private function buildRegistration($page) {
        return [
            Link::createFromRoute(t('Step One'), 'registration.one'),
            Link::createFromRoute(t('Step Two'), 'registration.two'),
            Link::createFromRoute(t('Step Three'), 'registration.three'),
            Link::createFromRoute(t('Step Four'), 'registration.four'),
            Link::createFromRoute(t('Step Five'), 'registration.five'),
            Link::createFromRoute(t('Step Six'), 'registration.six'),
            Link::createFromRoute(t('Step Seven'), 'registration.seven')
        ];
    }

}

Dann die yml-Datei

# modules/MY_MODULE/registration/MY_MODULE.services.yml
services:
  registration.breadcrumb:
    class: Drupal\registration\MyBreadcrumbBuilder
    tags:
      - { name: breadcrumb_builder, priority: 100 }

PS: Wenn Sie Bootstrap verwenden, gehen Sie zu Ihrer Einstellungsseite /admin/appearance/settings Und sehen Sie sich die Breadcrumbs-Einstellungen an. Show 'Home' breadcrumb link Sollte aktiviert sein. Und Show current page title at end Sollte abgehakt sein.

Nachdem dies alles erledigt ist, leeren Sie Ihren Cache. Jedes Mal, wenn Sie eine YML-Datei ändern, auch im Debug-Modus, müssen Sie Ihren Cache leeren. Sie können zu /core/rebuild.php gehen, wenn Sie nicht weiterkommen und nicht neu erstellen können.

8
Neoaptt

Vergiss das Caching nicht

Der Render-Cache wurde ziemlich spät im D8-Entwicklungszyklus geändert und wird daher in der d8ftw-Serie oder den anderen Antworten auf diese Frage nicht erwähnt.

Die Cache-API-Dokumentation bezieht sich speziell auf Render-Arrays, aber alle diese Anweisungen gelten gleichermaßen für Breadcrumbs. Breadcrumbs haben eine toRenderable() Methode, Drupal versucht, sie im Render-Cache zwischenzuspeichern, und das bedeutet, dass Sie muss genügend Informationen angeben, damit Drupal es richtig machen kann).

Die Details sind in den Dokumenten enthalten, aber die Kurzversion ist, dass Breadcrumb das RefinableCachableDependencyInterface implementiert. In Ihrer Builder-Klasse möchten Sie addCachableDependency() mit allen Entitäten oder Konfigurationsobjekten aufrufen, die zum Erstellen des Breadcrumbs verwendet werden. In der Dokumentation zu 'CacheableDependencyInterface & friends' wird ausführlicher beschrieben, wie und warum.

Wenn es andere Kontexte gibt, in denen sich der Breadcrumb ändern könnte, müssen Sie auch manuell addCacheContexts() verwenden, um sicherzustellen, dass der Block variiert, addCacheTags() um sicherzustellen, dass der Cache-Eintrag korrekt ungültig gemacht werden kann, und mergeCacheMaxAge() , wenn der Cache zeitkritisch ist und ablaufen muss.

Wenn dies nicht ordnungsgemäß durchgeführt wird, wird einer Ihrer benutzerdefinierten Breadcrumb Builder-Dienste "gewinnen", und die Breadcrumbs für diese eine bestimmte Seite werden auf jeder Seite für immer allen Besuchern bereitgestellt.

7
Sean C.

Es gibt einen anderen Weg, dies zu erreichen.

/**
 * Implements hook_preprocess_breadcrumb().
 */
 function theme_name_preprocess_breadcrumb(&$variables){
  if(($node = \Drupal::routeMatch()->getParameter('node')) && $variables['breadcrumb']){
    $variables['breadcrumb'][] = array(
     'text' => $node->getTitle() 
   );
  }
}

Erstellen Sie anschließend eine weitere Datei im Vorlagenordner Ihres Themas mit dem Namen "readcrumb.html.twig "und fügen Sie den folgenden Code in diese Datei ein:

{% if breadcrumb %}
  <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
    <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
    <ul>
    {% for item in breadcrumb %}
      <li>
        {% if item.url %}
          <a href="{{ item.url }}">{{ item.text }}</a>
        {% else %}
          {{ item.text }}
        {% endif %}
      </li> /
    {% endfor %}
    </ul>
  </nav>
{% endif %}

Das ist es. Leeren Sie nun den Cache und Sie erhalten Breadcrumb mit dem aktuellen Seitentitel wie Startseite/Aktueller Seitentitel. Sie können das Trennzeichen ändern, indem Sie "/" durch das gewünschte ersetzen.

4
Sachin

Sie sollten ein Contrib-Modul verwenden, um den aktuellen Seitentitel zum Breadcrumb hinzuzufügen, z. B. Current Page Crumb: https://www.drupal.org/project/current_page_crumb

Wenn Sie es von Hand codieren möchten, können Sie den Code aus dem src-Ordner dieses Moduls abrufen. Weitere Details zu Drupal 8 Breadcrumbs finden Sie hier: http://www.gregboggs.com/drupal8-breadcrumbs/

2
Greg Boggs

Ich hatte benutzerdefinierte Brotkrumen mit Token in Drupal 7) verwendet, und als dieses Modul für Drupal 8 nicht verfügbar war), erstellte ich schließlich Ansichten für meine einzelnen Inhaltstypen mit dem Felder, die ursprünglich die Tokenfelder waren. Verwenden Sie es als Block und deaktivieren Sie den normalen Breadcrumb. Es war etwas mehr Arbeit als benutzerdefinierte Breadcrumbs, aber es funktioniert.

0
weben