Obtenez les termes de taxonomie

16

Je voulais récupérer des termes de taxonomie à partir d'un certain vocabulaire dans Drupal 8.

Apparemment, je peux toujours le faire en utilisant taxonomy_get_treemais c'est obsolète.

Je dois maintenant utiliser TermStorageInterface :: loadTree

J'essaie d'accéder à cette fonction à partir d'un Blockmais je ne comprends pas comment instancier la TermStorageInterfaceclasse.

J'ai essayé d'accéder directement à la fonction mais ce n'est pas une fonction statique:

TermStorageInterface::loadTree('categories')

J'ai essayé d'instancier la classe mais ça m'a dit Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Je ne comprends pas comment cette classe fonctionne et comment je peux accéder aux liens de taxonomie. Je pense que je manque une grande partie de la compréhension du fonctionnement de Drupal.

Romain Braun
la source

Réponses:

38

Le remplacement d'une fonction obsolète est dans la plupart des cas trivial. Regardez-le. Là, vous pouvez voir ceci:

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

Si vous recherchez une fonction qui a déjà été supprimée, recherchez-la sur la page Modifier les enregistrements pour le noyau Drupal . Presque toutes les fonctions qui ont été supprimées devraient avoir des instructions plus ou moins (généralement plus) détaillées sur la façon de le faire dans Drupal 8.

La classe de stockage est un gestionnaire de stockage d'entité que vous obtenez via le gestionnaire d'entités. En général, 99% des classes de D8 ne sont pas destinées à être créées vous-même, mais en tant que plugin de service ou de gestionnaire d'entités.

Par exemple:

$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
la source
Super merci. Bien que je ne comprenne pas où vous avez trouvé cette ligne de code?
Romain Braun
Comme je l'ai dit, c'est copié straigt de taxonomy_get_tree (). Une fonction obsolète signifie qu'il existe une nouvelle façon de faire quelque chose, mais l'ancienne fonction doit encore fonctionner.
Berdir
Ah d'accord. Impressionnant. Je le vois maintenant. Merci beaucoup pour votre aide!
Romain Braun
Maintenant, cela ne fonctionne pas, j'ai changé la fonction obsolète en entityTypeManager, mais après getStorage, je ne reçois pas loadTree.
Bhanu Prakash Ryaga
2
@ usethe23 Mettre en œuvre quoi? Il s'agit simplement de remplacer un appel de fonction obsolète par la nouvelle approche. Il ne fait rien d'autre qu'il ne le faisait déjà. Vous devrez probablement créer une nouvelle question et décrire ce que vous voulez faire.
Berdir
9

Voici ce que j'utilise pour créer une liste de balises:

  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
la source
J'ai cherché pendant une demi-heure pour cela ... c'est tellement compliqué et n'a pas de sens ... et si je veux juste l'alias d'URL du terme de taxonomie, comment puis-je l'obtenir?
Raf A.
1
Salut Raf. J'ai décidé de poster ceci, car j'ai également eu du mal à me lancer dans une tâche aussi simple que celle-ci. Pour obtenir simplement l'alias: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren
5

L'erreur que vous obtenez est parce que vous essayez de créer une instance d'une interface, ce que PHP ne permet pas. Les interfaces PHP décrivent les méthodes que les classes doivent implémenter pour des cas spécifiques, mais elles ne peuvent pas être utilisées pour créer un objet, par exemple avec new InterfaceName().

Maintenant que cela taxonomy_get_tree()a été supprimé et que le service de gestion d'entités est obsolète, vous devez utiliser le code suivant.

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

Il n'est pas nécessaire d'utiliser \Drupal::getContainer()car \Drupalexpose une méthode d'assistance pour obtenir le service de gestionnaire de type d'entité.

kiamlaluno
la source
3

Charger en utilisant le nom de machine du vocabulaire (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
la source
2

\ Drupal :: entityManager () est maintenant obsolète, donc cela a fonctionné pour moi

$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
la source
1
entityManager est obsolète car il est divisé en 11 classes - drupal.org/node/2337191 - alors utilisez plutôt \ Drupal :: entityTypeManager et vous devriez être bon.
ognockocaten
Chaque fois que vous devez charger plusieurs et boucler jusqu'à ce que vous obteniez celui que vous voulez, j'appelle ce code de merde fwiw
AlxVallejo
2

Je viens d'écrire une fonction, n'hésitez pas à l'éditer et à l'utiliser :) J'avais besoin de l'id du terme, mais vous pouvez retourner ce que vous voulez.

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
la source
Je me trompe peut-être, mais cela ne semble pas tout à fait raison. $query->conditionaprès $query->execute()n'a aucun effet. De plus, si le premier terme n'est pas le bon, foreach renverra null plutôt que de vérifier le terme suivant. (Pour votre cas d'utilisation, vous pourrez peut-être utiliser taxonomy_term_load_multiple_by_name à la place?)
Neograph734
Ops, oui désolé j'ai copié l'ancien code désolé, je le
modifie
Eh bien et oui, une autre façon est juste, comme vous l'avez dit, de mieux l'utiliser.
Czeglédi Dávid
1

Voici l'exemple D8 comment accéder aux termes de taxonomie basés sur le nom de la machine à vocabulaire:

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

Pour charger l'ensemble des entités, utilisez: loadTree('categories', 0, NULL, TRUE).

Kenorb
la source
1

Si vous avez besoin d'une entité de terme, vous pouvez utiliser 'loadByProperties ()'.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
Denis Viunyk
la source
Ceci est la bonne réponse. Merci.
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
la source