web-dev-qa-db-ja.com

分類用語を取得する

Drupal 8.の特定の語彙から分類用語を検索したかった。

どうやら私はtaxonomy_get_treeを使ってまだそれを行うことができますが、非推奨です。

TermStorageInterface :: loadTree を使用する必要があります

Blockからこの関数にアクセスしようとしていますが、TermStorageInterfaceクラスをインスタンス化する方法がわかりません。

関数に直接アクセスしてみましたが、静的関数ではありません:

TermStorageInterface::loadTree('categories')

クラスをインスタンス化してみましたが、Cannot instantiate interface Drupal\taxonomy\TermStorageInterfaceと表示されました

$test = new TermStorageInterface();

このクラスがどのように機能するか、分類法リンクにアクセスする方法がわかりません。 Drupalがどのように機能するかを理解するのに大きな欠落していると思います。

17
Romain Braun

非推奨の関数を置き換えることは、ほとんどの場合簡単です。見てください。そこで見ることができます:

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

既に削除された関数を探している場合は、 (Drupal core のレコードを変更)ページで検索します。削除されたほとんどすべての関数には、代わりにDrupal 8で行う方法の詳細な説明を少なく(通常は多く)します。

ストレージクラスはエンティティストレージハンドラーであり、エンティティマネージャーを介して取得します。一般に、D8のクラスの99%は自分で作成するためのものではなく、サービスまたはエンティティハンドラープラグインとして作成するためのものです。

例えば:

$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

これは、タグのリストを作成するために使用するものです。

  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

発生しているエラーは、PHPで許可されていないインターフェースのインスタンスを作成しようとしているためです。 PHPインターフェイスは、特定の場合にクラスが実装する必要のあるメソッドを記述しますが、それらを使用してオブジェクトを作成することはできません(例:new InterfaceName())。

taxonomy_get_tree()が削除され、エンティティマネージャーサービスが廃止されたため、次のコードを使用する必要があります。

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

_\Drupal_は、エンティティタイプマネージャーサービスを取得するためのヘルパーメソッドを公開しているため、\Drupal::getContainer()を使用する必要はありません。

5
kiamlaluno

語彙のマシン名を使用してロード(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

私は関数を書いたところです。自由に編集して使用してください:)用語のIDが必要でしたが、好きなものを返すことができます。

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()は非推奨になったため、これは私にとってはうまくいきました

$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

用語エンティティが必要な場合は、「loadByProperties()」を使用できます。

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

以下は、語彙マシン名に基づいて分類用語にアクセスするD8の例です。

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

エンティティ全体をロードするには、 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