Как вывести термины в таком случае?

Аватар пользователя superintendent superintendent 16 декабря 2017 в 15:37

Есть:
тип контента, к которому привязаны 2 словаря таксономии.

Как сделать, чтобы,

  1. Заходишь на страницу термина словаря 1
  2. И на ней выводятся все термины словаря 2
  3. Которые привязаны к нодам, которые привязаны к этому термину словаря 1.

Т.е. что тут происходит:

  1. Запрос ТИД термина словаря 1
  2. Запрос НИД всех связанных с термином нод
  3. Запрос все ТИД терминов словаря 2
  4. Вывод на экран.

А как это сделать через Views? Настраивать связи и контексты? Что там сделать?

Комментарии

Аватар пользователя Phantom63rus Phantom63rus 16 декабря 2017 в 20:03

Я бы попробовал через views_field_view, оно позволяет впихнуть вьюшку как поле во вьюшку. Не уверен что сработает, но попробовать стоит.

Аватар пользователя voviko voviko 16 декабря 2017 в 21:49

по сути нужно вывести ноды, которые привязаны к термину 1, где группировка по терминам словаря 2.

Аватар пользователя ХулиGUN ХулиGUN 16 декабря 2017 в 23:03

Phantom63rus wrote:

Я бы попробовал через views_field_view, оно позволяет впихнуть вьюшку как поле во вьюшку. Не уверен что сработает, но попробовать стоит.

То есть 1 вьюха слишком мало запросов генерит, давайте умножим это число на количество строк?

Аватар пользователя Phantom63rus Phantom63rus 17 декабря 2017 в 15:50

Если хочется быстро - пишем самостоятельно запрос к БД. Топикстартер хотел через views, я подсказал ему вариант, который может сработать.

Аватар пользователя gun_dose gun_dose 16 декабря 2017 в 23:46

voviko wrote:

по сути нужно вывести ноды

