[РЕШЕНО] Вывод блока "Похожие материалы"

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

Аватар пользователя Zonder Zonder 18 февраля 2010 в 17:54

Задача:
На странице материала выводить блок с анонсами материалами, похожих на тот, который читаем.
Вывод блока осуществить при помощи модуля Views

Настроено:
1. Выводить только те ноды, у которых активен параметр "опубликовано" (при помощи фильтров views)
2. Запрет вывода анонса той ноды, на странице которой находимся (при помощи аргументов views)

Загвоздка:
1. Выводить только те документы, которые имеют тот же термин таксономии, что и просматриваемый документ.

Как решить Загвоздку?

Комментарии

Аватар пользователя Zonder Zonder 18 февраля 2010 в 18:06

Попробуйте cctags, он умеет делать такой блок (правда с views-ом пока не дружит)

Полезный модуль, взял на заметку. Однако хотелось бы реализовать при помощи Views по причине кастомного вывода тизеров. Да и модулей чтобы в системе не много болталось.

Аватар пользователя oboroten oboroten 18 февраля 2010 в 20:02

Arguments
Таксономия: Term ID -> Provide default argument -> PHP Code ->

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
$node = node_load(arg(1));
$terms = taxonomy_node_get_terms_by_vocabulary($node, 4); // 4 - Id нужного словаря
return key($terms);
}
?>

найдено где-то на этом сайте

P.S. Вроде не ошибся

Аватар пользователя oboroten oboroten 19 февраля 2010 в 19:23

Странно в локале проверил - всё работает как требуется
1 аргумент - Таксономия: ID термина (с кодом)
2 агрумент - Материал: Nid (Подставить аргумент по умолчанию - ID материала из URL - Исключить аргумент)

Аватар пользователя Pan4eZzz Pan4eZzz 7 июня 2010 в 14:35

У меня не работает.
Зависит ли этот код от формата строки URL?
Как должны быть описаны заголовки для этих аргументов?

Адрес ноды выглядит так: site.ru/news/[nid]

Аватар пользователя penexe penexe 7 июня 2010 в 14:46

Pan4eZzz, не зависит. адрес вашего материала site.ru/node/[nid]

news/[nid] - это всего лишь алиас

блок на страницу вывели? у нод термины точно присвоены?
"4" в коде на номер своего словаря поменяли?

Аватар пользователя Pan4eZzz Pan4eZzz 8 июня 2010 в 2:09

А как поставить условие вывода только определенного типа материалов с таким же термином таксономии (использующего тот-же словарь), отличного от выводимого в данный момент?

Аватар пользователя oboroten oboroten 8 июня 2010 в 16:22

"oboroten" wrote:

2 агрумент - Материал: Nid (Подставить аргумент по умолчанию - ID материала из URL - Исключить аргумент)

это уберёт текущий материал

а определённый тип выставьте фильтр по типу материала

Аватар пользователя cosmozzz cosmozzz 17 октября 2010 в 19:39

Всё сделал как описано, в превью Views всё работает, но блок на страницу не выводится
страница имеет юрл вида http://site.ru/alias/[nid]/[term-id]

то есть что то типа http://site.ru/products/67/85

если во вьюс в аргументах оставить только ID материала, то блок выводится, но соответственно не фильтрует материалы по термину таксономии, после добавления аргумента по ID термина с настройками:

Provide default argument

PHP Code

<?php 
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  
$node node_load(arg(1));
  
$terms taxonomy_node_get_terms_by_vocabulary($node63); //63 - id словаря
   
return key($terms);
}
?>

ничего не выводится.
в превью вьюс ввожу аргументы вида 67/85, жму предпросмотр, и всё правильно работает.

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

P.S. проблему решил, всё нормально, внимательнее надо было читать=)

Аватар пользователя MasterTrend MasterTrend 31 октября 2010 в 21:11

У меня не получается..
В представлениях, добавляю вид - блок.
Потом выставляю аргументы:
1 аргумент - Таксономия: ID термина (с кодом), Таксономия: Term ID -> Provide default argument -> PHP Code -

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  $node = node_load(arg(1));
  $terms = taxonomy_node_get_terms_by_vocabulary($node, 4); // 4 - Id нужного словаря
   return key($terms);
}
?>

2 агрумент - Материал: Nid (Подставить аргумент по умолчанию - ID материала из URL - Исключить аргумент)

И ожидаю, что на сранице ноды, в блоке, появятся материалы совпадающие с термином ноды, но ни чего нет.
Да, и у меня у нод по несколько терминов..

Аватар пользователя Jackinua Jackinua 17 ноября 2010 в 13:16

http://drupal.org/node/65375
For D6 in Views 2:
Create a related content views block to list content with the same taxonomy of the current node:

Create View
Add Argument "Taxonomy: Term ID"
Argument configuration:
Provide default argument
PHP Code
Add this code:

$node = node_load(arg(1));
if($node) {
foreach($node->taxonomy as $term) { $terms[] = $term->tid; }
return implode('+',$terms);
} else { return; }

