Views - 2 задачи, решаемы ли без кодинга?

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

Аватар пользователя iNFerNo iNFerNo 4 июля 2013 в 11:45

Имеем в наличие вьюшную страницу с заданной выборкой(фильтрацией) нод
Некоторые ноды имеют поле_1 типа чекбокс (с вкл. чекбоксом).

Необходимо для роли_1 отфильтровать вывод списка нод по вкл. чекбоксу , а для роли_2 по выключенному (то есть убрать из списка все ноды с вкл. чекбоксом)

вторая задача. похожа на первую.

нужно показывать/скрывать поля для определенных ролей.
пример выводим поле_1 со значением его. для роли_1 не показывать это поле. а для роли_2 - показывать.

Комментарии

Аватар пользователя arrides arrides 4 июля 2013 в 13:02

Можно и без кода. Я так понял это Drupal 7. Там же можно вводить разные условия и разные группы условий и там есть условия между группами or/and, не придумывайте велосипед все до вас придумано, нажмите не на add (условия), а на стрелочку правее и там (And, Or).

Аватар пользователя serega111 serega111 4 июля 2013 в 13:16

Предположим, у чекбокса значения 0 и 1 (меняются в настройках поля).
Тогда контекстный фильтр по этому полю, значение по умолчанию - php code
<?php
global $user;
$roles = $user->roles;
if (in_array ('role_1', $roles))
return 1;
if (in_array ('role_2', $roles))
return 0;
return 0; // здесь случай, когда юзер не имеет ни одной роли. значение на ваше усмотрение
?>

Аватар пользователя arrides arrides 4 июля 2013 в 13:54

да момент с ролями я упустил, по-правильному вам просто нужно настроить доступ к этим нодам с помощью хука hook_access. Единственный вопрос они должны пропасть вообще или только на данной вьюшке

Аватар пользователя serega111 serega111 4 июля 2013 в 13:57

"iNFerNo" wrote:
как узнать на англ. значения рус. название полей?

devel установлен? выведете как нибудь результат функции user_roles(); например, если есть devel, на странице devel/php выполните dpm(user_roles());

Аватар пользователя iNFerNo iNFerNo 4 июля 2013 в 15:59

не девелом я не пользуюсь.

"arrides" wrote:
Единственный вопрос они должны пропасть вообще или только на данной вьюшке

на это вьюшке для конкретной роли пользователя.

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 9:11
<?phpglobal $user;
$roles = $user->roles;
if ( array_key_exists(3, $roles) ) return 1;

if ( array_key_exists(2, $roles) ) return 0;

return 0; // здесь случай, когда юзер не имеет ни одной роли. значение на ваше усмотрение
?>

что то я не пойму как выше предложеный код вяжется с задачей...

создана views страница с выводом по определенной фильтрацией нод, некоторые из этих нод имеют поле_1 типа чекбокс - с вкл. чекбоксом.
Необходимо для роли_2 отфильтровать вывод списка нод по вкл. чекбоксу , а для роли_3 по выключенному (то есть убрать из списка все ноды с вкл. чекбоксом)

и все это на одном дисплее!!!

Аватар пользователя serega111 serega111 5 июля 2013 в 9:19

"iNFerNo" wrote:
<?phpglobal $user;
$roles = $user->roles;
if ( array_key_exists(3, $roles) ) return 1;

if ( array_key_exists(2, $roles) ) return 0;

return 0; // здесь случай, когда юзер не имеет ни одной роли. значение на ваше усмотрение
?>


контекстный фильтр создали? в нем этот код.
конкретно этот код работает так - если у юзера есть роль 3, то код вернет 1, значит выведутся ноды с включенным чекбоксом, если у него есть роль 2 и нет роли 3, значит выведутся ноды с выключенным чекбоксом. Если у него нет ни роли 2, ни роли 3, значит выведутся ноды тоже с выключенным чекбоксом.
"iNFerNo" wrote:
что то я не пойму как выше предложеный код вяжется с задачей...

Что именно вы не понимаете?
"iNFerNo" wrote:
создана views страница с выводом по определенной фильтрацией нод, некоторые из этих нод имеют поле_1 типа чекбокс - с вкл. чекбоксом.

вы уверены, что не перепутали фильтры с контекстными филтрами?

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 9:23

"serega111" wrote:
контекстный фильтр создали? в нем этот код.
конкретно этот код работает так - если у юзера есть роль 3, то код вернет 1, значит выведутся ноды с включенным чекбоксом, если у него есть роль 2 и нет роли 3, значит выведутся ноды с выключенным чекбоксом. Если у него нет ни роли 2, ни роли 3, значит выведутся ноды тоже с выключенным чекбоксом.

