You are here

hser.module in Hierarchical Select 7.3

Allows hierarchical select to be used with entity reference fields.

File

modules/hser/hser.module
View source
<?php

/**
 * @file
 * Allows hierarchical select to be used with entity reference fields.
 */

/**
 * Implements hook_field_widget_info().
 */
function hser_field_widget_info() {
  return array(
    'hser_hierarchy' => array(
      'label' => t('Hierarchical Select'),
      'field types' => array(
        'entityreference',
      ),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
      ),
      'settings' => array(
        'editable' => FALSE,
      ),
    ),
  );
}

/**
 * Implements hook_field_widget_settings_form().
 */
function hser_field_widget_settings_form($field, $instance) {
  $widget = $instance['widget'];
  $settings = $widget['settings'] + field_info_widget_settings($widget['type']);
  $form = array();
  if ($widget['type'] == 'hser_hierarchy') {
    $form['editable'] = array(
      '#type' => 'checkbox',
      '#title' => t('Editable'),
      '#default_value' => $settings['editable'],
      '#description' => t('Select this to allow users to use the hierarchical select widget to create new terms in the selected vocabulary.'),
    );
  }
  return $form;
}

/**
 * Implements hook_field_widget_form().
 */
function hser_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  if ($field['settings']['target_type'] == 'taxonomy_term') {
    $vocabularies = $field['settings']['handler_settings']['target_bundles'];
    if (count($vocabularies) == 1 && ($vocabulary = taxonomy_vocabulary_machine_name_load(reset($vocabularies)))) {
      $default_value = array();
      foreach ($items as $item) {
        $default_value[] = $item['target_id'];
      }
      $element += array(
        '#type' => 'hierarchical_select',
        '#size' => 1,
        '#default_value' => $default_value,
        '#element_validate' => array(
          '_hser_element_validate',
        ),
        '#required' => $instance['required'],
        '#config' => array(
          'module' => 'hs_taxonomy',
          'params' => array(
            'vid' => $vocabulary->vid,
          ),
          'save_lineage' => FALSE,
          'enforce_deepest' => FALSE,
          'resizable' => FALSE,
          'level_labels' => array(
            'status' => FALSE,
          ),
          'dropbox' => array(
            'status' => $field['cardinality'] != 1,
            'limit' => $field['cardinality'],
          ),
          'editability' => array(
            'status' => $instance['widget']['settings']['editable'],
            'allow_new_levels' => TRUE,
            'max_levels' => 0,
          ),
          'entity_count' => array(
            'enabled' => 0,
            'require_entity' => 0,
            'settings' => array(
              'count_children' => 0,
              'entity_types' => array(),
            ),
          ),
          'render_flat_select' => FALSE,
        ),
      );
      return $element;
    }
  }

  // If we reach this point, we decided that hierarchical_select would not be
  // appropriate for some reason (not taxonomy, no vocabulary selected, etc).
  // So instead we fall back to a normal select widget.
  $instance['widget']['type'] = 'options_select';
  return options_field_widget_form($form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
}

/**
 * Element validation callback for field widget hierarchical select element.
 */
function _hser_element_validate($element, &$form_state, $form) {
  $value = array();
  foreach ($element['#value'] as $delta => $target_id) {
    $value[$delta]['target_id'] = $target_id;
  }
  form_set_value($element, $value, $form_state);
  if ($element['#required'] && (!isset($form_state['submit_handlers'][0]) || $form_state['submit_handlers'][0] !== 'hierarchical_select_ajax_update_submit')) {
    if (!count($element['#value']) || is_string($element['#value']) && strlen(trim($element['#value'])) == 0 || array_key_exists(0, $element['#value']) && !$element['#value'][0]) {
      form_error($element, t('!name field is required.', array(
        '!name' => $element['#title'],
      )));
      _hierarchical_select_form_set_error_class($element);
    }
  }
}

/**
 * Implements hook_node_validate().
 *
 * Temporary workaround for https://drupal.org/node/1293166 - remove when that
 * bug is fixed.
 */
function hser_node_validate($node, $form, &$form_state) {
  if (arg(0) == 'hierarchical_select_ajax') {
    form_set_error('');
  }
}

Functions

Namesort descending Description
hser_field_widget_form Implements hook_field_widget_form().
hser_field_widget_info Implements hook_field_widget_info().
hser_field_widget_settings_form Implements hook_field_widget_settings_form().
hser_node_validate Implements hook_node_validate().
_hser_element_validate Element validation callback for field widget hierarchical select element.