Check ON: Allow multiple terms per argument.
Check ON: Reduce duplicates
Add Display: Block
Add Field: Title
Optional — Add Filter: Content Type (whatever type you'd like to filter)

Аватар пользователя Zonder Zonder 21 сентября 2011 в 0:57

"R_e_m" wrote:
Можно ведь поставить Views attach и прикрепить к ноде
Конечно можно. Только выводиться блок у вас будет под комментариями.
Или может быть я не понял, что вы имеете ввиду под "прикрепить к ноде"?

Аватар пользователя R_e_m R_e_m 21 сентября 2011 в 22:48

"Zonder" wrote:
Конечно можно. Только выводиться блок у вас будет под комментариями.
Или может быть я не понял, что вы имеете ввиду под "прикрепить к ноде"?

Нет отнюдь. Выводится будет до коментариев, под нодой (правда для типа материала пост на форуме вообще не работает). После, это если выводить блоком в область контента.
Вообще спасибо, допиливаю, вроде бы все начинает работать, хотя конечно...

Кстати вот этот код:

<?php$node = node_load(arg(1));
if($node) {
foreach($node->taxonomy as $term) { $terms[] = $term->tid; }
return implode('+',$terms);
} else { return; }?>

почему-то влечет за собой ошибки и вывод красных сообщений по всему сайту.

Аватар пользователя R_e_m R_e_m 21 сентября 2011 в 23:18

Вообще неплохо и без красных сообщений по всему сайт раьотает вот этот код:

<?phpif (arg(0) == 'node' && is_numeric(arg(1))) {
   $node=node_load(arg(1));
   if($node->taxonomy){
      foreach($node->taxonomy as $term) {$terms[] = $term->tid;
      return implode('+' , $terms);}
   }else{return;}
} else {
  return false;
}?>

Но как и с другими у меня проблема, обрабтывается только первый тэг, т.е. схоство опледеляется только по первому тэгу текущей ноды, остальные игнорятся.

P.s. кстати для таких же как я, кто туп копирует коды, (скобка)php и все эти артифакты нйжно убирать, копировать только сам код, т.е. начиная с if

Аватар пользователя drupby drupby 22 сентября 2011 в 0:02

"R_e_m" wrote:
Но как и с другими у меня проблема, обрабтывается только первый тэг, т.е. схоство опледеляется только по первому тэгу текущей ноды, остальные игнорятся.

А галочка стоит наротив
-Разрешить множественные термины для аргументов. ?

Аватар пользователя R_e_m R_e_m 22 сентября 2011 в 1:06

Увы да, галочка стоит, но материалы только по первому тэгу. В php коде ведь написано foreach, это правильно же да ?
(Кстати друпал 6, views 2 )

Аватар пользователя Zonder Zonder 22 сентября 2011 в 1:35

"Айдар" wrote:
Все то же самое вроде, но без капли кода делает similar by terms.
Да, делает. Но этот топик о том, как делать на вьюсах.

Аватар пользователя R_e_m R_e_m 22 сентября 2011 в 12:17

"Zonder" wrote:
Я думал вы говорите о модуле
similar by terms

Ну что бы получить этот аргумент, нужно установить модуль )
Вообщем в итоге с аргументом similar by terms все заработало как нужно, через views, но для этого мне конечно пришлось поступить как презренный червь и установить модуль Smile

Аватар пользователя Zonder Zonder 22 сентября 2011 в 14:33

"R_e_m" wrote:
Ну что бы получить этот аргумент, нужно установить модуль )

Зачем городить огород с аргументами, если вы уже установили готовый модуль?

Аватар пользователя R_e_m R_e_m 22 сентября 2011 в 21:10

Ну я утрирую.. (да там еще вид сортировки появляется и все такое) но модуль то по сути и нужен что бы появился этот аргумент. Он собственно только и делает что просто создает во views свой блок и еще своё поле. Из всего этого самым полезным является этот аргумент.

Хорошо, другой вопрос, возможно не по теме уже. Я вывожу не названия релевантных нод, а например превьюхи видеороликов, которые они содержат; но некоторые ноды не имеют превьюх (видосы из контакта например), следовательно они выводятся просто пустым местом в сетке (Style: Grid), как сделать так что бы для таких нод выводилась какая-то дефолтная картинка ?

Аватар пользователя Zonder Zonder 22 сентября 2011 в 21:12

Не захламляйте тему вопросами, которые к ней не относятся. Создайте свою тему и задайте там вопрос.

Аватар пользователя Stalk Stalk 9 марта 2012 в 18:40

Для Drupal 7

$node = node_load(arg(1));
if($node) {
$terms = field_view_field('node', $node,'field_tags');
foreach ($terms['#items'] as $tid => $term) {
$tids[] = $term['taxonomy_term']->tid;
}
return implode('+', $tids);}
else { return; }

Аватар пользователя sqdimon sqdimon 10 декабря 2012 в 14:28

"oboroten" wrote:
<?php 
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  $node = node_load(arg(1));
  $terms = taxonomy_node_get_terms_by_vocabulary($node, 4); // 4 - Id нужного словаря
   return key($terms);
}
?>

работает. надо только убрать <?php и ?>, у меня была эта проблема, всё работает без проблем.