superintendent wrote:

  • И на ней выводятся все термины словаря 2
  • Которые привязаны к нодам, которые привязаны к этому термину словаря 1.

  • Кто-то не видит суть.

    Аватар пользователя ХулиGUN ХулиGUN 17 декабря 2017 в 3:37

    VasyOK wrote:

    А кеширование вьюхи разве не поможет?

    Это уже по ходу диагноз - решать все проблемы кешированием. Кеш - не панацея. И если на то уж пошло, то при грамотной архитектуре приложения кеш практически не нужен. Тот же сайт в моём профиле. Использование кеша минимально, хотя некоторые компоненты имеют достаточно сложную архитектуру и бизнес логику.
    А дивиз друпала, по ходу следующий: "Наговнотыкал? Медленно? В кеш!"

    Аватар пользователя sas@drupal.org sas@drupal.org 17 декабря 2017 в 18:18

    Принципиально panels_views работате с аргументами намного более гибко чем views настройка возможна но поколдовать конечно придется. И как часто в Друпале бывает есть варинат без UI с кодом но это уже совсем другая история.

    Аватар пользователя gun_dose gun_dose 17 декабря 2017 в 20:54

    Я просто сталкивался именно с такой задачей. Полностью мышкой накликать там не получится.

    Аватар пользователя ХулиGUN ХулиGUN 17 декабря 2017 в 22:18

    <a href="mailto:sas@drupal.org">sas@drupal.org</a> wrote:

    Принципиально panels_views работате с аргументами намного более гибко чем views настройка возможна но поколдовать конечно придется. И как часто в Друпале бывает есть варинат без UI с кодом но это уже совсем другая история.

    Я согласен с Алексеем (Gun_dose).
    Логика простая, как и писал ТС, В качестве аргумента tid термина первого словаря, по которому нужно получить НОДЫ, из которых нужна аггрегация с уникальностью по ТЕРМИНАМ второго словаря.
    То есть должно получиться что то подобное:

    SELECT t2.name FROM voc2_terms t2
    LEFT JOIN node n ON node.voc2_term_id = t2.id  // Либо CONTAINS, если множественный выбор
    WHERE node.voc1_term_id = {НАШ АРГУМЕНТ} // Либо CONTAINS
    DISTINCT t2.name

    Обычная вьюха подобное не сделает. да и не думаю, что panels_views в качестве аргументов сможет взять id результата выборки по первому темину.

    Думаю всё же подобное лучше реализовать своим модулем без всяких вьюх и панелей. ИМХО

    Аватар пользователя gun_dose gun_dose 17 декабря 2017 в 22:28

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

    Аватар пользователя ХулиGUN ХулиGUN 17 декабря 2017 в 23:07

    gun_dose wrote:

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

    А ты оказывается ещё тот изращуга)))

    Аватар пользователя VasyOK VasyOK 17 декабря 2017 в 23:29

    Taxonomy term - вьюха идущая в коомплекте с views работает аналогичным способом

    Аватар пользователя goodboy goodboy 18 декабря 2017 в 0:52

    Задача решается во вьюве в одно действие. Voviko написал как действовать

    Аватар пользователя gun_dose gun_dose 18 декабря 2017 в 10:13

    В группированном вьюсе нельзя скрывать все поля. А если не скрывать, то будут ноды, сгруппированные по терминам, а не термины.

    Аватар пользователя goodboy goodboy 18 декабря 2017 в 21:09

    Есть нода типа Новости, 2 словаря: Разделы и Регионы. Строю вьюв, который выводит регионы, которые есть в нодах для Раздела=Спорт (tid=1). Такое же требуется? Вьюв генерирует следующий sql (Drupal 7)

    SELECT field_data_field_regions.field_regions_tid AS field_data_field_regions_field_regions_tid, MIN(node.nid) AS nid, 'node' AS field_data_field_regions_node_entity_type
    FROM
    {node} node
    LEFT JOIN {field_data_field_regions} field_data_field_regions ON node.nid = field_data_field_regions.entity_id AND (field_data_field_regions.entity_type = 'node' AND field_data_field_regions.deleted = '0')
    LEFT JOIN {taxonomy_term_data} taxonomy_term_data_field_data_field_regions ON field_data_field_regions.field_regions_tid = taxonomy_term_data_field_data_field_regions.tid
    LEFT JOIN {field_data_field_news_section} field_data_field_news_section ON node.nid = field_data_field_news_section.entity_id AND (field_data_field_news_section.entity_type = 'node' AND field_data_field_news_section.deleted = '0')
    LEFT JOIN {taxonomy_term_data} taxonomy_term_data_field_data_field_news_section ON field_data_field_news_section.field_news_section_tid = taxonomy_term_data_field_data_field_news_section.tid
    WHERE (( (field_data_field_news_section.field_news_section_tid = '1' ) )AND(( (node.status = '1') AND (node.type IN  ('news')) )))
    GROUP BY field_data_field_regions_node_entity_type, field_data_field_regions_field_regions_tid

    На выходе термины: Москва, Смоленская область

    Аватар пользователя gun_dose gun_dose 18 декабря 2017 в 22:36

    В ваших с вовико показаниях есть определенные расхождения. Он предлагает выводить ноды, а вы предлагаете выводить термины. Запрос довольно сложный, чтобы сразу понять, по каким сущностям сделана вьюха, и какие в ней есть связи. Лично мне интересны только эти два вопроса, а не количество действий в решении задачи.

    Аватар пользователя ХулиGUN ХулиGUN 18 декабря 2017 в 22:58

    gun_dose wrote:

    Запрос довольно сложный, чтобы сразу понять, по каким сущностям сделана вьюха,

    SELECT бла бла бла FROM {node} node

    Аватар пользователя gun_dose gun_dose 18 декабря 2017 в 23:10

    Тогда вопрос, почему люди говорят одно, а копипастят другое?)) Вопросов от этого меньше не становится.

    Аватар пользователя voviko voviko 19 декабря 2017 в 7:35

    Собрал тестовую вьюху, показывает node. Агрегация нужна только при множественном значении термина.
    Никаких настроек агрегации нет.
    Не работает, если скрыть все поля.

    Запрос сложный, и потому не каждый напишет. И самое главное, врядли кто-то лучше views это сделает, и, вероятно, задача не будет стоить того, чтобы вот так. потратить пол дня, на модуль.

    В случае использования views можно скрыть лишнее через css, либо еще как извернуться.
    Я бы сделал через preg_match_all

    Аватар пользователя gun_dose gun_dose 19 декабря 2017 в 7:54

    Но ведь в таком раскладе под названием термина пойдут поля всех его нод. А если у нас 50 терминов и 5000 нод? Запрашивать из базы 5000 сущностей ради вывода 50 и потом резать это в шаблонах?

    Аватар пользователя gun_dose gun_dose 19 декабря 2017 в 9:29

    А вот это уже похоже то, что нужно. Только надо включить уникальность в настройках запроса и всё работает, как надо. Что характерно, этот вариант больше никто не предложил))