web-dev-qa-db-fra.com

Comment afficher le module dans la zone de composant

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

Je résous ce problème en créant un nouvel article et en n’ajoutant que {loadposition mymodule} dans le contenu de l'article. Ensuite, je crée un élément de menu Article unique pour l'article. Cela convient pour un seul module, mais que se passe-t-il si j'ai 20 modules différents que je souhaite 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 moyens d'afficher un module (et rien d'autre) dans la zone de composant d'un modèle? Des trucs? Hacks? Des idées?

12
johanpw

J'ai fait cela en créant une position de module au même emplacement que le composant et en vérifiant si un module est présent à cette position, puis affichez-le, sinon choisissez le composant:

Exemple 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, l'assigne à cet élément de menu et j'ai terminé.

Une petite note de côté:

Pour plus de commodité et de clarté, je suggère de nommer la position de ce module, par exemple "contenu-module", "module principal" ou "compomodule". Tout ce qui rappellera que tout module placé à cet endroit remplacera la sortie du composant.

9
FFrewin

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

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

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

au fichier de vue.

La deuxième chaîne avec la balise courte load position peut être remplacée par une variable qui contient plus de code HTML si vous en avez besoin. Vous n'êtes pas obligé d'é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.)

8
Dennis Heiden

Voici une solution simple et efficace. 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); 
2
user2589739

Créer un article vierge.

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

Créez un module en position inutilisée, définissez l'attribution de menu uniquement sur les pages sélectionnées, sélectionnez uniquement l'élément de menu ci-dessus.

Etant donné que c’était au top que je donnerais ma réponse, voici ce que je fais.

0
Mythic

Essaye ça

jimport('joomla.application.module.helper');
    // this is where you want to load your module position
    $modules = JModuleHelper::getModules('header'); 
    foreach($modules as $module)
    {
    echo JModuleHelper::renderModule($module);
    }

ref: https://stackoverflow.com/questions/12225538/how-we-include-a-joomla-module-in-a-component-view-in-joomla

0
Sh4msi

Le moyen le plus propre de le faire est d'utiliser: http://extensions.joomla.org/extension/m2c-module-to-component

0
Lala

J'ai eu à faire de même sur mon site pour les démos d'extension et les boutons de téléchargement. Cependant, honnêtement, je pense que séparer les choses est à certains égards préférable, car il est plus facile à gérer. Non seulement je suis sûr qu'il n'y a aucun moyen de réaliser ce que vous recherchez via le système de gestion de contenu actuel, vous ne pouvez utiliser que du code dur (n'en dites pas plus).

0
Lodder

Tout d’abord, selon votre question, vous créez déjà 20 modules et 20 éléments de menu. La seule chose supplémentaire que vous ayez à faire est donc de créer un élément de contenu d’une ligne pour chaque module. Si c'est vraiment si pénible, allez de l'avant avec l'idée de @FFrewin. C'est un peu hacky, mais ça va marcher.

Personnellement, j'irais avec les éléments de contenu. En fait, c'est ce que je faisais lorsque je construisais un système avec des boîtes de dialogue contextuelles que je souhaitais également faire fonctionner sans js. J'ai mis le contenu de la boîte de dialogue dans un module custom_html, puis le module à révéler et à positionner lorsqu'un lien a été cliqué. Et puis j'ai également pointé le lien vers un élément de contenu, y compris le module tel que vous l'avez décrit. Si js était activé, le lien n'était pas suivi et la boîte de dialogue était révélée. Si js était désactivé, le lien était suivi et le contenu de la boîte de dialogue était affiché comme contenu. Et comme le contenu se trouvait à un endroit, je ne conservais pas deux copies distinctes du contenu.

0
Arlen