it-swarm.it

Come posso ottenere il termine genitore in una tassonomia con una gerarchia?

Ho un nodo che è taggato con un termine di tassonomia che fa parte di una gerarchia di termini come "stato >> contea".

Poiché l'utente ha selezionato uno dei tag "contea", come posso ottenere il nome del termine principale?

5
Arosboro

Puoi interrogare tu stesso il database, oppure puoi usare la funzione API: taxonomy_get_parents

Dal momento che potresti avere diversi genitori, potrebbe essere più semplice eseguire una query sul database da solo:

$tid = ? // the tid of the county term
$parent_tid = db_result(db_query("SELECT parent FROM {term_hierarchy} WHERE tid = %d;",
  array(':tid' => $tid)
));
$parent_term = taxonomy_get_term($parent_tid);

Aggiornamento - Perché penso che la query sopra sia intelligente in Drupal 6

Alcuni (kiamlaluno) sostengono che è sbagliato usare l'argomento sopra per db_query In Drupal 6

In Drupal 6 È possibile utilizzare db_query in tre modi:

$query = db_query($sql, $arg1, $arg2, $arg3);
$query = db_query($sql, array($arg1, $arg2, $arg3));
$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));

Tutto quanto sopra restituirà la stessa cosa, quindi non ci sono differenze funzionali usando uno sopra l'altro. Perché allora potresti chiedere, penso che sia intelligente usare l'ultimo?

Se guardi come Drupal 7 lo vedrai:

$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));

Drupal 7 richiede che gli argomenti della query siano formattati in modo speciale. Quello che non puoi vedere in questo esempio è che anche l'SQL deve essere cambiato. Invece di utilizzare segnaposto come %d Devi utilizzare segnaposto come :arg1. Quindi, mentre il secondo dei 3 Drupal 6 modi di usare db_query è il più dettagliato, ti farà risparmiare un sacco di lavoro, se dovessi aggiornare il tuo modulo Drupal 6 a Drupal 7. Che potrebbe accadere in un anno, in cui non ricordi cosa stavi facendo e perché.

Ma alla fine, è solo una preferenza personale, poiché entrambi i modi funzioneranno bene.

2
googletorp

taxonomy_get_parents () restituisce tutti i termini principali per il termine tassonomia con l'ID passato come argomento.
Il valore restituito dalla funzione è un array avente la seguente struttura:

 array (
 'term id' => [oggetto termine tassonomia] 
) 

Il termine oggetto tassonomia contiene una proprietà per ciascuno dei campi contenuti nella tabella "term_data".

Il codice utilizzato dalla funzione è essenzialmente il seguente.

$result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_hierarchy} h ON h.parent = t.tid WHERE h.tid = %d ORDER BY weight, name', 't', 'tid'), $tid);
$parents = array();
while ($parent = db_fetch_object($result)) {
  $parents[$parent->$key] = $parent;
}

Come vedi, non restituisce i termini principali dei termini principali di quello passato come argomento. Per questo è necessario taxonomy_get_parents_all () , che esegue il seguente codice.

  if ($tid) {
    $parents[] = taxonomy_get_term($tid);
    $n = 0;
    while ($parent = taxonomy_get_parents($parents[$n]->tid)) {
      $parents = array_merge($parents, $parent);
      $n++;
    }
  }

La funzione restituisce tutti i termini principali nella gerarchia.

5
kiamlaluno