Bearbeiten: Ich habe den Teil über die Berechtigung "Eigenen Knoten bearbeiten" verpasst, da Sie dann nicht nur die Berechtigung überprüfen müssen, sondern auch, ob dieser Knoten dem aktuellen Benutzer gehört. Ich habe mein Beispiel unten aktualisiert, lasse aber die obige Erklärung unverändert.
Befindet sich Ihr Menüeintrag unter node / nid (zB node / 1234 / something)? Dann brauchen Sie wahrscheinlich nicht einmal einen benutzerdefinierten Rückruf.
Wenn Sie Ihren Menüpfad wie im folgenden Beispiel definieren, wird der Zugriffsrückruf (und damit der Seitenrückruf) nur aufgerufen, wenn Sie einen gültigen Knoten anzeigen.
'node/%node/something'
Dies bedeutet, dass es für das obige Beispiel node_load (1234) aufruft und nur dann fortfährt, wenn ein gültiges Knotenobjekt zurückgegeben wird. So können Sie Ihre Berechtigung wie gewohnt mit Zugriffsargumenten definieren.
Das Schreiben eines Zugriffsrückrufs ist jedoch sehr einfach. Es ist nur eine Funktion, die alle Argumente empfängt, die Sie in den Zugriffsargumenten definiert haben. Zum Beispiel ist der Standard - Zugriffs Rückruf user_access () und wenn Sie Ihren Zugang Argumente wie definieren 'access arguments' => array('a permission string')
, wird es in dem folgenden Aufruf zur Folge: user_access('a permission string')
.
Wenn Sie mehrere Argumente haben, werden diese als zweites, drittes usw. Argument an Ihre Funktion übergeben. Um auf den aktuell aktiven Knoten zuzugreifen, können Sie menu_get_object () verwenden .
Sie könnten also Ihren Access Callback wie folgt schreiben, müssen aber möglicherweise noch nicht einmal einen erstellen.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
Anstatt die Berechtigungszeichenfolge fest zu codieren, können Sie sie als Argument an die Funktion übergeben oder was auch immer Sie tun möchten.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
und$node = menu_get_object();
im Callback fn, gab$node
nie etwas zurück. Ich habe stattdessen verwendet,$node = node_load(arg(1));
was funktioniert ... Weitere Erklärungen wären wirklich willkommenDrupal ist selbst ein Beispiel für das Schreiben von Code.
Das einfachere Beispiel ist aggregator_menu () , das den folgenden Code enthält.
In diesem Fall ist der Zugriffsrückruf der Standardwert ( user_access () ), und die Zugriffsargumente sind ein Array, das die Zeichenfolge für die Berechtigung enthält. Der Code kann nicht mehr als eine Berechtigung prüfen. Wenn die zu überprüfenden Berechtigungen zwei sind oder die zu überprüfenden Bedingungen nicht nur Berechtigungen sind, sollte der Zugriffsrückruf ein anderer sein, einschließlich eines benutzerdefinierten.
node_menu () definiert einige Menüs, die einen vom Standard abweichenden Zugriffsrückruf verwenden. Die Funktion enthält den folgenden Code.
Die als Zugriffsrückruf ( node_access () ) definierte Funktion ist die folgende:
Es gibt drei Punkte zu beachten:
TRUE
wenn der Benutzer Zugriff auf das Menü hat undFALSE
wenn der Benutzer keinen Zugriff auf das Menü hat.quelle
access callback
Funktion deklarieren , muss sie in Ihrer.module
Datei gespeichert sein, da Drupal siefile
(zumindest für mich) nicht in der Deklaration zu finden scheint .