Здравствуйте, подскажите пожалуйста. В общем есть у меня модуль, который создает страницу.
И есть определенная роль "оператор", и вот собственно мой вопрос в том, как сделать так, что бы эта страница была доступна только роли "оператор" ? Заранее благодарю за ответ.
<?php
function webformizi_menu() {
$items = array();
$items['newselect'] = array(
'title' => 'Новая поверка',
'page callback' => 'main_funct', //Отрисовка стр.
'type'=> MENU_NORMAL_ITEM,
);
return $items;
}
?>
Комментарии
Вы правильно ключевые слова выбрали. Проверяйте в access callback какая роль у пользователя. Всё это легко гуглится
Спасибо, да, вот ищу решение сейчас
Ну собственно решил проблему вот такой функцией:
Данная страница доступна только для администратора, и роли оператора.
<?php
function module_access() {
global $user;
$Array = $user->roles;
if(in_array("Оператор",$Array) || in_array("administrator",$Array)) {
return TRUE;
}
else {
return FALSE;
}
}
?>
Которая находиться в access callback в hook_menu
<?php
function webformizi_menu() {
$items = array();
$items['newselect'] = array(
'title' => 'Новая поверка',
'page callback' => 'main_funct', //Отрисовка стр.
'access callback' => 'module_access',
'type'=> MENU_NORMAL_ITEM,
);
return $items;
}
?>
Я могу, конечно, ошибаться, но in_array это тот же цикл по массиву и тогда в вашем module_access() получается 2 обхода одного и того же массива.
Гораздо быстрее отработало что-то типа:
<?php
foreach($roleArray as $role) {
if ($role == 'administrator' || $role == 'Оператор') {
return true;
}
}
return false;
?>
В таком случае будет всего 1 проход по циклу и то не до конца, если найдёт совпадения.
А так, как массив ролей юзера, опять же если мне не изменяет память, от "меньших" к "большим", то рациональней было бы массив предварительно развернуть
<?php array_reverse($userRoles) ?>
Где там два прохода? И с каких пор foreach стал быстрее, чем специализированные функции работы с массивами?
https://api.drupal.org/api/drupal/modules%21user%21user.module/function/...
Я ж писал
Если это не так, то объясни мне, как работает in_array?
Нада смотреть в исходниках пхп. Но поскольку сам цикл в in_array написан на более быстром, чем пхп языке, то должен быть быстрее. Ну да ладно, опустим момент скорости. Где там два цикла то?
Первый проход проверяет оператора, второй - администратора.
Алексей, будьте любезны объяснить чем именно кроме слова "специализированная" foreach отличается от in_array
Bumble , + 1. Ещё лучше решение:
<?php return (isset($user->roles[$rid1]) || isset($user->roles[$rid2]) ) ?>
Чёрт побери! Там горизонтальный скролл)))) теперь увидел) за один проход можно решить через array_intersect
Даже взгуглить не поленился:
https://gist.github.com/Maks3w/3097685
опять же судя из ссылки Антона $user->roles - массив, где ключами выступают айдишники ролей.
То есть для интерсекта нужно составить сперва соответствующий массив для оператора и администратора, и потом проверить длину чтобы вернуть булево значение. Как по мне через isset проще, короче и понятнее
Через иссет нельзя проверить две роли сразу.
А вообще, по-правильному нужно проверять не роли, пермишены.
Можно:
<?php
isset($rid1, $rid2);
?>
Вот просто спасибо. А я дурак всю жизнь проверял через
<?php
isset($var1) && isset($var2)
?>
Теперь чувствую себя полным идиотом.
Там точно оператор ИЛИ?
Ну и? При строгой типизации - одинаковое время выполнения. При нестрогой in_array чуть быстрее. При чём в примере при нахождении элемента foreach не прерывает цикл)))
Вот это уже дело... друпал вей мать его
Ты там с мобилы что ли сидишь?
Не сидеть же за компом после работы))
Всем спасибо за Ваши ответы)