web-dev-qa-db-fra.com

Comment puis-je obtenir le terme parent dans une taxonomie avec une hiérarchie?

J'ai un nœud qui est étiqueté avec un terme de taxonomie qui fait partie d'une hiérarchie de termes tels que "état >> comté".

Comme l'utilisateur a sélectionné l'une des balises "comté", comment puis-je obtenir le nom du terme parent?

5
Arosboro

Vous pouvez interroger la base de données vous-même ou utiliser la fonction API: taxonomy_get_parents

Comme vous pouvez avoir plusieurs parents, il peut être plus simple de simplement interroger la base de données vous-même:

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

Mise à jour - Pourquoi je pense que la requête ci-dessus est intelligente dans Drupal 6

Certains (kiamlaluno) diraient qu'il est incorrect d'utiliser l'argument ci-dessus pour db_query Dans Drupal 6

Dans Drupal 6 Vous pouvez utiliser db_query de trois manières:

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

Tout ce qui précède retournera la même chose, il n'y a donc pas de différence fonctionnelle en utilisant une au-dessus. Pourquoi alors vous demandez-vous, est-ce que je pense qu'il est intelligent d'utiliser le dernier?

Si vous regardez comment Drupal 7 fonctionne, vous verrez:

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

Drupal 7 nécessite que les arguments de requête soient formatés d'une manière spéciale. Ce que vous ne pouvez pas voir dans cet exemple, c'est que le SQL doit également être modifié. Au lieu d'utiliser des espaces réservés comme %d, Vous devez utiliser des espaces réservés comme :arg1. Ainsi, bien que la dernière des 3 Drupal 6 façons d'utiliser db_query soit la plus verbeuse, elle vous fera économiser beaucoup de travail, si vous avez besoin de mettre à niveau votre module Drupal 6 vers Drupal 7. Ce qui pourrait arriver dans un an, où vous ne vous souvenez pas de ce que vous faisiez et pourquoi.

Mais à la fin de la journée, c'est juste une préférence personnelle, car dans les deux cas, cela fonctionnera très bien.

2
googletorp

taxonomy_get_parents () renvoie tous les termes parents du terme de taxonomie avec l'ID passé en argument.
La valeur renvoyée par la fonction est un tableau ayant la structure suivante:

 tableau (
 'term id' => [objet de terme de taxonomie] 
) 

L'objet terme de taxonomie contient une propriété pour chacun des champs contenus dans la table "term_data".

Le code utilisé à partir de la fonction est essentiellement le suivant.

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

Comme vous le voyez, il ne retourne pas les termes parents des termes parents de celui passé en argument. Pour cela, vous avez besoin de taxonomy_get_parents_all () , qui exécute le code suivant.

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

La fonction renvoie tous les termes parents de la hiérarchie.

5
kiamlaluno