Obtener términos de taxonomía

16

Quería recuperar términos de taxonomía de cierto vocabulario en Drupal 8.

Aparentemente todavía puedo hacerlo usando, taxonomy_get_treepero está en desuso.

Ahora tengo que usar TermStorageInterface :: loadTree

Estoy tratando de acceder a esta función desde un Blockpero no entiendo cómo crear una instancia de la TermStorageInterfaceclase.

Intenté acceder a la función directamente pero no es una función estática:

TermStorageInterface::loadTree('categories')

Traté de crear instancias de la clase pero me dijo Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

No entiendo cómo funciona esta clase y cómo puedo acceder a los enlaces de taxonomía. Creo que me falta una gran parte de entender cómo funciona Drupal.

Romain Braun
fuente

Respuestas:

38

Reemplazar una función obsoleta es en la mayoría de los casos trivial. Solo míralo. Allí puedes ver esto:

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

Si está buscando una función que ya se eliminó, búsquela en Cambiar registros para la página principal de Drupal . Casi todas las funciones que se eliminaron deberían tener más o menos (generalmente más) instrucciones detalladas sobre cómo hacerlo en Drupal 8.

La clase de almacenamiento es un controlador de almacenamiento de entidades, que se obtiene a través del administrador de entidades. En general, el 99% de las clases en D8 no están diseñadas para ser creadas por usted mismo, sino como un complemento de servicio o manejador de entidades.

Por ejemplo:

$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
fuente
Genial, gracias. ¿Aunque no entiendo dónde encontraste esa línea de código?
Romain Braun
Como dije, eso se copia directamente de taxonomy_get_tree (). Una función obsoleta significa que hay una nueva forma de hacer algo, pero la función anterior todavía tiene que funcionar.
Berdir el
Oh ok Increíble. Ya lo veo. ¡Muchas gracias por su ayuda!
Romain Braun
Ahora no funciona, he cambiado la función obsoleta a entityTypeManager, pero después de getStorage no obtengo loadTree.
Bhanu Prakash Ryaga
2
@ usethe23 ¿Implementar qué? Esto se trata de reemplazar una llamada de función en desuso por el nuevo enfoque. No hace nada que no haya hecho antes. Probablemente necesite crear una nueva pregunta y describir lo que quiere hacer.
Berdir
8

Esto es lo que uso para crear una lista de etiquetas:

  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
fuente
Busqué esto durante media hora ... es tan complicado y no tiene sentido ... y ¿qué pasa si solo quiero el alias de URL del término de taxonomía, cómo obtengo eso?
Raf A.
1
Hola raf Decidí publicar esto, porque también tuve dificultades para llegar a una tarea tan simple como esta. Para obtener el alias: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren
5

El error que está recibiendo es porque está tratando de crear una instancia de una interfaz, que no es algo que PHP permita. Las interfaces PHP describen los métodos que las clases deberían implementar para casos específicos, pero no pueden usarse para crear un objeto, por ejemplo con new InterfaceName().

Ahora que taxonomy_get_tree()se ha eliminado y el servicio del administrador de entidades ha quedado en desuso, debe utilizar el siguiente código.

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

No es necesario usarlo, \Drupal::getContainer()ya que \Drupalexpone un método auxiliar para obtener el servicio de administrador de tipo de entidad.

kiamlaluno
fuente
3

Cargar usando el nombre de máquina del vocabulario (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
fuente
2

\ Drupal :: entityManager () ahora está en desuso, así que esto funcionó para mí

$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
fuente
1
entityManager está en desuso porque se divide en 11 clases, drupal.org/node/2337191 , así que use \ Drupal :: entityTypeManager en su lugar y debería ser bueno.
ognockocaten
Cada vez que tenga que cargar múltiples y bucles hasta obtener el específico que desea, llamo a ese código de mierda fwiw
AlxVallejo
2

Acabo de escribir una función, siéntase libre de editar y usar :) Necesitaba la identificación del término, pero puede devolver lo que quiera.

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
fuente
Podría estar equivocado, pero esto no parece ser del todo correcto. $query->conditiondespués $query->execute()no tiene efecto. Además, si el primer término no es el correcto, el foreach devolverá nulo en lugar de verificar el siguiente término. (Para su caso de uso, ¿podría utilizar taxonomy_term_load_multiple_by_name en su lugar?)
Neograph734
Ops, sí, lo siento, copié el código antiguo, lo edito
Czeglédi Dávid
Bueno y sí, otra forma es correcta, como dijiste, para que sea mejor usar eso.
Czeglédi Dávid
1

Aquí está el ejemplo D8 de cómo acceder a términos de taxonomía basados ​​en el nombre de la máquina de vocabulario:

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

Para cargar el conjunto de entidades, utilice: loadTree('categories', 0, NULL, TRUE).

kenorb
fuente
1

Si necesita un término entidad, puede usar 'loadByProperties ()'.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
Denis Viunyk
fuente
Esta es la respuesta correcta. Gracias.
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
fuente