18 окт. 2014 г., 15:42
При регистрации не прописывает primary_group или как получить группу пользователя
Здравствуйте.
Подскажите в чем проблема. Создал форму регистрации, в которой пользователь выбирает группу, в которую регистрируется.
Так вот группа прописывается нормально, он попадает в нужную. А вот в таблице user в поле primaru_group всегда пишет 0 (нуль). Хотя туда должен писаться id группы.
На сайте в зависимости от группы показывается разная информация. Таким кодом я получал primary_group и в зависимости от него выводил разные чанки. Вот код:
$id = $_GET[id]; $res = $modx->getObject('modUser',$id); $output = $res->get(primary_group);
Преобразовал его из этого кода:
$output = ""; if ($modx->user->isMember('Новичок')) { $output = $modx->getChunk('user_novichok'); } else { $output = $modx->getChunk('user_profi'); } return $output;
Во втором коде получается группа текущего зарегистрированного пользователя. А как мне ее получить для любого пользователя, например по его id?
Таким кодом я получал primary_group и в зависимости от него выводил разные чанки.
А вот не надо плясать от primary_group. primary_group в MODX-е - эот от Ктулху. И использовать это не надо вообще. И вообще чанки брать в зависимости от группы - не по религии это. Запомните: если вы что-то хотите разделить, то права или есть на что-то, или их нет. Юзайте $modx->hasPermission($perm) - и будете на правильном пути.
Вот немного поковырял когда же и где устанавливается primary_group. Так вот, в user/create-процессоре этот параметр вообще не устанавливается, его просто нет. Устанавливается он только в user/update-процессоре, только если были переданы группы пользователя. А главное - выбирается только та группа, у которой ранк = 0. И вот начига оно надо? Это рандом. А главное - вообще не видел, чтобы где-то в системе политик безопасности MODX-а это где-то использователось. В общем, если хочется головняка, то юзайте.
Вот так можно использовать как замену primary_group?
$id = $_GET[id]; $res = $modx->getObject('modUser',$id); if ($res->isMember('Новичок')) { $output = $modx->getChunk('user_novichok'); }
Ну это на скорую руку, лишь бы работало...
А вообще странно... Раньше работало как надо, поэтому и стал его использовать. Но с какого момента перестало работать не могу выяснить, поэтому и трудно выявить причину...
Да. Но здесь есть два НО, больших и жирных:
1. Метод modUser::isMember() (а точнее modUser::getUserGroupNames(), вызываемый в modUser::isMember()), получает группы пользователей из сессии пользователя. Это чревато тем, что если пользователь уже был авторизован, а вы ему меняете группу пользователя, изменения возникнут только после уничтожения его сессии.
2. Метод modUser::isMember() не принимает id группы пользователей, что повлечет за собой понятные последствия в случае переименовывания группы пользователей.
Но в целом можно пользоваться. И да - этот метод так же не имеет никакого отношения к primary_group :)
Вот это я и имею ввиду, когда говорю не использовать - странно. Такого в программировании не должно быть. Работать (или не работать) должно стабильно. Сегодня у вас работает, а завтра у вас не работает. Объяснение конечно можно найти почему оно не работает, но только зачем себе все усложнять?
А почему я привязался сначала в primary_group? Потому что значения там совпадали со значением id группы. Вот я подумал что таки и задумано))
Это вам просто повезло. Совпадение.
А таким образом можно выводить информацию не для текущего пользователя, который залогинен, а для других пользователей? Например, хочу вывести профили пользователей сайта для просмотра. У в зависимости от группы в профилях разная информация.
Вы зайдите здесь в чей-нибудь профиль. Увидите емейл? Вряд ли. Думаете из-за того, что вы не в той группе? Отчасти да, но главное - у вас просто нет прав. Смысл политик безопасности должен быть в том, есть у вас права или нет. Не важно в какой вы группе. У анонимуса может быть больше прав, чем у администратора. Все зависит от настроенных политик. К примеру, у меня это так:
{if $modx->hasPermission('some_perm')} Some code... {/if}
И я не парюсь в какой группе пользователь. Или у него есть права, и он увидит, или у него нет прав.
А можно ли сделать разными профили пользователей в зависимости от группы (в принципе сделано) и еще в зависимости от какого-либо второго значения в БД?
То есть в БД записано 1 или 0. Если пользователь в группе Новичек и у него в БД значение 1, то его профиль более расширен нежели у Новичка со значением 0 в поле БД.
Запутанно может объяснил?
Не запутано, а бессмыслено. Я же сказал: используйте $modx->hasPermission(). Надо пользователю дать более расширенные поля - занесите его еще в одну группу пользователей. Один пользователь может находиться в нескольких группах, права суммируются. Не изобретайте велосипед.
//html I`m [[+user.name]] my identifier [[+user.id]] //html
Call Chunk:
$output = $modx->getChunk('MyChunk',array( 'user' => array( 'id' => 123, 'name' => 'Pet`ka' ) ); return $output;
Output:
//html I`m Pet`ka my identifier 123 //html