Хитрое условие в views [Решено]

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

Аватар пользователя Drugan Drugan 11 сентября 2009 в 7:50

Возможно ли в views сделать такое: нужно перед построением запроса определить переменную, а потом подставить ее в запрос? Хочу вначале определить текущего пользователя, а потом в зависимости от него в запросе фильтровать ноды по терминам.

Комментарии

Аватар пользователя Drugan Drugan 11 сентября 2009 в 9:11

Возможно я плохо вьюз изучил, но как там сделать такое? Например, если uid=2, то в фильтре tid = 120, а если uid=3, то tid=121. Пользователь имеется ввиду не автор ноды, а под которым человек вошел на сайт. Это с помощью аргументов возможно?

Аватар пользователя Nikit Nikit 11 сентября 2009 в 9:10

да.
попробуй щелкнуть на аргументы, выбрать пользователся, далее там понятно.
задай путь.
вызовы так: путь/2
тогда вьюс поймает число 2 и положит его в первый аргумент, который выше являлся uid пользователя.

если так, то путь/2/222
то уже 2 аргумента ловиться.

Аргумент - это фильтр, только динамический, на самом деле он еще много чего умеет.

Аватар пользователя Nikit Nikit 11 сентября 2009 в 10:31

а в блоках делается немного хитро:
добавляешь пользователя в аргументах, потом где есть выборка - при отсуствтии аргумента - выбираешь php code, далее аргументы ловишь по arg(1), arg(2) и так далее.

Аватар пользователя botan botan 11 сентября 2009 в 12:16

Каким образом tid привязан к uid?
Про аргументы я считаю немного глупой затеей .. ибо в целом блоку аргументы не нужны Wink У views есть замечательная вещь как Relationships ..
Т.е. там нам нужно выбрать именно принцип связи терма и юзера (если каким то модулем было сделано, то возможно данная взаимосвязь указана уже), а потом добавить фильтр по терму, и указать отношение к только что созданному.

Т.е. для стандартных модулей хэндлеры уже написаны, например http://cvs.drupal.org/viewvc.py/drupal/contributions/modules/views/modul...

Контриб модули обычно поставляются со своими хэндлерами, если нет, то можно написать, там не сложно .. к сожалению найти сейчас не могу где читал про написание :/

Аватар пользователя Nikit Nikit 11 сентября 2009 в 12:54

"botan" wrote:
Про аргументы я считаю немного глупой затеей .. ибо в целом блоку аргументы не нужны

это почему глупая? они там доступны, и их можно ловить по arg.

Аватар пользователя botan botan 11 сентября 2009 в 17:56

"Nikit" wrote:
botan вы про что? при чём тут реляшны? ему надо подставить фильтр uid.

Ну если рассмотреть пример:
Допустим у меня есть список пользователей и список нод (тип articles)

и есть типа материала news (Это как замена терма, tid) в нем при помощи User reference и Node reference привязываются пользователи и нода типа articles.
К сожалению след.запрос нам ничего не выведет:

 SELECT node.nid AS nid,
   node.title AS node_title
 FROM node node
 INNER JOIN users users ON node.uid = users.uid
 WHERE (users.uid = ***CURRENT_USER***) AND (node.type IN ('articles'))

Пользуемся немного магией .. меняем тип ноды на news, и подгружаем два отношения по нужным нам полям User reference и Node reference.
А далее в поле Node: title в связях указываем отношение Node reference, а в фильтре User: Current указываем User reference.

В результате наших махинаций одной только мышкой мы выводим след. схему:

И след. запрос выдаст нам ноды articles привязанные к текущему пользователю:

 SELECT node.nid AS nid,
   node_node_data_field_q.title AS node_node_data_field_q_title,
   node_node_data_field_q.nid AS node_node_data_field_q_nid
 FROM node node
 LEFT JOIN content_field_q node_data_field_q ON node.vid = node_data_field_q.vid
 INNER JOIN node node_node_data_field_q ON node_data_field_q.field_q_nid = node_node_data_field_q.nid
 LEFT JOIN content_type_news node_data_field_ww ON node.vid = node_data_field_ww.vid
 INNER JOIN users users_node_data_field_ww ON node_data_field_ww.field_ww_uid = users_node_data_field_ww.uid
 WHERE users_node_data_field_ww.uid = ***CURRENT_USER***

Или я не правильно понял для чего нужны Relationships? Biggrin

Аватар пользователя Drugan Drugan 11 сентября 2009 в 20:24

"botan" wrote:
Каким образом tid привязан к uid?

Видимо я плохо объяснил, чем ввел в заблуждение. Взаимосвязи между tid и uid нет никакой, т.е. в нодах нужный uid не прописан. Мне нужно это для создания службы Вопрос - Ответ. Пользователи создают ноды с вопросами, кому задают вопрос выбирают через справочник. Эксперт заходит на сайт под своим именем. Ему в блоке показываются ноды без ответов в соответствии с его категорией.