web-dev-qa-db-fra.com

Est-il possible d'ajouter une nouvelle position de module dans un module?

Je sais dans un modèle que vous pouvez ajouter

<jdoc:include type="modules" name="newposition"   />

et ensuite, dans les balises de positions, vous ajoutez votre nouvelle position.

<positions>
     <position>newposition</position>
</positions>

Mais je sais aussi que vous pouvez simplement créer une position de nulle part en la tapant dans le module dorsal dans l’emplacement.

Adding a new module position in the Joomla! module backend

Et puis vous pouvez faire le chargement du module.

{loadposition some_position}

Mais si je répète ce texte dans mon module, il ne s'agit que de texte (une chaîne). Si je répète le XML, c'est aussi une chaîne, mais je ne m'attendais pas à ce que cela fonctionne, car ce n'est pas dans le fichier XML.

Est-il possible d'ajouter une position de module dans un module?

Je préférerais que ce soit construit dans Joomla! manière que d'utiliser des extensions.

Je l'ai essayé avec un plugin de préparation de contenu, mais je préférerais essayer la méthode de Sharky, mais je ne parviens pas à le faire fonctionner. Voici ce que j'ai essayé.

<?php 
use Joomla\CMS\Factory;
?>

<div class="ui-nav ui-nav-mobile">
    <div class="g-content">
    <a class="ui-btn ui-menu-close">Close <i class="fa fa-close" aria-label="Close dialog"></i></a>        
    <?php
        foreach ($subform_items as $item) {
            $position_name = "{loadposition " . $item->position_name_x . "}";
         $modulePositions = JHtml::_('content.prepare', $position_name, '', 'mod_koy_sticky_contact.content');
            //$modulePositions = Factory::getApplication()->getDocument()->loadRenderer('modules')->render($position_name);
            echo "<div class='" . $item->position_name_x . "'>" . $modulePositions . "</div>";
        }
    ?>
    </div>
</div>

La partie commentée affiche un blanc, mais l'autre version fonctionne.

2
Eoin

Bien que l’utilisation de plug-in de contenu fonctionne, elle n’est pas nécessaire dans le code PHP. À la place, vous pouvez utiliser le rendu du document directement:

use Joomla\CMS\Factory;

echo Factory::getApplication()->getDocument()->loadRenderer('modules')->render($position);
2
Sharky

Cela dépend probablement de circonstances spécifiques. J'ai des modules personnalisés contenant plusieurs modules "secondaires". Pour ce faire, utilisez l'extension Modules Anywhere et ajoutez {exemple de module} au code du module dans lequel je l'insère. Vous n'avez pas besoin d'inclure une position de module dans les paramètres de module pour utiliser Modules Anywhere.

https://extensions.joomla.org/extensions/extension/core-enhancements/coding-a-scripts-integration/modules-anywhere/

1
Mythic

JE SUIS CELA ICI DANS CE CAS QUELQU'UN A BESOIN DE SAVOIR FAIRE. MAIS LA REPONSE CI-DESSUS IS MEILLEUR.

Vous devez activer le plugin de contenu

Déclencher l'événement du plugin onContentPrepare

https://docs.joomla.org/Triggering_content_plugins_in_votre_extension

J'ai fini par créer un Joomla! sous-formulaire afin que je puisse ajouter plusieurs positions. Voici mon code.

        foreach ($subform_items as $item) {
            $position_name = "{loadposition " . $item->position_name_x . "}";
            $modulePositions = JHtml::_('content.prepare', $position_name, '', 'mod_my_module.content');
            echo $modulePositions;
        }

Ce que cela fait c'est:

  1. Un foreach sur mon XML pour gagner chaque position.
  2. Utilisez l'habituel {loadposition yourPositionName} code qui peut être vu ici: https://docs.joomla.org/How_do_you_put_a_module_inside_an_article%3F
  3. Habituellement, vous le saisissiez manuellement ou utilisez le plug-in de module de montage. Dans mon exemple, j’utilisais votrePositionName , mais dans la vie réelle, je voulais que ces positions proviennent de mon module où il y a un champ répétable. Alors j'ai appelé $position_name_x qui fait partie du params de mon $item.
  4. Je fais ensuite écho à mon nom de poste. Sans pour autant content prepare il va faire écho à une chaîne littérale {yourPositionName} et non aux modules à cette position, mais avec content prepare il vous enverra les modules. Ceci utilise le plugin système onContentPrepare je crois.

J'espère que cela aide quelqu'un

0
Eoin