Как в штатное представление Glossary добавить второй контекстный фильтр

Главные вкладки

Аватар пользователя il-ir il-ir 27 августа 2020 в 18:36

Здравствуйте.

Сделаны типы материалов:

1. Тип материала «Издатель».
Поля:
- Название (наименование) издателя
- Веб-сайт издателя
- Описание издателя

2. Тип материала «Журнал».
Поля:
- Название (заголовок) журнала
- Ссылка на издателя
- ISSN журнала
- Описание журнала

3. Тип материала «Номер (выпуск) журнала».
Поля:
- Название (заголовок) номера (выпуска)
- Ссылка на журнал
- Номер выпуска
- Год выпуска
- Ссылка на файл с номером

Поля «Ссылка на издателя» и «Ссылка на журнал» связаны с полем id материала в соответствующих таблицах через Entity reference.

Требуется вывести все журналы, так чтобы под наименованием конкретного журнала были указаны года с архивами – как в штатном представлении Glossary.
Примерно так:

Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

Журнал Садоводство
2020 (1) | 2019 (12) | 2018 (12)

Журнал Пчеловодство
2020 (8) | 2019 (12) | 2018 (12)

Где, к примеру, 2020 – год за который группируются архивные номера, в скобках указано количество номеров.
Если сделать просто сборку по всем номерам, не разделяя по журналам, – то это настроить получилось.
Но мне надо чтобы по выбранному журналу архив за конкретный год раскрывался для каждого конкретного журнала независимо от всех остальных. К примеру, если нажать на 2019 под журналом Садоводство – то будет раскрыт архив за 2019 год только этого журнала Садоводство.

Сделал клон штатного представления Glossary с фильтрацией по типу материала «Номер (выпуск) журнала».

Первый контекстный фильтр у меня настроен как в штатном представлении Glossary – но используется поле «Год выпуска» для контекстного фильтра, и параметр «Ограничение символов» установлен 4, а не 1, как в исходном Glossary.
Добавил второй контекстный фильтр по полю «Ссылка на журнал». Предполагалось, что после группирования по полю «Год выпуска» должно происходить отсеивание всех номеров, не относящихся к выбранному журналу.

Соответственно, когда в предпросмотре с контекстными фильтрами в админке вьюхи задаю параметры YEAR/ID_JOURNAL – то всё работает нормально (YEAR – указывается конкретный год цифрами, ID_JOURNAL – указывается id материала «Журнал» для конкретного журнала).

Но не понимаю, как сделать так, чтобы после обработки контекстных фильтров в ссылку передавалось указание на id материала «Журнал» для конкретного журнала. Сейчас в ссылку передаётся только указание на год – как это делается в штатном представлении Glossary.

Подскажите, пожалуйста, как реализовать мою задачу?

Заранее спасибо за ответ(ы).

Комментарии

Аватар пользователя marassa marassa 27 августа 2020 в 18:49

Я не знаю, что такое "штатное представление Glossary" - в восьмёрке я такого не вижу, а про семёрку мне только бабушка рассказывала. Там прямо в одном представлении выводится и

il-ir wrote: Примерно так:

Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

Журнал Садоводство
2020 (1) | 2019 (12) | 2018 (12)

Журнал Пчеловодство
2020 (8) | 2019 (12) | 2018 (12)

и собственно список номеров журнала за выбранный год? Или все же представлений несколько?
Если это два разных представления, то я бы наверное пошел путем переписывания поля (rewrite results) в первом (верхнем) представлении и формирования адреса ссылки "<path_to_view>/YEAR/ID_JOURNAL" вручную.

Аватар пользователя il-ir il-ir 27 августа 2020 в 19:51

Пусть будет более простая задача, когда из всего многообразия номеров для разных журналов надо выбрать номера только по конкретному журналу и отобразить, например, так:

Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

marassa wrote: не знаю, что такое "штатное представление Glossary" - в восьмёрке я такого не вижу

Это представление, которое поставляется вместе с модулем views прямо из коробки: Glossary - A list of all content, by letter.

marassa wrote: пошел путем переписывания поля (rewrite results) в первом (верхнем) представлении и формирования адреса ссылки "/YEAR/ID_JOURNAL" вручную

В разделе "Контекстные фильтры" для добавленных фильтров не вижу такого параметра во views в 7-ой версии друпала Sad
Можете конкретизировать, где оно должно находиться? У Вас всё же более старшая версия - восьмёрка - по сравнению с моим друпалом, и могут быть некоторые расхождения в функционале.

Аватар пользователя marassa marassa 27 августа 2020 в 20:08
1

Нашел в восьмерке Glossary - оно просто почему-то disabled было. Никогда в него не вникал. На первый взгляд я не уверен, что его можно перепахать под Ваши нужды, я бы пошел другим путем.

il-ir wrote: из всего многообразия номеров для разных журналов надо выбрать номера только по конкретному журналу и отобразить, например, так:

Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

Я бы это делал на Aggregation (в продвинутых настройках view - третья колонка).

il-ir wrote: В разделе "Контекстные фильтры" для добавленных фильтров не вижу такого параметра

А его и не должно быть в разделе контекстных фильтров - это в настройках полей (FIELDS). При отображении года (2020) переписать линк, чтобы он в качестве контекстных фильтров передавал и год, и id журнала.

