You are here

views_ef_fieldset_display_extender_plugin.inc in Views Exposed Form Fieldset 7

Same filename and directory in other branches
  1. 7.2 views/views_ef_fieldset_display_extender_plugin.inc

Provides a display extender plugin for View 3.x.

File

views/views_ef_fieldset_display_extender_plugin.inc
View source
<?php

/**
 * @file
 * Provides a display extender plugin for View 3.x.
 */
class views_ef_fieldset_display_extender_plugin extends views_plugin_display_extender {
  function options_definition_alter(&$options) {
    parent::options_definition_alter($options);
    $options['views_ef_fieldset'] = array(
      'contains' => array(
        'enabled' => array(
          'default' => FALSE,
          'bool' => TRUE,
        ),
        'options' => array(),
      ),
    );
  }

  /**
   * Provide a form to edit options for this plugin.
   */
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    if ($form_state['section'] != 'exposed_form_options') {
      return;
    }
    $options = $this->display
      ->get_option('views_ef_fieldset');
    $defaults = $this
      ->option_definition();
    $form['views_ef_fieldset'] = array(
      '#tree' => TRUE,
    );
    $form['views_ef_fieldset']['enabled'] = array(
      '#type' => 'checkbox',
      '#default_value' => isset($options['enabled']) ? $options['enabled'] : $defaults['views_ef_fieldset']['enabled']['default'],
      '#title' => t('Enable fieldset around exposed forms ?'),
    );
    $form['views_ef_fieldset']['options'] = array(
      '#type' => 'fieldset',
      '#title' => t('Exposed form fieldsets'),
      '#states' => array(
        'visible' => array(
          ':input[name="views_ef_fieldset[enabled]"]' => array(
            'checked' => TRUE,
          ),
        ),
      ),
    );
    $exposed_fields = array_values($this->view->display_handler
      ->get_handlers('filter'));
    foreach ($exposed_fields as $exposed_field_index => $exposed_field) {
      if (!$exposed_field
        ->can_expose() || !$exposed_field
        ->is_exposed()) {
        unset($exposed_fields[$exposed_field_index]);
      }
    }
    $sort_fields = array_values($this->view->display_handler
      ->get_handlers('sort'));
    foreach ($sort_fields as $sort_fields_index => $sort_field) {
      if (!$sort_field
        ->can_expose() || !$sort_field
        ->is_exposed()) {
        unset($sort_fields[$sort_fields_index]);
      }
    }
    if (!empty($sort_fields)) {
      $sort_by = new Stdclass();
      $sort_by->handler_type = 'sort';
      $sort_by->options = array(
        'id' => 'sort_by',
        'expose' => array(
          'label' => 'Sort by',
        ),
      );
      $exposed_fields[] = $sort_by;
    }
    if ($form['exposed_form_options']['expose_sort_order']['#default_value'] == 1 && count($sort_fields)) {
      $sort_order = new Stdclass();
      $sort_order->handler_type = 'sort';
      $sort_order->options = array(
        'id' => 'sort_order',
        'expose' => array(
          'label' => 'Sort order',
        ),
      );
      $exposed_fields[] = $sort_order;
    }
    $submit_button = new Stdclass();
    $submit_button->handler_type = 'buttons';
    $submit_button->options = array(
      'id' => 'submit',
      'expose' => array(
        'label' => 'Submit button',
      ),
    );
    $exposed_fields[] = $submit_button;
    if ($form['exposed_form_options']['reset_button']['#default_value'] == 1) {
      $reset_button = new Stdclass();
      $reset_button->handler_type = 'buttons';
      $reset_button->options = array(
        'id' => 'reset',
        'expose' => array(
          'label' => 'Reset button',
        ),
      );
      $exposed_fields[] = $reset_button;
    }
    foreach ($exposed_fields as $exposed_field_index => $exposed_field) {
      $container = new StdClass();
      $container->handler_type = 'container';
      $container->container_type = 'fieldset';
      $container->weight = $exposed_field_index;
      $container->options = array(
        'id' => 'container-' . $exposed_field_index,
        'expose' => array(
          'label' => 'Container ' . $exposed_field_index,
        ),
      );
      $exposed_fields[] = $container;
    }
    $root_options = !empty($options['options']['sort']['root']) ? $options['options']['sort']['root'] : array();

