Taxonomiebedingungen abrufen


16

Ich wollte Taxonomiebegriffe aus einem bestimmten Wortschatz in Drupal 8 abrufen.

Anscheinend kann ich es immer noch benutzen, taxonomy_get_treeaber es ist veraltet.

Ich muss jetzt TermStorageInterface :: loadTree verwenden

Ich versuche, von a auf diese Funktion zuzugreifen, Blockverstehe jedoch nicht, wie die TermStorageInterfaceKlasse instanziiert werden kann .

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 hat mir gesagt 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.

Antworten:


38

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 diese auf der Seite Datensätze für Drupal-Kern ändern . Ziemlich jede Funktion, die entfernt wurde, sollte mehr oder weniger (normalerweise mehr) detaillierte Anweisungen zur Vorgehensweise in Drupal 8 enthalten.

Die Speicherklasse ist ein Entitätsspeicher-Handler, den Sie über den Entitätsmanager erhalten. Im Allgemeinen sollen 99% der Klassen in D8 nicht selbst erstellt werden, sondern als Service- oder Entity-Handler-Plugin.

Beispielsweise:

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

Grosses Dankeschön. Obwohl ich nicht verstehe, wo Sie diese Codezeile gefunden haben?
Romain Braun

Wie gesagt, das wird gerade aus taxonomy_get_tree () kopiert. Eine veraltete Funktion bedeutet, dass es eine neue Möglichkeit gibt, etwas zu tun, aber die alte Funktion muss noch funktionieren.
Berdir

Oh ok. Genial. Ich sehe es jetzt. Vielen Dank für Ihre Hilfe!
Romain Braun

Jetzt funktioniert es nicht mehr, ich habe die veraltete Funktion in entityTypeManager geändert, aber nach getStorage bekomme ich nicht loadTree.
Bhanu Prakash Ryaga

2
@ usethe23 Was umsetzen? Hier geht es nur darum, einen veralteten Funktionsaufruf durch den neuen Ansatz zu ersetzen. Es macht nichts, was es vorher nicht getan hat. Sie müssen wahrscheinlich eine neue Frage erstellen und beschreiben, was Sie tun möchten.
Berdir

8

So erstelle ich eine Liste mit Tags:

  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;

Ich habe ungefähr eine halbe Stunde danach gesucht ... es ist so kompliziert und macht keinen Sinn ... und was ist, wenn ich nur den URL-Alias ​​des Taxonomiebegriffs möchte, wie bekomme ich das?
Raf A.

1
Hallo Raf. Ich habe mich dazu entschlossen, dies zu posten, weil es mir auch schwer gefallen ist, an eine so einfache Aufgabe wie diese zu gelangen. Um nur den Alias ​​zu erhalten: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren

5

Der Fehler, den Sie erhalten, liegt darin, dass Sie versuchen, eine Instanz einer Schnittstelle zu erstellen, was PHP nicht zulässt. PHP-Interfaces beschreiben die Methoden, die Klassen für bestimmte Fälle implementieren sollten, können jedoch nicht zum Erstellen eines Objekts verwendet werden, z. B. mit new InterfaceName().

Nachdem taxonomy_get_tree()dies entfernt wurde und der Entitätsmanagerdienst veraltet ist, müssen Sie den folgenden Code verwenden.

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

Es ist nicht verwenden müssen , \Drupal::getContainer()da \Drupalmacht eine Hilfsmethode den Entitätstyp - Manager - Dienst zu bekommen.


3

Laden mit Maschinenname 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);
  }

2

\ Drupal :: entityManager () ist jetzt veraltet, so dass 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;
  }
}

1
entityManager ist veraltet, da es in 11 Klassen unterteilt ist - drupal.org/node/2337191 - verwenden Sie stattdessen \ Drupal :: entityTypeManager und Sie sollten gut sein.
ognockocaten

Jedes Mal, wenn Sie Multiple laden und eine Schleife ausführen müssen, bis Sie das gewünschte
Ergebnis erhalten

2

Ich habe gerade eine Funktion geschrieben, die Sie gerne bearbeiten und verwenden können :) 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);}
    }
}

Ich könnte mich irren, aber das scheint nicht ganz richtig zu sein. $query->conditionAfter $query->execute()hat keine Wirkung. Auch wenn der erste Term nicht der richtige ist, gibt foreach null zurück, anstatt den nächsten Term zu überprüfen. (Für Ihren Anwendungsfall können Sie möglicherweise stattdessen taxonomy_term_load_multiple_by_name verwenden?)
Neograph734

Ops, ja sorry ich habe alten Code kopiert sorry ich bearbeite ihn
Czeglédi Dávid

Nun und ja, ein anderer Weg ist richtig, wie Sie sagten, um das besser zu nutzen.
Czeglédi Dávid

1

Im folgenden D8-Beispiel wird gezeigt, wie auf Taxonomiebegriffe zugegriffen wird, die auf dem Namen der Vokabularmaschine basieren:

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

Um die ganzen Einheiten zu laden, benutzen loadTree('categories', 0, NULL, TRUE).


1

Wenn Sie eine Begriffseinheit 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]);

Das ist die richtige Antwort. Vielen Dank.
Stef Van Looveren

0
$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);

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.