it-swarm.com.de

Kann innerhalb eines Moduls eine neue Modulposition hinzugefügt werden?

Ich weiß in einer Vorlage, die Sie hinzufügen können

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

und dann fügen Sie innerhalb der Positions-Tags Ihre neue Position hinzu.

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

Ich weiß aber auch, dass Sie eine Position einfach aus dem Nichts erstellen können, indem Sie sie in das Modul-Back-End im Positions-Slot eingeben.

Adding a new module position in the Joomla! module backend

Und dann können Sie die Modul-Ladeposition durchführen.

{loadposition some_position}

Aber wenn ich diesen Text in meinem Modul wiedergebe, ist es nur Text (eine Zeichenkette). Wenn ich das XML wiedergebe, ist das auch eine Zeichenfolge, aber ich hätte nie erwartet, dass dies funktioniert, da es nicht in der XML-Datei enthalten ist.

Ist es möglich, eine Modulposition innerhalb eines Moduls hinzuzufügen?

Ich mache das lieber mit dem eingebauten Joomla! Art und Weise, als irgendwelche Erweiterungen zu verwenden.

Ich habe es mit einem Plugin zur Inhaltsvorbereitung versucht, aber ich würde lieber Sharkys Methode ausprobieren, aber ich kann es nicht zum Laufen bringen. Folgendes habe ich versucht.

<?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>

Der auskommentierte Teil zeigt ein Leerzeichen, aber die andere Version funktioniert.

2
Eoin

Obwohl das Verwenden des Inhalts-Plugins funktioniert, ist es im PHP Code nicht erforderlich. Stattdessen können Sie den Dokument-Renderer direkt verwenden:

use Joomla\CMS\Factory;

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

Es hängt wahrscheinlich von bestimmten Umständen ab. Ich habe benutzerdefinierte Module, die mehrere "sekundäre" Module enthalten. Ich führe dies mit der Modules Anywhere-Erweiterung durch und füge dem Code für das Modul, in das ich es einbaue, {example module} hinzu. Sie müssen in den Moduleinstellungen keine Modulposition angeben, um Modules Anywhere zu verwenden.

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

1
Mythic

Ich lasse dies hier in dem Fall, dass jemand wissen muss, wie man das macht. ABER DIE ANTWORT OBEN IS BESSER.

Sie müssen das Content Plugin einschalten

Lösen Sie das Plugin-Ereignis onContentPrepare aus

https://docs.joomla.org/Triggering_content_plugins_in_your_extension

Am Ende habe ich ein Joomla! Unterformular, damit ich mehrere Positionen hinzufügen kann. Hier ist mein 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;
        }

Was dies tut, ist:

  1. Ein foreach in meinem XML, um jede Position zu erhalten.
  2. Benutze das übliche {loadposition yourPositionName} Code, der hier angezeigt wird: https://docs.joomla.org/How_do_you_put_a_module_inside_an_article%3F
  3. Normalerweise würden Sie es manuell eingeben oder das Editor-Modul-Plugin verwenden, in meinem Beispiel habe ich yourPositionName verwendet, aber im wirklichen Leben wollte ich, dass diese Positionen von meinem stammen Modul, in dem es ein wiederholbares Feld gibt. Also rief ich $position_name_x das ist ein Teil des params meines $item.
  4. Ich gebe dann meinen Positionsnamen wieder. Ohne content prepare es wird eine Literalzeichenfolge {yourPositionName} und nicht die Module an dieser Position, sondern mit content prepare es sendet Ihnen die Module. Dies verwendet das System-Plugin onContentPrepare, glaube ich.

Ich hoffe das hilft jemandem

0
Eoin