Как сделать чтобы один пользователь мог иметь только одну роль? Чтобы в админке где роль выбираешь при создании и редактировании юзера был радиобокс вместо чекбокса. Пытаюсь сам модуль написать - не изменяет роль.
/* make radiobox in registration form*/
function hdmod_form_alter(&$form, &$form_state, $form_id)
{
//var_dump($form_id);
if(in_array($form_id, Array("user_register_form","user_profile_form")))
{
global $user;
$roles = $user->roles;
$_keys = array_keys($roles);
$role = $_keys[1]; // role
Такой код. Но при этом когда сохраняешь юзера он получается вообще без ролей.
Выдает : «
The first argument should be an array в функции user_user_presave() (строка 1286 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).
Warning: array_keys() [function.array-keys]: The first argument should be an array в функции user_save() (строка 523 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).
Warning: Invalid argument supplied for foreach() в функции user_save() (строка 523 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).»
«один пользователь мог иметь только одну роль»
Какую именно роль? Супер админа,анонима ?
Хотите делать выборку одной определенной роли,опишите критерии выборки
просто сменить на radios не работает. там проблема возникает со структурой формы. вообще есть ли комплексные решения какие-то? чтоб иерархия ролей допустим?
Дык переопределить-то я переопределил. Только не работает. Не меняется роль, а точнее вообще юзер становится без ролей. Неверный формат какой-то.
по логике в $form_state['values']['roles'] должен предаваться массив, а когда меняете на radios передастся строка
в hook_form_alter перед сабмитом оберните значение в массив
но это предположение, не проверял
['values']['roles'] - пробовал. не помогает. и ['input']['roles']
После сохранения юзера орет :
«Warning: array_filter() expects parameter 1 to be array, string given в функции user_user_presave() (строка 1286 в файле D:\wamp\domains\syskit\modules\user\user.module).
Warning: array_keys() expects parameter 1 to be array, null given в функции user_save() (строка 523 в файле D:\wamp\domains\syskit\modules\user\user.module).
Warning: Invalid argument supplied for foreach() в функции user_save() (строка 523 в файле D:\wamp\domains\syskit\modules\user\user.module).»
Комментарии
«function radio_role_submit($form, &$form_state)
{
ob_start();
var_dump($form_state);
file_put_contents('form.html', ob_get_clean());
ob_start();
var_dump($form_state);
file_put_contents('form_state.html', ob_get_clean());
$form_state['input']['roles'] = Array(2,(int)$form_state['input']['roles']);
$form['complete form']['#user']->roles = Array(2,(int)$form_state['input']['roles']);
$form['values'] = Array(2,(int)$form_state['input']['roles']);
//$form['build_info']['args'][0]->roles = Array(2,(int)$form_state['input']['roles']);
}
/* make radiobox in registration form*/
function hdmod_form_alter(&$form, &$form_state, $form_id)
{
//var_dump($form_id);
if(in_array($form_id, Array("user_register_form","user_profile_form")))
{
global $user;
$roles = $user->roles;
$_keys = array_keys($roles);
$role = $_keys[1]; // role
//var_dump($form);
if(empty($form["account"]["roles"]["#default_value"][1]))
{
$form["account"]["roles"]["#default_value"] = 5;
}
else
{
$form["account"]["roles"]["#default_value"] = $form["account"]["roles"]["#default_value"][1];
}
$form["account"]["roles"]["#type"]="radios";
//$form["account"]["roles"]["#default_value"] = 4;
//unset($form["account"]["roles"]["#options"][3]);
array_unshift($form['#submit'],'radio_role_submit');
}
}»
Такой код. Но при этом когда сохраняешь юзера он получается вообще без ролей.
Выдает : «
The first argument should be an array в функции user_user_presave() (строка 1286 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).
Warning: array_keys() [function.array-keys]: The first argument should be an array в функции user_save() (строка 523 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).
Warning: Invalid argument supplied for foreach() в функции user_save() (строка 523 в файле /home/blago-v-da/komunal-servis.ru/docs/crm/modules/user/user.module).»
Может просто хук форм алтер и тип сменить на radios?
«один пользователь мог иметь только одну роль»
Какую именно роль? Супер админа,анонима ?
Хотите делать выборку одной определенной роли,опишите критерии выборки
просто сменить на radios не работает. там проблема возникает со структурой формы. вообще есть ли комплексные решения какие-то? чтоб иерархия ролей допустим?
Переопределите меню и выведите свою форму и там творите что хотите
Или https://api.drupal.org/api/drupal/modules!system!system.api.php/function...
Дык переопределить-то я переопределил. Только не работает. Не меняется роль, а точнее вообще юзер становится без ролей. Неверный формат какой-то.
Борьба функций..Кто победит ? Ваши или Друпал?
function hdmod_form_alter что возвращает ? массив
The first argument should be an array?
Не удивительно, этот код далёк от друпала как я от США.
У юзера, как минимум, должна быть всегда роль авторизованного.
Значит вам нужно две роли.
по логике в $form_state['values']['roles'] должен предаваться массив, а когда меняете на radios передастся строка
в hook_form_alter перед сабмитом оберните значение в массив
но это предположение, не проверял
['values']['roles'] - пробовал. не помогает. и ['input']['roles']
После сохранения юзера орет :
«Warning: array_filter() expects parameter 1 to be array, string given в функции user_user_presave() (строка 1286 в файле D:\wamp\domains\syskit\modules\user\user.module).
Warning: array_keys() expects parameter 1 to be array, null given в функции user_save() (строка 523 в файле D:\wamp\domains\syskit\modules\user\user.module).
Warning: Invalid argument supplied for foreach() в функции user_save() (строка 523 в файле D:\wamp\domains\syskit\modules\user\user.module).»
Знать бы что в form и form_state он берет.
«Знать бы что в form и form_state он берет.»
А чего знать,пройдитесь по функциям,попробуйте отладить каждую строку)
Или почитайте
https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...
Выяснилось. Там должно быть в формате
« ["roles"]=>
array(5) {
[5]=>
string(1) "5"
[2]=>
bool(true)
[3]=>
int(0)
[4]=>
int(0)
[6]=>
int(0)
}»
Вот модуляка.
Мелкий глючок был. Вот нормэ.