    // Add defaults
    $root_options += array(
      'title' => t('Filters'),
      'description' => '',
      'collapsible' => TRUE,
      'collapsed' => TRUE,
      'collapsed_if_no_exposed_input' => FALSE,
      'container_type' => 'fieldset',
    );
    $data = array(
      array(
        'id' => 'root',
        'type' => 'container',
        'weight' => 0,
        'pid' => '',
        'label' => 'Root',
        'title' => $root_options['title'],
        'description' => $root_options['description'],
        'collapsible' => (bool) $root_options['collapsible'],
        'collapsed' => (bool) $root_options['collapsed'],
        'collapsed_if_no_exposed_input' => (bool) $root_options['collapsed_if_no_exposed_input'],
        'container_type' => $root_options['container_type'],
      ),
    );
    foreach ($exposed_fields as $index => $field) {
      $field_options = $options['options']['sort'][$field->options['id']];
      $label = $field->options['expose']['label'] ? $field->options['expose']['label'] : $field->options['id'];
      $data[] = array(
        'id' => $field->options['id'],
        'type' => $field->handler_type,
        'weight' => isset($field_options['weight']) ? $field_options['weight'] : (isset($field->weight) ? $field->weight : $index - count($exposed_fields)),
        'pid' => empty($field_options['pid']) ? 'root' : $field_options['pid'],
        'label' => $label,
        'title' => isset($field_options['title']) ? $field_options['title'] : $label,
        'description' => isset($field_options['description']) ? $field_options['description'] : '',
        'collapsible' => !empty($field_options['collapsible']),
        'collapsed' => !empty($field_options['collapsed']),
        'collapsed_if_no_exposed_input' => !empty($field_options['collapsed_if_no_exposed_input']),
        'container_type' => isset($field_options['container_type']) ? $field_options['container_type'] : 'fieldset',
      );
    }
    $viewsEFFieldsetData = new ViewsEFFieldsetData($data);
    $table_rows = array();
    foreach ($viewsEFFieldsetData
      ->buildFlat() as $item) {
      $item = $item['item'];
      $table_rows[$item['id']] = array(
        'weight' => array(
          '#item' => $item,
          '#type' => 'weight',
          '#title' => $item['title'],
          '#delta' => count($data),
          '#title_display' => 'invisible',
          '#default_value' => $item['weight'],
          '#attributes' => array(
            'class' => array(
              'item-weight',
            ),
          ),
        ),
        'type' => array(
          '#type' => 'hidden',
          '#default_value' => $item['type'],
        ),
        'id' => array(
          '#type' => 'hidden',
          '#default_value' => $item['id'],
          '#size' => 4,
          '#attributes' => array(
            'class' => array(
              'item-id',
            ),
          ),
        ),
        'pid' => array(
          '#type' => 'hidden',
          '#default_value' => $item['pid'],
          '#size' => 4,
          '#attributes' => array(
            'class' => array(
              'item-pid',
            ),
          ),
        ),
        'depth' => array(
          '#type' => 'hidden',
          '#default_value' => $item['depth'],
        ),
      );
      if ($item['type'] == 'container') {
        $table_rows[$item['id']] += array(
          'container_type' => array(
            '#type' => 'select',
            '#default_value' => $item['container_type'],
            '#options' => array(
              'container' => 'Container',
              'fieldset' => 'Fieldset',
              'vertical_tabs' => 'Vertical tabs',
            ),
          ),
          'title' => array(
            '#type' => 'textfield',
            '#size' => 15,
            '#default_value' => $item['title'],
          ),
          'description' => array(
            '#type' => 'textfield',
            '#size' => 15,
            '#default_value' => $item['description'],
          ),
          'collapsible' => array(
            '#type' => 'checkbox',
            '#default_value' => $item['collapsible'],
          ),
          'collapsed' => array(
            '#type' => 'checkbox',
            '#default_value' => $item['collapsed'],
          ),
          'collapsed_if_no_exposed_input' => array(
            '#type' => 'checkbox',
            '#default_value' => $item['collapsed_if_no_exposed_input'],
          ),
        );
      }
    }
    $form['views_ef_fieldset']['options']['sort'] = $table_rows;
    $form['views_ef_fieldset']['options']['sort']['#theme'][] = 'views_ef_fieldset_reorder_form';
  }
  function options_validate(&$form, &$form_state) {
    parent::options_validate($form, $form_state);
    $sort_options = array();
    if (array_key_exists('views_ef_fieldset', $form_state['values'])) {
      $sort_options = $form_state['values']['views_ef_fieldset']['options']['sort'];
    }
    if (!empty($sort_options)) {
      foreach ($sort_options as $item) {
        $parent = $sort_options[$item['pid']];
        if (is_array($parent)) {
          if ($parent['type'] != 'container') {
            form_set_error($item['id'], 'The item ' . $item['id'] . ' must be the child of a container only.');
          }
        }
      }
    }
  }
  function options_submit(&$form, &$form_state) {
    if (array_key_exists('views_ef_fieldset', $form_state['values'])) {
      $this->display
        ->set_option('views_ef_fieldset', $form_state['values']['views_ef_fieldset']);
    }
    parent::options_submit($form, $form_state);
  }

}

Classes

Namesort descending Description
views_ef_fieldset_display_extender_plugin @file Provides a display extender plugin for View 3.x.