Modifier: j'ai raté la partie concernant l'autorisation "Modifier son propre nœud", car vous devez non seulement vérifier l'autorisation, mais également si ce nœud appartient à l'utilisateur actuel. J'ai mis à jour mon exemple ci-dessous mais je laisse l'explication ci-dessus telle qu'elle était.
Votre entrée de menu est-elle sous nœud / nid (par exemple nœud / 1234 / quelque chose)? Ensuite, vous n'avez probablement même pas besoin d'un rappel d'accès personnalisé.
Si vous définissez votre chemin de menu comme dans l'exemple suivant, il n'appellera que le rappel d'accès (et donc le rappel de votre page), si vous visualisez un nœud valide.
'node/%node/something'
Cela signifie qu'il appellera node_load (1234) pour l'exemple ci-dessus et ne continuera que si un objet nœud valide est retourné. Vous pouvez donc définir votre autorisation avec des arguments d'accès comme d'habitude.
Cela dit, écrire un rappel d'accès est vraiment simple. C'est juste une fonction qui recevra les arguments que vous avez définis dans les arguments d'accès. Par exemple, le rappel d'accès par défaut est user_access () et lorsque vous définissez vos arguments d'accès aiment 'access arguments' => array('a permission string')
, cela se traduira par l'appel suivant: user_access('a permission string')
.
Si vous avez plusieurs arguments, ceux-ci seront passés comme deuxième, troisième et ainsi de suite argument à votre fonction. Pour accéder au nœud actuellement actif, vous pouvez utiliser menu_get_object () .
Vous pouvez donc écrire votre rappel d'accès comme ceci, mais encore une fois, vous n'aurez peut-être même pas besoin d'en créer un.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
Au lieu de coder en dur la chaîne d'autorisation, vous pouvez la passer comme argument à la fonction ou à tout ce que vous voulez faire.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
et$node = menu_get_object();
dans le rappel fn,$node
n'a jamais rien retourné. J'ai utilisé à la place$node = node_load(arg(1));
ce qui a fonctionné ... De plus amples explications seraient vraiment les bienvenuesDrupal est lui-même un exemple de la façon d'écrire du code.
L'exemple le plus simple estgregator_menu () , qui contient le code suivant.
Dans ce cas, le rappel d'accès est la valeur par défaut ( user_access () ) et les arguments d'accès sont un tableau contenant la chaîne de l'autorisation. Le code ne peut pas vérifier plus qu'une autorisation; si les autorisations à vérifier sont deux ou si les conditions à vérifier ne sont pas uniquement des autorisations, le rappel d'accès doit être différent, y compris personnalisé.
node_menu () définit certains menus qui utilisent un rappel d'accès différent de celui par défaut. La fonction contient le code suivant.
La fonction définie comme rappel d'accès ( node_access () ) est la suivante:
Il y a trois points à noter:
TRUE
si l'utilisateur a accès au menu etFALSE
si l'utilisateur n'a pas accès au menu.la source
access callback
fonction personnalisée , il semble qu'elle doit vivre dans votre.module
fichier, car Drupal ne semble pas la trouver dans lafile
déclaration (du moins pour moi).