Здравствуйте.
Сделаны типы материалов:
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.
Подскажите, пожалуйста, как реализовать мою задачу?
Заранее спасибо за ответ(ы).
Комментарии
Я не знаю, что такое "штатное представление Glossary" - в восьмёрке я такого не вижу, а про семёрку мне только бабушка рассказывала. Там прямо в одном представлении выводится и
и собственно список номеров журнала за выбранный год? Или все же представлений несколько?
Если это два разных представления, то я бы наверное пошел путем переписывания поля (rewrite results) в первом (верхнем) представлении и формирования адреса ссылки
"<path_to_view>/YEAR/ID_JOURNAL"
вручную.Пусть будет более простая задача, когда из всего многообразия номеров для разных журналов надо выбрать номера только по конкретному журналу и отобразить, например, так:
Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)
Это представление, которое поставляется вместе с модулем views прямо из коробки: Glossary - A list of all content, by letter.
В разделе "Контекстные фильтры" для добавленных фильтров не вижу такого параметра во views в 7-ой версии друпала
Можете конкретизировать, где оно должно находиться? У Вас всё же более старшая версия - восьмёрка - по сравнению с моим друпалом, и могут быть некоторые расхождения в функционале.
Нашел в восьмерке Glossary - оно просто почему-то disabled было. Никогда в него не вникал. На первый взгляд я не уверен, что его можно перепахать под Ваши нужды, я бы пошел другим путем.
Я бы это делал на Aggregation (в продвинутых настройках view - третья колонка).
А его и не должно быть в разделе контекстных фильтров - это в настройках полей (FIELDS). При отображении года (2020) переписать линк, чтобы он в качестве контекстных фильтров передавал и год, и id журнала.
Да нет, в этом аспекте не должно отличаться.
На всякий случай оговорюсь: я конкретно эту задачу не решал - просто на основании имеющегося опыта говорю как бы я начинал пробовать ее решать. Представление Glossary вижу впервые в жизни и не могу авторитетно судить можно ли его подогнать под задачу или нет.
Спасибо за подсказку - у меня какой-то выход из тупика появляется.
Сделал представление с фильтрацией по типу материала «Номер (выпуск) журнала».
Добавил поля (все поля кроме этих удалил):
- Ссылка на журнал
- Год выпуска
Включил агрегацию для поля «Год выпуска» - Тип агрегации «Количество».
В итоге у меня с агрегацией получилось так настроить вывод:
Журнал Цветоводство
2020 (5)
Журнал Цветоводство
2019 (12)
Журнал Цветоводство
2018 (10)
То есть, вывод сделан в столбец. А как сделать чтобы агрегация результат выдавала в строку:
Журнал Цветоводство
2020 (5) | 2019 (12) | 2018 (10)
Даже если в разделе "ФОРМАТ" -> "Показать" -> "Настройки" -> "Поля в линию" включить все галки для всех используемых полей, то всё равно в столбец получается
Что надо исправить, чтоб вывод был в строку?
Для начала, чтобы название журнала не повторялось на каждой строчке:
1) в настройках формата View выбрать Grouping Field #1: Ссылка на журнал;
2) сделать поле Ссылка на журнал hidden.
А чтобы годы выводились в строчку наверное нужно с CSS мудрить, иначе не вижу как.
Вот эту мысль я не очень понял. То есть, как переписать выводимые параметры для поля - я знаю.
Правильно ли я понял, что Вы предлагаете переписать выводимое значение, так, чтоб в поле «Год выпуска» выводилось не значение YEAR, а вывод был таким: YEAR/ID_JOURNAL
Или что имелось в виду?
Поясните, пожалуйста?
Перезаписать можно как текстовый вывод поля (который в данном случае трогать не нужно), так и ссылку под ним - Output this field as a custom link.
Так вот эту самую ссылку и нужно изменить, чтобы в качестве контекстных фильтров в пути ссылки подставлялись и год, и id журнала.
У Вас же всё работает, если в админке вручную ввести параметры YEAR/ID_JOURNAL? Вот сделайте, чтобы view само формировало точно такие же параметры.
Сделал несколько иначе, но меня устраивает (так как иначе всё равно сделать не могу ).
Исходная задача была такая. Выводится так:
Журнал Цветоводство
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. ...
То есть, все номера выводятся сразу по всем годам.
Нашёл в инете решение, только не смог им воспользоваться - не понял.
Приведу тут, вдруг кому поможет
Исходный текст на английском (вариант текста на русском):
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.
if($view->name == "VIEW_NAME" && $display_id == "ATTACHMENT_ID") {
if(isset($args[1])) unset($args[1]);
}
}
I stay tuned for any better alternatives.