Отримайте терміни таксономії


17

Я хотів отримати терміни таксономії з певної лексики в 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
 );
}

Чудово, дякую. Хоча я не розумію, де ви знайшли цей рядок коду?
Ромен Браун

Як я вже говорив, це скопійовано straigt з таксономії_get_tree (). Застаріла функція означає, що є новий спосіб зробити щось, але стара функція ще має працювати.
Бердір

О, добре. Дивовижно. Я бачу це зараз. Велике спасибі за вашу допомогу!
Ромен Браун

Тепер це не працює, я змінив застарілу функцію на entitTypeManager, але після getStorage я не отримую loadTree.
Bhanu Prakash Ryaga

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 ('entit.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 :: entitManager () тепер застарілий, тому це працювало для мене

$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
entitManager є застарілим, оскільки він розділений на 11 класів - drupal.org/node/2337191 - тому використовуйте \ Drupal :: entitTypeManager замість цього, і ви повинні бути хорошими.
ognockocaten

Кожен раз, коли вам доведеться завантажувати кілька разів і циклічно, поки ви не отримаєте потрібний, я називаю цей гадкий код 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 повернеться до нуля, а не перевіряє наступний термін. (Для вашого випадку використання, можливо, ви зможете використовувати таксономію_term_load_multiple_by_name ?)
Neograph734,

Ой, так вибачте, я скопіював старий код, вибачте, редагую його
Czeglédi Dávid

Ну і так, як ви вже сказали, інший спосіб є правильним для цього.
Чеґледі Давід

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.