Platzhalter Argumente
Hinweis:In diesem Artikel bedeutet der Begriff Argument Argumente einer Funktion. Und Element bedeutet Argument des Pfades. Dieser Begriff kann ein wenig verwirrend sein, wenn man ihn für zwei verschiedene Dinge verwendet.
Die Grundlagen
Wenn ein Platzhalter in einen Pfad eingefügt wird, ist das Element an der Position der Platzhalterdefinition standardmässig das einzige Argument, das übergeben wird.
Beispiel:
<?php
$items['node/%node/revisions'] = array(
'title' => 'Revisions',
'type' => MENU_CALLBACK,
);
?>
Das "%
" definiert den zweiten Teil des Pfades als Argument. Der Teil "node" in "%node" sagt Drupal, dass der zweite Teil des Pfades an eine Funktion übergeben soll, deren Namen sich aus dem zweiten Teil (alles nach dem "%") und "_load" zusammensetzt. Für "%node" ist dies also "node" plus "_load", also node_load()
. So wird also, wenn wir node/1337/revisions aufrufen, die Funktion node_load(1337)
aufgerufen.
Mehrfache Platzhalter Argumente
Drupal ruft die Loader Funktion immer so auf, dass der erste Parameter das Pfadelement ist, in dem der Loaderdefiniert ist. Aber was ist, wenn mehrere Argumente an den Loader übergeben werden sollen?
Damit Drupal andere Elemente des Pfades einbindet, wie z.B. einen zweiten Platzhalter, muss der Menüparameter 'load arguments' verwendet werden.
Nicht vergessen: das erste Argument ist immer der Wert, in dem der Loader definiert wird. Die Argumente in 'load arguments' sind dann das 2., 3., ... Argument.
(Die 'load arguments' kann man sich auch als zusätzliche Argumente verstehen, da das erste Argument immer verwendet wird.)
Beispiel:
<?php
$items['node/%node/revisions/%/view'] = array(
'title' => 'Revisions',
'load arguments' => array(3), // <-- hier
'page callback' => 'drupal_get_form',
'page arguments' => array('node_revision_revert_confirm', 1),
'type' => MENU_CALLBACK,
);
?>
Die Angabe in 'load arguments' im obigen Beispiel definiert zusätzliche Parameter die an die load Funktion übergeben werden. Standardmässig verwendet die load Funktion (in diesem Falle node_load()
nur das erste Element des Pfades (den Text, der an der Stelle "%node" steht).
Wenn also ein zweiter Parameter an node_load()
übergeben werden soll, können wir in 'load arguments' innerhalb eines Arrays weitere Argumente definieren. Positive Integerwerte in diesem Array werden besonders behandelt: sie werden durch die Teile des Pfades an den entsprechenden Position ersetzt. In diesem Beispiel wird 3
durch den 3. Teil des aktuellen Pfade (gezählt von 0 aufwärts) ersetzt, wenn ein Nutzer die entsprechende Seite im Browser aufruft. Wenn wir nun also node/1337/revisions/42/view aufrufen, wird node_load(1337, 42)
aufgerufen.
Für gewöhnlich kann der von der load Funktion zurückgegebene Wert vom 'access callback' oder vom 'page callback' verwendet werden, indem der Index des Elementes als 'access argument' oder 'page argument' angegeben wird. Im Beispiel oben wird der Rückgabewert von node_load()
an den 'page callback' wie folgt übergeben:
<?php
drupal_get_form('node_revision_revert_confirm', $node_load_returned_value_here);
?>
Hinweis: Wenn drupal_get_form()
als 'page callback' verwendet wird, is der erste an die Funktion übergebene Funktion $form_state
. Zum Beispiel function node_revision_revert_confirm($form_state, $node_revision()
. Wenn Du also zusätzliche Argumente übergibst, sind in der Funktion die als 2., 3., ... Parameter verfügbar.
Spezielle Platzhalter Argumente
Die Verwendung von Integerwerten zur Ersetzung von Pfadelementen ist sehr hilfreich, allerdings gibt es auch andere Wege um mehr Informationen zu bekommen.
%map und %index
- %map: Alle Elemente des Pfades werden in ein Array umgewandelt. Dieses ist dann ebenfalls als referenzierte Variable verfügbar.
- %index: Das Element des Pfades, an dem die load Funktion des Platzhalters definiert ist.
Beispiel:
<?php
$items['user/%user_category/edit'] = array(
'title' => 'Edit',
'page callback' => 'user_edit',
'page arguments' => array(1),
'access callback' => 'user_edit_access',
'access arguments' => array(1),
'type' => MENU_LOCAL_TASK,
'load arguments' => array('%map', '%index'),
'file' => 'user.pages.inc',
);
?>
Wenn wir jetzt node/55 aufrufen, wird user_category_load($uid, $map_array, $index)
aufgerufen.
Das erste Element der load Funktion ist denn der Integerwert 55.
Das zweite Element ist:
<?php
array(
[0] => "user",
[1] => 55,
[2] => "edit",
)
?>
Das dritte Argument der load Funktion ist der Integerwert 1, da dies die Position des Pfades ist, an der der Loader definiert wurde.
Mehr Informationen
Wenn eine load Funktion eines Platzhalters FALSE
zurückgibt, ist das äquivalent zu 'page not found'.
Solltest Du schauen wollen, wie das alles intern arbeitet, schau Dir die Funktion _menu_load_objects in includes/menu.inc an.
- Anmelden oder Registrieren um Kommentare zu schreiben
Neue Kommentare
vor 17 Stunden 18 Minuten
vor 14 Stunden 13 Minuten
vor 2 Tagen 3 Stunden
vor 17 Stunden 28 Minuten
vor 2 Tagen 3 Stunden
vor 2 Tagen 12 Stunden
vor 2 Tagen 12 Stunden
vor 2 Tagen 13 Stunden
vor 2 Tagen 15 Stunden
vor 2 Tagen 15 Stunden