Редактировать: я пропустил часть о разрешении «Редактировать собственный узел», потому что тогда вы должны не только проверить разрешение, но также, если этот узел принадлежит текущему пользователю. Я обновил мой пример ниже, но я оставляю приведенное выше объяснение, как было.
Ваш пункт меню ниже узла / nid (например, узел / 1234 / что-то)? Тогда вам, вероятно, даже не нужен обратный вызов с пользовательским доступом.
Если вы определите путь к меню, как в следующем примере, он будет вызывать только обратный вызов доступа (и, следовательно, обратный вызов вашей страницы), если вы просматриваете действительный узел.
'node/%node/something'
Это означает, что он вызовет node_load (1234) для приведенного выше примера и продолжит работу только в том случае, если возвращен действительный объект узла. Таким образом, вы можете определить свое разрешение с помощью аргументов доступа, как обычно.
Тем не менее, написание обратного вызова доступа действительно просто. Это просто функция, которая получит любые аргументы, которые вы определили в аргументах доступа. Например, вызов доступа по умолчанию user_access () и при определении ваших аргументов доступа нравятся 'access arguments' => array('a permission string')
, то это приведет к следующему вызову: user_access('a permission string')
.
Если у вас есть несколько аргументов, они будут переданы в качестве второго, третьего и т. Д. Аргумента вашей функции. Чтобы получить доступ к текущему активному узлу, вы можете использовать menu_get_object () .
Таким образом, вы можете написать свой обратный вызов доступа, как это, но, опять же, вам даже не нужно его создавать.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
Вместо того, чтобы жестко кодировать строку разрешения, вы можете передать ее в качестве аргумента функции или тому, что вы хотите сделать.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
и$node = menu_get_object();
в обратном вызове fn,$node
никогда ничего не возвращал. Я использовал вместо этого,$node = node_load(arg(1));
который работал ... Дальнейшие объяснения будут действительно приветствоватьсяDrupal сам является примером того, как писать код.
Более простой пример - aggregator_menu () , который содержит следующий код.
В этом случае обратный вызов доступа используется по умолчанию ( user_access () ), а аргументы доступа - это массив, содержащий строку для разрешения. Код не может проверить больше, чем разрешение; если разрешений для проверки два, или условия для проверки не просто разрешения, то обратный вызов доступа должен быть другим, включая пользовательский.
node_menu () определяет некоторые меню, которые используют обратный вызов доступа, отличный от стандартного. Функция содержит следующий код.
Функция, которая определена как обратный вызов доступа ( node_access () ), является следующей:
Следует отметить три момента:
TRUE
если у пользователя есть доступ к меню, иFALSE
если у пользователя нет доступа к меню.источник
access callback
функции она должна.module
находиться в вашем файле, потому что Drupal не может найти ее вfile
объявлении (по крайней мере, для меня).