Drupal → Выводим ссылки на похожие материалы с помощью Views

27.03.2012

Я уже писал, как вывести ссылки на похожие материалы с помощью сниппета в template.php. Теперь покажу как то же самое можно сделать с помощью Views 3.

Единственное условие — у материалов должно быть поле с тегами.

1. Создаём представление по материалам, без сортировки и с дисплеем Block:

2. Добавляем поле Content: Nid, в настройках отмечаем опцию Exclude from display и делаем поле первым в списке:

3. Добавляем контекстный фильтр по полю с терминами (у меня это field_tags):

4. В настройках фильтра отмечаем опцию Provide default value, выбираем тип Taxonomy term ID from URL, отмечаем пункт Load default filter from node page, that's good for related taxonomy blocks, выбираем опцию Filter to items that share any term и в филдсете More отмечаем пункт Allow multiple values:


5. Добавляем контекстный фильтр по Content: Nid, в настройках фильтра выбираем опцию Provide default value с типом Content ID from URL, в филдсете More отмечаем опцию Exclude:

6. Включаем агрегацию:


7. Добавляем сортировку по Content: Nid и в качестве Aggregation type выбираем Count

Способ сортировки меняем на descending:

8. На странице управления блоками выводим новый блок в нужный регион.

Profit.

SQL запрос будет выглядеть как-то так:

SELECT n.nid, n.title, COUNT(n.nid) AS score
FROM node n
LEFT JOIN field_data_field_tags f ON n.nid = f.entity_id AND f.entity_type = 'article'
WHERE
  f.field_tags_tid IN (:tids) AND
  n.nid != :nid AND
  n.status = 1 AND
  n.type = 'article'
GROUP BY nid, title
ORDER BY score DESC
LIMIT 5 OFFSET 0

Как избавиться от группировки по title пока не знаю.

Экспорт представления.

Написанное актуально для
Drupal 7, Drupal 8
Похожие записи

Комментарии

Алексей
27.03.2012, 22:40

Спасибо, давно ждал подобного мануала. Но при импорте возникла проблема:

Обработчик Контекстный фильтр для field_data_field_tags.field_tags_tid не доступен.

Подскажите, что делать.

экспортируйте на чистом друпале. нужен дефолтный тип материала article с полем field_tags

Алексей
27.03.2012, 22:42

Все разобрался, работает. Еще раз спасибо.

danylevskyi
28.03.2012, 07:40

Для решения этой задачи отлично подойдет модуль similarterms.
Выполнен он в качестве плагина для Views.

Работу на 7-ке не проверял.
На 6 друпале с 2-ым views работает отлично!

Спасибо за материал!

Алексей
28.03.2012, 09:33

А вот в 7-ке он работать отказывается. А это решение я уже проверил, работает на отлично.

Работу на 7-ке не проверял.

проверьте

Гость
15.04.2012, 18:56

У меня все работает, кроме сортировки нод по Nid. Насколько я понял сортировка должна происходить следующим образом, например, есть node/140 и от нее ссылки должны вести на node/141,142,143,138,139 и так далее, с учетом термина ноды. У меня же этого не происходит и со всех нод ссылки стоят на одни и те же ноды. В чем может быть проблема?

сортировка происходит по релевантности. другая не имеет смысла

Гость
15.04.2012, 23:39

Это не релевантность, когда у всех нод классифицируемого термина ссылки с похожими материалами одни и те же. В чем может быть проблема ? (D7, Views 3, InnoDB)

Это не релевантность

а что это?

Гость
16.04.2012, 19:09

Тогда проще под ноды с нужным термином создать блок. где указать 5 самых приглянувшихся нод из этого термина. Тоже самое будет.

с каким ещё "нужным термином"? статья о том, как на странице ноды вывести похожие материалы, на основе тегов, которыми помечен просматриваемый материал

Гость
16.04.2012, 20:22

