[Решено] Views - как вывести подтермины таксономии

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

Аватар пользователя Andruxa Andruxa 16 мая 2010 в 3:30

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

Делаю каталог товаров, основанный на словаре таксономии, вывожу его через views (стандртный модуль uc_catalog отключен)
Словарь ссылается на 2 типа материалов - стандартный product и клонированный page, который называется 'Описание категории' (просто чтобы не путаться в типах материалов).

Термины словаря имеют 3 уровня вложенности:

термин 1
--термин 1.1
----термин 1.1.1
----термин 1.1.2
---- ...
--термин 1.2
----термин 1.2.1
и т.д.

Ноды типа 'товар' привязаны к последним (по вложенности) терминам словаря, а 'описания категории' - ко всем.

Создал 2 представления: category_list и product_grid, выбираю какой из них использовать с помощью модуля TVI.
Со вторым представлением все хорошо, а в первом застрял на такой проблеме:

нужно вывести в шапке заголовок категории, соответствующей текущему термину а под ней - список описаний категорий, соответствующих подтерминам текущего термина, т.е. если выбран термин 1, то вывод должен выглядеть так:

Заголовок 1

Содержимое 1

Заголовок 1.1

Содержимое 1.1

Заголовок 1.2

Содержимое 1.2

(заголовки описаний подкатегорий являются ссылками на следующий уровень)

для этого в представлении category_list создаю вид 'вложение' который прикреплен к странице и выводится перед ней.
аргумент - таксономия:ID термина, поля - Материал:Заголовок, Материал:Содержимое, здесь тоже все хорошо.

Теперь в виде 'страница' нужно вывести ноды, у которых термины таксономии являются дочерними к текущему термину.

Если в качестве аргумента взять ID Термина с глубиной = 1 , то выводятся ноды с текущим и дочерними терминами, и описание текущей категории выводится дважды: в шапке (где ей место) и в списке (где ей не место).
Пытался прикрутить Term ID depth modifier - вообще не смог понять, что он делает.
Возможно, стоит настроить проверку аргументов через PHP, что-нибудь вроде return $argument != нода.tid; но не знаю, как добраться до tid

Пробовал в качестве аргумента указывать Таксономия:Связанные термины и включать чекбокс 'Исключить аргумент' - на втором уровне (если текущим является термин 1.1) в списке выводятся ноды с терминами первого уровня (термин 1, термин 2 и т.д.)

Подскажите, пожалуйста, как можно решить.

Комментарии

Аватар пользователя Andruxa Andruxa 16 мая 2010 в 17:09

Решено методом Мюнца:
в файле sites/all/modules/views/modules/taxonomy/views_handler_argument_term_node_tid_depth.inc
строку $where = " WHERE tn.tid $placeholder\n"; (у меня это строка 103) заменил на
$where = " WHERE tn.tid = 0\n";

Это модифицировало запрос SQL:
...AND (node.vid IN (
SELECT tn.vid FROM term_node tn
LEFT JOIN term_hierarchy th ON th.tid = tn.tid
LEFT JOIN term_hierarchy th1 ON th.parent = th1.tid
WHERE tn.tid = ID текущего темина таксономии 0 (заведомо False)
OR th1.tid = ID текущего термина таксономии
))
По-хорошему, надо бы сделать возможность в аргументе 'ID Термина (с глубиной)' указывать начало и окончание этой глубины, но руки пока выросли только чтобы резать чужой код Smile

Никто не хочет поправить?

Аватар пользователя Siegfrid@drupal.org Siegfrid@drupal.org 17 мая 2010 в 15:13

Все руки не доходят... Надо несколько расширений написать, например поддержку простейших математических операций с возможностью сортировки по этому полю.

Аватар пользователя Andruxa Andruxa 10 декабря 2010 в 17:39

Решил проблему без ковыряния кода с помощью модуля Views Field View

