web-dev-qa-db-ja.com

Drupal 8のツリーに分類用語をロードする

私は複数のレベルの語彙を持っていますが、分類表示と同じように階層内のすべてのレベルを表示したいと思います。私の分類は次のようなものです。

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

今私はコードを使用してこれをロードしようとしています。

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

そしてこのコードは次のような結果を与えます

enter image description here

階層内の用語を取得するための助けが必要です。

1
Mukunda Bhatta

TermForm.php には、これを行う方法の例があります。

基本的には、ツリーをループして、用語の深さに応じてダッシュを追加します。

使用できる例は次のとおりです。

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

UPDATE:ネストされた用語の配列が必要な場合は、次のようにすることができます。

$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];
  }
}

これは、用語がネストされているレベルの数に関係なく機能します。

4
user72672

データの格納には多次元配列を使用する必要があります。

  $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