So erhalten Sie die Bündelbezeichnung von der Entität


14

Wie erhalte ich das lesbare Etikett eines Bundles von einer geladenen Entität?

Nehmen wir an, ich möchte die Bezeichnung eines Knotens des Bundles my_article erhalten, der "My awesome article" ist.

// Load a node
$node = Drupal::entityManager()->getStorage('node')->load(4);

print $node->bundle(); // prints the machine-readable name. e.g. 'my_article'.

print $node->getEntityType()->getBundleLabel(); // prints 'content type'.

Ich kann nur den maschinenlesbaren Namen des Bundles oder die Bezeichnung der Entität ("Inhaltstyp", "Taxonomiebegriff" usw.) abrufen, aber wie erhalte ich die Bezeichnung des Bundles?

PS Ich würde es vorziehen, keine veralteten Klassen / Funktionen zu verwenden

Antworten:


23

Ich kann nichts direkt sehen, das Laden des Knotentyps selbst ist jedoch eine Option:

$bundle_label = \Drupal::entityTypeManager()
  ->getStorage('node_type')
  ->load($node->bundle())
  ->label();

Oder wie Berdir in den Kommentaren betont hat, gibt es einen schnelleren Weg durch das Entity-Referenzfeld:

$bundle_label = $node->type->entity->label();

1
Danke, das funktioniert. Ich würde nur entityTypeManager anstelle des veralteten entityManager verwenden.
Linus

1
Mein schlechtes, ich wusste nicht, dass es veraltet war. Problem behoben
Clive

9
Es ist nicht als Methode verfügbar, aber der Typ ist eine Entitätsreferenz. Sie können dies also auch einfach tun: $ node-> type-> entity-> label ()
Berdir

1
Dies beantwortet nur den Knotentyp .. und keine Entitäten im Allgemeinen ..
ssibal

2
@ssibal Ja, gemäß der Frage. Der Bundle-Schlüssel ist je nach Entitätstyp unterschiedlich (kann aber auch aus Metadaten abgerufen werden)
Clive

9

Beachten Sie, dass die akzeptierte Antwort speziell für Knotenentitäten gilt, aber alle Entitäten über Bündel verfügen. Viele Entitäten, wie useroder menu_link_content(für benutzerdefinierte Menüverknüpfungen), haben nur ein Bundle, das dem Entitätstyp selbst entspricht.

Der entity_type.bundle.infovon Drupal \ Core \ Entity \ EntityTypeBundleInfo implementierte Dienst bietet Zugriff auf Informationen zu Entitätspaketen. Seine Methoden getAllBundleInfo()und getBundleInfo($entity_type_id)geben ein Array zurück, das nach Entitätstyp und Bundle-Maschinenname verschlüsselt ist, wobei ersteres dann ein Array von Bundles enthält, die nach Bundle-Maschinennamen verschlüsselt sind. Jedes Bundle hat einen labelSchlüssel mit dem Anzeigenamen des übersetzten Bundles.

Unten sehen Sie ein Beispiel, das den Unterschied zwischen Computernamen, Beschriftungen, Computernamen und Beschriftungen für Inhaltsentitäten zeigt. Der Code setzt voraus, dass mindestens ein benutzerdefinierter Menü-Link mit einer ID von vorhanden ist 1. Es wird auch davon articleausgegangen, dass es einen Knotentyp (Bündel) gibt, dass es mindestens einen Knoten mit der ID von 1gibt und dass der Knoten vom Knotentyp (Bündel) ist article.

<?php

$entity_type_manager = \Drupal::entityTypeManager();
$bundle_info = \Drupal::service("entity_type.bundle.info")->getAllBundleInfo();

$current_user = \Drupal::currentUser()->getAccount();

// Prints "user".
print $current_user->getEntityTypeId() . PHP_EOL;

// Prints "User".
print $current_user->getEntityType()->getLabel() . PHP_EOL;

// Prints "user".
print $current_user->bundle() . PHP_EOL;

// Prints "User".
print $bundle_info[$current_user->getEntityTypeId()][$current_user->bundle()]['label'] . PHP_EOL;

$my_menu_link = $entity_type_manager->getStorage('menu_link_content')->load(1);

// Prints "menu_link_content".
print $my_menu_link->getEntityTypeId() . PHP_EOL;

// Prints "Custom menu link".
print $my_menu_link->getEntityType()->getLabel() . PHP_EOL;

// Prints "menu_link_content".
print $my_menu_link->bundle() . PHP_EOL;

// Prints "Custom menu link".
print $bundle_info[$my_menu_link->getEntityTypeId()][$my_menu_link->bundle()]['label'] . PHP_EOL;

$my_article = $entity_type_manager->getStorage('node')->load(1);

// Prints "node".
print $my_article->getEntityTypeId() . PHP_EOL;

// Prints "Content".
print $my_article->getEntityType()->getLabel() . PHP_EOL;

// Prints "article".
print $my_article->bundle() . PHP_EOL;

// Prints "Article".
print $bundle_info[$my_article->getEntityTypeId()][$my_article->bundle()]['label'] . PHP_EOL;

Verwenden Sie in Ihrem Code nach Möglichkeit die Abhängigkeitsinjektion, anstatt sich auf die statischen Methoden der DrupalKlasse zu verlassen.


Sehr hilfreich, um eine Antwort zu haben, die für alle Entitätstypen funktioniert. Vielen Dank.
James Wilson


3

Wenn Sie sich über den $entityTyp nicht sicher sind , kann es sein:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}

Dies sollte die richtige Antwort sein: Die ursprüngliche Frage
lautet "Bündelbezeichnung

1

Nicht die effizienteste Lösung, aber der Vollständigkeit halber funktioniert Folgendes:

\Drupal::token()->replace('[node:type-name]', ['node' => $node]);

oder

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.