Macroformate

Der Artikel gibt eine Einführung in Macroformate und erklärt wie Macroformate eingebunden werden können.

Einführung

Hinter einem Macroformat verbirgt sich eine hierarchische Kette von Formaten. Zum grundsätzlichen Verständnis, was sich hinter einem Format verbirgt, empfehlen wir zuerst den Artikel Formate - die Grundlagen sowie Formate zu lesen.

Grundsätzliche Struktur

  • Node A
    • Node A.1
    • Node A.2
    • Node A.3
  • Node B
  • Node C
    • Node C.1
    • Node C.2

Beim Rendering eines Macroformats werden die verschachtelten Knoten von unten nach oben aufgelöst und die Ergebnisse der Unterknoten werden an den Vaterknoten übergeben. Für das Beispiel oben bedeutet dies, das der Node A die Ergebnisse von den Nodes A.1 + A.2 + A.3 erhält.

Die Vaterknoten sind dabei für die Verarbeitung seiner Unterknoten verantwortlich. Kümmert sich der Vaterknoten nicht um die Verarbeitung, werden die Unterknoten-Ergebnisse nicht automatisch im Macroformat-Ausgabe integriert, sondern gehen verloren.

Die Ergebnisse der Unterknoten werden in den Format-Parametern an den Vaterknoten übergeben

  1. $DATA['params']['ecms_macroformat']['child_results'] = array(
  2.             0 => array(
  3.                     'status' => true,
  4.                     'src' => '<div>...</div>',
  5.                     'cache' => array('cacheable'=>true),    
  6.                 ),
  7.             ...    
  8.         )

In einem Macroformat-Knoten kann alternativ zu einem Format auch ein anderes Macroformat eingehängt werden. Die Ergebnisse der Top-Level-Ebene aus dem Sub-Macroformat ersetzen den Knoten im aufrufenden Macroformat.

Zur Verdeutlichung ein Beispiel. Würde das folgende Macroformat

  • Sublist Node 1
    • Sublist Node 1.1
    • Sublist Node 1.2
  • Sublist Node 2
    • Sublist Node 2.1

als Sub-Macroformat in den Node B des obigen Beispiel angehängt, würde das Ergebnis des Rendering-Prozess (alle Unterknoten sind aufgelöst) wie folgt aussehen.

  • Node A
  • Sublist Node 1
  • Sublist Node 2
  • Node C

Verwendung

Macroformate können im eCMS auf 2 Wege verwendet werden. Die 1. Option wäre die Einbindung über das Foramt "ecms_macroformat_render". Als 2. Option steht die Integration über eigene Formate bereit.

Format ecms_macroformat_render

Das Format wird als Standard-Rendering für Macroformat bereitgestellt. Es kann in PH-Config und in anderen Format genutzt werden um Macroformate einzubinden. Als Pflichtparameter erwartet das Format das Label des Macroformats in "macroformat_label".

Das nachfolgende Beispiel zeigt, wie ein Macroformat innerhalb eines Format-Obejcts verwendet werden könnte:

  1. // Instance von Macroformat-Render erzeugen
  2. $MFR = $this->factory('ecms_macroformat_render', array('params'=>array('macroformat_label'=>'my-macroformat-label')));
  3.     
  4. // Ausgabe des Macroformat generieren, Rendering-Daten werden von aussen übergeben
  5. $r = $MFR->generateContent($DATA);

Eigene Formate

Macroformate können auch einfach als eigene Format-Objects bereitgestellt werden. In der einfachsten Form, wird dabei ein Format-Object-Class mit dem Label den Macroformat anlegt und die Class von "ecms_macroformat_base" abgeleietet.

  1. class my_macroformat extends ecms_macroformat_base
  2. {
  3.     // die Class rendert Macroformat mit dem Label "my_macroformat"
  4. }

Mit ein wenig mehr Aufwand kann dern Name der Format-Object-Class vom Macroformat-Label entkoppelt werden:

  1. class my_macroformat_as_table extends ecms_macroformat_base
  2. {
  3.     public function __construct($params)
  4.     {
  5.         parent::__construct($params);
  6.  
  7.         // setzt Label des aufzulösenden Macroformats
  8.         $this->marcoformat_label = 'my_macroformat';
  9.     }
  10. }

Durch diese Entkoppelung von Macroformat und Format-Obejct, ist die Verwendung des gleichen Macroformat für verschiedene Ausgaben, wie als Table oder Liste, möglich. In den Format-Object-Classes müsste dafür nur die "generateContent" Methode überschrieben werden.

Render Daten und Parameter

Für Macroformat-Rendering können von aussen Daten und Parameter übergeben werden. Wie dies von Formaten bekannt ist.

Die Daten (z.B. CDB-Records) werden unverändert an alle Knoten des Macroformats übergeben. Das manipulieren von Daten durch Knoten, z.B. um das Verhalten eines Oberknotens zu beeinflussen, ist nicht möglicht.

  1. // Zugriff auf Daten in Format-Sciprten
  2. $DATA['data']['<render-data>'];
  3.  
  4. // Zugriff in Format-Objects
  5. public function generateContent ($params)
  6. {
  7.     $params['data']['<render-data>'];
  8. }

Die Format-Parameter können pro Knoten hinterlegt werden und ihr Zusammenfügen mit den von aussen übergeben Parameter kann in jeden Knoten festgelegt werden. Aktuell werden hier 2 Optionen supported:

  • merge_as_defaults: die Parameter aus den Knoten werden als Defaults behandelt und können durch die Parameter von aussen überschrieben werden
  • merge_by_overwrite: die Parameter aus den Knoten besitzen die höhere Priorität und dürfen die Parameter von aussen überschreiben

Auch bei den Parametern gibt es keine Option, dass Knoten die von aussen übergebenen Parameter verändern können.