ну, только вот, если есть множество нод у которых тэг всего один, то ни о каких похожих материалах говорить не приходится, так как у всех нод отображаются одни и теже "похожие материалы". вся суть проблемы описана тут, по идее благодаря сортировке по Nid она должна была решится, но не тут то было.

Александр
25.04.2012, 09:24

xandeadx,
я у себя сделал примерно также, только на 3-м шаге я добавляю такой контекстный фильтр:
Содержимое: Имеет идентификатор термина таксономии
Так можно выбрать, например, несколько словарей, и на 4-м шаге внизу появится пункт:
Устранить дубликаты

Ну и сортировка у меня не по Nid, а по дате добавления материала (новые наверху).

Вот что вышло:
http://34355.ru/novosti/obshchestvo/novost-1164
http://hdays.ru/pozdravleniya/7812

сортировка должна быть по COUNT(nid), иначе весь смысл теряется

grafdegan
09.05.2012, 23:16

xandeadx
Подскажите пожалуйста, как решить такую задачу:

Есть 8 словарей таксономии, не считая словаря "Теги"
В каждом словаре множество нод
В этих нодах так же прописаны теги, через которые можно просматривать ноды со всех словарей

Вопрос:
Как сделать так чтобы похожие материалы не выводились из словаря текущей ноды, а выводились из других 7-ми словарей?
Так же нужно обратное решение, т.е. что бы выводились материалы только из словаря текущей ноды.

Говорят решение кроется в аргументах в вивсе, но увы работать с ними не умею.
Знаю что решить это можно путем создать отдельного вивса для каждого словаря, без использования агрументов, но это слишком муторно и не правильно...
В итоге хотелось бы иметь 1-2 вивса с аргументами

grafdegan
10.05.2012, 07:41

Но там ведь:

4. Добавляем контекстный фильтр по полю, в котором прописана категория материала (в примере это field_category)

а у меня по тегам

Гость
26.05.2012, 19:33

xandeadx, привет!
Подскажи пожалуйста, а как это сделать для определенного типа материала? У меня просто все новости не в качестве Статей(article) идут. А свой тип материала я создавал.

на первом шаге выбрать нужный тип материала

Гость
20.06.2012, 00:04

Спасибо. Заметно, когда автор четко понимает тему :)

Султан
26.08.2012, 13:46

Здравствуйте! А можно сгруппировать материалы по полю не field_tags, а к примеру, по field_keywords, если теги я убрал, а поставил кейворды? Спасибо заранее!

не понимаю о какой группировке идёт речь

Султан
26.08.2012, 13:58

"3. Добавляем контекстный фильтр по полю с терминами (у меня это field_tags)."
Можно здесь, вместо тегов, использовать field_keywords? Просто поле тегов я убрал и поставил кейворды.

ну если field_keywords это поле с терминами, то ответ очевиден

Султан
26.08.2012, 14:05

Это поле с ключевыми словами. Надеюсь, пойдет.
И еще, прости, xandeadx, за офтоп, но хотел узнать что за редактор у тебя?
Просто CKEditor несимпатичный какой-то и глючил у меня.

Султан
26.08.2012, 14:08

Спасибо большое за информацию. Пошел работать.
Кстати, сайт отличный и полезный. И радует, что автор всегда отвечает на вопросы, при чем очень быстро :) Много нового интересного узнал для себя здесь.

Сергей
21.09.2012, 16:12

Доброго времени суток. Подскажите, если я скачал у вас файл импорта и импортировал в Представления, нужно там еще что-то настраивать? потому как в исходном виде блок не отображается. Может быть, что дело в малом количестве статей? Их по три на каждый тэг.

Красная Шапочка
25.12.2012, 12:40

Здравствуйте, xandeadx!

