it-swarm.com.de

Laden von Taxonomiebegriffen in einen Baum in Drupal 8

Ich habe mehrere Vokabelebenen und möchte alle Ebenen in der Hierarchie wie die Taxonomieanzeige anzeigen. Meine Taxonomie ist wie.

All
   Drinks
      Alcohol Drinks
         Beer
         Vodka
      Alcohol Free Drinks
         Coca Cola
         Pepsi
   Fruits
      Fruits For Losing Weight
         Watermelon
         Blackberrie
      Fruits For Dogs
         Strawberry
         Orange

jetzt versuche ich dies mit Code zu laden.

$vid = 'food';
    $terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1, FALSE);
    foreach ($terms as $term) {
        $term_data_1[$term->tid] = $term->name;
            $terms_2 =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1, FALSE);
            foreach ($terms_2 as $term_2) {
                $term_data_2[$term_2->tid] = $term_2->name;
                    $terms_3 =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term_2->tid, 1, FALSE);
                    foreach ($terms_3 as $term_3) {
                        $term_data_3[$term_3->tid] = $term_3->name;
                    }

            }
            $term_data_1[$term_2->tid] = $term_data_2;
            $term_data_1[$term_3->tid] = $term_data_3;
    }

    kint($term_data_1);

und dieser Code gibt Ergebnis wie

(enter image description here

Benötigen Sie Hilfe, um den Begriff in der Hierarchie zu erhalten.

1
Mukunda Bhatta

TermForm.php enthält ein Beispiel dafür.

Grundsätzlich durchlaufen Sie den Baum und fügen Striche entsprechend der Tiefe des Begriffs hinzu.

Hier ist ein Beispiel, das Sie verwenden können:

$options = [];
foreach (\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid) as $item) {
  $options[$item->tid] = str_repeat('-', $item->depth) . $item->name;
}

UPDATE: Wenn Sie ein verschachteltes Array von Begriffen möchten, können Sie Folgendes tun:

$result = [];
foreach (\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid) as $item) {
  $parents = array_reverse(\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($item->tid), TRUE);
  $r = &$result;
  foreach ($parents as $k => $v) {
    if (isset($r[$k])) {
      $r[$k] = array_replace($r[$k], [$k => $v->label()]);
    }
    else {
      $r[$k] = [$k => $v->label()];
    }
    $r = &$r[$k];
  }
}

Dies funktioniert unabhängig davon, wie viele Ebenen Ihre Begriffe verschachtelt sind.

4
user72672

Sie sollten ein mehrdimensionales Array zum Speichern von Daten verwenden.

  $vid = 'tags';
  $terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1);
  $termDataAll = [];
  foreach ($terms as $term) {
    $termDataAll[$term->tid]["tid"] = $term->tid;
    $termDataAll[$term->tid]["name"] = $term->name;
     $terms_2 =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1);
      foreach($terms_2 as $term_2){
        $termDataAll[$term->tid][$term_2->tid]["tid"] = $term_2->tid;
        $termDataAll[$term->tid][$term_2->tid]["name"] = $term_2->name;
        $terms_3 =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term_2->tid, 1);
        foreach($terms_3 as $term_3){
          $termDataAll[$term->tid][$term_2->tid][$term_3->tid]["tid"] = $term_3->tid;
          $termDataAll[$term->tid][$term_2->tid][$term_3->tid]["name"] = $term_3->name;
        }
      }
  }
  dpm($termDataAll);
1
Sandesh Yadav