Come posso ottenere un elenco di tutti i termini di tassonomia assegnati a un nodo?


13

Ho un nodo e voglio ottenere tutti i termini di tassonomia assegnati al nodo.

In drupal 6 ho potuto usare $node->taxonomye le taxonomy_*funzioni ma queste non esistono in drupal 7.

Risposte:


21

I termini della tassonomia sono implementati nei campi in Drupal 7. Supponendo che tu abbia definito un campo di tassonomia chiamato field_category per il tuo tipo di contenuto, puoi accedervi come:

$language = 'und'; // or will be provided by some Drupal hooks
foreach ($node->field_category[$language] as $delta => $value) {
  $term = taxonomy_term_load($value['tid']);
}

Se non si ha accesso al nome del campo, probabilmente il modo più semplice per i nodi è interrogare direttamente il database:

$results = db_query('SELECT tid FROM {taxonomy_index} WHERE nid = :nid', array(':nid' => $node->nid));
foreach ($results as $result) {
  $term = taxonomy_term_load($result->tid);
}

Tieni presente, tuttavia, che potresti finire per trattare un miscuglio di termini da diversi vocabolari se hai più di un campo di tassonomia.


Cosa succede se non conosco il nome del campo tassonomia? I nomi differiranno tra i tipi di contenuto e voglio ottenere tutti i termini per qualsiasi nodo.
Rwky,

1
Aggiunto un metodo se non si conosce il nome del campo.
keithm,

4
Soprattutto nella seconda versione, è possibile utilizzare taxonomy_term_load_multiple($results->fetchCol());per caricare i termini in una singola query.
Berdir,

1
Oh, e puoi usare field_get_items('node', $node, 'field_category')per ottenere i campi nella lingua corretta.
Berdir,

Nota la tecnica select from taxonomy_index funziona solo con nodi pubblicati. Quella tabella non viene mantenuta per il contenuto non pubblicato.
Dave Cohen,

2

Ecco un modo molto generico per afferrare tutti i termini senza specificare i nomi dei campi e senza db_query:

function example_get_terms($node) {
  $terms = array();

  foreach (field_info_instances('node', $node->type) as $fieldname => $info) {
    foreach (field_get_items('node', $node, $fieldname) as $item) {
      if (is_array($item) && !empty($item['tid']) && $term = taxonomy_term_load($item['tid'])) {
        $terms[] = $term->name;
      }
    }
  }
  return $terms;
}

Per i principianti di Drupal, aggiungerei if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}per ottenere nide $node = node_load($nid);per far funzionare la tua funzione.
Sébastien Gicquel,
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.