Obter termos de taxonomia

16

Eu queria recuperar termos de taxonomia de um determinado vocabulário no Drupal 8.

Aparentemente, ainda posso fazer isso usando, taxonomy_get_treemas está obsoleto.

Agora tenho que usar TermStorageInterface :: loadTree

Eu estou tentando acessar esta função a partir de um, Blockmas eu não entendo como instanciar a TermStorageInterfaceclasse.

Eu tentei acessar a função diretamente, mas não é uma função estática:

TermStorageInterface::loadTree('categories')

Tentei instanciar a aula, mas ela me disse Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Não entendo como essa classe funciona e como posso acessar os links de taxonomia. Acho que estou perdendo uma grande parte do entendimento de como o Drupal funciona.

Romain Braun
fonte

Respostas:

38

Substituir uma função preterida é, na maioria dos casos, trivial. Apenas olhe para isso. Lá você pode ver isso:

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

Se você estiver procurando por uma função que já foi removida, procure-a na página principal Alterar registros da Drupal . Praticamente todas as funções removidas devem ter instruções mais ou menos (geralmente mais) detalhadas sobre como fazê-lo no Drupal 8.

A classe de armazenamento é um manipulador de armazenamento de entidade, que você obtém através do gerenciador de entidades. Em geral, 99% das classes no D8 não devem ser criadas por você mesmo, mas como um plugin de serviço ou manipulador de entidades.

Por exemplo:

$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
fonte
Ótimo, obrigado. Embora eu não entenda onde você encontrou essa linha de código?
Romain Braun
Como eu disse, isso é copiado diretamente de taxonomy_get_tree (). Uma função obsoleta significa que há uma nova maneira de fazer algo, mas a função antiga ainda precisa funcionar.
Berdir
Ah ok. Impressionante. Eu vejo agora. Muito obrigado pela sua ajuda!
Romain Braun
Agora não está funcionando, alterei a função descontinuada para entityTypeManager, mas depois de getStorage não estou recebendo o loadTree.
Bhanu Prakash Ryaga
2
@ usethe23 Implementar o que? Trata-se de substituir uma chamada de função descontinuada pela nova abordagem. Ele não faz nada que não fazia antes. Você provavelmente precisará criar uma nova pergunta e descrever o que deseja fazer.
22416 Berdir
8

Isto é o que eu uso para criar uma lista de tags:

  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;
Stef Van Looveren
fonte
Pesquisei meia hora por isso ... é tão complicado e não faz sentido ... e se eu quiser apenas o alias da URL do termo taxonomia, como faço para obtê-lo?
Raf A.
1
Oi Raf. Eu decidi postar isso, porque eu também tinha dificuldade em realizar uma tarefa tão simples como essa. Para obter apenas o alias: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren
5

O erro que você está recebendo é porque está tentando criar uma instância de uma interface, o que não é algo que o PHP permita. As interfaces PHP descrevem os métodos que as classes devem implementar para casos específicos, mas não podem ser usados ​​para criar um objeto, por exemplo, com new InterfaceName().

Agora que taxonomy_get_tree()foi removido e o serviço do gerenciador de entidades foi preterido, você precisa usar o seguinte código.

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

Não é necessário usar, \Drupal::getContainer()pois \Drupalexpõe um método auxiliar para obter o serviço de gerenciamento de tipo de entidade.

kiamlaluno
fonte
3

Carregar usando o nome da máquina do vocabulário (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);
  }
Achraf JEDAY
fonte
2

\ Drupal :: entityManager () agora está obsoleto, então funcionou para mim

$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
fonte
1
entityManager foi descontinuado porque foi dividido em 11 classes - drupal.org/node/2337191 - portanto, use \ Drupal :: entityTypeManager e você deve ser bom.
ognockocaten
Sempre que você tem que loadMultiple e ciclo até chegar a um específico que você quiser, eu chamo que fwiw código de merda
AlxVallejo
2

Acabei de escrever uma função, fique à vontade para editar e usar :) Eu precisava do id do termo, mas você pode retornar o que quiser.

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);}
    }
}
Czeglédi Dávid
fonte
Eu posso estar errado, mas isso parece não estar totalmente certo. $query->conditiondepois $query->execute()não tem efeito. Além disso, se o primeiro termo não for o correto, o foreach retornará nulo em vez de verificar o próximo. (Para seu caso de uso, você pode ser capaz de usar taxonomy_term_load_multiple_by_name em vez disso?)
Neograph734
Ops, sim desculpe, eu copiado código antigo desculpe, eu editá-lo
Czeglédi Dávid
Bem, e sim, de outra maneira, como você disse, é melhor usar isso.
Czeglédi Dávid
1

Aqui está o exemplo D8 de como acessar termos de taxonomia com base no nome da máquina de vocabulário:

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

Para carregar todo o entidades, use: loadTree('categories', 0, NULL, TRUE).

kenorb
fonte
1

Se você precisar do termo entidade, poderá usar 'loadByProperties ()'.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
Denis Viunyk
fonte
Essa é a resposta correta. Obrigado.
Stef Van Looveren
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);
Wasim Khan
fonte