| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 | <?php/** * @file * Prepare and manage vocabularies. *//** * Creates vocabulary by its name and returns vocabulary object. * * @param $name *   (Optional) Name of vocabulary to create. * * @return *   Created vocabulary object. */function taxonomy_csv_vocabulary_create($name = '') {  $name = _taxonomy_csv_vocabulary_name_create($name);  // Create an empty vocabulary with default Drupal 7 fields.  // Hierarchy is updated later.  $vocabulary = (object) array(    'name'         => $name,    'machine_name' => taxonomy_csv_vocabulary_machine_name_create($name),    'description'  => t('Vocabulary created automatically by Taxonomy csv import/export module'),    'hierarchy'    => 2,    'module'       => 'taxonomy',    'weight'       => 0,  );  $result = taxonomy_vocabulary_save($vocabulary);  return $vocabulary;}/** * Helper to create an unused vocabulary name from a string. */function _taxonomy_csv_vocabulary_name_create($name = '') {  $name = preg_replace('/.csv$/', '', trim(basename(strval($name))));  $name = (drupal_strlen($name) == 0) ?    t('Auto created vocabulary') :    // Limit to 250 characters.    drupal_substr($name, 0, 250);  // Invent a unused vocabulary name.  if (taxonomy_csv_vocabulary_name_check($name)      || taxonomy_csv_vocabulary_machine_name_check(taxonomy_csv_vocabulary_machine_name_create($name))) {    for (      $i = 2;      (taxonomy_csv_vocabulary_name_check("$name $i"))      || taxonomy_csv_vocabulary_machine_name_check(taxonomy_csv_vocabulary_machine_name_create("$name $i"));      $i++) {    }    $name = "$name $i";  }  return $name;}/** * Creates a machine name from a string. * * The name is created by replacing non alphanumeric character by an underscore. * Machine name is defined as first 16 cleaned characters of name and a random * five characters serial. Fields module prepends 'taxonomy_' to name and check * if total lenght is 21 characters max. * * @param $name *   The string to process. * * @return *   The processed string. */function taxonomy_csv_vocabulary_machine_name_create($name) {  // Get last vid.  $vid = 1 + db_query('SELECT max(vid) FROM {taxonomy_vocabulary}')->fetchField();  $machine_name = drupal_substr(preg_replace('/_+/i', '_', preg_replace('/[^a-z0-9\\_]/i', '_', drupal_strtolower(trim(strval($name))))), 0, 16) . $vid . '_' . strval(rand(10000, 99999));  return drupal_substr($machine_name, 0, 21);}/** * Checks if a name is a vocabulary machine_name. */function taxonomy_csv_vocabulary_machine_name_check($name) {  return (taxonomy_vocabulary_machine_name_load($name) != FALSE);}/** * Check if a name is a vocabulary name. */function taxonomy_csv_vocabulary_name_check($name) {  return (taxonomy_vocabulary_load_multiple(FALSE, array('name' => $name)) != FALSE);}/** * Return an array of all term ids of a given vocabulary. * * @param $vid *   The vocabulary id from where to fetch term ids. * * @return *   Array of term ids. */function taxonomy_csv_vocabulary_get_tids($vid) {  // Tids are available in drupal_static('taxonomy_get_tree:terms'), but we  // prefer to use an entity query to avoid issue with cache, if not updated.  $query = new EntityFieldQuery;  $query    ->entityCondition('entity_type', 'taxonomy_term')    ->propertyCondition('vid', $vid)  ;  $result = $query->execute();  return (isset($result['taxonomy_term'])) ?    array_keys($result['taxonomy_term']) :    array();}/** * Return an array of all full terms of a given vocabulary. * * @param $vid *   The vocabulary id from where to fetch term ids. * * @return *   Array of full term. */function taxonomy_csv_vocabulary_get_terms($vid) {  $result = taxonomy_csv_vocabulary_get_tids($vid);  return taxonomy_term_load_multiple($result);}/** * Calculate number of terms in a vocabulary or in all vocabularies. * * @param $vocabulary_id *   (Optional) Id or array of ids of the chosen vocabularies. If not specified, *   count terms in all vocabularies. * * @return *   Number of terms in specified vocabularies or in all vocabularies. */function taxonomy_csv_vocabulary_count_terms($vocabulary_id = 0) {  if (!is_array($vocabulary_id)) {    $vocabulary_id = array($vocabulary_id);  }  $sql = "    SELECT COUNT(*)    FROM {taxonomy_term_data}  ";  $args = array();  if (($vocabulary_id != array(0)) && ($vocabulary_id != array('0'))) {    $sql .= ' WHERE vid IN (:vid) ';    $args[':vid'] = $vocabulary_id;  }  $result = db_query($sql, $args)->fetchField();  return $result;}/** * Add or create a field to attach to a vocabulary. * * @param $vocabulary_machine_name *   Vocabulary machine_name. * @param $field *   Field array to attach. * * @return *   TRUE if success, FALSE else. */function taxonomy_csv_vocabulary_field_attach($vocabulary_machine_name, $field) {  // Check if vocabulary exist.  $vocabulary = taxonomy_vocabulary_machine_name_load($vocabulary_machine_name);  if ($vocabulary) {    // Check if field exists in order to create or to update it.    // No other check is made.    $prior_field = field_info_field($field['field_name']);    // The field doesn't exist, so creates it.    if (empty($prior_field)) {      $field = field_create_field($field);    }    // The field exists: check if an update is needed. Update is needed only    // with taxonomy_term_reference, because this type requires to use specific    // vocabularies.    elseif ($field['type'] == 'taxonomy_term_reference') {      $flag = FALSE;      foreach ($prior_field['settings']['allowed_values'] as $allowed_values) {        // Don't add new allowed values if they exist already.        if ($allowed_values == $field['settings']['allowed_values'][0]) {          $flag = TRUE;          break;        }      }      if (!$flag) {        $prior_field['settings']['allowed_values'][] = $field['settings']['allowed_values'][0];        $result = field_update_field($prior_field);      }      $field = field_info_field($field['field_name']);    }    // The field exists and doesn't need to be updated.    // Field is already created, so use it.    else {      $field = $prior_field;    }    // Check if field is already instanced to vocabulary so attach it if needed.    $prior_instance = field_info_instance('taxonomy_term', $field['field_name'], $vocabulary->machine_name);    if (empty($prior_instance)) {      $result = field_create_instance(array(        'field_name'  => $field['field_name'],        'entity_type' => 'taxonomy_term',        'bundle'      => $vocabulary->machine_name,        'label'       => (isset($field['label']) ? $field['label'] : $field['field_name']),        'description' => (isset($field['description']) ? $field['description'] : ''),      ));    }    return TRUE;  }  return FALSE;}
 |