Для вывода подкатегорий создал отдельное представление category_sublist, в котором аргументом является ID родительского термина таксономии.
В представлении category_list в виде страница настроил поле Глобальный: Просмотр (не знаю, как точно будет называться по-английски, это поле добавляет модуль Views Field View), которое вызывает представление category_sublist и передает ему в качестве аргумента ID текущего термина таксономии.

Решение получилось тяжелее прежнего, но зато без быдлокода.
М.б. кому-нибудь пригодится.

Аватар пользователя symsym symsym 26 января 2011 в 12:15

Спасибо за способ, но можно по подробнее? Какое должно быть view category_sublist, что оно должно выводить?
И остальное. А то никак не выходит "каменный цветок" Smile

Аватар пользователя sanita sanita 24 ноября 2010 в 7:52

Andruxa, огромное спасибо за разъяснения! Smile

Я уже отчаялась сделать то, что мне надо, нагородила кучу сниппетов, а решение, в вашем объяснении, оказалось очень простым и эллегантным. Более всего порадовало, что на страницах терминов можно выводить и ноды самого термина и дочерние в абсолютно любом виде.

Единственный недостаток данного метода - обязательная! необходимость все хорошо кешировать (из-за использования Views Field View).

Аватар пользователя zakraben zakraben 28 февраля 2011 в 22:55

Хорошая тема, но не могу понять некоторые вещи.
У меня словарь выглядит так:

Категория-1
- подкатегория 1
- подкатегория 2
- подкатегория 3
Категория-2
- подкатегория 1
- подкатегория 2
- подкатегория 3

Вот при нажатии на "Категория-1" хотелось бы вывести все "подкатегории" как заголовки, и под каждой подкатегорией блок с определенным количеством нод.
Как сделать не могу понять....
Подскажите плиз.

Аватар пользователя Andruxa Andruxa 1 марта 2011 в 13:26

Пару вариантов:

Первый - попроще:

создаем представление,
Аргумент: термин таксономии (с глубиной), в вашем случае - глубина =1 (один уровень вложенности в словаре),
в полях добавляем "Таксономия: Термин", включаем флажок "Исключить из вывода", там же добавляем необходимые поля нод.

в настройках вида (Defaults или Страница, если последнюю предется переопредолять) в настройках стиля (шерстеренка рядом):
"Группировать по полю:" выбираем "Термин" (заголовок поля "Таксономия: Термин")

Этот способ будет правильно работать в том случае, если к терминам таксономии верхего (нулевого) уровня не привязаны ноды.

Иначе они будут выводиться вместе с нодами, привязаным к следующему (первому) уроню словаря.

Собственно, из-за этого и появился этот пост Smile

Если же ноды привязываются ко всем терминам словаря, то следует воспользоваться модулем Views Field View, с помощью которого можно вложить одно представление в другое.

тогда в первом представлении нужно заменить аргумент на "Таксономия: Родительский термин"

и создать второе представление, которое будет вызывать первое:
аргумент: "Таксономия: ID термина",
поля: "Глобальный: Просмотр" (это поле создается модулем Views Field View).

тем самым из вывода исключаются ноды, привязанные к самому термину таксономии (например - Категория-1) и выводятся ноды, привязанные к его подтерминам (подкатегория 1,2,3).

Некоторые вещи писал по памяти, проверяйте.

Аватар пользователя zakraben zakraben 1 марта 2011 в 14:03

С группировкой по термину все понятно. А как же например сделать такое с помощью Views Field View:
Создать страничное представление с заголовками
- подкатегория 1
- подкатегория 2
- подкатегория 3
и под каждой подкатегорией вывести блок (с more link и с четко заданными количеством таваров)
Нажали на родителя Sport и вывелись подтермины и блоки этих подтерминов с четким количеством товаров (4 или 6) и ссылкой на страницу подтермина.

Аватар пользователя Andruxa Andruxa 1 марта 2011 в 16:00

