Templateumstellung zu OpenCms 8.x

Neue Formatter-Struktur

 Für neue Typen, die  als Element einer Containerpage dienen sollen, muss eine sogenannte Formatter-JSP angelegt werden. Diese hat folgende Grundstruktur:

<?xml version="1.0" encoding="UTF-8"?>

<formatter var="content" value="value"> <p>${content.value.Inhalt} </formatter>

Der Zugriff auf die Elemente des Typs erfolgt mit sogenannter EL-Notation (Unified Expression Language) der Form ${content.value.<Feldname>}

Abfragen wie es mit dem <contentcheck>-Tag möglich war, können folgendermaßen ausgedrückt werden:

 
<formatter var="content" value="value">
     <c:if test="${content.value.Inhalt.exists}>
       <p>${content.value.Inhalt}</p>
     </c:if>
</formatter>

Dieser Code gibt das Element Inhalt nur aus, wenn es existiert.



Umstellung von alten Detailpage-JSPs

Eine Umstellung der alten JSPs auf die neue Formatterstruktur funktioniert relativ problemlos über zwei Schritte:

Als Erstes werden die alten <contentload>/<contentaccess>-Elemente mit dem neuen <formatter>-Tag umschlossen:

<formatter var="content">
  <contentload collector="..." params="..." >
    .... 
  </contentload>
</formatter>

Dabei sollte unbedingt darauf geachtet werden, dass die Ausgabe ein Wurzelelement besitzt und, falls dies nicht der Fall sein sollte außerhalb des <formatter>-Tags ein zusätzliches, den gesamten Code umschließendes <div>-Tag einfügen. Andernfalls hat das fehlende Wurzelelement zur Folge, dass dieser Formatter keine Ausgabe produziert.

Im letzten Schritt muss nun noch eine Abfrage zu Beginn des Formatters eingefügt werden, da beim Erstellen neuer Elemente über die ADE-Oberfläche, diese vorerst nur im Speicher liegen und es somit zu Fehlern führt, ein <contentload> auf diese Elemente ausführen zu wollen. 

Um dieses Problem zu umgehen kann man z.B. eine Standarddatei laden, anstatt des gerade erstellten Elements.

Diese Abfrage sieht dann folgendermaßen aus

<formatter var="content">
  <c:choose>
   <c:when test="${cms.element.isInMemoryOnly}">
      <c:set name="url" var="/pfad/zu/standarddatei" />
   </c:when>
   <c:otherwise>
      <c:set name="url" var="${cms.element.sitePath}" />
   </c:otherwise>
  </c:choose>
  <contentload collector="..." params="..." >
    .... 
  </contentload> 
</formatter>

Anstatt eine Standarddatei zu laden kann man folgendermaßen auch eine andere Art der Ausgabe produzieren:

<formatter var="content">
  <c:choose>
     <c:when test="${cms.element.isInMemoryOnly}">
      <p>Neues Element, bitte bearbeiten!</p>
     </c:when>
     <c:otherwise>
     <contentload collector="..." params="..." >
      .... 
     </contentload> 
  </c:otherwise>
</c:choose>
</formatter>
 

Schemaanpassungen

In beiden Fällen muss nach Erstellung des Formatters noch das XSD-Schema angepasst werden. Hierzu muss folgender XSD-Tag eingefügt werden:

<xsd:annotation>
  <xsd:appinfo>     
   <formatters>      
      <formatter minwidth="200" maxwidth="400" uri="/pfad/zum/formatter" />     
   </formatters>
  </xsd:appinfo>  
</xsd:annotation> 

Die Mindest- und Maximalbreite (minwidth/maxwidth) begrenzt den Einsatz des Formatters auf Container, die diese Kriterien erfüllen. Spezifischer kann auch mit dem Attribut "type" ein Containertyp (center, sidecolumn) angegeben werden.



Manuelle Seitenumstellung

Man kann Inhaltselemente durch folgende Schritte manuell zu Containerpages umstellen:

  1. Kopiere die Inhaltsressource nach ./content/<typ>/
  2. Ändere den Typ der Ressource zu einer Containerpage (Kontextmenü >> Erweitert >> Typ ändern)
  3. Erzeuge einen gültigen XML-Inhalt, z.B. durch Kopieren einer geeigneten Modelpage (aus .content/.new/) auf die Containerpage
  4. Öffne die Ressource in der Vorschau und bette den Inhaltstyp aus .content/<typ>/ ein