You are here

content_taxonomy_tree.module in Content Taxonomy 6

Same filename and directory in other branches
  1. 6.2 content_taxonomy_tree.module

File

content_taxonomy_tree.module
View source
<?php

/**
 * Implementation of hook_theme().
 */
function content_taxonomy_tree_theme() {
  return array(
    'content_taxonomy_tree' => array(
      'arguments' => array(
        'element' => NULL,
      ),
    ),
  );
}

/**
 * Implementation of hook_widget_info().
 */
function content_taxonomy_tree_widget_info() {
  return array(
    'content_taxonomy_tree' => array(
      'label' => t('Tree'),
      'field types' => array(
        'content_taxonomy',
      ),
      'multiple values' => CONTENT_HANDLE_MODULE,
      'callbacks' => array(
        'default value' => CONTENT_CALLBACK_DEFAULT,
      ),
    ),
  );
  return $items;
}

/**
 * Implementation of hook_widget_settings
 */
function content_taxonomy_tree_widget_settings($op, $widget) {
  switch ($op) {
    case 'form':
      $form['settings'] = array(
        '#type' => 'fieldset',
        '#title' => t('Settings for Trees'),
        '#collapsible' => TRUE,
        '#weight' => 10,
      );
      $form['settings']['expand_all'] = array(
        '#type' => 'checkbox',
        '#title' => t('Expand whole tree by default'),
        '#default_value' => isset($widget['expand_all']) ? $widget['expand_all'] : 0,
        '#description' => t('Otherwise only branches, where a term is selected get expanded by default'),
      );
      return $form;
    case 'save':
      return array(
        'expand_all',
      );
  }
}

/**
 * Implementation of hook_elements().
 */
function content_taxonomy_tree_elements() {
  return array(
    'content_taxonomy_tree' => array(
      '#input' => TRUE,
      '#columns' => array(
        'value',
      ),
      '#delta' => 0,
      '#process' => array(
        'content_taxonomy_tree_process',
      ),
      '#element_validate' => array(
        'content_taxonomy_tree_validate',
      ),
      '#autocomplete_path' => FALSE,
    ),
  );
}

/**
 * Implementation of hook_widget().
 */
function content_taxonomy_tree_widget(&$form, &$form_state, $field, $items, $delta = NULL) {
  $element = array(
    '#type' => 'content_taxonomy_tree',
    '#default_value' => !empty($items) ? $items : array(),
  );
  return $element;
}

/**
 * Processes the content_taxonomy_tree form element
 *
 * uses the 'taxonomy_manager_tree' element type
 */
function content_taxonomy_tree_process($element, $edit, &$form_state, $form) {
  $field_name = $element['#field_name'];
  $field = $form['#field_info'][$field_name];
  $field_key = $element['#columns'][0];
  if (is_array($element['#value'])) {
    if (array_key_exists($field_key, $element['#value'])) {

      //validation function where values are set haven't been called yet for this form element

      //because some other element might have caused an validation error

      //so we have to do the processing of the values here
      if ($field['multiple']) {
        $selected_terms = _taxonomy_manager_tree_get_selected_terms($element['#value']['value']);
        $element['#value'] = content_transpose_array_rows_cols(array(
          $field_key => array_values($selected_terms),
        ));
      }
    }
    $element['#value'] = content_taxonomy_tree_data2form($element, $element['#value'], $field);
  }
  $element[$field_key] = array(
    '#type' => 'taxonomy_manager_tree',
    '#default_value' => isset($element['#value']) ? $element['#value'] : '',
    '#vid' => $field['vid'],
    '#parent' => content_taxonomy_field_get_parent($field),
    '#default_value' => is_array($element['#value']) ? $element['#value'] : array(),
    '#render_whole_tree' => TRUE,
    '#pager' => FALSE,
    '#add_term_info' => FALSE,
    '#expand_all' => $field['widget']['expand_all'],
    '#tree_is_required' => $field['required'],
    //using tree_is_required instead of required, prevents that error messages are shown twice
    '#required' => FALSE,
    '#multiple' => isset($field['multiple']) ? $field['multiple'] : FALSE,
    '#field_name' => $element['#field_name'],
    '#delta' => $element['#delta'],
    '#columns' => $element['#columns'],
    '#title' => $element['#title'],
    '#description' => $element['#description'],
  );

  // Make sure field info will be available to the validator which
  // does not get the values in $form.
  $form_state['#field_info'][$field['field_name']] = $field;
  return $element;
}

/**
 * Validation function for the content_taxonomy_tree element
 *
 * assigns the selected terms to the element
 * additionally checks if terms are selected for required fields (if this check isn't already done by form.inc)
 */
function content_taxonomy_tree_validate($element, &$form_state) {
  $field = $form_state['#field_info'][$element['#field_name']];
  $field_key = $element['#columns'][0];
  $values = content_taxonomy_tree_form2data($element, $form_state, $field);

  //check for required fields

  //if $element['#value'] is empty, it's validated by form.inc

  //otherwise we have to check this by our own
  if ($field['required'] && is_null($values[0]['value']) && !empty($element['#value'])) {
    form_error($element[$field_key], t('!name field is required.', array(
      '!name' => $element['#title'],
    )));
  }
  if ($field['multiple'] >= 2 && count($element['#value']) > $field['multiple']) {
    form_error($element[$field_key], t('%name: this field cannot hold more than @count values.', array(
      '%name' => t($field['widget']['label']),
      '@count' => $field['multiple'],
    )));
  }
  form_set_value($element, $values, $form_state);
}

/**
 * Helper function to transpose the values as stored in the database
 * to the format the content_taxonomy_tree needs to select the values
 */
function content_taxonomy_tree_data2form($element, $values, $field) {
  $terms = array();
  foreach ($values as $delta => $entry) {
    if ($entry['value']) {
      $terms[] = $entry['value'];
    }
  }
  return $terms;
}

/**
 * Helper function to transpose the values returned by submitting the content_taxonomy_tree
 * to the format to be stored in the field
 */
function content_taxonomy_tree_form2data($element, &$form_state, $field) {
  $field_key = $element['#columns'][0];
  $selected_terms = $form_state['values'][$element['#field_name']][$field_key]['selected_terms'];
  if (!is_array($selected_terms) || !count($selected_terms)) {
    $selected_terms[] = NULL;
  }
  $form_state['#field_info'][$field['field_name']] = $field;
  return content_transpose_array_rows_cols(array(
    $element['#columns'][0] => array_values($selected_terms),
  ));
}

/**
 * FAPI theme for content_taxonomy_tree
 *
 * element already rendered by taxonomy_manager_tree
 */
function theme_content_taxonomy_tree($element) {
  return $element['#children'];
}

Functions

Namesort descending Description
content_taxonomy_tree_data2form Helper function to transpose the values as stored in the database to the format the content_taxonomy_tree needs to select the values
content_taxonomy_tree_elements Implementation of hook_elements().
content_taxonomy_tree_form2data Helper function to transpose the values returned by submitting the content_taxonomy_tree to the format to be stored in the field
content_taxonomy_tree_process Processes the content_taxonomy_tree form element
content_taxonomy_tree_theme Implementation of hook_theme().
content_taxonomy_tree_validate Validation function for the content_taxonomy_tree element
content_taxonomy_tree_widget Implementation of hook_widget().
content_taxonomy_tree_widget_info Implementation of hook_widget_info().
content_taxonomy_tree_widget_settings Implementation of hook_widget_settings
theme_content_taxonomy_tree FAPI theme for content_taxonomy_tree