Отделите все открытые фильтры в Drupal друг с другом и сделайте каждый открытый фильтр в виде отдельного блока
-
25-09-2019 - |
Вопрос
Я создал пользовательский тип контента и используя View2 для создания различных видов страниц. Я использовал таксономию (наличие 4 терминов, скажем, "А", "Б", "С" а также "D") Для более широкой категоризации этого типа содержимого. Есть 4 других таксономии, соответствующие каждому из вышеуказанных условий "А", "Б", "С" а также "D" называется «Таксиномия-А», «Таксиномия-б», «Таксиномия-С» а также «Таксиномия-D» которые используются для дальнейшей подкатегоризации этого типа содержимого в определенной категории (скажем, "А" или "Б" так далее.). Подкатегория «Таксиномия-А» виден в форме редактирования узла только если более широкая категория "А" выбран. Похоже имеет дело с "Б", "С" а также "D" Категории. Теперь на моих представлениях о странице я использовал термины таксономии "А", "Б", "С" а также "D" как мои первые аргументы URL. Таким образом, следующий URL
www.example.com/a.
Предоставляет все опубликованные типы пользовательских контент «Категория A». Подобные будут случаями для «категории B», «категории C» и т. Д. Теперь, чтобы фильтровать мои типы содержимого определенной категории (скажем, «A») в его подкатегории, я создал четыре открытых фильтра, соответствующих каждой таксономии » Таксономия-а "," таксономию-б "," таксономию-C "и" таксономию-D ". Теперь я хотел бы показать только один фильтр на каждом типе «просмотра страницы»; т.е.
Фильтр, соответствующий «таксономию-а» на www.example.com/a. Вид страницы
Фильтр, соответствующий «таксономию-б» на www.example.com/b. Вид страницы
Фильтр, соответствующий «таксономию-C» на www.example.com/c. Вид страницы и т. Д.
Если я настрою основную настройку представления, чтобы показать фильтр в отдельном блоке, затем блок фильтра содержит все четыре фильтра плюс применить кнопку. Но я хочу показать только один фильтр (на основе первого аргумента страницы URL) с помощью кнопки «Применить».
На самом деле я хотел бы отделить все открытые фильтры друг с другом и сделать каждый открытый фильтр в виде отдельного блока, который можно назначить на шаблонную область.Можно ли достичь этого по тематикам (каждый элемент выбора на представленные формы выставленного фильтра имеет разные «ID»)? В противном случае единственный вариант, оставленный со мной, - создать отдельные типы содержимого для каждой категории "А", "Б", "С" а также "D", что не является практическим решением, если количество категорий больших.
Как я могу достичь этого?
Спасибо заранее за ваш ответ!
Решение
1. Super Slick
Ну, щелчок способ посмотреть на то, как вы можете изменить представления, чтобы выплавить различные открытые фильтры в разные блоки, возможно, определенные настроек блока DELTA в конфигурации для каждого фильтра. Это было бы аккуратно.
2. Универсал / избыточный / избыточный / FAPI-Cook_Block ()
Получите ваш открытый блок, затем используйте hook_form_alter()
Чтобы скрыть фильтры, которые вы хотите надеть на другой блок. Затем создайте новые блоки программно в новом модуле (или если вам абсолютно обязательно должен, модуль фильтра PHP и пользовательский блок через графический интерфейс). В этом модуле повторите необходимую элементы формы в этом блоке, включая уникальный открытый фильтр. Полезно помнить, что открытые фильтры не заботятся о форме. Они заботятся о крючке. Вы можете ввести свои аргументы фильтра в URL, если это нужно.
3. Условная модификация
Реализуйте Hook_form_Alter () для формы, отображаемой в открытом фильтре. Чтобы определить эту форму, вам сначала нужно получить удостоверение личности для views_exposed_form
(Не уверены, что это так), затем получите более специфическую идентификацию из массива форм, чтобы нацелить только эту открытую форму. (Вам понадобится это для подхода № 2 в любом случае).
Теперь, когда у вас есть это, вы можете сделать пару вещей. Во-первых, имейте в виду, что если вы агрессивны к кэшированию этого блока в ловушку, это сломается. Кэш на страницу, или на какую-то гранулярность вы намерены менять блок. Для каждого фильтра вы хотите скрыть, вы собираетесь поставить какую-то логику в $form['#access']
Так что Drupal может посмотреть на элемент формы, посмотрите на страницу, и скрыть эту форму, потому что он не используется.
Если вы оказались полагаться на текущий путь страницы, вы можете сделать что-то подобное:
$form['taxonomy_b_filter']['#access'] = arg(0) == 'section';
Это говорит Drupal скрыть воображаемое элемент Taxonyyy_b_filter, если текущая страница выглядит как http://example.com/section..