Мучаюсь с прошлой ночи. Сначала создала блок с помощью Views (ну я вчера писала, что мне нужны тизеры, то есть не просто ссылки, но еще и картинки) по Вашей инструкции. Ничего не выводилось. Ни во время сохранения в автопросмотре внизу, ни после включения блока.
Вот сегодня создаю заново. Двигаюсь пошагово, все ок, даже в автопросмотре вижу тизеры, внизу. Но как дойду до третьего шага (добавить контекс.фильтр по полю словаря (у меня field_menu)), так там все исчезает в автопросмотре и ничего нет. Дошла до конца инструкции, та же беда...
Почему я делаю все точно также, но у меня ничего не выходит? Я даже пробовала не добавлять field_image.

Супер, сразу все заработало! Спасибо!!!

Согдиана
22.04.2013, 16:10

Здравствуйте! Спасибо вам за статью. Благодаря вашей статье, мне удалось сделать блок похожие записи в моем сайте.
У меня получилась такая картина:
После статьи у меня отображается форма комментариев, а после комментариев отображается блок похожие записи. У меня используется другой тип контента (tours) вместо articles.
Прошу вас проконсультировать как сделать так чтобы форма комментариев отображалась под блоком похожие туры. (Блок можете посмотреть тут) Спасибо.

Согдиана
22.04.2013, 17:17

Если правильно поняла, нужно будет взять следующий код:

<?php
$block = module_invoke('module_name', 'block_view', 'block_delta');
print render($block['content']); 
?>

.
В друпал.орг дается также очень много кодов, которые куда не знаю, но нужно будет внедрить.
А нет ли возможности без кодовых изменений поменять блоки местами?
В Кодах друпал я пока ничего не понимаю. Спасибо.

Валентин
11.06.2013, 19:23

Спасибо! Давно хотел так сделать, но не знал, как.. Всё работает отлично!

Владимир
07.07.2013, 19:21

Спасибо, отличный метод. Но возникла трудность. Надо вывести не только заголовок ноды, но и картинку. Добавляю еще одно поле для вывода "Содержимое: Картинка" и все перестает работать. Т.е. не выводится вообще ничего. Почему так? и как сделать чтобы можно было выводить заголовок и картинку?

Николай
25.07.2013, 16:55

Привет, спасибо за мануал и отличный блог.
Не сталкивались с фильтрацией по тегам таксономии в Drupal Commerce? Дело в том, что там могут быть словари привязаны не только к типу материала(как) в вашем мануале, но и к товару, который привязывается к материалу через entityreference(ну вы наверно в курсе). Как отфильтровать товары по этим тегам словаря(аттрибутам)?Т.е у меня часть словарей привязана к материалу(по ним получается отфильтровать), а часть словарей привязана к товару - по ним не получается отфильтровать.

Валентин
25.07.2013, 18:36

А у вас есть пост, как вывести Аватар и Имя пользователя красиво в одну строчку, чтобы когда человек заходил на сайт, то видел себя любимого и своё имя. Я вывожу, конечно, то и другое, но есть косяки, а хочется идеальной настройки, как и в случае с "ссылками на похожие материалы".

Николай
25.07.2013, 18:36

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

дальше в контекстных фильтрах будут поля из связанных товаров

Николай
25.07.2013, 18:46

да, я именно так и делаю, беру поле термина(атрибуты цвета), к-е прикреплено к товару и настраиваю по нему фильтр как описано у вас, ничего не выводится

А зачем там агрегация? Работает без неё и можно другие поля выводить, картинки там и т.д.

Здравствуйте помогите разобраться
Есть тип материала пиццерии.
Есть тип материала отзывы, в котором есть поле node reference, пользователь создает отзыв, в поле ссылка на материал выбирает материал к которому относится его отзыв.
Сохраняет.
Далее вывожу через views содержимое типа отзыв в блоке.
Но выводятся все отзывы по всем материалам.
Как мне сделать вывод отзывов только к тому материалу который пользователь указал в node reference
Буду очень признателен за ответ и любую помошь

читайте про контекстные фильтры

