Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Wildcard Loader Arguments

Référence en anglais sur drupal.org : 22 Octobre 2010
http://drupal.org/node/224170


Remarque : termes utilisés dans cet article :

  • argument : identique aux arguments de fonctions PHP

  • élément indique un argument de path. Exemple : /node/224170/edit - 224170 est un élement.

Les bases

Lorsque un wildcard loader est utilisé dans une chemin de menu, la valeur de l'élément à l'emplacement de la déclaration de loader est passé comme premier argument à la fonction wildcard loader.

Exemple :

<?php
$items
['node/%node/revisions'] = array(
'title' => 'Revisions',
'page callback' => 'node_load',
'type' => MENU_CALLBACK,
);
?>

Lorsque un symbole % est utilisé dans un élément de menu (voir l'exemple), le texte qui le suit sera utilisé pour construire le nom de la fonction wildcard loader.

Dans l'exemple précédent, %node indique à Drupal de passer la valeur du deuxième élément à la fonction node_load(). _load est toujours ajouté par Drupal pour contruire le wildcard loader.

Si avec votre navigateur vous allez à node/1337/revisions, la fonction node_load(1337) sera appelée.

Il est important d'initialiser le paramètre page callback avec le nom de la fonction qui sera appelée pour que l'access callback fonctionne. Les éléments de menu n'ayant pas le paramètre page callback initialisé obtiendront toujours des erreurs Accès refusé.

Arguments Wildcard Loader multiples

Drupal exécutera toujours la fonction loader avec comme premier argument du loader le premier élément du path dans lequel le loader a été défini. Mais que faire si nous voulons passer des arguments personnalisés à la fonction loader ?

Pour que Drupal ajoute d'autres éléments du path, comme un second joker (wildcard), nous utiliserons la propriété load arguments de l'élément de menu.

Rappel : le premier argument est toujours la valeur où est défini le loader, les autres arguments dans load arguments seront les secondes, troisièmes valeurs, etc. Il est préférable de penser les arguments « load » en tant qu'arguments supplémentaires car le premier argument est toujours supposé.

Exemple :

<?php
$items
['node/%node/revisions/%/view'] = array(
'title' => 'Revisions',
'load arguments' => array(3), // HERE
'page callback' => 'drupal_get_form',
'page arguments' => array('node_revision_revert_confirm'1),
'type' => MENU_CALLBACK,
);
?>

Le load arguments de l'exemple ci-dessus déclare des arguments supplémentaires à passer à la fonction load. Cette fonction n'accepte qu'un argument par défaut : la partie 1 du path (dans l'exemple : %node).

Si nous voulons passer un deuxième argument à node_load(), nous pouvons déclarer un 'load arguments' dans le tableau avec des arguments supplémentaires. Les entiers positifs dans ce tableau sont manipulés spécifiquement; ils sont remplacés par la partie correspondante du path. Dans l'exemple ci-dessus, 3 est remplacé par la troisième partie (le décompte commence à zéro) du path lorsqu'un internaute navigue jusqu'à la page. Donc, si l'internaute se rend à node/1337/revisions/42/view, la fonction node_load(1337,42) sera appelée.

Comme à l'accoutumé, la valeur retournée par la fonction loader peut être utilisée par l'access callback ou page callback en incluant l'index des éléments comme access argument ou page argument. Avec l'exemple précédent, la valeur retournée par node_load() sera passée au page callback comme ceci :

<?php
drupal_get_form
('node_revision_revert_confirm'$node_load_returned_value_here); 
?>

Remarque : quand on utilise drupal_get_form comme page callback, la première variable passée à la fonction est $form_state (par exemple : function node_revision_revert_confirm($form_state, $node_revision ). Donc quand vous envoyez des arguments, ils seront disponibles comme le second, le troisième, et ainsi de suite.

Arguments Wildcard Loader spéciaux

Utiliser des nombre entiers comme substitut d'élément de path est très utile, mais il y a d'autres façons d'obtenir encore plus de données.

%map et %index
  • %map : tous les éléments du path sont convertis en tableau avec clés. Il s'agit également d'une référence de variable.
  • %index : l'élément du path où le joker loader est déclaré.

Exemple :

<?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',
); 
?>

Si on navigue sur user/55/edit, alors user_category_load($uid, $map_array, $index) sera appelée.

Le premier argument de la fonction sera l'entier 55.

Le deuxième argument de la fonction sera

<?php
array(
  [
0] => "user",
  [
1] => 55,
  [
2] => "edit",
)
?>

Le troisième argument de la fonction sera l'entier 1 puisque c'est la position du path à laquelle le loader a été défini.

Plus d'infos

Un retour de fonction loader égal à FALSE équivaut à une page non trouvée.

Si vous voulez regarder de l'intérieur comment ça marche, allez dans la fonction _menu_load_objects dans includes/menu.inc.