You are here

function entityreference_multiple_field_formatter_settings_form in Entity reference multiple display 7

Implements hook_field_formatter_settings_form().

File

./entityreference_multiple.module, line 35
Extend entity reference formatter with an option to separate elements display with specific view_modes.

Code

function entityreference_multiple_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];

  // do not interfer with entityreference
  if ($display['type'] == 'entityreference_entity_multiple_view') {
    $entity_info = entity_get_info($field['settings']['target_type']);
    $options = array();
    if (!empty($entity_info['view modes'])) {
      foreach ($entity_info['view modes'] as $view_mode => $view_mode_settings) {
        $options[$view_mode] = $view_mode_settings['label'];
      }
    }
    if (count($options) > 1) {

      // Build settings form
      $element['view_mode_number'] = array(
        '#type' => 'select',
        '#options' => drupal_map_assoc(range(1, 10)),
        '#title' => t('Number of groups'),
        '#default_value' => $settings['view_mode_number'],
        '#ajax' => array(
          'callback' => 'entityreference_multiple_callback',
          'wrapper' => 'view_mode_multiple_' . $field['field_name'],
          'method' => 'replace',
          'effect' => 'fade',
        ),
        '#attributes' => array(
          // add rel to get field name for ajax callback
          'rel' => $field['field_name'],
          'alt' => t('Enter a number of group to split display.'),
          'title' => t('Enter a number of group to split display.'),
        ),
      );

      // container needed for ajax call
      $element['view_mode_multiple'] = array(
        '#type' => 'container',
        '#attributes' => array(
          'id' => array(
            'view_mode_multiple_' . $field['field_name'],
          ),
        ),
      );

      // Ajax logic: if a values is set we need to handle it
      if (isset($form_state['values']['fields'][$field['field_name']]['settings_edit_form']['settings']['view_mode_number'])) {
        $group_number = $form_state['values']['fields'][$field['field_name']]['settings_edit_form']['settings']['view_mode_number'];
      }
      else {
        $group_number = $settings['view_mode_number'];
      }

      // Build settings for each group
      for ($i = 1; $i <= $group_number; $i++) {
        $element['view_mode_multiple']['view_mode_' . $i] = array(
          '#type' => 'select',
          '#options' => $options,
          '#title' => t('View mode group !num', array(
            '!num' => $i,
          )),
          '#default_value' => $settings['view_mode_multiple']['view_mode_' . $i],
          '#prefix' => '<div class="limit-float">',
          '#suffix' => '</div>',
        );
        $element['view_mode_multiple']['view_mode_' . $i . '_number'] = array(
          '#type' => 'textfield',
          '#title' => t('Elements'),
          '#size' => 2,
          '#maxlength' => 2,
          '#default_value' => $settings['view_mode_multiple']['view_mode_' . $i . '_number'],
          '#required' => TRUE,
          '#element_validate' => array(
            'entityreference_multiple_number_validate',
          ),
          '#prefix' => '<div class="limit-float">',
          '#suffix' => '</div><div class="clearfix"></div>',
          '#attributes' => array(
            'alt' => t('Enter a number to limit the number of items concerned by this mode, fill # for all items left, so it should be used only for the last group.'),
            'title' => t('Enter a number to limit the number of items concerned by this mode, fill # for all items left, so it should be used only for the last group.'),
          ),
        );
        $element['view_mode_multiple']['view_mode_' . $i . '_links'] = array(
          '#type' => 'checkbox',
          '#title' => t('Show links'),
          '#default_value' => $settings['view_mode_multiple']['view_mode_' . $i . '_links'],
        );
      }
    }
    return $element;
  }
}