Комментарии 10
С радостью учту замечания, как это можно было сделать лучше.
0
Если честно, я запутался в вашем коде.
Если ничего не путаю, то access callback — имя функции, которая проверит права доступа, а access arguments — массив аргументов, которые уйдут на вход функции. Почему нельзя было сделать как-то так:
Если ничего не путаю, то access callback — имя функции, которая проверит права доступа, а access arguments — массив аргументов, которые уйдут на вход функции. Почему нельзя было сделать как-то так:
function MYMODULE_menu_alter(&$items) {
foreach ($items as $key => &$item) {
array_unshift($item['access arguments'], $item['access callback']);
$item['access callback'] = 'MYMODULE_access_callback';
}
}
function MYMODULE_access_callback() {
$args = func_get_args();
$callback = array_shift($args);
$core_access = call_user_func_array($callback, $callback_args);
$my_access = some_my_function_access(); // Функция, которая проверит ваши права доступа
return $core_access && $my_access;
}
0
$core_access = call_user_func_array($callback, $callback_args);
В этой строке не $callback_args, а $args
0
Не путаете.
В любом случае придется проверять наличие
Если в
То половина проверок прав из модулей ядра отвалится с ошибкой на несуществующую функцию.
В любом случае придется проверять наличие
access arguments
и access callback
, их типы. Вот с указателем &$item
действительно гораздо красивее :)Если в
MYMODULE_access_callback()
сразу сделать:$core_access = call_user_func_array($callback, $callback_args);
То половина проверок прав из модулей ядра отвалится с ошибкой на несуществующую функцию.
0
Вы ведь по этому поводу особо не переживаете и делаете в самом начале
if (!call_user_func_array($callback, $callback_args)) {
return FALSE;
}
0
Потому, что в
MYMODULE_menu_alter
устанавливаю стандартный user_access
, если коллбэка нет.0
Быть может у Вас конечно абстрактный пример, но всё таки хочется показать как я поступал именно с нодами. В своё время у меня стояла схожая задача, какие-то пользователи должны иметь доступ к определённому контенту, какие-то нет. Сначала я решил что пользователи делают с нодами, а они смотрят на них, редактируют и удаляют. Поэтому альтер следующий получился:
А вот теперь решаем давать ли им
Я намеренно потом запускаю callback который перетёр альтером (конечно в большинстве случаев это node_access), но всё может быть.
/**
* Implementation of hook_menu_alter().
*/
function module_menu_alter(&$items) {
variable_set('module_next_access_for_script_view', $items['node/%node']['access callback']);
variable_set('module_next_access_for_script_update', $items['node/%node/edit']['access callback']);
variable_set('module_next_access_for_script_delete', $items['node/%node/delete']['access callback']);
$items['node/%node']['access callback'] = 'module_script_access';
$items['node/%node/edit']['access callback'] = 'module_script_access';
$items['node/%node/delete']['access callback'] = 'module_script_access';
}
А вот теперь решаем давать ли им
/**
* Custom access for node/%node page.
*/
function module_script_access($op, $node, $account = NULL) {
//тут решаем давать ли доступ, а потом
$node_access_function = variable_get('module_next_access_for_script_' . $op, 'node_access');
return $node_access_function($op, $node, $account);
}
Я намеренно потом запускаю callback который перетёр альтером (конечно в большинстве случаев это node_access), но всё может быть.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Переопределение прав доступа в Drupal 6