xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Я уже писал, как вывести ссылки на похожие материалы с помощью сниппета в 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 пока не знаю.

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

Написанное актуально для Views 3
Похожие записи

Комментарии RSS

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

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

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

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

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

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

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

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

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

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

проверьте

Работает. Вот здесь вывел похожие обои по полю теги.

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

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

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

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

а что это?

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

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

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

добавьте больше тегов

а есть другие варианты?

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

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

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

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

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

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

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

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

Но там ведь:

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

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

без разницы

Я вот по этой забугорной инструкции сделал буквально вчера - http://www.metachunk.com/blog/adding-related-content-view-drupal-7
xandeadx, скажи, по твоей инструкции получается, что в похожих будут только предыдущие материалы, я правильно понял?

нет

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

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

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

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

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

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

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

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

bueditor

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

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

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

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

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

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

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

<?php
$block = module_invoke('module_name', 'block_view', 'block_delta');
print render($block['content']); 
?>
.
В друпал.орг дается также очень много кодов, которые куда не знаю, но нужно будет внедрить.
А нет ли возможности без кодовых изменений поменять блоки местами?
В Кодах друпал я пока ничего не понимаю. Спасибо.

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

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

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

добавьте связь с товаром

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо!! :)

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

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

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

Очень круто.

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

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

Может кому то пригодится я использую вот такой способ http://thinkshout.com/blog/2012/06/sean/introducing-relevant-content-bean/

Пример использования можно посмотреть на сайте hapori .ru в любой статье.

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании