$value) {
$list_previous_values[$key] = isset($form_state['values'][$key]) ?
$form_state['values'][$key] :
variable_get("taxonomy_csv_{$key}", $value);
}
$list_export_format = _taxonomy_csv_values('export_format');
$list_export_delimiter = array(
'comma' => t('« , » (Comma)'),
'semicolon' => t('« ; » (Semicolon)'),
'tabulation' => t('« » (Tabulation)'),
'pipe' => t('« | » (Pipe)'),
'space' => t('« » (Space)'),
'currency_sign' => t('« ¤ » (Currency sign)'),
'custom_delimiter' => t('Custom delimiter'),
);
$list_export_enclosure = array(
'none' => t('None'),
'quotation' => t('« " » (Quotation mark)'),
'quote' => t("« ' » (Quote)"),
'custom_enclosure' => t('Custom enclosure'),
);
$list_export_line_ending = array(
'Unix' => t('Unix / Linux'),
'Mac' => t('Apple Mac'),
'MS-DOS' => t('Microsoft DOS'),
);
$list_export_order = array(
'name' => t('Alphabetic order'),
'weight' => t('Weight'),
'tid' => t('Internal order (tid)'),
);
// Build form.
$form = array();
$list_vocabularies = taxonomy_vocabulary_get_names();
if (count($list_vocabularies) == 0) {
$form['info'] = array(
'#type' => 'item',
'#markup' => t("As there isn't any vocabulary, nothing can be exported..."),
);
return $form;
}
// Else there are vocabularies.
$form['tab'] = array(
'#type' => 'vertical_tabs',
'#default_tab' => 'content',
);
$form['tab']['content'] = array(
'#type' => 'fieldset',
'#title' => t('1. What do you want to export?'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['tab']['content']['export_format'] = array(
'#type' => 'radios',
'#title' => 'CSV format',
'#options' => $list_export_format,
'#default_value' => $list_previous_values['export_format'],
);
$form['tab']['content']['info'] = array(
'#type' => 'item',
'#description' => t('See advanced help for informations about formats.', array('!more_help_link' => url('admin/help/taxonomy_csv'))) . '
'
. t('In all cases, you will be notified if a duplicate is found.'),
);
$form['tab']['content']['export_vocabulary_id'] = array(
'#type' => 'select',
'#title' => t('Vocabularies to export'),
'#options' => array(
0 => t('All vocabularies'),
),
'#multiple' => TRUE,
'#default_value' => $list_previous_values['export_vocabulary_id'],
'#description' => t('The vocabularies you want to export.'),
'#size' => min(12, count($list_vocabularies)) + 1,
);
foreach ($list_vocabularies as $vocabulary) {
$form['tab']['content']['export_vocabulary_id']['#options'][$vocabulary->vid] = $vocabulary->name;
}
$form['tab']['csv_format'] = array(
'#type' => 'fieldset',
'#title' => t('2. How do you want to format your CSV file?'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['tab']['csv_format']['export_delimiter'] = array(
'#type' => 'select',
'#title' => t('CSV value delimiter'),
'#options' => $list_export_delimiter,
'#default_value' => $list_previous_values['export_delimiter'],
'#description' => t('Choose the delimiter to use in the CSV file.'),
);
$form['tab']['csv_format']['export_delimiter_custom'] = array(
'#type' => 'textfield',
'#title' => 'Custom delimiter',
'#default_value' => $list_previous_values['export_delimiter_custom'],
'#size' => 2,
'#maxlength' => 1,
'#description' => t('Specify your custom delimiter.'),
'#states' => array(
'visible' => array(
':input[name=export_delimiter]' => array('value' => 'custom_delimiter'),
),
),
);
$form['tab']['csv_format']['export_enclosure'] = array(
'#type' => 'select',
'#title' => t('CSV value enclosure'),
'#options' => $list_export_enclosure,
'#default_value' => $list_previous_values['export_enclosure'],
'#description' => t('Choose the enclosure used in the CSV file you want to export. Warning: enclosure should not be used in term definitions, specially in descriptions. Furthermore, an enclosure is needed if a field contains a line ending character. Export process will stop in case of problem.'),
);
$form['tab']['csv_format']['export_enclosure_custom'] = array(
'#type' => 'textfield',
'#title' => 'Custom enclosure',
'#default_value' => $list_previous_values['export_enclosure_custom'],
'#size' => 2,
'#maxlength' => 1,
'#description' => t('Specify your custom enclosure.'),
'#states' => array(
'visible' => array(
':input[name=export_enclosure]' => array('value' => 'custom_enclosure'),
),
),
);
$form['tab']['csv_format']['export_line_ending'] = array(
'#type' => 'select',
'#title' => t('Line ending'),
'#options' => $list_export_line_ending,
'#default_value' => $list_previous_values['export_line_ending'],
'#description' => t('Choose the end of line to use.'),
);
$form['tab']['advanced_options'] = array(
'#type' => 'fieldset',
'#title' => t('3. Advanced and specific options'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['tab']['advanced_options']['export_order'] = array(
'#type' => 'select',
'#title' => t('Terms order'),
'#options' => $list_export_order,
'#default_value' => $list_previous_values['export_order'],
'#description' => t('Choose order of exported terms.'),
'#states' => array(
'invisible' => array(
':input[name=export_format]' => array('value' => TAXONOMY_CSV_FORMAT_TREE),
),
),
);
$form['tab']['advanced_options']['info'] = array(
'#type' => 'item',
'#description' => t('Specific options are shown only if suitable.'),
);
$form['tab']['advanced_options']['result_duplicates'] = array(
'#type' => 'checkbox',
'#title' => t('Show duplicate terms after export'),
'#default_value' => $list_previous_values['result_duplicates'],
'#description' => '',
);
$form['export_submit'] = array(
'#type' => 'submit',
'#value' => t('Export'),
);
$form['export_default_values'] = array(
'#type' => 'submit',
'#value' => t('Reset to defaults'),
'#validate' => array('taxonomy_csv_export_form_default_values_validate'),
'#submit' => array('taxonomy_csv_export_form_default_values_submit'),
);
return $form;
}
/**
* Handles CSV export form validation.
*
* @see taxonomy_csv_export_form()
*/
function taxonomy_csv_export_form_validate($form, &$form_state) {
// Invoke taxonomy_csv api (defines and functions).
$module_dir = drupal_get_path('module', 'taxonomy_csv');
require_once($module_dir . '/export/taxonomy_csv.export.api.inc');
$options = &$form_state['values'];
// 1. Presave a file in order to check it.
// Define vocabulary id (use simple api name of it).
$options['vocabulary_id'] = $options['export_vocabulary_id'];
$messages = _taxonomy_csv_export_output_presave($options);
// 2, Simplify values to be compatible with api checks.
// Define true delimiter.
$delimiter = array(
'comma' => ',',
'semicolon' => ';',
'tabulation' => "\t",
'pipe' => '|',
'space' => ' ',
'currency_sign' => '¤',
'custom_delimiter' => $options['export_delimiter_custom'],
);
$options['delimiter'] = $delimiter[$options['export_delimiter']];
// Define true enclosure.
$enclosure = array(
'none' => '',
'quotation' => '"',
'quote' => "'",
'custom_enclosure' => $options['export_enclosure_custom'],
);
$options['enclosure'] = $enclosure[$options['export_enclosure']];
// Define true line ending and order.
$options['line_ending'] = $options['export_line_ending'];
$options['order'] = $options['export_order'];
// 3, Make api checks and eventually update options by reference.
$messages = array_merge($messages, _taxonomy_csv_export_check_options($options));
// Use form set error for api errors.
foreach (array(
'vocabulary_id' => 'export_vocabulary_id',
'delimiter' => 'export_delimiter',
'enclosure' => 'export_enclosure',
'line_ending' => 'export_line_ending',
'order' => 'export_order',
) as $key => $value) {
if (isset($message[$key])) {
$message[$value] = $message[$key];
unset($message[$key]);
}
}
// 4. Make non api checks.
if (($options['export_delimiter'] == 'custom_delimiter')
&& (empty($options['export_delimiter_custom']))) {
$messages['export_delimiter_custom'] = t('You choose to use a custom delimiter, but your delimiter is empty.');
}
if (($options['export_enclosure'] == 'custom_enclosure')
&& (empty($options['export_enclosure_custom']))) {
$messages['export_enclosure_custom'] = t('You choose to use a custom enclosure, but your enclosure is empty.');
}
if (($options['export_delimiter'] == 'custom_delimiter')
&& (drupal_strlen($options['export_delimiter_custom']) > 1)) {
$messages['export_delimiter_custom'] = t('Delimiter should have only one character.');
}
if (($options['export_enclosure'] == 'custom_enclosure')
&& (drupal_strlen($options['export_enclosure_custom']) > 1)) {
$messages['export_enclosure_custom'] = t('Enclosure should have only zero or one character.');
}
// 5. Finish validatation of form.
foreach ($messages as $item => $message) {
form_set_error(check_plain($item), filter_xss($message));
}
}
/**
* Validate options of exported vocabulary.
*
* @param $options
* An associative array of options.
*
* @return
* Array of messages errors if any.
* By reference options are cleaned and completed.
*/
function _taxonomy_csv_export_check_options(&$options) {
$messages = array();
if ($options['export_format'] == TAXONOMY_CSV_FORMAT_TRANSLATE && !module_exists('i18n_taxonomy')) {
$messages['export_format'] = t('You cannot use Translations if i18n_taxonomy is not enabled.');
}
$list_vocabularies = taxonomy_get_vocabularies();
if (!$list_vocabularies) {
$messages['vocabulary_id'] = t('No vocabulary to export.');
}
elseif ($options['vocabulary_id']) {
// Replace machine name with vocabulary id.
if (!(is_numeric($options['vocabulary_id']) || is_array($options['vocabulary_id']))) {
$vocabulary = taxonomy_vocabulary_machine_name_load($options['vocabulary_id']);
$options['vocabulary_id'] = array($vocabulary->vid);
}
// Replace vocabulary_id by an array if only one item is selected.
elseif (!is_array($options['vocabulary_id'])) {
$options['vocabulary_id'] = array($options['vocabulary_id']);
}
if ((count($options['vocabulary_id']) > 1) && in_array(0, $options['vocabulary_id'])) {
$messages['vocabulary_id'] = t('You choose to export all vocabularies, but you select some individual vocabularies too.');
}
foreach ($options['vocabulary_id'] as $item) {
if (($item != 0) && !isset($list_vocabularies[$item])) {
$messages['vocabulary_id'] = t("You choose to export a vocabulary, but it doesn't exist.");
}
}
}
// Delimiter and enclosure greater than one character are forbidden.
if (drupal_strlen($options['delimiter']) != 1) {
$messages['delimiter'] = t('Delimiter should be a one character string.');
}
if (drupal_strlen($options['enclosure']) > 1) {
$messages['enclosure'] = t('Enclosure lenght cannot be greater than one character.');
}
if ($options['delimiter'] == $options['enclosure']) {
$messages['delimiter'] = t('Delimiter and enclosure cannot be same character.');
}
if (!in_array($options['line_ending'], array(
'Unix',
'Mac',
'MS-DOS',
))) {
$messages['line_ending'] = t('Line ending should be "Unix", "Mac" or "MS-DOS".');
}
if (!in_array($options['order'], array(
'name',
'tid',
'weight',
))) {
$messages['order'] = t('Order should be "name", "tid" or "weight".');
}
// Calculates number of terms to be exported.
$options['total_terms'] = taxonomy_csv_vocabulary_count_terms($options['vocabulary_id']);
if (!$options['total_terms']) {
$messages['vocabulary_id'] = t('Vocabulary has no term to export. Export finished.');
}
return $messages;
}
/**
* Handles CSV export form submission and launch batch set.
*
* @see taxonomy_csv_export_form()
*/
function taxonomy_csv_export_form_submit($form, &$form_state) {
// Remember last preferences and prepare only options to be sent to api.
foreach (array(
'export_format',
'export_vocabulary_id',
'export_delimiter',
'export_delimiter_custom',
'export_enclosure',
'export_enclosure_custom',
'export_line_ending',
'export_order',
'result_duplicates',
) as $option) {
variable_set('taxonomy_csv_' . $option, $form_state['values'][$option]);
$options[$option] = $form_state['values'][$option];
}
// Finish to prepare $options. Unset useless options for api.
unset($options['export_vocabulary_id']);
unset($options['export_delimiter']);
unset($options['export_delimiter_custom']);
unset($options['export_enclosure']);
unset($options['export_enclosure_custom']);
unset($options['export_line_ending']);
unset($options['export_order']);
$options['delimiter'] = $form_state['values']['delimiter'];
$options['enclosure'] = $form_state['values']['enclosure'];
$options['line_ending'] = $form_state['values']['line_ending'];
$options['order'] = $form_state['values']['order'];
$options['file'] = $form_state['values']['file'];
$options['vocabulary_id'] = $form_state['values']['vocabulary_id'];
$options['check_options'] = FALSE; // Already done.
$options['result_display'] = TRUE;
// Prepares process batch (will be automatically processed when returns).
taxonomy_csv_vocabulary_export($options);
}
/**
* Restore recommended default values in the export form. Empty validate hook.
*/
function taxonomy_csv_export_form_default_values_validate($form, &$form_state) {
}
/**
* Restore recommended default values in the export form.
*/
function taxonomy_csv_export_form_default_values_submit($form, &$form_state) {
foreach (_taxonomy_csv_values('export_default_ui') as $option => $value) {
variable_set("taxonomy_csv_$option", $value);
}
unset($form_state['values']);
unset($form_state['storage']);
drupal_set_message(t('Export options have been reset to default.'));
}