Получить условия таксономии

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.

Класс хранения - это обработчик хранения сущностей, который вы получаете через менеджер сущностей. В целом, 99% классов в D8 предназначены не для того, чтобы их создавать самостоятельно, а как сервис или обработчик сущностей, плагин.

Например:

$vid = 'vocabulary_name';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
 $term_data[] = array(
  'id' => $term->tid,
  'name' => $term->name
 );
}
Berdir
источник
Отлично, спасибо. Хотя я не понимаю, где вы нашли эту строку кода?
Ромен Браун
Как я уже сказал, это скопировано прямо из taxonomy_get_tree (). Устаревшая функция означает, что есть новый способ что-то сделать, но старая функция все еще должна работать.
Бердир
О хорошо Потрясающие. Я вижу это сейчас. Большое спасибо за Вашу помощь!
Ромен Браун
Теперь это не работает, я изменил устаревшую функцию на entityTypeManager, но после getStorage я не получаю loadTree.
Бхану Пракаш Ряга
2
@ usethe23 Реализовать что? Это просто замена устаревшего вызова функции новым подходом. Он не делает ничего такого, чего не делал раньше. Вам, вероятно, нужно создать новый вопрос и описать, что вы хотите сделать.
Бердир
9

Это то, что я использую для создания списка тегов:

  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;
Стеф Ван Луверен
источник
Я искал полчаса для этого ... это так сложно и не имеет смысла ... и что, если мне нужен только URL-псевдоним термина таксономии, как мне это получить?
Раф А.
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;
  }
}
badzilla
источник
1
entityManager устарел, потому что его разбили на 11 классов - drupal.org/node/2337191 - поэтому используйте вместо него \ Drupal :: entityTypeManager, и все будет хорошо.
ognockocaten
В любое время, когда вам нужно загрузить Multiple и выполнить цикл, пока вы не получите тот, который вам нужен, я называю этот дерьмовый код fwiw
AlxVallejo
2

Я только что написал функцию, не стесняйтесь редактировать и использовать :) Мне нужен идентификатор термина, но вы можете вернуть все, что захотите.

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->conditionпосле не $query->execute()имеет никакого эффекта. Также, если первый член не является правильным, foreach вернет ноль, а не проверяет следующий член. (В вашем случае вы могли бы вместо этого использовать taxonomy_term_load_multiple_by_name ?)
Neograph734
Упс, да, извините, я скопировал старый код, извините, я его редактирую
Чегледи Давид
Ну и да, другой путь верен, как вы сказали, для этого лучше использовать это.
Чегледи Давид
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).

kenorb
источник
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);
Васим Хан
источник