Php-validation, Views 3 - Как добавить фильтр 3 последних нод?

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

Аватар пользователя kuser kuser 7 апреля 2013 в 19:22

Суть проблемы такова:

в Views 3 в Drupal 7 нужно добавить контекстный фильтр хитрого содержания. Нужно, чтобы на странице ноды, например, 51 ($nid=51) выводились в блоке "Похожие материалы" только предыдущие 3 ноды, то есть имеющие nid 48, 49 и 50. При заходе на ноду, например, 32, в этом блоке должны отображаться ноды с nid 29, 30 и 31.

В PHP я не бэтмэн, но больно уж нужна такая фишка.

Помогите с решением, огроменное пожалуйста Smile

Комментарии

Аватар пользователя Sandy Big Boy Sandy Big Boy 7 апреля 2013 в 21:31

Я, мягко говоря, друпалер начинающий, но столкнулся в чем-то схожий задачей, поэтому попрбую подсказать.

В контекстном фильтре, в разделе 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 не знаю. Smile

Аватар пользователя kuser kuser 8 апреля 2013 в 0:00

"Sandy Big Boy" wrote:
...

Это все понятно Smile Спасибо!

Только вот я сам в PHP не бэтмнэн, поэтому и спрашиваю совета, как написать такую php-проверку в контекстном фильтре вьюс.

Аватар пользователя Sandy Big Boy Sandy Big Boy 8 апреля 2013 в 1:23

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

Ну а код то совсем же простой, буквально две строчки, как я написал.
Если все-таки $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;

Нужно только еще включить флажок, который разрешает множественные значения аргумента.

Аватар пользователя kuser kuser 8 апреля 2013 в 13:16

"Sandy Big Boy" wrote:
$array = array((string)($argument-1),(string)($argument-2),(string)($argument-3));
$handler->argument = implode(",", $array);
return TRUE;

Дядька! Ты крут Smile Это заработало! Благодарю безгранично!
Не могу объединить это с проверкой на наличие термина таксономии. Т.е. если ноде, по которой фильтруются предыдущие 3 ноды, присвоен определенный термин таксономии (а он присвоен для каждой ноды), то нужно ограничить выводимый результат определенным термином таксономии.

Поспособствуешь еще разок? Smile

Аватар пользователя Sandy Big Boy Sandy Big Boy 8 апреля 2013 в 19:29

Не-не-не, перехваливать не надо, а то сча начну тупить. Smile
Вот уже например в следующую задачу не врубаюсь сходу. Smile

Т.е. нам нужно не просто выбрать три предыдущих, а если какая то нода имеет другую категорию (термин таксономии), то ее выводить не надо, а брать следующую и смотреть подходит ли она?
В принципе нам тут (в проверке аргумента) вроде весь $view доступен, поэтому можно сделать это (т.е. сравнение терминов) здесь же наверное. Но сходу код написать не могу, надо гуглить (как получить доступ к определенным полям через $view), а время к сожалению у самого впритык и тоже не все получается. Sad Там все должно быть несложно по идее, может сам попробуешь погуглить? Smile

Аватар пользователя kuser kuser 8 апреля 2013 в 21:32

"Sandy Big Boy" wrote:
Т.е. нам нужно не просто выбрать три предыдущих, а если какая то нода имеет другую категорию (термин таксономии), то ее выводить не надо, а брать следующую и смотреть подходит ли она?

Все верно Smile Не перехвалю, реально ведь помогаешь.

То есть на странице ноды должен получиться вывод 3 предыдущих нод по nid, помеченных 1 термином одного и того же словаря. Вроде так Smile

Аватар пользователя kuser kuser 9 апреля 2013 в 17:34

Обнаружил, что если добавить второй контекстный фильтр по термину с глубиной, то в блоке на странице ноды выводятся предыдущие 3 ноды, но только фильтруются еще и по термину. Что делать дальше, пока не врубаюсь Sad

Банально Smile