В первом представлении (список нод подкатегории) - "Элементы для показа:" 4, насчет ссылки "далее" надо понять, что по ней будет открываться, проще всего - в настройках "Ссылка "Ещё":" - Да

Вместо группировки можно во втором представлении добавить поле "Таксономия: Термин" перед полем "Глобальный: Просмотр"

Аватар пользователя zakraben zakraben 1 марта 2011 в 16:14

Например создал представление subcategories, в нем показываю 4 элемента, выбираю поля для элементов. Ставлю ссылку more. Тогда какой аргумент здесь должен быть задействован?
Затем создаю еще представление для вывода этого дела. В настройках ставлю неограниченный показ элемнтов, как поле выбираю представление созданное первым. Соответственно тоже не понятно с аргументами.
У меня выводится ровно столько полей "Просмотр" сколько нод относится к данной подкатегории.

Аватар пользователя Andruxa Andruxa 1 марта 2011 в 16:50

"zakraben" wrote:
Ставлю ссылку more. Тогда какой аргумент здесь должен быть задействован?

Например,
Таксономия: ID термина, включить "Перезаписать вывод для этого поля", текст: "more", чекбокс "Выводить это поле в виде ссылки",
Путь ссылки: taxonomy/term/[tid], классы по вкусу.

Появится ссылка "more", указывающая на подтермин (ему можно настроить отдельное представление, где будут показаны все ноды подтермина)

Аватар пользователя Siegfrid@drupal.org Siegfrid@drupal.org 2 апреля 2011 в 16:44

Написал простенький модуль для views, результат можно посмотреть тут Кому будет интересно, пишите - договоримся.

Что он делает - добавляет поле, которое формирует список терминов нижнего уровня. Формирование происходит после того, как из БД извлекается список терминов первого уровня (т.е. после этого формируется второй запрос на получение под-терминов). Таким образом улучшается производительность.

Аватар пользователя NIKS_ArtReaktor NIKS_ArtReaktor 6 октября 2011 в 2:51

[Решение] Замена Ubercart, с помощью Views, вывода категорий, подкатегорий и списка товаров [Два метода]

Метод 1 www.ArtReaktor.com

Метод 2 www.ArtReaktor.com

В данных статьях описывается как заменить вывод категорий и подкатегорий и списка товаров Ubercart, с помощью Views.
Решение для система Drupal 6.х (в данном случае испытывалось на версии 6.22)

Цель:
Более гибкий вывод списка товаров, а именно:
Корректное применение Views Exposed filters для списка товаров категории.
и другие приятные возможности Views

Решено вывод информации о подкаталогах (child term или дочерние термины) без повторяющихся нодов.

Аватар пользователя Artifex Artifex 10 ноября 2015 в 11:48

люди вот у меня такая иерархия
Термин
-термин
-термин
-термин
Термин
-термин
-термин
-термин

вот хочу чтоб когда кликаешь по родительскому термину выдвигались подтермины( сделал как предлагает Andruxa с помощью модуля Views Field View
но у меня получается когда я захожу по пути только термины к которым привязаны ноды((как решить кто поможет?? скрины views прикреплены кому не влом обяснить куда тыкать мой Skype (mc_amidix)

Аватар пользователя AnreeChess AnreeChess 30 ноября 2012 в 13:09

Возможно ответ уже был, но я перепробовал всё, что было здесь написано))

А мне нужно:

У меня есть словарь вида:
-Артикул 1
--его цвет 1
--его цвет 2
--его цвет 3

-Артикул 2
--его цвет 1
--его цвет 2
--его цвет 3

Каждый артикул с его цветом - это НОДА, мне нужно в ноде выводить список остальных цветов данного артикула, кроме цвета текущей ноды.
Помогите понять и разобраться, как это сделать с помощью views...

А ешё у меня во views не отображается запрос SQL ---- это где-то настраивается?)

Заранее спасибо!