Добавление опции "Все" в фильтр открытых представлений
У меня есть фильтр просмотра, который позволяет выбирать несколько элементов. Он основан на "Допустимых значениях" для многозначного поля CCK.
Открытый фильтр выглядит следующим образом:
Option 1
Option 2
Option 3
Мне нужно добавить опцию "Все" вверху, чтобы это было:
All
Option 1
Option 2
Option 3
Нажатие на опцию Все должно иметь тот же эффект, что и удержание Ctrl и нажатие на опции 1, 2 и 3. т.Е. Вернуть все узлы, которые имеют значение опции 1, Опции 2 или Вариант 3 для этого поля.
Как я могу добавить такую опцию в свой виджет? Я уверен, что это можно было бы как-то сделать с помощью form_alter, но я не могу понять, как это сделать.
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;
}
}
Поэтому в основном я добавляю свой пункт "Все" в верхней части выбора. Затем я добавляю свой собственный обработчик отправки перед обработчиком представлений.
В моем обработчике отправки я проверяю наличие опции "Все", и если она найдена, я настраиваю выбранные параметры так, чтобы были выбраны все параметры, кроме опции "Все".
Кажется, работает:)
Вы можете просто добавить такой же незащищенный фильтр с вашими параметрами:
Option 1
Option 2
Option 3
Тогда опция "Все" в открытом фильтре покажет результаты только для этих трех параметров.
В моем случае (Просмотр открытого фильтра терминов таксономии) Мне пришлось отменить выбор всех вариантов, чтобы получить -Все-. Не знаю, почему это так работает для меня.
function mymodule_exposed_form_submit(&$form, &$form_state) {
if (!empty($form_state['values']['myfield']['-ALL-'])) {
$form_state['values']['myfield'] = array();
}
}
Я думаю, что вы не можете сделать это по умолчанию, однако вы можете использовать модуль, который был создан специально для улучшения доступных фильтров. Это называется Улучшенные фильтры.
Я сделал два очень уродливых решения.
Предполагая, что у вас есть значение по умолчанию для распечатки всех значений, вы можете взломать опцию в своем шаблоне вывода на дисплей (тот, который основан на 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.
Если открытый фильтр обозначен как множественный и необязательный, выбор всех или ни одного из параметров дает одинаковые результаты. Одним из вариантов было бы упомянуть об этом в тексте справки по фильтру. Другой вариант - установить улучшенные фильтры и включить ссылку "Выбрать все/нет", которая, не изменяя функциональность фильтра, предоставит вашим пользователям более интуитивно понятный интерфейс.
Том Киркпатрик был прав, однако вместо добавления всех параметров вы также можете удалить все параметры, чтобы значение состояния формы было пустым. Это также показывает все значения по умолчанию и немного чище:
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', []);
}
}
По крайней мере, для Drupal 8 (я не знаю, применимо ли это также и для D7), Улучшенные открытые фильтры дают вам возможность "Добавить ссылки выбрать все/нет" в ваш открытый фильтр. Версия BEF, которую я использую: 8.x-3.0
Чтобы добавить эту опцию в свой открытый фильтр, перейдите в свое представление, откройте панель "Дополнительно" > "Лучшие открытые фильтры" > "Настройки", и под каждым открытым фильтром вы найдете свернутую панель с надписью "ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ ДЛЯ "[ИМЯ_ПОЛЯ]" (МЕТКА ФИЛЬТРА: "[МЕТКА]")".
Выберите флажок с надписью "Добавить"Выбрать все/Нет" в:
"Добавьте ссылку "Выбрать все/Нет" при отображении открытого фильтра с помощью флажков. Если эта опция отключена, отредактируйте фильтр и установите флажок "Разрешить множественный выбор"."
!Проблема, которую я заметил при выборе этого параметра "Все", заключается в том, что он продолжает обновлять страницу, когда в форме включена автоматическая отправка. Но, если вам не нужна эта функциональность, похоже, она работает как заклинание.