Ottieni termini di tassonomia


16

Volevo recuperare i termini della tassonomia da un certo vocabolario in Drupal 8.

Apparentemente posso ancora farlo usando taxonomy_get_treema è deprecato.

Ora devo usare TermStorageInterface :: loadTree

Sto provando ad accedere a questa funzione da un Blockma non capisco come creare un'istanza della TermStorageInterfaceclasse.

Ho provato ad accedere direttamente alla funzione ma non è una funzione statica:

TermStorageInterface::loadTree('categories')

Ho provato ad istanziare la lezione, ma mi ha detto Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Non capisco come funziona questa classe e come posso accedere ai collegamenti di tassonomia. Penso che mi stia perdendo gran parte della comprensione di come funziona Drupal.

Risposte:


38

Sostituire una funzione deprecata è nella maggior parte dei casi banale. Basta guardarlo. Lì puoi vedere questo:

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

Se stai cercando una funzione che è già stata rimossa, cercala nella pagina Modifica record per Drupal core . Praticamente ogni funzione che è stata rimossa dovrebbe avere più o meno (di solito più) istruzioni dettagliate su come farlo in Drupal 8 invece.

La classe di archiviazione è un gestore di archiviazione entità, che si ottiene tramite il gestore entità. In generale, il 99% delle classi in D8 non è pensato per essere creato da te, ma come un plug-in di servizio o gestore di entità.

Per esempio:

$vid = 'vocabulary_name';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
 $term_data[] = array(
  'id' => $term->tid,
  'name' => $term->name
 );
}

Ottimo grazie. Anche se non capisco dove hai trovato quella riga di codice?
Romain Braun,

Come ho già detto, questo è copiato da taxonomy_get_tree (). Una funzione deprecata significa che esiste un nuovo modo di fare qualcosa, ma la vecchia funzione deve ancora funzionare.
Berdir,

Oh va bene. Eccezionale. Ora lo vedo. Grazie mille per il tuo aiuto!
Romain Braun,

Ora non funziona, ho cambiato la funzione obsoleta in entityTypeManager, ma dopo getStorage non ricevo loadTree.
Bhanu Prakash Ryaga,

2
@ usethe23 Implementare cosa? Si tratta solo di sostituire una chiamata di funzione obsoleta con il nuovo approccio. Non fa nulla che non abbia già fatto prima. Probabilmente dovrai creare una nuova domanda e descrivere cosa vuoi fare.
Berdir,

8

Questo è quello che uso per creare un elenco di tag:

  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;

Ho cercato mezz'ora per questo ... è così complicato e non ha senso ... e se volessi solo l'alias URL del termine tassonomia, come posso ottenerlo?
Raf A.

1
Ciao Raf. Ho deciso di pubblicare questo, perché ho anche avuto difficoltà a raggiungere un compito così semplice come questo. Per ottenere solo l'alias: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren,

5

L'errore che stai ricevendo è perché stai provando a creare un'istanza di un'interfaccia, cosa che PHP non consente. Le interfacce PHP descrivono i metodi che le classi dovrebbero implementare per casi specifici, ma non possono essere utilizzate per creare un oggetto, ad esempio con new InterfaceName().

Ora che taxonomy_get_tree()è stato rimosso e il servizio di gestione entità è stato deprecato, è necessario utilizzare il seguente codice.

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

Non è necessario utilizzare \Drupal::getContainer()poiché \Drupalespone un metodo di supporto per ottenere il servizio di gestione del tipo di entità.


3

Caricare usando il nome macchina del vocabolario (video):

  $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 :: entityManager () ora è deprecato, quindi ha funzionato per me

$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
entityManager è deprecato perché diviso in 11 classi - drupal.org/node/2337191 - quindi usa \ Drupal :: entityTypeManager invece e dovresti essere bravo.
ognockocaten,

Ogni volta che devi caricare Multiple e loop fino a quando non ottieni quello specifico che desideri, chiamo quel codice di merda fwiw
AlxVallejo

2

Ho appena scritto una funzione, sentiti libero di modificare e usare :) Avevo bisogno dell'id del termine, ma puoi restituire quello che vuoi.

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

Potrei sbagliarmi, ma questo sembra non essere del tutto giusto. $query->conditiondopo $query->execute()non ha alcun effetto. Inoltre, se il primo termine non è quello giusto, il foreach restituirà null anziché controllare il termine successivo. (Per il tuo caso d'uso, potresti essere in grado di usare taxonomy_term_load_multiple_by_name invece?)
Neograph734

Ops, sì, scusa, ho copiato il vecchio codice, scusa, lo modifico
Czeglédi Dávid,

Bene, sì, come hai detto, è giusto che sia meglio usarlo.
Czeglédi Dávid,

1

Ecco l'esempio D8 su come accedere ai termini della tassonomia in base al nome della macchina del vocabolario:

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

Per caricare l'intera entità, utilizzare: loadTree('categories', 0, NULL, TRUE).


1

Se hai bisogno di un termine entità, puoi usare 'loadByProperties ()'.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);

Questa è la risposta corretta Grazie.
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);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.