it-swarm.com.de

Abrufen von "Aufruf einer Mitgliedsfunktion getName () auf null" in benutzerdefiniertem Breadcrumb

Ich versuche, den Breadcrumb von drupal 8) anzupassen, um so etwas zu erhalten:

Home> Kategorie> Artikel-Titel.

Ich habe das geschrieben und den folgenden Code geschrieben.

namespace Drupal\module_demo\Breadcrumb;

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

class ArticleBreadcrumbBuilder implements BreadcrumbBuilderInterface {

    public function applies(RouteMatchInterface $route_match) {
        $parameters = $route_match->getParameters()->all();
        if(isset($parameters['node'])) {
            return $parameters['node']->getType() === 'article';
        }

    }

    public function build(RouteMatchInterface $route_match) {

        $breadcrumb = new Breadcrumb();

        $term = $route_match->getParameter('taxonomy_term');

        $breadcrumb->addCacheContexts(["url"]);

        $breadcrumb->addLink(Link::createFromRoute(t('Home'), '<front>'));

        $breadcrumb->addLink(Link::createFromRoute(t('Articles'), '<none>'));

        $breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]));

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

        return $breadcrumb;
    }
}

aber ich habe den Fehler unten.

Auf der Website ist ein unerwarteter Fehler aufgetreten. Bitte versuchen Sie es später noch einmal. Fehler: Rufen Sie eine Mitgliedsfunktion getName () auf null in Drupal\module_demo\Breadcrumb\ArticleBreadcrumbBuilder-> build () auf (Zeile 34 von modules/custom/module_demo/src/Breadcrumb/ArticleBreadcrumbBuilder.php).

Anscheinend liegt das Problem bei getName() und id().

Kann mir jemand sagen, wo der Fehler liegt?

1
Worksfather

Sie können auch hook_system_breadcrumb_alter um dies zu erreichen:
Versuche dies:

/**
 * Implements hook_system_breadcrumb_alter().
 */
function MyModule_system_breadcrumb_alter(\Drupal\Core\Breadcrumb\Breadcrumb &$breadcrumb, \Drupal\Core\Routing\RouteMatchInterface $route_match, array $context) {
  $node = \Drupal::request()->attributes->get('node');
  if ($node && $node instanceof Drupal\node\Entity\Node) {
    if ($node->bundle() == 'article') {
      // Add Articles item.
      $breadcrumb->addLink(Link::createFromRoute(t('Articles'), '<none>'));
      // Add category term item to breadcrumb.
      // Change here the field_tags with your taxonomy you want to add to breadcrumb.
      $term_id = $node->field_tags->getValue()[0]['target_id'];
      $term = Term::load($term_id);
      $breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]));
      // Add title as breadcrumb item.
      $request = \Drupal::request();
      $route_match = \Drupal::routeMatch();
      $page_title = \Drupal::service('title_resolver')
        ->getTitle($request, $route_match->getRouteObject());
      if (!empty($page_title)) {
        $breadcrumb->addLink(Link::createFromRoute($page_title, '<none>'));
      }
    }
  }
}

Update: Um den Fehler zu beheben.
Aktualisieren Sie die Methode applies, um Ihren Breadcrumb nur auf Artikel anzuwenden, wie in der Antwort von @Jdrupal erwähnt:

  public function applies(RouteMatchInterface $route_match) {
    $parameters = $route_match->getParameters()->all();
    if (isset($parameters['node'])) {
      return $parameters['node']->getType() === 'article';
    }
    if (isset($parameters['term'])) {
      return TRUE;
    }
  }

Der Fehler kommt von der Zeile:

$term = $route_match->getParameter('taxonomy_term');

$term gleich NULL es ist normal, du bist auf der Knotenseite, also die taxonomy_term param immer null, also versuchen Sie, Ihren Begriff aus dem Knotenobjekt zu erhalten, etwa:

 $node = \Drupal::request()->attributes->get('node');
 // Change the field_tags with your filed.
 $term_id = $node->field_tags->getValue()[0]['target_id'];
 $term = Term::load($term_id);
3
berramou

Das Problem ist, dass Sie versuchen, das term von der Route abzurufen, aber in Ihrer applies() -Methode haben Sie den Breadcrumb so eingeschränkt, dass er nur auf Seiten angewendet wird, auf denen Sie den Knoten von der Route abrufen können.

Wenn Sie möchten, dass Ihr Breadcrumb auch für Seiten mit Taxonomie-Begriffen gilt, muss Ihre Funktion applies() folgendermaßen aussehen:

public function applies(RouteMatchInterface $route_match) {
  $parameters = $route_match->getParameters()->all();
  if (isset($parameters['node'])) {
    return $parameters['node']->getType() === 'article';
  }
  if (isset($parameters['term'])) {
    return TRUE;
  }
}

Andernfalls müssen Sie $term->getName() aus Ihrer build() -Methode entfernen.

PDATE : Da Sie erwähnen, dass Sie den Breadcrumb nur auf Artikelseiten anzeigen möchten, müssen Sie den Begriff vom Knoten abrufen.

Ersetzen Sie diese Zeile:

$term = $route_match->getParameter('taxonomy_term');

Mit:

$term = $route_match->getParameter('node')->field_term->first()->entity;

Dann können Sie $term->label() aufrufen.

2
user72672

Ihr apply () sucht nach einer Knotenroute, während Ihr build () eine Taxonomieroute wünscht. Deshalb ist $ term hier null. Sie müssen Ihr $ term-Objekt aus dem entsprechenden Knotenfeld abrufen.

0
Rainer Feike