| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | <?php/** * @file * Find, get and set full or detail term items. *//** * Find a term by its name and load it. This function manages duplicates. * * If the term has got duplicates, only first one (lower tid) will be returned. * * @note * Need to maintain a specific function and a direct query, because * taxonomy_term_load_multiple doesn't manage parents and duplicates. * db_query() is prefered, because it's four times faster than db_select(), * EntityFieldQuery and taxonomy_get_term_by_name() (these last two don't manage * parents'). Anyway terms are loaded to get all fields, specialy parents. * * @param $term *   The term object to find. It's not necessarily a standard term object. It's *   an object which needs only a name and eventually a vid, a parent id and a *   language. Of course, if tid is set, the found term is the existing one. * @param $all_vocabularies *   (Optional) Boolean. Search in all vocabularies or only in $term->vid *   vocabulary (default), which need to be set. * @param $parent_tid *   (Optional) The direct parent term id where to restrict search. *   Used for structure import. Default to NULL (no parent restriction). * * @return *   Formatted found term object, or FALSE if not found or error. */function taxonomy_csv_term_find($term, $all_vocabularies = FALSE, $parent_tid = NULL) {  if (isset($term->tid) && $term->tid) {    return taxonomy_term_load($term->tid);  }  static $flag_i18n = NULL;  if (is_NULL($flag_i18n)) {    $flag_i18n = module_exists('i18n_taxonomy');  }  if (isset($term->name)) {    $name = drupal_strtolower(trim($term->name));    // Only term id is selected, because taxonomy_term_load is used next in    // order to take advantage of taxonomy cache.    $sql = '      SELECT t.tid      FROM {taxonomy_term_data} t      INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid      WHERE :name LIKE LOWER(t.name)    ';    $args = array();    $args[':name'] = $name;    if (isset($term->vid)        && $term->vid        && !$all_vocabularies) {      $sql .= ' AND t.vid = :vid';      $args[':vid'] = $term->vid;    }    if ($flag_i18n && isset($term->language)) {      $sql .= ' AND t.language = :language';      $args[':language'] = $term->language;    }    if ($parent_tid) {      $sql .= ' AND h.parent = :parent';      $args[':parent'] = $parent_tid;    }    $sql .= ' ORDER BY t.tid ASC LIMIT 1';    $result = db_query($sql, $args)->fetchField();    if ($result) {      return taxonomy_term_load($result);    }  }  // Not found or error.  return FALSE;}/** * Find duplicate terms in a vocabulary or in all vocabularies. * * @todo * Use taxonomy_term_load_multiple or regular Drupal 7 query. * * @param $vid *  (Optional) Vocabulary to check in. * * @return *  An array of term names, indexed by tid. */function taxonomy_csv_term_find_duplicate($vid = 0) {  $terms = array();  $sql = '    SELECT t1.tid, t1.name    FROM {taxonomy_term_data} t1    LEFT OUTER JOIN {taxonomy_term_data} t2 ON t1.tid != t2.tid AND LOWER(t1.name) = LOWER(t2.name)    WHERE t2.tid IS NOT NULL  ';  $args = array();  if ($vid) {    $sql .= ' AND t1.vid = :vid AND t2.vid = :vid ';    $args[':vid'] = $vid;  }  $sql .= ' ORDER BY t1.tid ASC ';  $result = db_query($sql, $args)->fetchAllKeyed();  return $result;}/** * Return the first path to the root of a term. * * @note *   Drupal and taxonomy_csv use 'parent' property, but taxonomy_get_tree() uses *   'parents'. * * @param $term *   A term object with 'parent' property. * @param $tree *   A tree array as obtained with taxonomy_get_tree(). * * @return *   Array of term objects matching to the path of a term to its root term. *   If a term is a root term, return an empty array. */function taxonomy_csv_term_get_first_path($term, &$tree) {  $path = array();  // Items need to be ordered from 0 to get first parent easy.  if (isset($term->parent)) {    $term->parent = array_values($term->parent);  }  // Sometime, taxonomy_term_load() return a 'parents', not a 'parent'.  elseif (isset($term->parents)) {    $term->parent = $term->parents;    unset($term->parents);  }  // To use a counter prevents infinite loop when the hierarchy is inconsistent.  $i = 0;  while ($i < 100      // A term root has no parent.      && isset($term->parent)      && !empty($term->parent)      && $term->parent[0] <> 0    ) {    $tid = $term->parent[0];    if ($tid === 0) {      break;    }    // Get the full term from the tree.    foreach ($tree as $parent) {      if ($parent->tid == $tid) {        break;      }    }    if (isset($parent->parents)) {      $parent->parent = array_values($parent->parents);      unset($parent->parents);    }    $path[] = $term = $parent;    $i++;  }  // The path is reversed in order to begin with root term.  return array_reverse($path);}/** * Delete multiple terms. * * @param $tids *   An array of taxonomy term IDs. * * @return *   TRUE. */function taxonomy_csv_term_delete_multiple($tids) {  if (!is_array($tids)) {    return FALSE;  }  foreach ($tids as $tid) {    taxonomy_term_delete($tid);  }  return TRUE;}
 |