You are here

function taxonomy_csv_vocabulary_duplicate in Taxonomy CSV import/export 7.4

Same name and namespace in other branches
  1. 6.5 taxonomy_csv.vocabulary.api.inc \taxonomy_csv_vocabulary_duplicate()
  2. 6.2 taxonomy_csv.vocabulary.api.inc \taxonomy_csv_vocabulary_duplicate()
  3. 6.3 taxonomy_csv.vocabulary.api.inc \taxonomy_csv_vocabulary_duplicate()
  4. 6.4 taxonomy_csv.vocabulary.api.inc \taxonomy_csv_vocabulary_duplicate()

Duplicates a vocabulary object. If not exist, creates an empty vocabulary.

@todo To be finished.

Parameters

$vocabulary_id: Vocabulary id to duplicate.

Return value

Duplicated vocabulary object.

1 call to taxonomy_csv_vocabulary_duplicate()
_taxonomy_csv_import_vocabulary_prepare in import/taxonomy_csv.import.api.inc
Prepare a vocabulary for import.

File

./taxonomy_csv.vocabulary.api.inc, line 114
Prepare and manage vocabularies.

Code

function taxonomy_csv_vocabulary_duplicate($vocabulary_id) {
  $original_vocabulary = taxonomy_vocabulary_load($vocabulary_id);
  if ($original_vocabulary) {

    // Creates an unused name.
    // Check if name begins with 'Copy of #name' in order to serialize name.
    $name = t('Copy of [!vocabulary_name]', array(
      '!vocabulary_name' => $original_vocabulary->name,
    ));
    $name = _taxonomy_csv_vocabulary_name_create(strpos($original_vocabulary->name, $name) === FALSE ? $name : $original_vocabulary->name);

    // Duplicate original vocabulary. Relations and hierarchy are updated later.
    $duplicated_vocabulary = (object) array(
      'name' => $name,
      'machine_name' => taxonomy_csv_vocabulary_machine_name_create($name),
      'description' => $original_vocabulary->description,
      'hierarchy' => $original_vocabulary->hierarchy,
      'module' => $original_vocabulary->module,
      'weight' => $original_vocabulary->weight,
    );
    $result = taxonomy_vocabulary_save($duplicated_vocabulary);

    // Add specific fields.
    $fields = field_info_instances('taxonomy_term', $original_vocabulary->machine_name);
    foreach ($fields as $field) {
      taxonomy_csv_vocabulary_field_add($duplicated_vocabulary->machine_name, $field);
    }

    // Get all terms and attributes of original vocabulary and copy them in the
    // new one in three steps.
    $original_terms = taxonomy_term_load_multiple(array(), array(
      'vid' => $original_vocabulary->vid,
    ));

    // First step: copy each term except term reference fields (parents...).
    $duplicated_terms = array();
    foreach ($original_terms as $original_term) {

      // Check needed when vocabulary allows multiple parents.
      if (!isset($duplicated_terms[$original_term->tid])) {

        // @todo Add other non term reference fields (text...).
        $duplicated_terms[$original_term->tid] = (object) array(
          'vid' => $duplicated_vocabulary->vid,
          'name' => $original_term->name,
          'description' => $original_term->description,
          'format' => $original_term->format,
          'weight' => $original_term->weight,
        );
        $result = taxonomy_term_save($duplicated_terms[$original_term->tid]);
      }
    }

    // Second step: update duplicated terms with parents.
    foreach ($duplicated_terms as $original_tid => $duplicated_term) {
      $original_parents = taxonomy_get_parents($original_tid);
      if (count($original_parents) > 0) {
        foreach ($original_parents as $original_parent_term_id => $original_parent_term) {
          $duplicated_terms[$original_tid]->parent[] = $duplicated_terms[$original_parent_term_id]->tid;
        }
        $result = taxonomy_term_save($duplicated_terms[$original_tid]);
      }
    }

    // Third step: update duplicated terms with taxonomy_term_reference fields.
    // @todo Finish this step.
    return $duplicated_vocabulary;
  }
  return taxonomy_csv_vocabulary_create();
}