You are here

protected function views_ef_fieldset_display_extender_plugin::options_form_arrange in Views Exposed Form Fieldset 7.2

1 call to views_ef_fieldset_display_extender_plugin::options_form_arrange()
views_ef_fieldset_display_extender_plugin::options_form in views/views_ef_fieldset_display_extender_plugin.inc
Provide a form to edit options for this plugin.

File

views/views_ef_fieldset_display_extender_plugin.inc, line 122
Provides a display extender plugin for View 3.x.

Class

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

Code

protected function options_form_arrange(&$form, &$form_state) {
  $manager = $this
    ->get_manager();
  $valid_items = $this->manager
    ->getItems();

  // Pull items either from the form cache or the view.
  $items = (array) $this
    ->get_option('items', TRUE);
  foreach ($items as $key => $item) {

    // Remove items that are no longer available.
    if (!isset($valid_items[$item['id']])) {
      unset($items[$key]);
      continue;
    }

    // Add default keys.
    $items[$key] += $valid_items[$item['id']];
  }

  // Filter items that haven't been added yet.
  $backlog_items = array_diff_key($valid_items, $items);

  // Create an option list of addable items.
  $add_item_options = array();
  foreach ($backlog_items as $item) {
    $add_item_options[$item['id']] = $item['label'];
  }
  $tree = new ViewsEFFieldsetTree($items);
  $item_list = $tree
    ->getFlattenedTree();
  $weight_delta = count($item_list);

  // Options for the (hidden) pid selects.
  $parent_options = array();
  foreach ($item_list as $item) {
    if (!empty($item['is_group'])) {
      $parent_options[$item['id']] = $item['id'];
    }
  }

  /** @noinspection PhpUndefinedFieldInspection */
  $display_title = $this->display->display->display_title;
  $form['#title'] = check_plain($display_title) . ': ' . 'Arrange filter fieldsets';
  $form['item_add'] = array(
    '#type' => 'select',
    '#options' => $add_item_options,
    '#empty_value' => '',
    '#empty_option' => t('- Add item -'),
    '#name' => 'item_add',
  );
  $form['item_add_submit'] = array(
    '#submit' => array(
      array(
        $this,
        'arrange_submit',
      ),
    ),
    '#value' => 'Add',
    '#name' => 'item_add_submit',
    '#action' => 'item_add',
  );

  // Automatically trigger a submit when an item is selected.
  $form['item_add'] += array(
    '#action' => 'item_add',
    '#submit' => array(
      array(
        $this,
        'arrange_submit',
      ),
    ),
    '#executes_submit_callback' => TRUE,
    '#ajax' => array(
      'path' => views_ui_build_form_url($form_state),
    ),
  );

  // Hide the "Add" button by using a #states condition that will never be
  // true.
  $form['item_add_submit'] += array(
    '#states' => array(
      'visible' => array(
        'select[name="item_add"]' => array(
          'value' => FALSE,
        ),
      ),
    ),
  );
  $form['items'] = array(
    '#type' => 'fieldset',
    '#title' => 'Items',
    '#theme' => 'views_ef_fieldset_reorder_form',
    '#tree' => TRUE,
  );
  foreach ($item_list as $item) {
    $item_form = array(
      '#tree' => TRUE,
      '#item' => $item,
    );
    $item_form['id'] = array(
      '#type' => 'hidden',
      '#default_value' => $item['id'],
    );
    $item_form['pid'] = array(
      '#type' => 'select',
      '#options' => $parent_options,
      '#empty_value' => '',
      '#default_value' => $item['pid'],
    );
    unset($item_form['pid']['#options'][$item['id']]);
    $item_form['weight'] = array(
      '#type' => 'weight',
      '#title' => t('Weight'),
      '#default_value' => $item['weight'],
      '#delta' => $weight_delta,
      '#title_display' => 'invisible',
    );
    $item_options = isset($item['options']) ? $item['options'] : array();
    $item_form['options'] = $manager
      ->getOptionsForm($item['id'], $item_options);
    $item_form['remove'] = array(
      '#type' => 'submit',
      '#value' => 'Remove',
      '#submit' => array(
        array(
          $this,
          'arrange_submit',
        ),
      ),
      '#action' => 'item_remove',
      // Required to reliably identify the clicked button.
      '#name' => 'item_remove_' . $item['id'],
    );
    $form['items'][$item['id']] = $item_form;
  }
}