il-ir wrote: У Вас всё же более старшая версия - восьмёрка - по сравнению с моим друпалом, и могут быть некоторые расхождения в функционале

Да нет, в этом аспекте не должно отличаться.
На всякий случай оговорюсь: я конкретно эту задачу не решал - просто на основании имеющегося опыта говорю как бы я начинал пробовать ее решать. Представление Glossary вижу впервые в жизни и не могу авторитетно судить можно ли его подогнать под задачу или нет.

Аватар пользователя il-ir il-ir 27 августа 2020 в 21:11

marassa wrote: Я бы это делал на Aggregation

Спасибо за подсказку - у меня какой-то выход из тупика появляется.

Сделал представление с фильтрацией по типу материала «Номер (выпуск) журнала».
Добавил поля (все поля кроме этих удалил):
- Ссылка на журнал
- Год выпуска

Включил агрегацию для поля «Год выпуска» - Тип агрегации «Количество».

В итоге у меня с агрегацией получилось так настроить вывод:

Журнал Цветоводство
2020 (5)

Журнал Цветоводство
2019 (12)

Журнал Цветоводство
2018 (10)

То есть, вывод сделан в столбец. А как сделать чтобы агрегация результат выдавала в строку:
Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

Даже если в разделе "ФОРМАТ" -> "Показать" -> "Настройки" -> "Поля в линию" включить все галки для всех используемых полей, то всё равно в столбец получается Sad

Что надо исправить, чтоб вывод был в строку?

Аватар пользователя marassa marassa 28 августа 2020 в 9:54

Для начала, чтобы название журнала не повторялось на каждой строчке:
1) в настройках формата View выбрать Grouping Field #1: Ссылка на журнал;
2) сделать поле Ссылка на журнал hidden.
А чтобы годы выводились в строчку наверное нужно с CSS мудрить, иначе не вижу как.

Аватар пользователя il-ir il-ir 27 августа 2020 в 21:17

marassa wrote: А его и не должно быть в разделе контекстных фильтров - это в настройках полей (FIELDS). При отображении года (2020) переписать линк, чтобы он в качестве контекстных фильтров передавал и год, и id журнала.

Вот эту мысль я не очень понял. То есть, как переписать выводимые параметры для поля - я знаю.
Правильно ли я понял, что Вы предлагаете переписать выводимое значение, так, чтоб в поле «Год выпуска» выводилось не значение YEAR, а вывод был таким: YEAR/ID_JOURNAL

Или что имелось в виду?
Поясните, пожалуйста?

Аватар пользователя marassa marassa 28 августа 2020 в 10:00
1

Перезаписать можно как текстовый вывод поля (который в данном случае трогать не нужно), так и ссылку под ним - Output this field as a custom link.
Так вот эту самую ссылку и нужно изменить, чтобы в качестве контекстных фильтров в пути ссылки подставлялись и год, и id журнала.
У Вас же всё работает, если в админке вручную ввести параметры YEAR/ID_JOURNAL? Вот сделайте, чтобы view само формировало точно такие же параметры.

Аватар пользователя il-ir il-ir 6 сентября 2020 в 13:06

Сделал несколько иначе, но меня устраивает (так как иначе всё равно сделать не могу Sad ).
Исходная задача была такая. Выводится так:
Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

при нажатии на 2020 ниже раскрываются все выпуски журнала Цветоводство за 2020 год.
Нажимаем на 2018 - соответственно, раскрывается список выпусков за 2018 год, а список за 2020 сворачивается.

С предложенными советами смог сделать первую часть - вывод:
Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)

А вот, чтоб реализовать вторую часть - не смог настроить.

В результате реализовал другой вариант:
Журнал Цветоводство
архив за 2020 (5): номер 1. номер 2. ...
архив за 2019 (12): номер 1. номер 2. ...
архив за 2018 (10): номер 1. номер 2. ...

То есть, все номера выводятся сразу по всем годам.

Нашёл в инете решение, только не смог им воспользоваться - не понял.
Приведу тут, вдруг кому поможет Smile

Исходный текст на английском (вариант текста на русском):
Drupal view listing with glossary AND an additional contextual filter
(Drupal просмотреть список с глоссарием и дополнительный контекстный фильтр)

Context:

I have a view, with a page listing my all articles. I have added an attachment to that view in order to add a glossary (a to z) on the top of the listing to facilitate the search. > method used <

That works fine.

My problem is:

I want to add another contextual filter to filter my article by user, and so should be the glossary attachement. But if I turn "Inherit contextual filters" to "yes" it breaks the glossary process as soon as I select a letter as the glossary will inherit from the letter filter too and so show matching articles instead of exposing the contextual filter.

I am looking for any kind of solution: configuration, modules, hook, ...

It is a very specific problem, I hope I was clear enough

Thank you for reading me.

Answer

Ok I will reply to myself with a fix, don't know if it the best way but it works for me.
Using a hook:

Keep "Inherit contextual filters" to "yes". Add the following bits of code (in a custom module) in order to deny access to the unwanted contextual filter.

function HOOK_views_pre_view(&$view, &$display_id, &$args) {
  if($view->name == "VIEW_NAME" && $display_id == "ATTACHMENT_ID") {
    if(isset($args[1])) unset($args[1]);
  }
}

I stay tuned for any better alternatives.