Ausgefallen gut ins Netz!

Hinter dem Namen Wicked Software stehen ausgefallen gute und begeisterte Entwickler, für die Software wesentlich mehr ist als funktionierender Code. Wicked Software hat sich auf Joomla! spezialisiert und bietet moderne und flexible Erweiterungen.

Wir schreiben in unseren Blog mit und über Joomla!, unsere Software, Tricks & Tipps und alles was uns in den Sinn kommt und uns nützlich erscheint.

Finger drückt einen ON Button

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.

Alle verfügbaren Felder werden (als Array) in der Objektvariable jcfields gespeichert. Die Felder selbst sind folgendermaßen über deren ID ansprechbar: $this->item->jcfields[ID_DES_FELDES]; deshalb war es wichtig, dass wir uns am Anfang die ID gemerkt haben. Somit bekommen wir Zugriff auf die Daten unser Feld indem wir folgenden Code nutzen: $this->item->jcfields[1]

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:

<?php echo JLayoutHelper::render('joomla.content.full_image', $this->item); ?>

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