Подскажите аргумент views.

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

Аватар пользователя digital_sword digital_sword 18 января 2010 в 23:00

Простой случай: заходим на страницу, которую создал пользователь user. Как так настроить вид, чтобы показать все материалы пользователя user?
Я добавил аргумент: с пхп-кодом:

global $node;
return $node->uid;

Вывел пустое значение.
И еще, какой тип аргумента? (материал, пользователь...). Фильтров, по-моему, нужных нет

Комментарии

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 19 января 2010 в 1:40

Итак. Когда я исследовал модуль Views, то наткнулся на такую вещь в Relationships, как User: Nodes authored. По идейным соображениям, да и по подписи к нему стало понятно, что оно делает - для данного пользователя вытаскивает все(!) ноды, которые он написал, но вот что-то оно не работало.

После препарирования модуля и добавления 1 строчки в user.views.inc все встало на свои места.

Было

'relationship' => array(
      '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'),
    ),

стало

'relationship' => array(
      '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'),
    ),

итого добавил

'base field' => 'uid',

все в районе 60 строки

(да-да. есть diff, но нет на него времени)

далее алгоритм получается прост

1. определяем агрумент node:nid, и в качестве дефолтного значения выбираем nid from url.
2. определяем relationship, описанный выше
3. из него вытаскиваем то, что необходимо (фильтры и аргументы работают)
4. profit!!!

Аватар пользователя digital_sword digital_sword 19 января 2010 в 10:55

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 пользователь.... А обычно вверху раскрывающийся список бывает

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 19 января 2010 в 11:38

Забыл упомянуть - использую views 3.0 aplha1 - там эта функциональность уже есть. И relateonship не пользователь, а именно "Nodes authored".
в 2.0 этого функционала нет, но думаю что можно добавить прямиком в user.views.inc секцию с relationship

Аватар пользователя digital_sword digital_sword 19 января 2010 в 21:06

у меня 2ка, альфу не хочу пока ставить.
penexe, действительно работает. Только вот мне для какой задачи:

Этот вид дергается ССК-полем-ссылкой на материал. Т.е. например, пользователь создает страницу, и заполняет ССК поле, в котором раскрывающийся список его заметок. Этот список и предоставляет виевс.

Если мне добавить то, что вы написали, то при редактировании работать будет, но при создании страницы нет: список выбора пустой...

Аватар пользователя penexe penexe 19 января 2010 в 21:30

"digital_sword" wrote:
Этот вид дергается ССК-полем-ссылкой на материал. Т.е. например, пользователь создает страницу, и заполняет ССК поле, в котором раскрывающийся список его заметок. Этот список и предоставляет виевс.

Если мне добавить то, что вы написали, то при редактировании работать будет, но при создании страницы нет: список выбора пустой...


тоесть вид для 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

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 19 января 2010 в 23:05

а что по поводу аргумента "Node: User" и его дефолтного значения "Current Logged In User", или я что-то не понял?
вы описали, что дергается список заметок пользователя, а тут достаточно id именно залогиненного пользователя, а не пользователя - автора ноды

Аватар пользователя digital_sword digital_sword 19 января 2010 в 23:10

Спасибо! Работает :).
Постараюсь понять что написано. Вопросы по аргументам виевс появляются часто, так бы 1 раз разобраться, но инфы с несколькими объясняющими примерами что за аргументы и как их составлять не нахожу

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 20 января 2010 в 0:32

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

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 20 января 2010 в 8:37

Как и написано - проверяет аргумент на валиднось. На выходе соответственно 2 состояния - проверка пройдена, или нет, ну и при непрохождении - соответствующее действие, которое задается ниже. Пользовался лишь Basic Validation, и php validation - писал php код для проверки аргументов. Собвтсенно валидатор нужен чтобы исключить неугодные элементы, с которыми view может выдать "не ту" информацию. К примеру - view, которая будет выдавать список определенных типов нод текущего пользователя. Тут понятно что можно default argument прописать, но на скринкасте, который я смотрел - использовался uid из пути (view был в профиле как таблица), и php validation чтобы на чужом профиле не показывать. Надеюсь, объяснил более-менее понятно, т.к. никогда талантом учителя не отличался)

Аватар пользователя serious.vip@drupal.org serious.vip@dru... 20 января 2010 в 8:39

Оффтоп.
Вообще views замечательная штука, в которой можно не только gui пользовать, но и во всю api. К примеру если нужна гибкость, то я предпочитаю не писать sql, а использовать api views для его формирования. Там же и выполнить можно, и результат получить. Удобно, быстро, гибко.