Добавление опции "Все" в фильтр открытых представлений


У меня есть фильтр просмотра, который позволяет выбирать несколько элементов. Он основан на "Допустимых значениях" для многозначного поля CCK.

Открытый фильтр выглядит следующим образом:

Option 1
Option 2
Option 3

Мне нужно добавить опцию "Все" вверху, чтобы это было:

All
Option 1
Option 2
Option 3

Нажатие на опцию Все должно иметь тот же эффект, что и удержание Ctrl и нажатие на опции 1, 2 и 3. т.Е. Вернуть все узлы, которые имеют значение опции 1, Опции 2 или Вариант 3 для этого поля.

Как я могу добавить такую опцию в свой виджет? Я уверен, что это можно было бы как-то сделать с помощью form_alter, но я не могу понять, как это сделать.

 5
Author: Tom Kirkpatrick, 2011-05-14

8 answers

ХОРОШО... Я думаю, что, возможно, я взломал его.

function mymodule_form_alter(&$form, $form_state, $form_id) { 
  if ($form_state['view']->name == 'myview') {
    // Add our custom All buttons.
    $form['myfield']['#options'] = array("-ALL-" => t("- All -")) + $form['myfield']['#options'];
    array_unshift($form['#submit'], 'mymodule_exposed_form_submit');
  }
}

function mymodule_exposed_form_submit(&$form, &$form_state) { 
  if (!empty($form_state['values']['myfield']['-ALL-'])) {
    $options = $form['myfield']['#options'];
    unset($options['-ALL-']);
    $form_state['values']['myfield'] = $options;
  }
}

Поэтому в основном я добавляю свой пункт "Все" в верхней части выбора. Затем я добавляю свой собственный обработчик отправки перед обработчиком представлений.

В моем обработчике отправки я проверяю наличие опции "Все", и если она найдена, я настраиваю выбранные параметры так, чтобы были выбраны все параметры, кроме опции "Все".

Кажется, работает:)

 10
Author: Tom Kirkpatrick, 2011-05-14 23:29:08

Вы можете просто добавить такой же незащищенный фильтр с вашими параметрами:

Option 1
Option 2
Option 3

Тогда опция "Все" в открытом фильтре покажет результаты только для этих трех параметров.

 2
Author: yarroha, 2011-09-20 08:19:12

В моем случае (Просмотр открытого фильтра терминов таксономии) Мне пришлось отменить выбор всех вариантов, чтобы получить -Все-. Не знаю, почему это так работает для меня.

function mymodule_exposed_form_submit(&$form, &$form_state) { 
  if (!empty($form_state['values']['myfield']['-ALL-'])) {
    $form_state['values']['myfield'] = array();
  }
}
 2
Author: Jean-Pierre Dautricourt, 2018-08-18 00:46:44

Я думаю, что вы не можете сделать это по умолчанию, однако вы можете использовать модуль, который был создан специально для улучшения доступных фильтров. Это называется Улучшенные фильтры.

 1
Author: F1234k, 2011-05-14 17:07:47

Я сделал два очень уродливых решения.

Предполагая, что у вас есть значение по умолчанию для распечатки всех значений, вы можете взломать опцию в своем шаблоне вывода на дисплей (тот, который основан на views-view.tpl.php). Пример

<?php if ($attachment_before): ?>
  <div class="attachment attachment-before">
  <?php $attachment_before = str_replace('<div class="view-content">',                                     
   '<div class="view-content"><div class="views-summary views-summary-unformatted"><a href="/glossary/all">All</a></div>', $attachment_before); ?>

    <?php print $attachment_before; ?>
  </div>
<?php endif; ?>

Другой метод, по сути, делает то же самое с jQuery.

 1
Author: mpdonadio, 2011-05-14 18:03:56

Если открытый фильтр обозначен как множественный и необязательный, выбор всех или ни одного из параметров дает одинаковые результаты. Одним из вариантов было бы упомянуть об этом в тексте справки по фильтру. Другой вариант - установить улучшенные фильтры и включить ссылку "Выбрать все/нет", которая, не изменяя функциональность фильтра, предоставит вашим пользователям более интуитивно понятный интерфейс.

 1
Author: mikeker, 2011-05-18 23:13:33

Том Киркпатрик был прав, однако вместо добавления всех параметров вы также можете удалить все параметры, чтобы значение состояния формы было пустым. Это также показывает все значения по умолчанию и немного чище:

function mymodule_form_alter(&$form, $form_state, $form_id) { 
  if ($form_state['view']->name == 'myview') {
    // Add our custom All buttons.
    $form['myfield']['#options'] = array("-ALL-" => t("- All -")) + $form['myfield']['#options'];
    array_unshift($form['#submit'], 'mymodule_exposed_form_submit');
  }
}

function mymodule_exposed_form_submit(&$form, &$form_state) { 
  $myfield_values = $form_state->getValue('myfield');
  if (!empty($myfield_values) && isset($myfield_values['-ALL-'])) {
    $form_state->set('myfield', []);
    $form_state->setValue('myfield', []);
  }
}
 1
Author: Flyke, 2017-03-24 09:48:08

По крайней мере, для Drupal 8 (я не знаю, применимо ли это также и для D7), Улучшенные открытые фильтры дают вам возможность "Добавить ссылки выбрать все/нет" в ваш открытый фильтр. Версия BEF, которую я использую: 8.x-3.0

Чтобы добавить эту опцию в свой открытый фильтр, перейдите в свое представление, откройте панель "Дополнительно" > "Лучшие открытые фильтры" > "Настройки", и под каждым открытым фильтром вы найдете свернутую панель с надписью "ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ ДЛЯ "[ИМЯ_ПОЛЯ]" (МЕТКА ФИЛЬТРА: "[МЕТКА]")".

Выберите флажок с надписью "Добавить"Выбрать все/Нет" в:

"Добавьте ссылку "Выбрать все/Нет" при отображении открытого фильтра с помощью флажков. Если эта опция отключена, отредактируйте фильтр и установите флажок "Разрешить множественный выбор"."

!Проблема, которую я заметил при выборе этого параметра "Все", заключается в том, что он продолжает обновлять страницу, когда в форме включена автоматическая отправка. Но, если вам не нужна эта функциональность, похоже, она работает как заклинание.

 0
Author: ElaAle, 2017-08-08 06:50:56