Das Urproblem: Redakteure sind keine Programmierer
Schon seit längerem gibt es die Möglichkeit Module in einem Artikel zu laden, indem man den Befehl {loadposition modulposition} nutzt. Das war bisher aber nicht sehr Redakteurfreundlich. Mit den Custom Fields in Joomla! 3.7 hat sich das geändert.
Die Idee - Custom Fields
Es ist nun möglich, einen normalen Joomla!-Artikel mit eigenen Feldern (custom fields) anzureichern. Dies erlaubt es, die Eingabemaske für Artikel um weitere Felder zu erweitern und die eingegebenen Werte dann in der Artikelansicht mit auszugeben oder (wie in unserem Fall) abzufragen.
Was wollen wir nun erreichen? Zuerst werden wir im Backend von Joomla! ein custom field vom Typ "Optionsfeld (radio)" anlegen und für die Formularansicht aktivieren. Danach werden wir per Override am Ende eines Artikels Abfragen, ob die Option aktiviert wurde und entsprechend ein Modul laden.
Custom Field anlegen - Gruppen
Im Ersten Schritt erstellen wir eine neue Gruppe für das Custom Field. Dies können wir direkt über das linke Untermenü bei den Artikel erledigen. Dazu im gewohnten Joomla!-manier einen neuen Eintrag anlegen, benamsen (hier nennen wir es "Module") und Speichern & Schließen drücken. Die Gruppe wird dann beim Artikel der Name des Reiters sein, indem unser neues Custom Field erscheinen wird.
Custom Field anlegen - Optionsfeld
Als nächstes legen wir nun das Custom Field vom Typ "Optionsfeld (radio)" selbst an. Hierzu gehen wir links auf den Untermenüpunkt "Felder" und erstellen ein neues Feld. Wichtig hierbei ist es, zum einen den korrekten Typ "Optionsfeld (radio)" und auf der rechten Seite die zuvor erstellte Gruppe zu wählen. Zusätzlich nehmen wir "Ja/Nein" als wählbare Werte und "Nein" (entspricht "0") als Standardwert. Wichtig ist auch, dass wir das Custom Field im Beitrag nicht automatisiert ausgeben sondern dann gezielt per Override. Das können wir im zweiten Reiter "Optionen" unter dem Punkt "Automatische Anzeige" einstellen. Wichtig ist nun, dass wir uns die ID des Custom Fields merken. Diese befindet sich auf der rechten Seite in der Listenansicht (in unserem Beispiel gehen wir von der ID "1" aus)
Custom Field integrieren
Nachdem das Custom Field angelegt wurde, ist es auch direkt beim Erstellen eines Artikels verfügbar.
Was nun noch gemacht werden muss ist die Ausgabe selbst. Es ist in Joomla! möglich, dass die Felder automatisch gerendert und ausgegeben werden. In unserem Fall würde dann aber einfach ein "Ja" oder "Nein" da stehen. Wir benötigen aber nur eine Abfrage, was gewählt wurde und fügen dann eigenen Code (Das Laden der Modulposition) hinzu. Dazu gehen wir im Backend in die Templateverwaltung (Erweiterungen => Templates => Templates), klicken auf unser Template und erstellen ein Overrides des Artikellayouts.
Nun geht es ans eingemachte, wir brauchen ein bisschen PHP um das Laden der Module zu implementieren. Zuerst öffnen wir im Backend unter Erweiterungen => Templates => Templates die soeben erstellte Datei html/com_content/article/default.php:
Hier kann nun an (fast) beliebiger Stelle der Code für das laden der Modulposition hinzugefügt werden.
In diesem Beispiel fügen wir die Modulposition nach dem Beitragsbild ein. Dazu suchen wir in der Override-Datei (html/com_content/article/default.php) nach folgender Codezeile:
Diese Codezeile lädt das Layout für das Artikelbild. Direkt danach können wir nun einsteigen und unseren Code einfügen. Wir werden zuerst Abfragen, ob das Custom Field auf "Ja" (entspricht dem Wert "1") steht und dann alle Module der Modulposition "custom-modules" laden.
<?php use Joomla\CMS\Helper\ModuleHelper // Überprüfen, ob das Optionsfeld auf "Ja" gesetzt wurde if (!empty($this->item->jcfields[1]->rawvalue)) { // Module laden $modules = ModuleHelper::getModules('custom-modules'); foreach ($modules as $module) { // Modul ausgeben echo ModuleHelper::renderModule($module); } }
Nun können Module auf der Modulposition "custom-modules" ohne Probleme geladen und per Artikelparameter ein- und ausgeschalten werden.
weitere Verbesserungen
Was ist jetzt noch zu tun? Eigentlich nicht mehr, aber man könnte die geladene Modulposition dynamischer gestalten:
// Position anhand der Artikel-ID laden $modules = ModuleHelper::getModules('custom-modules-' . (int) $this->item->id); // Position anhand der Kategorie-ID laden $modules = ModuleHelper::getModules('custom-modules-' . (int) $this->item->catid); // Position anhand der Autor-ID laden $modules = ModuleHelper::getModules('custom-modules-' . (int) $this->item->created_by);
Bildquelle: Olivier Le Moal @ shutterstock.com