Имеем в наличие вьюшную страницу с заданной выборкой(фильтрацией) нод
Некоторые ноды имеют поле_1 типа чекбокс (с вкл. чекбоксом).
Необходимо для роли_1 отфильтровать вывод списка нод по вкл. чекбоксу , а для роли_2 по выключенному (то есть убрать из списка все ноды с вкл. чекбоксом)
вторая задача. похожа на первую.
нужно показывать/скрывать поля для определенных ролей.
пример выводим поле_1 со значением его. для роли_1 не показывать это поле. а для роли_2 - показывать.
Комментарии
контекстный фильтр с php кодом
пример можете показать кода.
Можно и без кода. Я так понял это Drupal 7. Там же можно вводить разные условия и разные группы условий и там есть условия между группами or/and, не придумывайте велосипед все до вас придумано, нажмите не на add (условия), а на стрелочку правее и там (And, Or).
да инет там php только Global: Null
так это я знаю. как эти фильтры узнают какая роль у юзера???
Предположим, у чекбокса значения 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; // здесь случай, когда юзер не имеет ни одной роли. значение на ваше усмотрение
?>
role_1, role_2
как узнать на англ. значения рус. название полей?
Можно еще роли по номеру находить
if ( array_key_exists(2, $roles) ) return 1;
да момент с ролями я упустил, по-правильному вам просто нужно настроить доступ к этим нодам с помощью хука hook_access. Единственный вопрос они должны пропасть вообще или только на данной вьюшке
devel установлен? выведете как нибудь результат функции user_roles(); например, если есть devel, на странице devel/php выполните dpm(user_roles());
не девелом я не пользуюсь.
на это вьюшке для конкретной роли пользователя.
зря, удобная штука для разработки и дебага
<?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 по выключенному (то есть убрать из списка все ноды с вкл. чекбоксом)
и все это на одном дисплее!!!
контекстный фильтр создали? в нем этот код.
конкретно этот код работает так - если у юзера есть роль 3, то код вернет 1, значит выведутся ноды с включенным чекбоксом, если у него есть роль 2 и нет роли 3, значит выведутся ноды с выключенным чекбоксом. Если у него нет ни роли 2, ни роли 3, значит выведутся ноды тоже с выключенным чекбоксом.
Что именно вы не понимаете?
вы уверены, что не перепутали фильтры с контекстными филтрами?
конечно не перепутал. я выбрал Global: Null и там в Provide default value нашел PHP
а откуда код знает какое поле с чекбоксом нужно проверять у нод???
код не знает, он просто возвращает значение. А вот views знает какое поле сравнить с этим значением. Вы ведь, когда создаете контекстный фильтр, выбираете определенное поле. Я об этом писал
у меня с таким кодом
<?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 и разные пары... никаких изменений...
там где я выбираю там нет возможности выбрать поле и добавить пхп...
или там же в контексных полях поле выбрать нужно???
выбрал поле. и код... сейчас поглядим что будет
где вы их меняли тогда, если фильтр еще не выбрали?
И поставьте devel, посмотрите список ролей, метод тыка не везде эффективен. Ну или хотя бы посмотрите в бд через phpmyadmin или что-нибудь подобное
так изменения пошли.
но что то не выходит.
я выбрал поле - у меня оно называется артист - и имеет 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; - без этого значения вообще ничего не выводит... - пишет страница не найден а тут нужно вариант когда все значения показывать...........
м.б. return; - но нет...
а как возвращать несколько значений? кончено хорошо бы было бы удобнее исключить значение а не возвращать значения...
но что то не то выводится...
для
<?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х и более ролей?
пока что выкрутился так
поставил доп роли выше чем зарегистрированный пользователь
но это не то!!!
1. как вернуть несколько значений (или вернуть все значения исключая некоторые)
такое не работает чото return array (0, 1, 2);
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 и программирование в общем.
так я так и делаю. написано же наверху. условия не выполняются. берутся из первого заданного.
еще раз повторяю такая схема не работает. предложенная вами
<?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 то дальше проверки не проходят.
как задать условие что бы у юзера была ТОЛЬКО это роль и никакая больше другая...
и по 2 фильтра не работает.
<?php
if ( array_key_exists(1, $roles) && count ($roles) == 1) return 2;
?>
Вот за такую подсказку большое большое спасибо.
теперь фильтрация для конкретных условий для ролей фильтрует выводя ОДНО значение.
1. есть ли решение что бы выводило кроме НЕКОТОРОГО значения, а все остальные выводились...
и для интересу таки
2. есть все таки решение что бы выводить несколько значений. потому что
если условия продублировать в др фильтре и ретюрн сделать на еще одно значение из того же массива... то нифига не выведется. пустая страница будет.
count ($roles) == 1
ксти 1 - это означает что роль одна у юзера или нечто другое?
Нет под рукой друпала, чтобы посмотреть. Разве в настройках фильтра нет что-то типа 'Negate'? то есть нужно обратить результат фильтра.
Опять же, нет друпала под рукой )) разве нет возможности при пересортировке фильтров поставить между ними OR вместо AND? или такая фича есть только для простых, не контекстных фильтров?
это означает, что в массиве 1 элемент. А так как массив содержит роли юзера, значит, что у юзера одна роль.
а для этой задачи такое же решение ? в php поле задаем условие для ролей и выводим или не выводим поле?
такое я видел только в рулесах...
в 7 друпале да. фича для простых не контекстных фильтров.
да
непонятно просто что показать по одному значение можно, а показать по всем значениям - нельзя, в одном коде.
если такой код вставлять
<?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'; } ?>то для гостей колонка выводится но без значения. как в коде убрать и вывод колонки?
пи.сэ. можно конечно в условиях табличного вывода поставить галку убирать колонку при ни одном выведенном значение поля.
но решит ся ли это в других вариантов вывода информации во вьюхе?
о какой колонке вы говорите? не могли бы скрины настроек прикладывать?
колонка от поля. какая еще есть в табл. виде вьюх
могу только предложить написать свой плагин для views. Тогда в нем можно решить многие задачи, которые вам нужны.
С плагином для виюхи понятно.