Article publié le 27 juillet 2011
Si vous avez besoin de personnaliser les URL de votre plugin et ne pas laisser des mod/plugin/fichier.php,vous devez les spécifier dans le fichier start.php de ce que vous êtes en train de développer.
Je ne parlerai pas des menus, je garde cette matière pour plus tard.
S’il s’agit d’une action qui est liée à un formulaire (c’est-à-dire au fichier qui traite les données de celui-ci), vous avez la fonction register_action().
register_action("grr/save", false, $CONFIG->pluginspath."grr/actions/save.php");
Il suffira d’indiquer dans votre balise form le code suivant:
<form action="<?php echo $vars['url']; ?>action/grr/save" method="post">
Si par contre, il s’agit d’une autre url, comme l’affichage d’une liste, l’affichage d’un formulaire ou tout autre chose, créez votre propre page_handler().
register_page_handler('grr','grr_page_handler'); //register_page_handler(nom_du_plugin, nom_de_la_fonction
Ensuite, plus loin, vous créez cette fameuse fonction:
function grr_page_handler($page) { switch ($page[0]) { //liste des ressources case "ressources": case "choix_ressource": include(dirname(__FILE__) . "/list.php"); break; //liste des réservations de l'utilisateur connecté case "mes_reservations": include(dirname(__FILE__) . "/my_reservations.php"); break; //liste des réservations case "reservations": include(dirname(__FILE__) . "/list_reservation.php"); break; //modifier une ressource case "edit": set_input('id', $page[1]); include(dirname(__FILE__) . "/edit.php"); break; //ajouter une ressource case "add": include(dirname(__FILE__) . "/add.php"); break; //lien réserver dans la fiche ressource case "reserver": set_input('id', $page[1]); include(dirname(__FILE__) . "/reservation.php"); break; default: return false; } return true; }
- $page[0] = ce qui vient après le nom du plugin (ex: pg/grr/add => add = $page[0])
- C’est donc bien une comparaison du $page[0] et c’est donc bien les noms choisis qui iront dans les URL
- $page[1] = ce qui suit page[0] (ex: pg/grr/edit/15 => $page[1] = 15)
- on inclut le fichier qui est à la racine de votre plugin et qui contient les données ainsi que les inclusions des vues nécessaires
- on peut parfaitement inclure des fichiers qui seraient dans d’autres dossiers à condition de bien renseigner le chemin
- set_input(‘nom_input’,$page[1]) = indique que l’on envoie un paramètre permettant de retrouver ce dont on a besoin ($_GET en php) qui se trouve à la place de $page[1]
- pour que set_input serve à quelque chose, vous devez avoir dans le fichier qui est inclus un get_input(« paramètre ») et l’utilisation de ce que vous récupérez permettant l’affichage de certaines données
- il n’est pas interdit d’utiliser $page[2], $page[3], etc.., surtout si vous avez plus d’un objet.
Ensuite, à chaque lien, vous devrez changer en pg/nom_du_plugin/$page[0]/$page[1]:
[...] <a href="<?php echo $vars['url']?>pg/grr/edit/<?php echo $reservation->guid; ?>"> <?php echo elgg_echo("grr:edit");?> </a> [...]
Vous pouvez aussi pour la fiche de vos objets améliorer l’url (je prends l’exemple du module blog d’Elgg) grâce à register_entity_url_handler():
register_entity_url_handler('blog_url','object','blog');//nom de la fonction, type, nom
Vous devez créer ensuite la fonction:
function blog_url($blogpost) { global $CONFIG; $title = $blogpost->title; $title = elgg_get_friendly_title($title); return $CONFIG->url . "pg/blog/read/" . $blogpost->getGUID() . "/" . $title; }
Comme vous le voyez, vous avez plusieurs possibilités de faire et une fois que vous avez compris le principe, ce qui vous semblait incompréhensible devient très clair (quoique certaines pages start.php restent nébuleuses dans Elgg).