конечно не перепутал. я выбрал Global: Null и там в Provide default value нашел PHP

а откуда код знает какое поле с чекбоксом нужно проверять у нод???

Аватар пользователя serega111 serega111 5 июля 2013 в 9:24

код не знает, он просто возвращает значение. А вот views знает какое поле сравнить с этим значением. Вы ведь, когда создаете контекстный фильтр, выбираете определенное поле. Я об этом писал

"serega111" wrote:
Предположим, у чекбокса значения 0 и 1 (меняются в настройках поля).
Тогда контекстный фильтр по этому полю

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 9:26

у меня с таким кодом

<?phpglobal $user;
$roles = $user->roles;
if ( array_key_exists(0, $roles) ) return 1;

if ( array_key_exists(1, $roles) ) return 0;

return 0;?>

с вьюхой вообще ничего не происходит. меняю номера ролей и 0 - 1, и 1 -2, и 0 - 3 и разные пары... никаких изменений...

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 9:28

"serega111" wrote:
А вот views знает какое поле сравнить с этим значением. Вы ведь, когда создаете контекстный фильтр, выбираете определенное поле. Я об этом писал

там где я выбираю там нет возможности выбрать поле и добавить пхп...

Аватар пользователя serega111 serega111 5 июля 2013 в 9:36

"iNFerNo" wrote:
или там же в контексных полях поле выбрать нужно???
выбрал поле. и код... сейчас поглядим что будет

"iNFerNo" wrote:
с вьюхой вообще ничего не происходит. меняю номера ролей и 0 - 1, и 1 -2, и 0 - 3 и разные пары... никаких изменений...

где вы их меняли тогда, если фильтр еще не выбрали?
И поставьте devel, посмотрите список ролей, метод тыка не везде эффективен. Ну или хотя бы посмотрите в бд через phpmyadmin или что-нибудь подобное

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 9:47

так изменения пошли.

но что то не выходит.

я выбрал поле - у меня оно называется артист - и имеет 5 значений (1,2,3,4,5)

есть пользователи - гости (0) зарегистрированные (1) есть зарегистрированные с дополнительными ролями например админ (3) или редактор (4)

как мне для гостей (0) исключить из вывода 1 значение поля... для зарегистрированных (1) - 2 значения, для зарегистрированных + админ роль (1 + 3 ) исключить 3 значение поля, а для зарег + редактор ( 1+ 4) исключить 4 значение поля...

я пытаюсь сделать так

global $user;
$roles = $user->roles;
if ( array_key_exists(0, $roles) ) return 1;

if ( array_key_exists(1, $roles) ) return 2;

if ( array_key_exists(1, $roles) and array_key_exists(3, $roles) ) return 3;

if ( array_key_exists(1, $roles) and array_key_exists(4, $roles)) return 4;

return 0; - без этого значения вообще ничего не выводит... - пишет страница не найден Sad а тут нужно вариант когда все значения показывать...........

м.б. return; - но нет...

а как возвращать несколько значений? кончено хорошо бы было бы удобнее исключить значение а не возвращать значения...

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 10:11

но что то не то выводится...

для

<?php
if ( array_key_exists(1$roles) ) return 5;

if ( 

array_key_exists(2$roles) ) return 2;?>

все ок. остальное выводит не то что задано! выводит в остальных случаях по if ( array_key_exists(2, $roles) ) return 2;

как записать условия для назначеных юзеру 2х и более ролей?

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 10:49

пока что выкрутился так

поставил доп роли выше чем зарегистрированный пользователь

но это не то!!!

1. как вернуть несколько значений (или вернуть все значения исключая некоторые)

такое не работает чото return array (0, 1, 2);
2. как составить правильно проверку юзера на две роли на три роли

Аватар пользователя serega111 serega111 5 июля 2013 в 11:05

"iNFerNo" wrote:
1. как вернуть несколько значений (или вернуть все значения исключая некоторые)

создать несколько контекстных фильтров
"iNFerNo" wrote:
2. как составить правильно проверку юзера на две роли на три роли

<?php
if ( array_key_exists(1, $roles) && array_key_exists(2, $roles))
?>
или
<?php
if ( array_key_exists(1, $roles) || array_key_exists(2, $roles))
?>
что вам выбрать зависит от задачи.

Если хотите решение, поставьте задачу правильно, сложно собирать условия по куче комментариев.
Хотите работать с друпал, подучите хоть немного php и программирование в общем.

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 12:29

еще раз повторяю такая схема не работает. предложенная вами

