Разъедините все открытые фильтры в Drupal друг с другом и сделайте каждый открытый фильтр отдельным блоком. - PullRequest
1 голос
/ 30 августа 2010

Я создал пользовательский тип контента и использую views2 для создания различных просмотров страниц.Я использовал таксономию (с 4 терминами, скажем "A" , "B" , "C" и "D" ) для более широкой категоризации этого типа контента.Существует 4 других таксономии, соответствующих каждому из приведенных выше терминов "A" , "B" , "C" и "D" называется "Таксономия-A" , "Таксономия-B" , "Таксономия-C" и "Таксономия-D" , котораяиспользуются для дальнейшей подкатегории этого типа контента в определенной категории (скажем, "A" или "B" и т. д.).Подкатегория "Таксономия-A" отображается в форме редактирования узла, только если выбрана более широкая категория "A" .Аналогично обстоит дело с категориями "B" , "C" и "D" .Теперь при просмотре страниц я использовал таксономические термины "A" , "B" , "C" и "D" как мои первые аргументы URL.Таким образом, следующий URL

www.example.com / A

предоставляет все опубликованные пользовательские типы контента категории "A".Аналогичные будут случаи для «категории B», «категории C» и т. Д. Теперь, чтобы отфильтровать мои типы контента определенной категории (скажем, «A») в ее подкатегориях, я создал ЧЕТЫРЕ выставленных фильтра, соответствующих каждой таксономии ».Таксономия-A "," Таксономия-B "," Таксономия-C "и" Таксономия-D ".Теперь я хотел бы показать только один фильтр для каждого типа «просмотра страницы», то есть
Фильтр, соответствующий «Таксономии-A» на www.example.com /A просмотр страницы
Фильтр, соответствующий "Таксономии-B" on www.example.com / B просмотр страницы
Фильтр, соответствующий "Таксономии-C" на www.example.com / C просмотр страницы и т. Д.

Если ясконфигурируйте базовую настройку вида, чтобы показать фильтр в отдельном блоке, тогда блок фильтра содержит все кнопки «Четыре фильтра плюс применение».Но я хочу показать только один фильтр (на основе первого аргумента URL-адреса страницы) с кнопкой «Применить».

На самом деле я хотел бы отделить все открытые фильтры друг от друга и сделать каждый открытый фильтр отдельным.блок, который может быть назначен области шаблона. Можно ли этого добиться тематикой (каждый элемент выбора в представленной форме фильтра имеет разные «id»)?В противном случае у меня остается только один вариант - создать отдельные типы контента для каждой категории "A" , "B" , "C" и "D ", что не является практическим решением, если количество категорий велико.

Как мне этого добиться?

Заранее спасибо за ваш ответ !!

1 Ответ

0 голосов
/ 31 августа 2010

1.Super Slick

Что ж, отличный способ - посмотреть, как можно модифицировать Views, чтобы разбивать различные открытые фильтры на разные блоки, возможно, определяемые настройкой дельты блока в конфигурации для каждого фильтра.Это было бы аккуратно.

2.Overkill / Redundant / FAPI-hook_block () Drill

Получите выставленный блок, затем используйте hook_form_alter(), чтобы скрыть фильтры, которые вы хотите поместить в другой блок.Затем программно создайте новые блоки в новом модуле (или, если вам абсолютно необходимо, модуль PHP Filter и пользовательский блок через графический интерфейс).В этом модуле скопируйте нужные элементы формы в этом блоке, включая уникальный открытый фильтр.Полезно помнить, что открытые фильтры не заботятся о форме.Они заботятся о строке запроса.При необходимости вы можете ввести аргументы фильтра в URL.

3.Условная модификация

Реализация hook_form_alter () для формы, отображаемой в экспонированном фильтре.Чтобы идентифицировать эту форму, вам сначала нужно получить идентификатор для views_exposed_form (не уверен, что это так), а затем получить более конкретную идентификацию из массива форм для нацеливания только на эту открытую форму.(Это все равно понадобится для подхода № 2).

Теперь, когда у вас есть это, вы можете сделать пару вещей.Во-первых, имейте в виду, что если вы агрессивно относитесь к кешированию этого блока в глобальном масштабе, это сломается.Кэшируйте на странице или с какой-либо степенью детализации, которую вы намереваетесь изменить блок.Для каждого фильтра, который вы хотите скрыть, вы собираетесь поместить некоторую логику в $form['#access'], чтобы Drupal мог просматривать элемент формы, просматривать страницу, на которой он находится, и скрывать этот элемент формы, потому что он не используется.

Если вы полагаетесь на текущий путь к странице, вы можете сделать что-то вроде этого:

$form['taxonomy_b_filter']['#access'] = arg(0) == 'section';

Это говорит Drupal скрывать воображаемый элемент 'taxonomy_b_filter', если путь к текущей странице выглядит как http://example.com/section.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...