web-dev-qa-db-fra.com

Obtenez les termes de taxonomie

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

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

Je dois maintenant utiliser TermStorageInterface :: loadTree

J'essaie d'accéder à cette fonction à partir d'un Block mais je ne comprends pas comment instancier la classe TermStorageInterface.

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.

17
Romain Braun

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 Modifier les enregistrements pour Drupal core page. Presque toutes les fonctions qui ont été supprimées devraient avoir plus ou des instructions moins (généralement plus) détaillées sur la façon de le faire dans Drupal 8 à la place.

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
 );
}
38
Berdir

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;
9
Stef Van Looveren

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

Maintenant que 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 \Drupal Expose une méthode d'assistance pour obtenir le service de gestionnaire de type d'entité.

5
kiamlaluno

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);
  }
3
Achraf JEDAY

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);}
    }
}
2
Czeglédi Dávid

\ 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;
  }
}
2
badzilla

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]);
1
Denis Viunyk

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 les entités entières, utilisez: loadTree('categories', 0, NULL, TRUE) .

1
kenorb
$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);
0
Wasim Khan