it-swarm.com.de

Holen Sie sich Taxonomie-Begriffe

Ich wollte Taxonomiebegriffe aus einem bestimmten Vokabular in Drupal 8) abrufen.

Anscheinend kann ich es immer noch mit taxonomy_get_tree aber es ist veraltet.

Ich muss jetzt TermStorageInterface :: loadTree verwenden

Ich versuche, über eine Block auf diese Funktion zuzugreifen, verstehe jedoch nicht, wie die Klasse TermStorageInterface instanziiert werden soll.

Ich habe versucht, direkt auf die Funktion zuzugreifen, aber es ist keine statische Funktion:

TermStorageInterface::loadTree('categories')

Ich habe versucht, die Klasse zu instanziieren, aber es sagte mir Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Ich verstehe nicht, wie diese Klasse funktioniert und wie ich auf Taxonomie-Links zugreifen kann. Ich glaube, ich vermisse einen großen Teil des Verständnisses, wie Drupal funktioniert).

17
Romain Braun

Das Ersetzen einer veralteten Funktion ist in den meisten Fällen trivial. Schau es dir an. Dort können Sie Folgendes sehen:

\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent, $max_depth, $load_entities);

Wenn Sie nach einer Funktion suchen, die bereits entfernt wurde, suchen Sie auf Datensätze ändern für Drupal core Seite. So ziemlich jede Funktion, die entfernt wurde, sollte mehr oder mehr haben weniger (normalerweise mehr) detaillierte Anweisungen dazu in Drupal 8 stattdessen.

Die Speicherklasse ist ein Entity Storage Handler, den Sie über den Entity Manager erhalten. Im Allgemeinen sind 99% der Klassen in D8 nicht dazu gedacht, selbst erstellt zu werden, sondern als Service- oder Entity-Handler-Plugin.

Zum Beispiel:

$vid = 'vocabulary_name';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
 $term_data[] = array(
  'id' => $term->tid,
  'name' => $term->name
 );
}
38
Berdir

Folgendes verwende ich, um eine Liste von Tags zu erstellen:

  use Drupal\taxonomy\Entity\Term;      
  use Drupal\Core\Link;
  use Drupal\Core\Url;

  $vocabulary_name = 'YOUR_VOCABULARY_NAME'; //name of your vocabulary
  $query = \Drupal::entityQuery('taxonomy_term');
  $query->condition('vid', $vocabulary_name);
  $query->sort('weight');
  $tids = $query->execute();
  $terms = Term::loadMultiple($tids);
  $output = '<ul>';
  foreach($terms as $term) {
      $name = $term->getName();;
      $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]);
      $link = Link::fromTextAndUrl($name, $url);
      $link = $link->toRenderable();
      $output .='<li>'.render($link).'</li>';
  }
  $output .= '</ul>';
  print $output;
9

Der Fehler, den Sie erhalten, ist, dass Sie versuchen, eine Instanz einer Schnittstelle zu erstellen, was nicht der Fall ist. PHP erlaubt. PHP Schnittstellen beschreiben die Methoden, die Klassen verwenden sollten Implementieren für bestimmte Fälle, aber sie können nicht zum Erstellen eines Objekts verwendet werden, z. B. mit new InterfaceName().

Nachdem taxonomy_get_tree() entfernt und der Entity Manager-Dienst nicht mehr unterstützt wurde, müssen Sie den folgenden Code verwenden.

$terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent, $max_depth, $load_entities);

\Drupal::getContainer() muss nicht verwendet werden, da \Drupal Eine Hilfsmethode verfügbar macht, um den Entity Type Manager-Service abzurufen.

5
kiamlaluno

Laden mit dem Maschinennamen des Vokabulars (vid):

  $vid = 'name_of_your_vocabulary';
  $terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
  foreach ($terms as $term) {
   $term_data[] = array(
    "id" => $term->tid,
    "name" => $term->name
   );
   dpm($term_data);
  }
3
Achraf JEDAY

Ich habe gerade eine Funktion geschrieben, kann sie gerne bearbeiten und verwenden :) Ich brauchte die ID des Begriffs, aber Sie können zurückgeben, was Sie wollen.

function checkTaxonomyTerm($vocab_name, $term_name){
    $query = \Drupal::entityQuery('taxonomy_term');
    $query->condition('vid', $vocab_name);
    $tids = $query->execute();
    $terms = Term::loadMultiple($tids);
    foreach($terms as $term) {
        $name = $term->getName();
        if($name == $term_name) {
            print_r($term->id());
            if (is_null($term->id())) {
                return null;
            }
            else{
                return array(true, $term->id());
            }
        }
        else {return addTaxonomyTerm($term->getVocabularyId(), $name);}
    }
}
2

\ Drupal :: entityManager () ist jetzt veraltet, sodass dies für mich funktioniert hat

$vids = Vocabulary::loadMultiple();
foreach ($vids as $vid) {
  if ($vid->label() == 'YourVocab') {
    $container = \Drupal::getContainer();
    $terms = $container->get('entity.manager')->getStorage('taxonomy_term')->loadTree($vid->id());
    if (!empty($terms)) {
      foreach($terms as $term) {
        dsm($term->name);
      }
    }
    break;
  }
}
2
badzilla

Wenn Sie eine Termentität benötigen, können Sie 'loadByProperties ()' verwenden.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
1
Denis Viunyk

Hier ist das D8-Beispiel für den Zugriff auf Taxonomiebegriffe basierend auf dem Namen des Vokabulars:

$terms = \Drupal::entityManager()->getStorage('taxonomy_term')->loadTree('categories');
foreach ($terms as $term) {
  //$value = $term->get('field_example')->getValue();
  var_dump($term);
}

Verwenden Sie zum Laden der gesamten Entitäten: loadTree('categories', 0, NULL, TRUE) .

1
kenorb
$vid = 'MACHINE_NAME_OF_VACABULARY';
$parent_tid = 0;//parent id
$depth = 2; //depth upto which level you want 
$load_entities = FALSE;
$tree = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent_tid, $depth, $load_entities);

foreach ($tree as $term) {
     $treeNames[] = array(
      'name' => $term->name
     );
}
dump($treeNames);
0
Wasim Khan