web-dev-qa-db-fra.com

Différents modules de menu dans différentes vues du même composant à partir d'un seul élément de menu

J'ai écrit un composant avec deux vues,

Mon client m'a demandé d'afficher un menu différent sur les pages de détail.

J'ai essayé de créer un nouvel élément de menu pointant sur la page de détail, ainsi qu'un paramètre permettant de définir le bon Itemid dans la page principale, et le ramasse correctement, mais il ajoute le deuxième alias de menu à l'URL, à savoir https: //exemple.com/second-menu-item-alias/somealias .

Je sais que je peux:

  • modifiez le modèle, créez deux positions et affichez-les en fonction des paramètres d'entrée;
  • écrasez le module de menu pour y ajouter la logique requise;
  • utilisez Nonumber ou d'autres extensions pour le gérer.

Mais avant d’y avoir recours, j’aimerais vraiment savoir s’il existe une solution que je peux utiliser à partir de mon composant.

Merci.

2
Riccardo Zorn

Il s'est avéré que la solution était incroyablement simple: j'ai ajouté à la vue principale un paramètre dans lequel j'ai saisi l'élément Itemid d'un deuxième élément de menu, masqué, où j'ai configuré la disposition de mes modules alternatifs.

Ensuite, dans la mise en page de détail, j'ai simplement ajouté:

$set_itemid = $this->params->get('set_itemid',0);
if ($set_itemid) {
    $app = JFactory::getApplication();
    $app->input->set('Itemid',$set_itemid);
}

Donc, je remplace simplement le paramètre Itemid par celui correct sur lequel j'ai construit ma mise en page. La page avec l'autre Itemid n'est jamais utilisée directement, je suis en train de tromper Joomla! en pensant qu'il devrait rendre les modules de cette page.

Cela fonctionne car lorsque je restitue le composant, l'URL est déjà décodée pour mon composant (cela ne posera donc pas de problème ici), mais les modules doivent toujours être restitués.

Je ne suis pas sûr que cela fonctionnera avec les gestionnaires de cache tiers ou les produits SEF, mais avec le routage Joomla 3.8 de base et le cache, il semble bien se comporter.

0
Riccardo Zorn

Oui, vous pouvez le faire sans apporter beaucoup de modifications à votre code, ajoutez une position personnalisée à votre vue à l'aide de

JHTML::_('content.prepare', '{loadposition mycustom-top}')

Allez aux modules et sur le module que vous voulez rendre ici, définissez position à mycustom-top

Note vous n'obtiendrez pas l'option pour cette position, mais écrivez la position dans le champ de texte de position et appuyez sur entrée.

J'espère que cela t'aides. Tout le meilleur, si vous rencontrez un problème ou une requête s'il vous plaît poster un commentaire.

0
Pratyush