J'écris un composant avec deux vues: une vue liste et une vue article.
La vue liste génère les liens pour chaque article comme suit, $ text étant la variable que je veux dans l'URL.
<?php echo JRoute::_("index.php?Itemid=103&testvar=".strtolower($text)); ?>
c'est-à-dire http://www.test.com/test est la page de liste et je veux http://www.test.com/test/text comme page d'article
103 est l'id d'élément de menu où se trouve le composant. Ceci est défini dans la vue liste.
Mon routeur contient le code suivant:
if(isset($query['testvar']))
{
$segments[] = $query['testvar'];
unset($query['testvar']);
};
Cela génère l'URL suivante: http://www.test.com/test/text?testvar=text
unset($query['testvar']);
ne semble pas fonctionner pour supprimer le bit ?testvar=text
. Tout le reste fonctionne comme prévu.
Une solution de contournement serait <?php echo JRoute::_("index.php?Itemid=103")."/".strtolower($text); ?>
- mais cela semble compliqué.
Des idées?
Jetez un coup d'oeil à la méthode JUri :: delVar: https://api.joomla.org/cms-3/classes/Joomla.CMS.Uri.Uri.Uml.html#method_delVar
JUri::delVar('testvar');
A parfaitement fonctionné pour moi :)
En supposant que vous ne puissiez avoir qu'une seule vue en liste, votre fonction BuildRoute
devrait avoir un maximum de 1 segment (qui est l'alias de l'article). Vous devriez supprimer tous les autres segments (essayez de faire un print_r
pour voir ce que vous devez désactiver.
Dans votre fonction ParseRoute
, vous vérifiez le nombre de segments et vous retournez la vue Liste ou la vue Article. Voici comment:
if (count($segments) == '0'){ //it's a list view
`return array('option'=>'com_yourcomponent', 'view'=>'list', 'Itemid'=>[the item id of your choice]);`
else //it's an article view
`return array('option'=>'com_yourcomponent', 'view'=>'article', 'testvar' => $segments[0], 'Itemid'=>[the item id of your choice]);`