分類条件を取得する


16

Drupal 8の特定の語彙から分類用語を取得したかった。

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

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

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

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

TermStorageInterface::loadTree('categories')

クラスをインスタンス化しようとしましたが、教えてくれました Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

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

回答:


38

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

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

既に削除された関数を探している場合は、Drupalコアページの変更レコードで検索してください。削除されたほとんどすべての関数には、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
 );
}

よかった。ありがとう。そのコード行をどこで見つけたのかわかりませんが?
ロマンブラウン

先ほど言ったように、それはtaxonomy_get_tree()からstraigtをコピーしたものです。廃止された関数は、何かを行うための新しい方法があることを意味しますが、古い関数はまだ機能している必要があります。
ベルディール

わかった 驚くばかり。今見ました。手伝ってくれてありがとうございます!
ロマンブラウン

動作しなくなったため、廃止された関数をentityTypeManagerに変更しましたが、getStorageの後、loadTreeを取得できません。
バヌプラカシュリャガ

2
@ usethe23何を実装しますか?これは、非推奨の関数呼び出しを新しいアプローチに置き換えることです。それは以前にはなかったことを何もしません。おそらく、新しい質問を作成し、何をしたいのかを説明する必要があります。
ベルディール16

8

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

  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;

私はこれを30分ほど探しました...それはとても複雑で意味がありません...そして、分類学用語のURLエイリアスだけが必要な場合はどうすればいいですか?
Raf A.

1
こんにちは、ラフ。私はこれを投稿することにしました。なぜなら、このような単純なタスクに到達するのに苦労したからです。エイリアスを取得するには:$ url = Url :: fromRoute( 'entity.taxonomy_term.canonical'、['taxonomy_term' => $ term-> id()]);
スティーフヴァンルーヴェレン

5

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

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

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

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


3

ボキャブラリーのマシン名を使用してロードします(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()は非推奨になったため、これは私のために働きました

$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は、11のクラス(drupal.org/node/2337191)に分割されているため非推奨です。そのため、代わりに\ Drupal :: entityTypeManagerを使用してください。
-ognockocaten

必要な特定のものを取得するまでloadMultipleとループする必要があるときはいつでも、そのくだらないコードをfwiwと呼びます
-AlxVallejo

2

私はちょうど関数を書いたので、自由に編集して使用してください:)用語の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);}
    }
}

私は間違っているかもしれませんが、これは完全に正しいとは思えません。$query->conditionafter $query->execute()は効果がありません。また、最初の用語が適切でない場合、foreachは次の用語をチェックするのではなくnullを返します。(ユースケースでは、代わりにtaxonomy_term_load_multiple_by_nameを使用できる場合がありますか?)
Neograph734

オプスは、はい申し訳ありません私は、申し訳ありませんI編集を古いコードをコピーして
Czeglédiデビッド

ええ、そうです、あなたが言ったように、それを使う方が良いのです。
チェグレディダビッド

1

ボキャブラリーマシン名に基づいて分類用語にアクセスする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

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

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

これは正解です。ありがとう。
スティーフヴァンルーヴェレン

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.