Mauvaise catégorie en début de chemin, itemid identique sur tous les liens

Appréciation moyenne:  / 8
Très mauvaisTrès bien 

Virtuemart et le problème de l'itemid identique

voici le problème résumé brièvement, que beaucoup rencontrent apparemment:

lorsqu'on utilise des menus virtuemart pour les catégories, on a une mauvaise catégorie qui se place systématiquement au début des url générées.
On voit bien le problème lorsqu'on utilise le composant breadcrumbs.
On voit aussi que le lien de menu actif bascule sur la catégorie rajoutée en début de chemin.
D'autres ont signalé d'autres comportements en rapport avec ce problème.

 

Il semblerait que virtuemart construise ses liens en prenant systématiquement la première catégorie déclarée dans sa liste.

Il fait une requête sql dans la table des menus joomla et extrait la première entrée de menu qui pointe sur le composant virtuemart.
On ne remarque ce problème que lorsqu'on utilise plusieurs entrées de menu joomla pour accéder directement aux catégories virtuemart par menu joomla.
Par exemple, j'ai un menu principal qui contient 4 entrées liées à un composant virtuemart, et je lie chaque entrée de menu à mes catégories virtuemart principales, en entrant dans le paramètre du composant un ID de catégorie.

A force de me prendre la tête avec ce truc et de remonter à la source du problème, j'ai trouvé un truc qui fonctionne bien:

comme beaucoup l'ont vu je crois, ça se passe dans le fichier ps_session.php du dossier:
/administrator/components/com_virtuemart/classes
dans la fonction: 

function getShopItemid()
{
  /** modif: rajout ligne suivante:*/
  global $Itemid;
  /** fin modif */
  if ( empty($_REQUEST['shopItemid']))
  {
    $db = new ps_DB;
    /** modif: commenté ligne suivante:*/
    //$db->query( "SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1");
    /** fin modif */
    /** modif: rajout ligne suivante:*/
    $db->query("SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1 AND id=".$Itemid);
    /** fin modif */
    if ($db->next_record())
    {
    $_REQUEST['shopItemid'] = $db->f("id");
    }
    else
    {
      if (! empty($_REQUEST['Itemid']))
      {
        $_REQUEST['shopItemid'] = intval($_REQUEST['Itemid']);
      }
      else
      {
        $_REQUEST['shopItemid'] = 1;
      }
    }
  }
  return intval($_REQUEST['shopItemid']);
}


Si je comprends bien la requête (dur dur au début), on demande de nous sortir une liste d'id tirés de la table joomla menu, ces ids étant finalement les itemid tant désirés...
Comme on ne précise aucun critère, je suppose qu'on sort une liste, et ensuite si on utilise cette liste, on ne récupère que le premier élément, qui correspond, comme par hasard, à la première catégorie virtuemart associée au menu catégorie de virtuemart...

  J'ai donc simplement rajouté ligne 13 un critère sur cette requête pour n'avoir qu'une seule ligne retournée à chaque fois, en fonction de l'itemid cliqué: 

$db->query("SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1 AND id=".$Itemid);

J'ai aussi rajouté la déclaration de l'itemid en global, comme on peut le voir dans la fonction, ligne surlignée 4.

Une fois mis en place ça fonctionne bien, mais je ne peux pas tout tester.