t('Vocabularies'),
'can_create' => user_access('administer taxonomy'),
'create' => 'node_import_create_taxonomy',
);
// Import taxonomy terms.
foreach ((array)$vocabularies as $vid => $vocabulary) {
$types['term:'. $vid] = array(
'title' => t('Terms of %name vocabulary', array('%name' => $vocabulary->name)),
'vocabulary' => $vocabulary,
'can_create' => user_access('administer taxonomy'),
'create' => 'node_import_create_taxonomy',
);
}
return $types;
}
/**
* Create a new vocabulary or term by submitting the corresponding
* form.
*/
function node_import_create_taxonomy($type, $values, $preview) {
$output = $preview ? '' : FALSE;
if ($preview) {
if ($type == 'vocabulary') {
$node_types = array();
foreach ($values['nodes'] as $node_type => $enabled) {
if ($enabled) {
$node_types[] = check_plain(node_get_types('name', $node_type));
}
}
$output .= '
';
$output .= '
'. check_plain($values['name']) .'
';
$output .= '
'. filter_xss_admin($values['description']) .'
';
$output .= '
';
$output .= '- '. t('Help text') .'
';
$output .= '- '. check_plain($values['help']) .'
';
$output .= '- '. t('Content types') .'
';
$output .= '- '. implode('
- ', $node_types) .'
';
$output .= '- '. t('Settings') .'
';
$settings = array();
if ($values['tags']) $settings[] = t('Tags');
if ($values['multiple']) $settings[] = t('Multiple select');
if ($values['required']) $settings[] = t('Required');
if ($values['hierarchy'] == 1) $settings[] = t('Single hierarchy');
if ($values['hierarchy'] == 2) $settings[] = t('Multiple hierarchy');
$output .= '- '. implode('
- ', $settings) .'
';
$output .= '- '. t('Weight') .'
';
$output .= '- '. check_plain($values['weight']) .'
';
$output .= '
';
$output .= '
';
}
else {
$output .= '';
$output .= '
'. check_plain($values['name']) .'
';
$output .= '
'. filter_xss_admin($values['description']) .'
';
if (!empty($values['parent'])) {
$output .= '
'. t('Parent:') .' ';
$output .= node_import_display_taxonomy_term($values['parent']) .'
';
}
if (!empty($values['relations']) || !empty($values['synonyms'])) {
$output .= '
';
if (!empty($values['relations'])) {
$output .= '- '. t('Related terms:') .'
';
$output .= '- '. implode('
- ', array_map('node_import_display_taxonomy_term', (array)$values['relations'])) .'
';
}
if (!empty($values['synonyms'])) {
$output .= '- '. t('Synonyms:') .'
';
$output .= '- '. implode('
- ', array_map('check_plain', (array)$values['synonyms'])) .'
';
}
$output .= '
';
}
$output .= '
';
// If a term is created and a later term refers to it (as relation
// or parent), we get an error in preview. In order to avoid this
// we manually add the (will-be-created) term to the checking
// function.
$types = node_import_types();
$vocabulary = $types[$type]['vocabulary'];
$field = array('vocabulary' => $vocabulary);
node_import_check_taxonomy_term($values['name'], $field, array(), $preview, 'add');
}
}
else {
module_load_include('inc', 'taxonomy', 'taxonomy.admin');
$values['op'] = t('Save');
$form_state = array(
'values' => $values,
);
if ($type == 'vocabulary') {
node_import_drupal_execute('taxonomy_form_vocabulary', $form_state);
$output = $form_state['vid'];
}
else {
$types = node_import_types();
$vocabulary = $types[$type]['vocabulary'];
node_import_drupal_execute('taxonomy_form_term', $form_state, $vocabulary);
$output = $form_state['tid'];
// As a term can refer to other terms (parent, relation), we
// can not continue if we have created a term.
global $node_import_can_continue;
$node_import_can_continue = FALSE;
}
}
return $output;
}
/**
* Display a taxonomy term during preview.
*/
function node_import_display_taxonomy_term($tid) {
static $output;
if (!isset($output)) {
$output = array();
}
if (!isset($output[$tid])) {
if ($tid === 0) {
$output[$tid] = theme('placeholder', t('The term will be created during import'));
}
else if (($term = taxonomy_get_term($tid))) {
$output[$tid] = l($term->name, 'taxonomy/term/'. $tid);
}
else {
$output[$tid] = theme('placeholder', $tid);
}
}
return $output[$tid];
}
/**
* Implementation of hook_node_import_fields().
*/
function taxonomy_node_import_fields($type) {
$fields = array();
// Import taxonomy vocabularies.
if ($type == 'vocabulary') {
$fields['name'] = array(
'title' => t('Vocabulary name'),
'group' => t('Identification'),
'module' => 'taxonomy',
'map_required' => TRUE,
'default_value' => '',
);
$fields['description'] = array(
'title' => t('Description'),
'group' => t('Identification'),
'module' => 'taxonomy',
'default_value' => '',
);
$fields['help'] = array(
'title' => t('Help text'),
'group' => t('Identification'),
'module' => 'taxonomy',
'default_value' => '',
);
$fields['nodes'] = array(
'title' => t('Content types'),
'group' => t('Content types'),
'module' => 'taxonomy',
'has_multiple' => TRUE,
'is_checkboxes' => TRUE,
'allowed_values' => node_get_types('names'),
);
$fields['tags'] = array(
'title' => t('Tags'),
'group' => t('Settings'),
'module' => 'taxonomy',
'input_format' => 'boolean',
);
$fields['multiple'] = array(
'title' => t('Multiple select'),
'group' => t('Settings'),
'module' => 'taxonomy',
'input_format' => 'boolean',
);
$fields['required'] = array(
'title' => t('Required'),
'group' => t('Settings'),
'module' => 'taxonomy',
'input_format' => 'boolean',
);
$fields['weight'] = array(
'title' => t('Weight'),
'group' => t('Settings'),
'module' => 'taxonomy',
'input_format' => 'weight',
);
$fields['hierarchy'] = array(
'title' => t('Hierarchy'),
'group' => t('Advanced settings'),
'module' => 'taxonomy',
'allowed_values' => array(
'0' => t('Disabled'),
'1' => t('Single'),
'2' => t('Multiple'),
),
);
}
// Import taxonomy terms.
else if (strpos($type, 'term:') === 0) {
$types = node_import_types();
$vocab = $types[$type]['vocabulary'];
$fields['vid'] = array(
'is_mappable' => FALSE,
'default_value' => $vocab->vid,
);
$fields['name'] = array(
'title' => t('Term name'),
'group' => t('Identification'),
'module' => 'taxonomy',
'map_required' => TRUE,
'default_value' => '',
);
$fields['description'] = array(
'title' => t('Description'),
'group' => t('Identification'),
'module' => 'taxonomy',
'default_value' => '',
);
$fields['parent'] = array(
'title' => t('Parents'),
'group' => t('Advanced options'),
'module' => 'taxonomy',
'has_multiple' => FALSE, // Although all vocabs in Drupal6.x allow for multiple parents, we only allow one.
'has_hierarchy' => TRUE,
'input_format' => 'taxonomy_term',
'vocabulary' => $vocab,
);
$fields['relations'] = array(
'title' => t('Related terms'),
'group' => t('Advanced options'),
'module' => 'taxonomy',
'has_multiple' => TRUE,
'has_hierarchy' => TRUE,
'input_format' => 'taxonomy_term',
'vocabulary' => $vocab,
);
$fields['synonyms'] = array(
'title' => t('Synonyms'),
'group' => t('Advanced options'),
'module' => 'taxonomy',
'has_multiple' => TRUE,
'multiple_separator' => ',',
);
$fields['weight'] = array(
'title' => t('Weight'),
'group' => t('Advanced options'),
'module' => 'taxonomy',
'input_format' => 'weight',
);
}
// Import taxonomy terms for nodes.
else if (($node_type = node_import_type_is_node($type)) !== FALSE) {
// Copy from taxonomy_form_alter().
$c = db_query(db_rewrite_sql("SELECT v.* FROM {vocabulary} v INNER JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE n.type = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $node_type);
while ($vocabulary = db_fetch_object($c)) {
$fields['taxonomy:'. $vocabulary->vid] = array(
'title' => $vocabulary->name,
'group' => t('Vocabularies'),
'module' => 'taxonomy',
'input_format' => 'taxonomy_term',
'vocabulary' => $vocabulary,
'has_multiple' => $vocabulary->multiple || $vocabulary->tags,
'has_hierarchy' => $vocabulary->hierarchy > 0,
'multiple_separator' => $vocabulary->tags ? ',' : '||',
);
}
}
return $fields;
}
/**
* Implementation of hook_node_import_fields_alter().
*/
function taxonomy_node_import_fields_alter(&$fields, $type) {
foreach ($fields as $fieldname => $fieldinfo) {
if ($fieldinfo['input_format'] == 'taxonomy_term') {
$vocab = $fieldinfo['vocabulary'];
if (!$vocab->tags) {
$fields[$fieldname]['preprocess'][] = 'node_import_check_taxonomy_term';
}
$fields[$fieldname]['tips'][] = t('Taxonomy term (by tid, name or synonym).');
}
}
}
/**
* Check if the value is a valid taxonomy term (by tid or name).
*
* Uses: $field['vocabulary'].
*
* @ingroup node_import_preprocess
*/
function node_import_check_taxonomy_term(&$value, $field, $options, $preview, $op = 'lookup') {
static $tids;
$vocab = $field['vocabulary'];
if ($vocab->tags) {
// No need to check when tags vocabulary.
return TRUE;
}
// We cache the terms already looked up.
if (!isset($tids)) {
$tids = array();
}
if (!isset($tids[$vocab->vid])) {
$tids[$vocab->vid] = array();
}
$store_value = is_array($value) ? implode("\n", array_map('drupal_strtolower', $value)) : drupal_strtolower($value);
// Special case for previews: signify that the term will be created.
if ($op == 'add') {
$tids[$vocab->vid][$store_value] = 0;
return;
}
if (isset($tids[$vocab->vid][$store_value])) {
// We have looked up this value already.
$value = $tids[$vocab->vid][$store_value];
}
else if (!is_array($value)) {
// One term specified, look up the tid or give error.
if (($tid = db_result(db_query("SELECT tid FROM {term_data} WHERE vid = %d AND (tid = %d OR LOWER(name) = '%s')", $vocab->vid, (is_numeric($store_value) && intval($store_value) > 0) ? $store_value : -1, $store_value))) ||
($tid = db_result(db_query("SELECT td.tid FROM {term_synonym} AS ts, {term_data} AS td WHERE td.tid = ts.tid AND td.vid = %d AND LOWER(ts.name) = '%s'", $vocab->vid, $store_value)))) {
$value = $tid;
}
else {
$value = '';
}
}
else if (count($value) == 1) {
// The user has specified the term as a hierarchy trail, but he
// only specified one parent. Lookup that value.
$value = array_shift($value);
node_import_check_taxonomy_term($value, $field, $options, $preview);
}
else {
// The user has specified the term as a hierarchy trail of terms.
// Example: array(grandparent, parent, child). We need to find
// the tid of the child.
//
// Pop child.
// Find a parent_tid for array(grandparent, parent).
// Find a tid for child that has a parent with parent_tid.
$child = array_pop($value);
$child = drupal_strtolower($child);
node_import_check_taxonomy_term($value, $field, $options, $preview);
if ($value === 0 || $value === '') {
// We can't look for a proper child as we did not find a proper
// parent (or the parent will be created). So stop.
}
else if (($tid = db_result(db_query("SELECT td.tid FROM {term_data} td, {term_hierarchy} th WHERE td.vid = %d AND th.parent = %d AND td.tid = th.tid AND (td.tid = %d OR LOWER(td.name) = '%s')", $vocab->vid, $value, (is_numeric($child) && intval($child) > 0) ? $child : -1, $child))) ||
($tid = db_result(db_query("SELECT td.tid FROM {term_data} td, {term_hierarchy} th, {term_synonym} ts WHERE td.vid = %d AND th.parent = %d AND td.tid = th.tid AND td.tid = ts.tid AND LOWER(ts.name) = '%s'", $vocab->vid, $value, $child)))) {
$value = $tid;
}
else {
$value = '';
}
}
$tids[$vocab->vid][$store_value] = $value;
// Report error.
if ($value === 0) {
drupal_set_message(t('The term %value will be added to %vocabulary during import and will be used for %name.', array('%value' => $value, '%name' => $field['title'], '%vocabulary' => $vocab->name)));
}
else if ($value === '') {
node_import_input_error(t('Input error: %value is not allowed for %name (not a term or synonym in %vocabulary).', array('%value' => $value, '%name' => $field['title'], '%vocabulary' => $vocab->name)));
return FALSE;
}
return TRUE;
}
/**
* Implementation of hook_node_import_defaults().
*/
function taxonomy_node_import_defaults($type, $defaults, $fields, $map) {
$form = array();
// Import taxonomy vocabularies.
if ($type == 'vocabulary') {
$form['nodes'] = array(
'#type' => 'checkboxes',
'#title' => t('Content types'),
'#default_value' => isset($defaults['nodes']) ? $defaults['nodes'] : array(),
'#options' => array_map('check_plain', node_get_types('names')),
);
$options = array(
'tags' => t('Tags'),
'multiple' => t('Multiple select'),
'required' => t('Required'),
);
foreach ($options as $key => $title) {
$form[$key] = array(
'#title' => $title,
'#type' => 'radios',
'#options' => array('0' => t('No'), '1' => t('Yes')),
'#default_value' => isset($defaults[$key]) ? $defaults[$key] : '0',
);
}
$form['weight'] = array(
'#title' => t('Weight'),
'#type' => 'weight',
'#default_value' => isset($defaults['weight']) ? $defaults['weight'] : 0,
);
$form['hierarchy'] = array(
'#title' => t('Hierarchy'),
'#type' => 'radios',
'#options' => array('0' => t('Disabled'), '1' => t('Single'), '2' => t('Multiple')),
'#default_value' => isset($defaults['hierarchy']) ? $defaults['hierarchy'] : '0',
);
}
// Import taxonomy terms.
else if (strpos($type, 'term:') === 0) {
$types = node_import_types();
$vocab = $types[$type]['vocabulary'];
$form['vocabulary'] = array(
'#type' => 'item',
'#title' => t('Vocabulary'),
'#value' => check_plain($vocab->name),
);
$options = array();
foreach (taxonomy_get_tree($vocab->vid) as $term) {
$choice = new stdClass();
$choice->option = array($term->tid => str_repeat('-', $term->depth). $term->name);
$options[] = $choice;
}
if ($vocab->hierarchy > 0) {
$form['parent'] = array(
'#type' => 'select',
'#title' => t('Parents'),
'#multiple' => $vocab->hierarchy == 2,
'#options' => array_merge(array('' => '<'. t('root') .'>'), $options),
'#default_value' => isset($defaults['parent']) ? $defaults['parent'] : '',
);
}
$form['relations'] = array(
'#type' => 'select',
'#title' => t('Related terms'),
'#multiple' => TRUE,
'#options' => array_merge(array('' => '<'. t('none') .'>'), $options),
'#default_value' => isset($defaults['relations']) ? $defaults['relations'] : '',
);
$form['synonyms'] = array(
'#type' => 'textarea',
'#title' => t('Synonyms'),
'#default_value' => isset($defaults['synonyms']) ? $defaults['synonyms'] : '',
);
$form['weight'] = array(
'#title' => t('Weight'),
'#type' => 'textfield',
'#size' => 6,
'#default_value' => isset($defaults['weight']) ? $defaults['weight'] : 0,
);
}
// Import taxonomy terms for nodes.
else if (($node_type = node_import_type_is_node($type)) !== FALSE) {
// Copy from taxonomy_form_alter().
$c = db_query(db_rewrite_sql("SELECT v.* FROM {vocabulary} v INNER JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE n.type = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $node_type);
while (($vocabulary = db_fetch_object($c))) {
if ($vocabulary->tags) {
$form['taxonomy:'. $vocabulary->vid] = array(
'#type' => 'textfield',
'#title' => $vocabulary->name,
'#default_value' => isset($defaults['taxonomy:'. $vocabulary->vid]) ? $defaults['taxonomy:'. $vocabulary->vid] : '',
'#autocomplete_path' => 'taxonomy/autocomplete/'. $vocabulary->vid,
);
}
else {
$form['taxonomy:'. $vocabulary->vid] = taxonomy_form($vocabulary->vid, isset($defaults['taxonomy:'. $vocabulary->vid])? $defaults['taxonomy:'. $vocabulary->vid] : 0);
}
}
}
return $form;
}
/**
* Implementation of hook_node_import_options().
*/
function taxonomy_node_import_options($type, $options, $fields, $map) {
$form = array();
return $form; //TODO: reenable this.
// Import taxonomy terms for nodes.
if (($node_type = node_import_type_is_node($type)) !== FALSE) {
// Copy from taxonomy_form_alter().
$c = db_query(db_rewrite_sql("SELECT v.* FROM {vocabulary} v INNER JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE n.type = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $node_type);
$create_options = array(
'create' => t('create it') .',',
'remove' => t('remove it from the selection') .',',
'error' => t('treat it as an import error') .'.',
);
if (user_access('administer taxonomy')) {
$create_default = 'create';
}
else {
unset($create_options['create']);
$create_default = 'error';
}
while (($vocabulary = db_fetch_object($c))) {
$field = 'taxonomy:'. $vocabulary->vid;
if (isset($map[$field]) && !empty($map[$field])) {
if (!$vocabulary->tags) {
$form[$field] = array(
'#title' => $vocabulary->name,
'non_existing_terms' => array(
'#title' => t('When a term does not exist'),
'#type' => 'radios',
'#options' => $create_options,
'#default_value' => isset($options[$field]['non_existing_terms']) ? $options[$field]['non_existing_terms'] : $create_default,
),
);
}
}
}
}
return $form;
}
/**
* Implementation of hook_node_import_values_alter().
*/
function taxonomy_node_import_values_alter(&$values, $type, $defaults, $options, $fields, $preview) {
if (strpos($type, 'term:') === 0) {
if (!$preview) {
$values['synonyms'] = implode("\n", (array)$values['synonyms']);
$values['parent'] = array($values['parent']);
}
}
else if (($node_type = node_import_type_is_node($type)) !== FALSE) {
$taxonomy = isset($values['taxonomy']) ? $values['taxonomy'] : array();
foreach ($fields as $fieldname => $fieldinfo) {
if (strpos($fieldname, 'taxonomy:') === 0) {
$vocab = $fieldinfo['vocabulary'];
if ($vocab->tags) {
$taxonomy['tags'] = isset($taxonomy['tags']) ? $taxonomy['tags'] : array();
$taxonomy['tags'][$vocab->vid] = implode(',', (array)$values[$fieldname]);
}
else {
$taxonomy[$vocab->vid] = $values[$fieldname];
}
unset($values[$fieldname]);
}
}
$values['taxonomy'] = $taxonomy;
}
}