Comment afficher le module dans la zone des composants

13

J'ai souvent besoin de créer un élément de menu qui affiche un module dans la zone des composants, sans autre contenu.

La façon dont je résous ce problème est de créer un nouvel article et de l'ajouter uniquement {loadposition mymodule}dans le contenu de l'article. Ensuite, je crée un élément de menu Article unique pour l'article. C'est bien pour un seul module, mais que faire si j'ai 20 modules différents que je veux afficher de cette façon? Je devrais créer 20 modules, 20 articles (presque vides) et 20 éléments de menu.

Existe-t-il d'autres façons d'afficher un module (et rien d'autre) dans la zone des composants d'un modèle? Des trucs? Hacks? Des idées?

johanpw
la source
Vous pouvez le trouver utile dans Joomla! 3 pour utiliser le bouton de l'éditeur qui crée un module pour vous. Cela le rendrait rapide et moins sujet aux erreurs.
Eoin

Réponses:

10

J'ai fait cela en créant une position de module au même endroit avec le composant et en vérifiant si un module est présent à cette position puis l'affichez, sinon optez pour le composant:

Échantillon de code:

<main id="content" role="main" class="main">
 <?php 
 if ($this->countModules('myposition')) 
   { ?>
     <jdoc:include type="modules" name="myposition" style="xhtml" />
 <?php } 
  else 
  { ?>
     <jdoc:include type="component" /> 
  <?php } ?>
</main>

Ensuite, lorsque je veux afficher un module au lieu d'un composant dans une page, je crée le module en l'assignant à cet élément de menu et j'ai terminé.

Une petite note latérale:

Pour plus de commodité et de clarté, je suggère de nommer cette position de module quelque chose comme "module de contenu", "module principal" ou "module". Tout ce qui rappellera que tout module positionné là-bas remplacera la sortie du composant.

FFrewin
la source
1
C'est la solution idéale. De nombreux modèles commerciaux ont une bascule de paramètre dans leur configuration côté administrateur, mais si vous n'utilisez pas l'un de ces modèles commerciaux ... c'est la réponse la plus efficace et élégante.
Toni Marie
1
J'adore cette idée, elle est simple et efficace, et facile à mettre en œuvre dans les modèles existants. Excellent.
johanpw
9

Pour améliorer les réponses données ici:

Pour inclure une position de module dans votre vue des composants et y charger des modules, il vous suffit d'ajouter

echo JHtml::_('content.prepare', '{loadposition yourmodulposition}');

dans le fichier de vue.

La deuxième chaîne avec la balise short load position peut être remplacée par une var qui contient plus de html si vous en avez besoin. Vous n'avez pas à écrire cette ligne pour chaque nouvelle position de module:

$outputModules = '<strong>Some Html</strong>'
                 .'{loadposition yourmodulposition1}'
                 .'{loadposition yourmodulposition2}';


echo JHtml::_('content.prepare', $outputModules);

(Je sais que ce n'est pas une réponse directe à la question des auteurs.)

Dennis Heiden
la source
2

Voici une solution simple et fonctionnelle. J'ai essayé avec jdoc: include mais cela n'a pas fonctionné.

    $ document = JFactory :: getDocument ();
    $ renderer = $ document-> loadRenderer ('modules');
    $ position = 'custompositionname';
    $ options = array ('style' => 'raw');
    echo $ renderer-> render ($ position, $ options, null); 
user2589739
la source
Veuillez expliquer comment le code ci-dessus peut être utilisé pour obtenir le résultat souhaité, comme décrit dans la question.
FFrewin
Dans le dossier, créez un nouveau module et définissez sa position (par exemple nom de position personnalisé) et publiez-le. Dans le frontend, ajoutez le code ci-dessus et cela fonctionnera sans aucun problème.
user2589739
0

J'ai dû faire la même chose sur mon site pour les démos d'extensions et les boutons de téléchargement, mais en toute honnêteté, je pense que garder les choses séparées est à certains égards mieux car c'est plus facile à gérer. Non seulement je suis presque sûr qu'il n'y a aucun moyen de réaliser ce que vous cherchez via le CMS réel, seulement un code dur (n'en dites pas plus).

Lodder
la source
0

Tout d'abord, selon votre question, vous créez déjà 20 modules et 20 éléments de menu, donc la seule chose supplémentaire que vous devez faire est de créer un élément de contenu d'une ligne pour chaque module. Si c'est vraiment si onéreux, alors allez-y avec l'idée de @ FFrewin. C'est un peu hacky, mais ça marchera.

Personnellement, j'irais avec les éléments de contenu. En fait, je l'ai fait lorsque je construisais un système avec des boîtes de dialogue contextuelles que je voulais également que le travail sans js soit activé. J'ai mis le contenu de la boîte de dialogue dans un module custom_html, truqué le module pour qu'il soit révélé et positionné lorsqu'un lien a été cliqué. Et puis j'ai également pointé le lien vers un élément de contenu, y compris le module comme vous l'avez décrit. Si js était activé, le lien n'a pas été suivi et la boîte de dialogue a été révélée. Si js était désactivé, le lien était suivi et le contenu de la boîte de dialogue était affiché en tant que contenu. Et le contenu était au même endroit, donc je ne conservais pas deux copies distinctes du contenu.

Arlen
la source
0

Créez un article vierge.

Créer un élément de menu en sélectionnant l'article que vous avez créé.

Créer un module dans une position inutilisée, définir l'attribution de menu uniquement sur les pages sélectionnées, sélectionner uniquement l'élément de menu ci-dessus.

Étant donné que c'était au sommet, je pensais fournir ma réponse, c'est ce que je fais.

Mythique
la source