Суть проблемы такова:
в Views 3 в Drupal 7 нужно добавить контекстный фильтр хитрого содержания. Нужно, чтобы на странице ноды, например, 51 ($nid=51) выводились в блоке "Похожие материалы" только предыдущие 3 ноды, то есть имеющие nid 48, 49 и 50. При заходе на ноду, например, 32, в этом блоке должны отображаться ноды с nid 29, 30 и 31.
В PHP я не бэтмэн, но больно уж нужна такая фишка.
Помогите с решением, огроменное пожалуйста
Комментарии
Я, мягко говоря, друпалер начинающий, но столкнулся в чем-то схожий задачей, поэтому попрбую подсказать.
В контекстном фильтре, в разделе When the filter value IS available or a default is provided, включаем флажок Specify validation criteria и выбираем в списке вариант PHP Code. И в качестве кода вводим что нам надо. Ключевое здесь то что мы должны задать значение для $handler->argument, таким образом мы зададим значение фильтра и в конце не забываем возратить TRUE.
Если в качестве значения аргумента у нас целое число, то возможно следует написать что-нибудь типа (но т.к. php я не знаю, могу и ошибиться) :
$handler->argument = ($argument-1),($argument-2),($argument-3);
return TRUE;
Еще раз обращу внимание, что за правильность синтаксиса не ручаюсь, php не знаю.
Это все понятно Спасибо!
Только вот я сам в PHP не бэтмнэн, поэтому и спрашиваю совета, как написать такую php-проверку в контекстном фильтре вьюс.
Ну мне например было как раз не очевидно, что код меняющий аргумент, помещается во вроде бы проверку.
Ну а код то совсем же простой, буквально две строчки, как я написал.
Если все-таки $argument, это у нас строка, тогда пишем так:
$array = array((string)($argument-1),(string)($argument-2),(string)($argument-3));
$handler->argument = implode(",", $array);
return TRUE;
Если я на ночь глядя ничего не напутал с приведением типов, то должно сработать. Только еще не забудьте установить соответсвующий флажок, чтобы контекстный фильтр принимал множественные значения.
Проверить в любом случае недолго.
Для теста можно вообще прописать что нибудь типа
$handler->argument = "29,30,31";
return TRUE;
Нужно только еще включить флажок, который разрешает множественные значения аргумента.
Дядька! Ты крут Это заработало! Благодарю безгранично!
Не могу объединить это с проверкой на наличие термина таксономии. Т.е. если ноде, по которой фильтруются предыдущие 3 ноды, присвоен определенный термин таксономии (а он присвоен для каждой ноды), то нужно ограничить выводимый результат определенным термином таксономии.
Поспособствуешь еще разок?
Не-не-не, перехваливать не надо, а то сча начну тупить.
Вот уже например в следующую задачу не врубаюсь сходу.
Т.е. нам нужно не просто выбрать три предыдущих, а если какая то нода имеет другую категорию (термин таксономии), то ее выводить не надо, а брать следующую и смотреть подходит ли она?
В принципе нам тут (в проверке аргумента) вроде весь $view доступен, поэтому можно сделать это (т.е. сравнение терминов) здесь же наверное. Но сходу код написать не могу, надо гуглить (как получить доступ к определенным полям через $view), а время к сожалению у самого впритык и тоже не все получается. Там все должно быть несложно по идее, может сам попробуешь погуглить?
Все верно Не перехвалю, реально ведь помогаешь.
То есть на странице ноды должен получиться вывод 3 предыдущих нод по nid, помеченных 1 термином одного и того же словаря. Вроде так
Обнаружил, что если добавить второй контекстный фильтр по термину с глубиной, то в блоке на странице ноды выводятся предыдущие 3 ноды, но только фильтруются еще и по термину. Что делать дальше, пока не врубаюсь
Банально