Créer un fichier de routing pour un composant personnalisé

Posté le: sam 01/12/2018 - 10:53 Par: rcowebdev
routing
Alors pour bien commencer, parce que mes soucis sont passés par là au début, je conseille de suivre cet article Problème de réécriture d'URL en local

La fonctionnalité de rooting de Joomla! est souvent critiquée et à raison; assez chiante à mettre en place pour un composant personnalisé avec très peu de documentation (ou alors pas très claire) et vu qu'ils le refont tous les 6 mois ça n'arrange pas les choses. Pour la petite histoire, j'ai crée un composant - com_booking - permettant de réserver en ligne des sorties spéléologiques et il faut bien avouer qu'une URL avec cette tête 

index.php?option=com_booking&view=formule&id=1

ne parle pas beaucoup, ni à l'utilisateur ni aux moteurs de recherche d'où l'utilité d'un router. Comme je le disais plus haut, le système de Rooting est en - constante ? - évolution à croire que l'équipe de Joomla! n'arrive pas à se mettre d'accord :p. Les principes restent cependant à peu près les mêmes :

Créer le fichier

/root/components/MON_COMPOSANT/router.php

Soit ici, dans le cas de mon composant

/root/components/com_booking/router.php

La définition de la classe

/**
 * Routing class from com_booking
 *
 * @since  3.3
 */
class BookingRouter extends JComponentRouterBase
{

Une méthode build qui construit les Segments à utiliser 

	/**
	 * Build the route for the com_booking (formule) component
	 *
	 * @param   array  &$query  An array of URL arguments
	 *
	 * @return  array  The URL arguments to use to assemble the subsequent URL.
	 *
	 * @since   3.3
	 */
	public function build(&$query)

Une méthode parse qui exploite ces Segments

	/**
	 * Parse the segments of a URL.
	 *
	 * @param   array  &$segments  The segments of the URL to parse.
	 *
	 * @return  array  The URL attributes to be used by the application.
	 *
	 * @since   3.3
	 */
	public function parse(&$segments)
	{

Et, la petite surprise / "nouveauté", deux méthodes hors de la classe à ajouter (je suppose qu'il y a une raison derrière mais bon, clairement je pense qu'il y avait une autre façon de faire ! Peut-être une question de rétro compatibilité, je ne sais pas trop, bref).

function bookingBuildRoute(&$query)
{
	$router = new BookingRouter;

	return $router->build($query);
}

function bookingParseRoute($segments)
{
	$router = new BookingRouter;

	return $router->parse($segments);
}

Au final, mon fichier router ressemble à ça 

<?php
/**
 * @package     racol
 * @subpackage  com_booking
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Routing class from com_booking
 *
 * @since  3.3
 */
class BookingRouter extends JComponentRouterBase
{
	/**
	 * Build the route for the com_booking component
	 *
	 * @param   array  &$query  An array of URL arguments
	 *
	 * @return  array  The URL arguments to use to assemble the subsequent URL.
	 *
	 * @since   3.3
	 */
	public function build(&$query) {
		$segments = [];

		if (isset($query['view'])) {
			$segments[] = $query['view'];
			unset($query['view']);
		}

		if (isset($query['id'])) {
			$segments[] = $query['id'];
			unset($query['id']);
		}

		if (isset($query['slug'])) {
			$segments[] = $query['slug'];
			unset($query['slug']);
		}

		return $segments;
	}

	/**
	 * Parse the segments of a URL.
	 *
	 * @param   array  &$segments  The segments of the URL to parse.
	 *
	 * @return  array  The URL attributes to be used by the application.
	 *
	 * @since   3.3
	 */
	public function parse(&$segments) {
		$vars = [];

		$vars['view'] 	= $segments[0];
		$vars['id'] 	= $segments[1];
		$vars['slug'] 	= $segments[2];

		return $vars;
	}
}

function bookingBuildRoute(&$query) {
	$router = new BookingRouter;

	return $router->build($query);
}

function bookingParseRoute($segments) {
	$router = new BookingRouter;

	return $router->parse($segments);
}

Rien de bien compliqué, la méthode build remplie le tableau segments pour exploiter ce dernier dans la méthode parse comme dit plus haut (bien noter les passages par référence (!!!) sinon c'est à n'y plus rien comprendre). 

L'utilisation de mon router ressemble du coup à cà

/root/components/com_booking/views/formules/tmpl/default.php

<?php
/**
 * @package     racol
 * @subpackage  com_booking
 *
 * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="section blog-section">
	<div class="container">
		<div class="row">
			<ul>
				<?php foreach ($this->items as $item):
				    $link = JRoute::_(BookingHelperRoute::getFormuleRoute($item->id, $item->name));
				    ?>
				    <li>
					    <a href="<?php echo $link?>">
					        <?php echo $item->name ?>
					    </a>
				    </li>
				<?php endforeach ?>
			</ul>
		</div>
	</div>
</div>

 

Mots clés
Joomla!3
SEO