Гость
30.10.2013, 23:50

Спасибо, хорогая статья. У меня заработало, но я оставил только "контекстный фильтр по полю с терминами (у меня это field_tags)" и все, поставил сортировку Random и теперь блок показывает слечайные статьи из категории.

Гость
16.01.2014, 23:49

Доброго времени суток!
Перелопатил кучу манов по этому вопросу, но так ни к чему и не пришел. У меня установлен модуль pathauto, так что вытянуть taxonomy ID или же material ID из Url-а не пердставляется возможным. Подскажите, имеются ли какие либо обходные пути для реализации сего блока без исключения pathauto?

Вы сначала сделайте как вам написали в статье, а потом задавайте вопросы

Гость
17.01.2014, 00:14

Хм, если бы я не проверил работоспособность вышеизложенного материала - задавал бы подобные вопросы в этом топике?!

значит что-то неправильно сделали
модуль pathauto тут ни на что не влияет

Гость
17.01.2014, 00:24

Да, по ходу все таки топик спутал. Т.к. тэги у меня вообще отсутствуют.

Добрый день!
Подскажите, как сделать контекстный фильтр по текстовому полю?
На сайте есть несколько товаров с одинаковыми "краткими заголовками". Задача внутри записи вывести все товары с такими же заголовками. Перепробовала кучу всего, не получается :'(

Андрей
17.04.2014, 21:44

Отличный метод, только не подходит для инет-магазинов и каталогов.
Агрегация глючит с полем изображения. Все работает, но если добавляю через связь фото - блок вьюхи перестает показываться.
Структура стандартна для инет-магазина. Дисплей с терминами. По ним строится похожесть. Добавляется в вьюхе связь дисплея к товару - все ок. Добавляю фильтр по наличию на складе товара - все ок. Добавляю в вывод количество на складе товара - все ок. Добавляю в вывод поле товара с фото - вьюха пропадает.
Попробовал модуль Similar By Terms - там по сути делается все то же самое, только нет агрегации - и с фоткой работает. Жаль, что для такого придется ставить модуль.
Если кто-то знает как побороть агрегацию и фото - напишите :) убирать/добавлять поле с фото я пробовал - не проходит (такое советуют на д.орге)

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

Алексей
30.10.2014, 13:49

Гран мерси за урок. Все работает. Правда я себе этот views сделал в виде EVA, чтоб блок схожие материалы стоял между материалом и комментами, не внизу страницы.

Гость
22.04.2015, 09:56

Очень круто.

И для нескольких контекстных фильтров по разным словарям тоже работает.

Гость
23.07.2015, 14:25

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

Гость
20.11.2015, 17:24

Почему-то не работает с drupal commerce.

на моем сайте больше двух слварей в каждом из 5 типов материалов, которые я добавляю на сайт. я пользуюсь similar terms, и мне кажется что так проще. но не знаю насколько ваш подход дает выигрыш в производительности?

Гость
20.01.2017, 22:30

Спасибо, очень полезная статья.

Добрый день!

А если не исключать ссылку на себя, (то есть убрать контекст по nid), как сделать сокрытие элемента элемента если он один в наборе?

То есть если несколько линков - отображается со всеми, если только он один то скрывается?

И как ссылка на самого себя сделать просто текстом?

Буду очень признателен за помощь, спасибо!

Гость
28.01.2018, 19:10

Здравствуйте. Подскажите, актуален ли этот способ для Drupal 8? Я пробовал несколько раз настроить, ничего не вышло. И, что такое content: nid? - нет такого в Д8

Денис
20.03.2018, 19:43

Огромное спасибо! Все заработало с первого раза!

Гость
23.12.2018, 01:55

Хотя если использовать как там описано, происходит какая-то сумасшедшая нагрузка на CPU сервера. Так что фильтр сразу по нескольким терминам (Filter to items that share all terms) никак не работает.

Добавить комментарий