Простой случай: заходим на страницу, которую создал пользователь user. Как так настроить вид, чтобы показать все материалы пользователя user?
Я добавил аргумент: с пхп-кодом:
Вывел пустое значение.
И еще, какой тип аргумента? (материал, пользователь...). Фильтров, по-моему, нужных нет
Комментарии
<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
if ($node = node_load(arg(1))) {
return $node->uid;
}
}
?>
Ну нафига грузить ноду ради одного uid'а?
Не проще ли запросом дёрнуть?
это не так
Тогда что тут, кеширование через static?
Итак. Когда я исследовал модуль Views, то наткнулся на такую вещь в Relationships, как User: Nodes authored. По идейным соображениям, да и по подписи к нему стало понятно, что оно делает - для данного пользователя вытаскивает все(!) ноды, которые он написал, но вот что-то оно не работало.
После препарирования модуля и добавления 1 строчки в user.views.inc все встало на свои места.
Было
'title' => t('Nodes authored'),
'help' => t('Relate nodes to the user who created it. This relationship will create one record for every node created by the user.'),
'handler' => 'views_handler_relationship',
'base' => 'node',
'field' => 'uid',
'label' => t('nodes'),
),
стало
'title' => t('Nodes authored'),
'help' => t('Relate nodes to the user who created it. This relationship will create one record for every node created by the user.'),
'handler' => 'views_handler_relationship',
'base' => 'node',
'field' => 'uid',
'base field' => 'uid',
'label' => t('nodes'),
),
итого добавил
все в районе 60 строки
(да-да. есть diff, но нет на него времени)
далее алгоритм получается прост
1. определяем агрумент node:nid, и в качестве дефолтного значения выбираем nid from url.
2. определяем relationship, описанный выше
3. из него вытаскиваем то, что необходимо (фильтры и аргументы работают)
4. profit!!!
Вполне возможно что я неверно понял суть relationship (именно того, который правил), тогда прошу объяснить, что же он тогда делает
penexe, не могли бы вы подробнее написать, какое именно аргумент добавить?
Я пробовал добавлять аргументы: Материал:nid, Пользователь: id, Материал:Заголовок.
Название: %1
Action to take if argument is not present: Provide default argument: PHP Code. И ваш код.
Также пробовал его в качестве валидатора, разумеется убрал <?пхп кавычки.
Пустой список.
serious.vip@drupal.org, не нашел я такого текста в user.views.inc.
И по связи: ни фильтры ни аргументы нигде не попросили связи с relationship пользователь.... А обычно вверху раскрывающийся список бывает
Пользователь: id, я проверял - работает
Забыл упомянуть - использую views 3.0 aplha1 - там эта функциональность уже есть. И relateonship не пользователь, а именно "Nodes authored".
в 2.0 этого функционала нет, но думаю что можно добавить прямиком в user.views.inc секцию с relationship
у меня 2ка, альфу не хочу пока ставить.
penexe, действительно работает. Только вот мне для какой задачи:
Этот вид дергается ССК-полем-ссылкой на материал. Т.е. например, пользователь создает страницу, и заполняет ССК поле, в котором раскрывающийся список его заметок. Этот список и предоставляет виевс.
Если мне добавить то, что вы написали, то при редактировании работать будет, но при создании страницы нет: список выбора пустой...
тоесть вид для 2х вещей сделан? тогда можно вот так
<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
if ($node = node_load(arg(1))) {
return $node->uid;
}
}
else {
global $user;
return $user->uid;
}
?>
или создать дургой вид где не php код будет а User ID from logged in user
а что по поводу аргумента "Node: User" и его дефолтного значения "Current Logged In User", или я что-то не понял?
вы описали, что дергается список заметок пользователя, а тут достаточно id именно залогиненного пользователя, а не пользователя - автора ноды
Спасибо! Работает :).
Постараюсь понять что написано. Вопросы по аргументам виевс появляются часто, так бы 1 раз разобраться, но инфы с несколькими объясняющими примерами что за аргументы и как их составлять не нахожу
Ну если быть кратким и обзорно - аргументы и фильтры очень близки друг другу (я смотрю по 3.0). имхо вся разница - аргументы можно определять дефолтные, фильтры можно делать exposed, ну и список возможных аргументов и фильтров тоже разные. а так то же самое.
а валидатор что такое?
Как и написано - проверяет аргумент на валиднось. На выходе соответственно 2 состояния - проверка пройдена, или нет, ну и при непрохождении - соответствующее действие, которое задается ниже. Пользовался лишь Basic Validation, и php validation - писал php код для проверки аргументов. Собвтсенно валидатор нужен чтобы исключить неугодные элементы, с которыми view может выдать "не ту" информацию. К примеру - view, которая будет выдавать список определенных типов нод текущего пользователя. Тут понятно что можно default argument прописать, но на скринкасте, который я смотрел - использовался uid из пути (view был в профиле как таблица), и php validation чтобы на чужом профиле не показывать. Надеюсь, объяснил более-менее понятно, т.к. никогда талантом учителя не отличался)
Оффтоп.
Вообще views замечательная штука, в которой можно не только gui пользовать, но и во всю api. К примеру если нужна гибкость, то я предпочитаю не писать sql, а использовать api views для его формирования. Там же и выполнить можно, и результат получить. Удобно, быстро, гибко.