Zielstellung dieses Beitrages

Dieser Beitrag richtet sich speziell an Nutzer des Gantry5-Template-Frameworks unter Joomla.

Wer mit dem Ganty5-Template unter Joomla arbeitet, weiss, dass man zum einen Inhalte im Template-Layout über Gantry5-Particle einpflegen kann. Andererseits ist es aber auch möglich Particle als Module anzulegen und diese Module auf dem Joomla-üblichen Weg Modulpositionen des Templates zuzuweisen. Ein dritter Weg wäre über eine Paticle-Instanz im Template-Layout sich ein existierendes Modul einzuladen.

Rein theoretische kann man fast ganz ohne Joomla-Module auskommen und Inhalte nur über Particle im Gantry-Layout-Manager einpflegen. Z.B. bei sogenannten One-Pager-Projekten mache ich persönlich das ganz gern so, da sowieso jeder Particle-Inhalt immer nur an einer Position auf nur einer Startseite veröffentlicht wird. Bei komplexeren Webprojekten praktiziere ich meist eine Mischform. Inhalte die ich mehrfach auf Seiten veröffentliche und diverse weitere Einstellmöglichkeiten benötige (z.B. Sprachabhängigkeiten) kreiere ich als Modul-Particle und wirklich statische Inhalte, die immer und überall unverändert angezeigt werden, hänge ich meist sofort fest als Particle in das Gantry5-Layout - entweder schon in das Basic-Outline oder nur in eines der Sub-Layouts.

Nun kann es passieren, dass ich in einem Projekt zunächst ein Particle im Templatelayout erstellt habe. Später stellt sich heraus, dass ich das Particle doch als Module-Particle bevorzuge. Üblich ist es nun, das Particle im Layout zu löschen, und an seine Stelle eine Modulposition einzubinden. Dann muss man eine Moduleparticle vom gewünschten gleichen Particle-Typ erstellen und nun leider alle Inhalte dort erneut einpflegen. Bei komplexen Particle-Inhalten mit ggf. vielen Items kann das einfach nerven. Leider gibt es keinen automatisierten Weg, eine Layoutparticle in eine Modulparticle zu transferieren oder umgekehrt.

Dieser Beitrag beschreibt wie man sich die komplette Neuerstellung der Particles-Inhalte ersparen kann.

 

Grundlagenwissen / Kown How

Zunächst sollte man dazu wissen, dass Gantry5-Layoutparticle ihre Inhalte anders speichern als Joomla-Module vom Typ Gantry5-Particle. Hier mal eine kleine Gegenüberstellung am Beispiel des Socials-Particle.

 

  Modul-Particle Particle-Defaults Layout-Particle
    Hier wird unterschieden, zwischen der Speicherung der Particle-Defaults und der Particle-Modifikationen im Template-Layout.
Speicherort in der Joomla-Core-Datenbanktabelle ~_modules im Feld params. templates\
mein_gantry5_template\
custom\
config\
36\  (ID je nach gewählterm Template)
particles\
myparticle.yaml
templates\
mein_gantry5_template\
custom\
config\
30\   (ID je nach gewählterm Template)
layout.yaml
Speicherformat JSON, zusammen mit den weiteren Modul-Optionen, speziell im Knoten 'options':'{particle':...}, siehe Code-Bsp. A) YAML
s. Code-Bsp. B)
YAML
s. Code-Bsp. B)

Beispielcode

A) JSON in Particle-Modulen - beim JSON schon ausgeklappt auf Einzelzeilen; gespeichert wird ohne Leerräume oder Zeilenumbrüche:

{
"particle":"{
	\"type\":\"particle\",
	\"particle\":\"social\",
	\"title\":\"Social\",
	\"options\":
		{
		\"particle\":
			{
			\"enabled\":\"1\",
			\"css\":
				{
				\"class\":\"social\"
				},
			\"title\":\"\",
			\"target\":\"_blank\",
			\"items\":
				[
					{
					\"icon\":\"fa fa-facebook-square\",
					\"text\":\"DJ-WAM auf FaceBook\",
					\"alttag\":\"DJ-WAM auf FaceBook\",
					\"link\":\"https:\/\/facebook\/djwam\",
					\"target\":\"_blank\",
					\"name\":\"Facebook\"
					},
					{
					\"icon\":\"fa fa-twitter-square\",
					\"text\":\"DJ-WAM auf Twitter\",
					\"alttag\":\"DJ-WAM auf Twitter\",
					\"link\":\"https:\/\/twitter.com\/djwam\",
					\"target\":\"_blank\",
					\"name\":\"Twitter\"
					}
				]
			}
		}
	}",
"moduleclass_sfx":"",
"owncache":"0",
"cache_time":"900",
"module_tag":"div",
"bootstrap_size":"0",
"header_tag":"h3",
"header_class":"",
"style":"0"
}

