Alias des articles, sans menu dans Joomla

Le problème du jour sera le suivant…

J’ai un site basé sur joomla (pas celui-là, un autre), dans lequel j’ai des menus qui pointent vers des articles. Mon problème c’est que  dans ces articles, je voulais faire des liens vers des articles secondaires donc non accessibles via des menus.

Mais surtout je voulais que ces articles secondaires soient accesibles via l’url de leur alias exemple « /mon-article-secondaire ».

Mon collègue, qui connaît mieux Joomla que moi, nous l’appellerons « G. », me dit que ce n’est pas possible, seuls les articles accessibles via un menu peuvent utiliser leur alias comme url accessible, et que c’est la logique de Joomla, puisque chaque article a besoin de connaître le menu qui l’affiche pour savoir les composants à afficher… soit. Mais ça m’embête.

Donc je décide de bidouiller…

Après quelques recherches, je comprend que c’est le JRouterSite est celui que je dois bidouiller et qu’il se trouve dans « includes/router.php ».

Et donc pour faire ce que je veux j’ai rajouté après le bloc :

//Need to reverse the array (highest sublevels first)
$items = array_reverse($menu->getMenu());
foreach ($items as $item)
{   
 $lenght = strlen($item->route); //get the lenght of the route

 if($lenght > 0 && strpos($route.'/', $item->route.'/') === 0 && $item->type != 'menulink')
 {   
  $route   = substr($route, $lenght);

  $vars['Itemid'] = $item->id;
  $vars['option'] = $item->component;
  break;
 }   
}

J’ai rajouté ceci (vers la ligne 223) :

# Si on a pas trouve' de route dans les menus,
# On cherche un article qui va matcher la route avec l'alias de page.
# On ne l'utilise que si elle correspond a un seul article et que cet article est publié.
if (!$vars['option']) {
 $db =& JFactory::getDBO();
 $query = "SELECT * FROM #__content where alias='$route' and state=1";
 $db->setQuery( $query );
 $articles = $db->loadObjectList();
 if (sizeof($articles) == 1) {
  $article = $articles[0];
  $vars['Itemid'] = 0;
  $vars['id'] = $article->id;
  $vars['option'] = 'com_content';
 }   
}

Voilà.

Ce code m’a permis de faire exactement ce que je voulais. C’est à dire juste intercepter le cas où si on a pas trouvé de menu qui corresponde à l’alias de l’url, alors on cherche dans les articles si un (et un seul) article correspond, si c’est le cas, on le choisit pour l’afficher.

Si vous avez des commentaires ou des correctifs à apporter, n’hésitez pas à m’envoyer un e-mail.

PS: Merci à G. pour le « state=1 »

Print Friendly

6 Commentaires

  1. Vincent dit : Répondre

    Bonjour,

    Merci pour cette astuce.
    Pour info j’avais aussi ma propre astuce :
    Créer un nouveau menu
    Activer le module menu dans position qui n’existe pas dans le template
    -> le lien existe, donc la page aussi !

  2. Oh, un très grand merci, j’ai pu faire ce que je voulais! Ton astuce est vraiment très utile! Merci

  3. Bonjour,
    Vincent, comment fais-tu pour activer un menu dans une position inexistante ?

  4. Oups, je viens de trouver cette solution : appeller la page directement, mais pas super pour le référencement.
    Ex : http://monsite.com/index.php?option=com_content&view=article&id=68

  5. azza dit : Répondre

    J’ai modifié le fichier router, mais ça ne fonctionne pas… ça marche aussi avec la 1.6 de joomla ?

    1. Thibault dit : Répondre

      Il est possible qu’effectivement cela ne marche pas avec Joomla 1.6. Je n’ai personnellement pas testé.
      Je sais juste qu’une grosse partie du moteurs et des droits ont été modifiés dans Joomla 1.6…

      Navré donc, je n’ai pas la réponse 🙂

Laisser un commentaire