<?php
global $user;
$roles $user->roles;

if ( 

array_key_exists(1$roles) ) return 2;

if ( 

array_key_exists(3$roles) && array_key_exists(2$roles)) return 4;

if (  

array_key_exists(4$roles) && array_key_exists(2$roles)) return 5;

if ( 

array_key_exists(2$roles) ) return 2;

return 

1;?>

так как если встречается роль с номер = 1 то дальше проверки не проходят.
как задать условие что бы у юзера была ТОЛЬКО это роль и никакая больше другая...

Аватар пользователя serega111 serega111 5 июля 2013 в 13:09

"iNFerNo" wrote:
как задать условие что бы у юзера была ТОЛЬКО это роль и никакая больше другая...

<?php
if ( array_key_exists(1, $roles) && count ($roles) == 1) return 2;
?>

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:06

Вот за такую подсказку большое большое спасибо.
теперь фильтрация для конкретных условий для ролей фильтрует выводя ОДНО значение.

1. есть ли решение что бы выводило кроме НЕКОТОРОГО значения, а все остальные выводились...

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

Аватар пользователя serega111 serega111 5 июля 2013 в 14:22

"iNFerNo" wrote:
1. есть ли решение что бы выводило кроме НЕКОТОРОГО значения, а все остальные выводились...

Нет под рукой друпала, чтобы посмотреть. Разве в настройках фильтра нет что-то типа 'Negate'? то есть нужно обратить результат фильтра.
"iNFerNo" wrote:
2. есть все таки решение что бы выводить несколько значений. потому что
если условия продублировать в др фильтре и ретюрн сделать на еще одно значение из того же массива... то нифига не выведется. пустая страница будет.

Опять же, нет друпала под рукой )) разве нет возможности при пересортировке фильтров поставить между ними OR вместо AND? или такая фича есть только для простых, не контекстных фильтров?
"iNFerNo" wrote:
ксти 1 - это означает что роль одна у юзера или нечто другое?

это означает, что в массиве 1 элемент. А так как массив содержит роли юзера, значит, что у юзера одна роль.

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:26

"iNFerNo" wrote:
вторая задача. похожа на первую.

нужно показывать/скрывать поля для определенных ролей.
пример выводим поле_1 со значением его. для роли_1 не показывать это поле. а для роли_2 - показывать

а для этой задачи такое же решение ? в php поле задаем условие для ролей и выводим или не выводим поле?

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:27

"iNFerNo" wrote:
Нет под рукой друпала, чтобы посмотреть. Разве в настройках фильтра нет что-то типа 'Negate'? то есть нужно обратить результат фильтра.

такое я видел только в рулесах...

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:28

"serega111" wrote:
Опять же, нет друпала под рукой )) разве нет возможности при пересортировке фильтров поставить между ними OR вместо AND? или такая фича есть только для простых, не контекстных фильтров?

в 7 друпале да. фича для простых не контекстных фильтров.

Аватар пользователя serega111 serega111 5 июля 2013 в 14:31

"iNFerNo" wrote:
а для этой задачи такое же решение ? в php поле задаем условие для ролей и выводим или не выводим поле?

да

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:33

"serega111" wrote:
Нет под рукой друпала, чтобы посмотреть. Разве в настройках фильтра нет что-то типа 'Negate'? то есть нужно обратить результат фильтра.

непонятно просто что показать по одному значение можно, а показать по всем значениям - нельзя, в одном коде.

Аватар пользователя iNFerNo iNFerNo 5 июля 2013 в 14:46

"serega111" wrote:
да

если такой код вставлять

<?php 
global $user;
$roles $user->roles;

if ( 

array_key_exists(2$roles) && count ($roles) ==  1) { print '2'; }

if ( 

array_key_exists(3$roles) && array_key_exists(2$roles)) { print '3'; }

?>

то для гостей колонка выводится но без значения. как в коде убрать и вывод колонки?

пи.сэ. можно конечно в условиях табличного вывода поставить галку убирать колонку при ни одном выведенном значение поля.

но решит ся ли это в других вариантов вывода информации во вьюхе?

Аватар пользователя serega111 serega111 5 июля 2013 в 15:05

"iNFerNo" wrote:
то для гостей колонка выводится но без значения. как в коде убрать и вывод колонки?

о какой колонке вы говорите? не могли бы скрины настроек прикладывать?

Аватар пользователя serega111 serega111 5 июля 2013 в 22:27

"iNFerNo" wrote:
колонка от поля. какая еще есть в табл. виде вьюх

могу только предложить написать свой плагин для views. Тогда в нем можно решить многие задачи, которые вам нужны.