Folgende das Beispiel für YAML-Daten. In dem Particle-Defaults, werden nur die Inhalte des Particles gespeichert, hier beginnend mit den Items-Inhalten, währenddessen werden in der Layout-YAML natürlich alle Einstellungen und Inhalte für das Layout gespeichert. Die Particle-Inhalte sind da also nur ein Auszug und sehen genauso aus wie beim Particle-Default:

 

     items:
        -
          icon: 'fa fa-envelope fa-lg'
          text: ''
          alttag: 'Terminanfrage an den DJ stellen'
          link: /kontakt
          target: _parent
          name: Kontakt
        -
          icon: 'fa fa-whatsapp fa-lg'
          text: ''
          alttag: 'WhatsApp-Nachricht an Sven schreiben'
          link: 'https://wa.me/491715397172'
          target: _blank
          name: WhatsApp
...
        -
          icon: 'fa fa-twitter fa-lg'
          text: ''
          alttag: 'DJ WAM Twitter-Profil'
          link: 'https://www.twitter.com/djwam'
          target: _blank
          name: Twitter

Wir sehen also, dass die Inhalte in unterschiedlichem Format gespeichert werden. Deshalb wäre eine einfaches Übertragen der Inhalte vom z.B. Layout-Particle in das Modul-Particle nicht möglich.

 

Umsetzung

Leider gibt es keine fertiges Feature im Gantry5-Framework mittels dessen man diese Übertragung einfach veranlassen könnte, aber mit wenigen Handgriffen kann man das wie folgt erledigen:

Erstes Fallbeispiel: Wir wollen eine Layout-Particle in eine Modul-Particle übertragen:

 

  1. Wir legen eine neues Module vom Typ Gantry-Particle an und wählen den gleichen Particle-Typ wie das Layout-Particle-Original. Speichern.
  2. Das Modul bekommt eine Joomla-interne Modul-ID. Diese merken!
  3. Nun z.B. mit PhpMyAdmin die Projekt-Datenbank aufrufen und die Tabelle ~_modules öffnen.
  4. Den Moduldatensatz zur Bearbeitung öffnen, der die Modul-ID hat, die wir uns eingangs gemerkt hatten.
  5. Den kompletten Feldinhalt mal in einen Editor zwischenspeichern, um im Fall eines Mißerfolges dieses DS-Feld wieder herstellen zu können.
  6. Wir suchen die YAML-Datei die unsere Layout-Particle-Inhalte enthält, also entweder de layout.yaml oder die particleX.yaml und kopieren von dort die Particle-Inhalte in die Zwischenablage.
  7. Nun rufen wir diese Website auf: http://convertjson.com/yaml-to-json.htm oder https://codebeautify.org/yaml-to-json-xml-csv
  8. In das linke Feld kopieren wir unsere YAML-Sequenz und konvertieren diese zu ihrem JSON-Gegenstück über den Button Convert YAML to JSON.
  9. Den Inhalt des JSON-Resultat-Feldes holen wir in die Zwischenablage.
  10. Einen einfachen Texteditor mit Suchen/Ersetzen-Funktion öffnen z.B. der Windows-Editor ist dafür geeignet. Dort den Inhalt der Zwischenablage einkopieren.
  11. Nun müssen in drei Schritten zunächst alle Doppel-Quote-Zeichen escaped werden \", durch voranstellen eines Backslash \. Dann alle Tabulatoren und Zeilenumbrüche in je einem Schritt durch nichts ersetzen. (Leider konnte ich noch keinen Converter finden, der diese Bereinigung schon vornimmt.).
  12. Das fertige bereinigte Erbebnis wieder in die Zwischenablage kopieren.
  13. In PhpMyAdmin wechseln und in das Feld params unsers o.g. Datensatzes gehen.
  14. Nun passend den Inhalt der Zwischenablage einfügen. Dabei beachten, dass in den korrekten Knoten gesprungen wird, z.B. i.d.R. "items" innerhalb der Array-Klammern [ und ]. Das kann je nach Parametersatz in  Ihrem Particle auch ein andere Knoten sein.
  15. Den Datensatz speichern.
  16. Nun kann in der Joomla-Modulverwaltung das Modul-Particle geöffnet werden. Wenn es korrekt abgelaufen ist, läßt sich das Modul-Particle fehlerfrei öffnen. Wenn etwas verkehr gelaufen ist, wird Joomla das Modul als beschädigt melden. Dann müssen sie mit der oben geforderten Sicherung das Feld wieder herstellen und nach der Ursache suchen.

 

Weiterführende Infos

In der Joomla 3.9-API gibt es eine Class zur Handhabung von YAML-Daten. Damit wäre es möglich YAML-Daten zuächst in ein PHP-Objekt zu übertragen. In einem weiteren Schritt ließe sich aus diesem Objekt dann ein Joomla-konformer JSON-String erzeugen. Prinzipiell gibt es im Namespace Joomla\Registry\Format die Classen zur Formatumwandlung sowohl für YAML als auch JSON (s. auch https://github.com/joomla-framework/registry).