Module abhängig von Komponente ausblenden

  • Joomla Version
    4.4.2
    PHP Version
    PHP 8.2.x
    Hoster
    Strato

    Hallo liebes Forum,


    ist es möglich die Anzeige eines Modul abhängig vom Aufruf einer bestimmten Komponente zu deaktivieren?
    Bisher kenne ich nur die Möglichkeit eine Modul abhängig von der Menüzuweisung anzuzeigen bzw. zu deaktivieren.


    Hintergrund:

    • wir setzen auf unserer Joomla-Installation sowohl JEvent (Version 3.6.78) als auch CiviCRM (Version 5.70.0) ein,
    • leider scheinen sich beide Komponenten nicht gut zu vertragen: Wird ein CiviCRM-Formular (z.B. Anmeldung zu einer Veranstaltung) angezeigt, während gleichzeitig ein JEvent-Modul (z.B. "JEvents - Calendar Module" oder "JEvents - Latest Events Module") dann erfolgt eine 500-Fehlermeldung,
    • laut Debug liegt es daran, dass beide Erweiterungen eine gleichnamige PHP-Funktion definieren:
    Code
    Symfony\Component\ErrorHandler\Error\FatalError:
    Error: Cannot redeclare PHP81_BC\strftime() (previously declared in
    
    /var/www/vhosts/website.de/httpdocs/www.website.de/administrator/components/com_civicrm/civicrm/vendor/pear/log/php-8.1-strftime.php:35)
    
    at /var/www/vhosts/website.de/httpdocs/www.website.de/administrator/components/com_jevents/libraries/strftime.php:69

    Ich würde jetzt gerne auf Seiten, die eine Ausgabe der CiviCRM-Komponente anzeigen, die JEvent-Module deaktivieren (die Ausgaben sollten wegen der o.g. Fehlermeldung nicht nur Layout-/css-technisch unsichtbar gemacht werden, sondern gar nicht erst generiert werden). Ist das irgendwie möglich? Idealerweise ohne in die Code-Basis einzugreifen (wobei ich das auch nicht ausschließe, wenn es anders nicht geht).


    Da die CiviCRM-Formulare durch Links in Beiträgen aufgerufen werden sollen, haben Sie keine Menüzuordnung, über die ich die Modul-Sichtbarkeit ja steuern könnte.


    Vielen Dank für eure Unterstützung, Zenon

  • Erstelle dir mal von deinen JEvent-Modulen die Probleme verursachen ein Template - Override und setzte folgenden Code an den Anfang der Overriedes.

    PHP
    <?php
    $app = JFactory::getApplication();
    $option = $app->input->get('option', '');
    
    // Überprüfe, ob die Komponente "CiviCRM" aufgerufen wird
    if ($option === 'com_civicrm') {
        return;
    }
    ?>

    Getestet habe ich das, indem ich ein Modul ausgeblendet habe, wenn die com_content aufgerufen wurde. Das Modul wurde nur noch auf der Kontaktseite eingebunden.

  • Komponenten werden doch über Menüeinträge angesprochen - welchen Weg hast Du gewählt?

    Das ist der klasische Weg. Daneben können Komponenten ja auch direkt über URLs aufgerufen werden.
    In meinem Beispiel habe ich über CiviCRM ein Veranstaltung mit Online-Anmeldung erstellt - dabei wird ein Link zum Online-Anmeldeformular erstellt. Diesen Link verteile ich dann, so dass die Besucher*innen über diesen Link die Komponente (und damit automatisch auch das Modul) aufrufen.


    Oder habe ich hier vielleicht einen Denkfehler und Du weißt mich auf etwas anderes hin? Danke jedenfalls für jede Idee!

  • Erstelle dir mal von deinen JEvent-Modulen die Probleme verursachen ein Template - Override und setzte folgenden Code an den Anfang der Overriedes.

    PHP
    <?php
    $app = JFactory::getApplication();
    $option = $app->input->get('option', '');
    
    // Überprüfe, ob die Komponente "CiviCRM" aufgerufen wird
    if ($option === 'com_civicrm') {
        return;
    }
    ?>

    Getestet habe ich das, indem ich ein Modul ausgeblendet habe, wenn die com_content aufgerufen wurde. Das Modul wurde nur noch auf der Kontaktseite eingebunden.

    Super, danke - nach einem kurzen Missverständnis hat genau das funktioniert.

    Ich hatte es erst ganz zu beginn der Override-PHP-Datei geschrieben (wo es nichts bewirkt hat).

    Aber zu Beginn der display-Funktion funktioniert es wie gewünscht.


    Vielen lieben Dank! Super!

  • ...dabei wird ein Link zum Online-Anmeldeformular erstellt...

    Eventuell nützlich:


    Schattenmenü


    Womit für diesen Link bzw. im Schattenmenüeintrag die entsprechenden benötigten Modulzuweisungs-Einstellungen fürs Problem-Modul denkbar wäre...

  • Code
    $app = JFactory::getApplication();

    JFactory

    ist übrigens veraltet und fliegt dir spätestens mit Joomla 6 oder bei deaktiviertem Kompatibilitäts-Plugin um die Ohren. Benutze daher besser z.B.:


    Code
    use Joomla\CMS\Factory;
    
    $app = Factory::getApplication();
  • Das ist der klasische Weg. Daneben können Komponenten ja auch direkt über URLs aufgerufen werden.
    In meinem Beispiel habe ich über CiviCRM ein Veranstaltung mit Online-Anmeldung erstellt - dabei wird ein Link zum Online-Anmeldeformular erstellt. Diesen Link verteile ich dann, so dass die Besucher*innen über diesen Link die Komponente (und damit automatisch auch das Modul) aufrufen.


    Oder habe ich hier vielleicht einen Denkfehler und Du weißt mich auf etwas anderes hin? Danke jedenfalls für jede Idee!

    Ich würde ganz normal einen Menüeintrag für diese Komponente erstellen. Ein Schattenmenü mit Schattenmenüeintrag braucht man ja heute nicht mehr. Den Menüeintrag kann man für das Menü unter "Linktyp" einfach nicht anzeigen lassen. Hast halt den Vorteil einer sauberen SEO-Struktur und kannst die Moduoe auf einefachem Wege zuweisen. Man muss nicht alles so kompliziert angehen.

  • Ein Schattenmenü mit Schattenmenüeintrag braucht man ja heute nicht mehr

    Will dir nicht absolut widersprechen, aber ein Schattenmenü kann eine perfekte Basis sein, um erst mal ein SEO-perfektes Gesamtmenü zu erstellen, wobei andere Menüs nur noch vornehmlich mit Menüalias-Einträgen arbeiten. Diese weiteren Menüs sind so flexibel gestaltbar und Änderungen sind nur noch im Schattenmenü zu machen. Will aber nicht streiten...