Pull to refresh

Comments 10

С радостью учту замечания, как это можно было сделать лучше.
Если честно, я запутался в вашем коде.
Если ничего не путаю, то 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;
}
$core_access = call_user_func_array($callback, $callback_args);

В этой строке не $callback_args, а $args
Не путаете.

В любом случае придется проверять наличие access arguments и access callback, их типы. Вот с указателем &$item действительно гораздо красивее :)

Если в MYMODULE_access_callback() сразу сделать:
$core_access = call_user_func_array($callback, $callback_args);

То половина проверок прав из модулей ядра отвалится с ошибкой на несуществующую функцию.
Вы ведь по этому поводу особо не переживаете и делаете в самом начале
if (!call_user_func_array($callback, $callback_args)) {
  return FALSE;
}
Потому, что в MYMODULE_menu_alter устанавливаю стандартный user_access, если коллбэка нет.
Точно. Это я проглядел.
В любом случае, код в моем комментарии — это скорее псевдокод. Я его на работоспособность не проверял и лишь продемонстрировал идею.
И для нод, вроде бы стандартным колбэком будет node_access
Не совсем. Тут написано, что используется user_access, только заодно заметил, что тип MENU_DEFAULT_LOCAL_TASK может наследовать access callback. Т.е. надо добавлять еще одно условие.
Быть может у Вас конечно абстрактный пример, но всё таки хочется показать как я поступал именно с нодами. В своё время у меня стояла схожая задача, какие-то пользователи должны иметь доступ к определённому контенту, какие-то нет. Сначала я решил что пользователи делают с нодами, а они смотрят на них, редактируют и удаляют. Поэтому альтер следующий получился:
/**
 * 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), но всё может быть.
Sign up to leave a comment.

Articles