Einfügen von Struktur-Elementen einschränken bzw. erlauben

Die Auswahl an Strukturelementen über das Modul Struktureditor können Sie individuell beeinflussen.

Sie wollen den Pflegebenutzern in bestimmten Bereichen nur konkrete Strukturelemente in der Auswahl zur Verfügung stellen?

Für das Ausblenden bzw. Anzeigen von Elementen in der Struktureditor-Auswahl stehen Ihnen mehrere Möglichkeiten bereit, die Sie nachfolgend beschrieben finden.

1) Struktur-Elemente über Gruppen einschränken / erlauben

Anhand der BASE Projektbasis zeigen wir Ihnen ein Beispiel, wie Sie für die Fusszeile (content5) nur das Fließtext-Element (text.wysiwyg) zur Auswahl bereitstellen.

Innerhalb des Pflegekommentares für Inhaltsgruppen können Sie über das Attribut "itemsExclude" definieren, welche Strukturelemente in der Auswahl des Struktureditors in dieser Gruppe ausgeblendet - also nicht zur Verfügung gestellt - werden sollen.
Ebenso können Sie eine Inhaltsgruppe über das Attribut "itemsExclude" auch so definieren, dass von allen verfügbaren Strukturelementen konkrete Elemente ausgeschlossen werden.
Wenn Sie den anderen Weg über das Attribut "itemsInclude" gehen,  können Sie definieren, auf welche Strukturelemente sich die Auswahl des Struktureditors in dieser Gruppe beschränken soll.

Im Beispiel 1.2 wird über "itemsInclude" für die Fußzeile nur das Fließtext-Element zur Verfügung gestellt.

Beispiele zu BASE (Mobile First)
Beispiele zu BASE Classic
Beispiele zu BASE (Mobile First)

Beispiel 1.1: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/globals/content.wGlobal.php zu content5 (Standard-Auslieferung)

...
  <!-- Hier werden die Inhaltselemente der Gruppe 5 eingebunden -->
  <xsl:template match="wd:group[@id='content5']">

    <xsl:variable name="itemsExclude"><xsl:if test="document(concat($wDocumentRoot, $wDocumentPath))/wd:document/wd:extension/wd:object/@type != 'global'">content.includeContentNavigation|content.includeContentCurrentPage|content.includeContentCurrentObject</xsl:if></xsl:variable>
    <wsl:php>
      $GLOBALS['wPageprocessing']['currentContentGroupId'] = '5';
    </wsl:php>
    <!-- web:group:start name="content5" de:caption="Element dem unteren Bereich hinzufügen" display="user" itemsExclude="<xsl:value-of select="$itemsExclude" />"-->
    <xsl:apply-templates select="wd:item[php:function('wOutput::isViewableItem', ., $wViewMode)]"/>
    <!-- web:group:stop -->

  </xsl:template>
...

Beispiel 1.2: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/globals/content.wGlobal.php zu content5 (nur Fließtext-Element)

...
  <!-- Hier werden die Inhaltselemente der Gruppe 5 eingebunden -->
  <xsl:template match="wd:group[@id='content5']">

    <xsl:variable name="itemsExclude">text.wysiwyg</xsl:variable>
    <wsl:php>
      $GLOBALS['wPageprocessing']['currentContentGroupId'] = '5';
    </wsl:php>
    <!-- web:group:start name="content5" de:caption="Element dem unteren Bereich hinzufügen" display="user" itemsExclude="<xsl:value-of select="$itemsExclude" />"-->
    <xsl:apply-templates select="wd:item[php:function('wOutput::isViewableItem', ., $wViewMode)]"/>
    <!-- web:group:stop -->

  </xsl:template>
...
Beispiele zu BASE Classic

Beispiel 1.1: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/misc/includes.global.php zu content5 (Standard-Auslieferung)

...
  <!-- Hier werden die Inhaltselemente der Gruppe 5 eingebunden -->
  <xsl:template match="wd:group[@id='content5']" wChecksum="39b4d3731bf8664f0d895dc05944f046">
    <xsl:variable name="itemsExclude"><xsl:if test="document(concat($wDocumentRoot, $wDocumentPath))/wd:document/wd:extension/wd:object/@type != 'global'">content.includeContentNavigation|content.includeContentCurrentPage</xsl:if></xsl:variable>
    <!-- web:group:start name="content5" caption="Element dem unteren Bereich hinzufügen" display="user" itemsExclude="<xsl:value-of select="$itemsExclude" />"-->
    <xsl:apply-templates select="wd:item[php:function('wOutput::isViewableItem', ., $wViewMode)]"/>
    <!-- web:group:stop -->
  </xsl:template>
...

Beispiel 1.2: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/misc/includes.global.php zu content5 (nur Fließtext-Element)

...
  <!-- Hier werden die Inhaltselemente der Gruppe 5 eingebunden -->
  <template match="wd:group[@id='content5']" wChecksum="39b4d3731bf8664f0d895dc05944f046">
    <xsl:variable name="itemsInclude">text.wysiwyg</xsl:variable>
    <!-- web:group:start name="content5" caption="" display="user" itemsInclude="<xsl:value-of select="$itemsInclude" />" -->
    <apply-templates select="wd:item[php:function('wOutput::isViewableItem', ., $wViewMode)]"/>
    <!-- web:group:stop -->
  </template>
...

Der Struktureditor stellt dem Benutzer somit nur das Fließtext-Element zur Verfügung:

Struktureditor - Elementeauswahl auf Fliesstext-Element beschränkt
Struktureditor - Elementeauswahl auf Fliesstext-Element beschränkt

2) Struktur-Elemente über das Mastertemplate einschränken / erlauben

Eine andere Möglichkeit, um bei der Auswahl im Struktureditor bestimmte Elemente zu erlauben oder zu begrenzen, ist die Angabe im Mastertemplate-Element.

Dies ist in der BASE und dem Element "Navigationsabhängige Inhalte einbinden" (content.includeContentNavigation.wItemMastertemplate.php) umgesetzt. Im Standard wird das Element so ausgeliefert, daß dieses nur in den Inhaltsbereichen (content1 - content6) eingefügt werden kann, nicht aber in z.B. Containern (da nicht als wd:contentGroup definiert). Gelöst ist dies über den  wd:mastertemplate  Bereich des zugehörigen Mastertemplate-Elements:

Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/mastertemplates/items/content.includeContentCurrentPage.wItemMastertemplate.php

...
    <wd:mastertemplate>
      <wd:contentGroup name="content1"/>
      <wd:contentGroup name="content2"/>
      <wd:contentGroup name="content3"/>
      <wd:contentGroup name="content4"/>
      <wd:contentGroup name="content5"/>
      <wd:contentGroup name="content6"/>
      <!--<wd:contentGroup name="container"/>-->
      <!--<wd:contentGroup name="formContainer"/>-->
      <!--<wd:contentGroup name="newsletter"/>-->
      <!--<wd:contentGroup name="contentHeaderMenuContainer"/>-->
      <!--<wd:contentGroup name="contentObjectListEntry"/>-->
    </wd:mastertemplate>
...

In o.g. Beispiel ist die wd:contentGroup Zeile zum "container" zur Veranschaulichung auskommentiert (wie nicht gesetzt). Somit kann das Element in einer Spalte des mehrspaltigen Inhaltscontainers nicht eingefügt werden. Setzen Sie die Zeile (ohne Kommentare), können Sie das Element auch in Spalten einfügbar machen.

Diese Technik wird z.B. auch im Bereich Newsletterbearbeitung angewandt, um nicht alle Strukturelemente standardmässig für den Newsletter bereitzustellen (siehe Online-Dokumentation). Dies hat dort den Hintergrund, dass E-Mail Clients teilweise mit komplexeren HTML-Strukturen nur bedingt zurechtkommen.
Strukturelemente aus .../mastertemplates/items/newsletter/ sind nur verfügbar, wenn diese die contentGroup name="newsletter" gesetzt haben.
Gleiches gilt für die Listendarstellung des Objektes beim Objekt-Wizard (Gruppe: contentObjectListEntry).

Auch zum Kopfbereich, welcher ab CMS-Version 18 in der BASE über den Struktureditor gepflegt werden kann, ist dies im Einsatz. Strukturelemente aus .../mastertemplates/items/header/ sind nur verfügbar, wenn diese die contentGroup name="contentHeaderMenuContainer" gesetzt haben.

2.1 Über die type-Angabe des Mastertemplate-Elementes einschränken / erlauben

Ab aktueller CMS Version 13.x besteht zudem die Möglichkeit, einem Mastertemplate-Element nach dem Einfügen des Strukturelementes einen anderen type zu geben.
Das ist in aktuellen Projekten z.B. beim BannerSlider- und Bildergalerie-Element umgesetzt, um die Auswahl vorab über den type (z.B. list.bannerSlider) zu beschränken, nach dem Einfügen aber den für die Liste korrekten type (hier: list.standard) zu haben (Attribut typeAfterInsert).

Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/mastertemplates/items/bannerSlider.standard.wItemMastertemplate.php

  <wd:group>
    <wd:item name="Banner Slider" en:name="Teaser" icon="bannerSlider.standard" type="list.bannerSlider" typeAfterInsert="list.standard" uid="fb9ff43403b0d431a1677a2b63335599">

3) Struktur-Elemente objektabhängig einschränken / erlauben

Die in der Seitenbearbeitung zur Verfügung stehenden Strukturelemente können Sie abhängig vom Seitenobjekt zur Auswahl bereitstellen (verfügbar ab CMS Version 005.058.045.000) .

Im Mastertemplate-Element können Sie innerhalb des wd:contentGroup Tags zur angegebenen Inhaltsgruppe (z.B. name="content1") das Element für bestimmte Objekte zulassen (objectsInclude) bzw. ausschliessen (objectsExclude).

Beschränken Sie auf diese Weise bestimmte Strukturelemente (z.B. das Tabellen-Element) auf Objekttypen.

Beispiel: Auszug aus dem Mastertemplate-Element table.standard.wItemMastertemplate.php

...
    <wd:mastertemplate>
      <wd:contentGroup name="content1" objectsInclude="start|default|news"/>
      <wd:contentGroup name="content2" objectsExclude="news"/>
      <wd:contentGroup name="content3"/>
      <wd:contentGroup name="content4"/>
      <wd:contentGroup name="content5"/>
      <wd:contentGroup name="content6"/>
      <wd:contentGroup name="container"/>
      <wd:contentGroup name="formContainer"/>
    </wd:mastertemplate>
...

4) Struktur-Elemente abhängig von der Seitendarstellung einschränken / erlauben

Die in der Seitenbearbeitung zur Verfügung stehenden Strukturelemente können Sie abhängig von der Seitendarstellung (pageDisplayType bei BASE, pageLayout bei Mobile First) zur Auswahl bereitstellen (verfügbar ab CMS Version 012.005.128.000 ) .

Im Mastertemplate-Element können Sie innerhalb von wslMastertemplate:php Tags innerhalb der Gruppe (wd:group) das Element für bestimmte Seitendarstellungen zulassen bzw. ausschliessen.

Beschränken Sie auf diese Weise bestimmte Strukturelemente (z.B. das Inhaltsbereich Element) auf Seitendarstellungen.

Beispiel: Auszug aus dem Mastertemplate-Element container-section.wItemMastertemplate.php

...
  <wd:group>
    <wslMastertemplate:php>
      $pageLayout = wDocumentData::getData(wPathName::getPathDraft(wEnv::getGlobalValue('wEditorPath')), "/wd:extension/wd:object/wd:data[@id = 'pageDisplayType']/text()");
      // bei Mobile First:
      //$pageLayout = wDocumentData::getData(wPathName::getPathDraft(wEnv::getGlobalValue('wEditorPath')), "/wd:extension/wd:object/wd:data[@id = 'pageLayout']/text()"); 
      //print $pageLayout;
      if($pageLayout == 'Full'){
    </wslMastertemplate:php>
    <wd:item type="container.section" insertType="" name="Inhaltsbereich (mit weiteren Elementen befüllbar)" en:name="Section to include further elements" icon="/[IHR-LAYOUT-PROJEKT]/wGlobal/layout/images/element-icons/element_containerSection.gif" uid="613c4f7c86d923a6f784694f03e6d2dd">
      ...
      ...
    </wd:item>
    <wslMastertemplate:php>
      }
    </wslMastertemplate:php>
  </wd:group>
...

5) Struktur-Elemente für eine Seite komplett ausblenden

Sie können zu einer Seite durch (bewußte) falsche Referenzierung der Mastertemplate-Datei (Datei-Eigenschaften - Templates) die Auswahl der Struktur-Elemente innerhalb der Seite unterbinden. Sofern Sie dies über die Standard-Dateieinstellungen auf Projektebene (z.B. /de) vornehmen, gilt dies für alle Seiten, die sich die Templates von dort erben.

Bei Klick auf den Struktur-Element Button "Element hinzufügen" öffnet sich in diesem Fall kein Layer und in der Fehlerkonsole des Browsers ist abhängig vom Browser eine Fehlermeldung zu finden:

z.B. Google Chrome:
Uncaught TypeError: Cannot read property 'items' of undefined

z.B. Mozilla Firefox:
TypeError: availableItemsOfGroup is undefined

Die Auswahl von Elementen über ein Strukturelement über den Anfasser bleibt in diesem Fall leer, also ohne Inhalt. Dies ist nachfolgend über Screenshots veranschaulicht.

Struktureditor - Element hinzufügen Button
Struktureditor - Element hinzufügen Button
Struktureditor - Struktur-Element Auswahl leer
Struktureditor - Struktur-Element Auswahl leer

6) Struktur-Elemente deaktivieren (offline setzen)

Ein deaktivieren (offline setzen) von Mastertemplate-Elementen bewirkt, daß Sie ein bestehendes Strukturelement, das auf solch einem Mastertemplate-Element basiert, nicht in andere Seiten einfügen können (z.B. per Zwischenablage-Funktion). Beim Einfügen erfolgt ein entsprechender Hinweis:

Das Element darf in diese Gruppe nicht eingefügt werden!

Um das Einfügen wieder zu ermöglichen, aktivieren Sie das entsprechende Mastertemplate-Element wieder (online setzen).
Die Meldung wird auch Pflegebenutzern angezeigt, wenn diese ein für den Benutzer nicht personalisiertes Mastertemplate-Element per Zwischenablage-Funktion einfügen wollen.

7) Struktur-Elemente speziell für Newsletter der BASE (Mobile First)

Die BASE (Mobile First) ist zum Newsletter-Modul und dessen verwendbaren Strukturelementen so umgesetzt, daß diese in einem Unterverzeichnis abgelegt werden:

/[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/items/newsletter/

z.B. headline.text.wItem.php etc.

Auch hier müssen Sie die contentGroup setzen, also wie in Punkt 2) angeführt den Einsatz für die Newsletter-Gruppe freigeben:
  <wd:contentGroup name="newsletter"/>

8) Falsche Namensraumangabe im Mastertemplate-Element

Sofern die Namensraumangabe im Mastertemplate-Element (versehentlich) verändert wurde, kann es sich auch derart auswirken, daß keine Strukturelemente mehr über den Struktureditor angezeigt werden (Struktureditorauswahl bleibt leer).

Ursache kann z.B. ein falscher Suchen & Ersetzen Vorgang sein, bei dem alle URLs von http auf https umgestellt werden sollten, aber auch diese Pfade falsch erfasst wurden (https://weblication.de/... anstatt http://weblication.de/...):

Falsch:

... xmlns:wslMastertemplate="https://weblication.de/5.0/wslMastertemplate" xmlns:wsl="https://weblication.de/5.0/wsl" xmlns:wd="https://weblication.de/5.0/wd" ...

Korrekt:

... xmlns:wslMastertemplate="http://weblication.de/5.0/wslMastertemplate" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" ...

9) JS-Dateien im tmpHTTP-Verzeichnis mit Fehler 500

Wenn der Struktur-Editor keine Strukturelemente mehr zur Auswahl anzeigt (ggf. nur Komponenten), kann dies auch daran liegen, daß die temporären JavaScript-Dateien im tmpHTTP-Verzeichnis die Ursache sind. Das kann sich z.B. so auswirken, daß diese Aufrufe einen Fehler 500 werfen (in der Browserkonsole ersichtlich).

In der Regel kann das Problem durch Bereinigen des tmpHTTP-Verzeichnisses (z.B. über die Serverinformationen) behoben werden.

10) Mastertemplate-XML nicht valide

Wenn das Mastertemplate im Inhalt nicht XHTML valide (wohlgeformt) ist, kann dies auch eine Ursache dafür sein, daß das Strukturelement nicht auswählbar ist.

Allgemeine Hinweise

Die Anzeige von Strukturelementen innerhalb der Struktureditor-Auswahl kann auch dadurch beeinflußt werden, wenn XSL-Templates die gleichen Gruppen aufrufen.
Nachfolgend wird dies anhand des mehrspaltigen Inhaltscontainers (container.standard) und einem speziell für den Newsletter angelegten XSL-Template (container.newsletter) aufgezeigt. Wenn beide für die Spalteninhalte (column1, column2, etc.) die gleiche Gruppen-ID angesprechen, kann dies kollidieren. Nutzen Sie daher im individuell angelegten Template einen speziellen Modus für den Templateaufruf (siehe Beispiel).

Auszug aus einem eigenen container.newsletter.wItem.php Template

<!-- Umsetzung ohne mode-Angabe -->
...
  <template match="wd:group[@id='column1']">
    <!-- web:group:start name="container" itemsInclude="headline.text|picture.standard|text.wysiwyg|link.standard" display="user" -->
      <apply-templates select="wd:item"/>
    <!-- web:group:stop -->
  </template>
...

<!-- Empfehlung: Umsetzung mit mode-Angabe -->
...
  <template match="wd:group[@id='column1']" mode="newsletter">
    <!-- web:group:start name="container" itemsInclude="headline.text|picture.standard|text.wysiwyg|link.standard" display="user" -->
      <apply-templates select="wd:item"/>
    <!-- web:group:stop -->
  </template>
...
<!-- Die mode-Angabe muß dann auch im xsl:apply-templates Aufruf gesetzt werden! -->

Sollten sich vorhandene Strukturelemente nicht verschieben lassen, kann dies z.B. folgende Ursachen haben:

  • type-Angabe des XSL-Templates und Mastertemplates unterscheiden sich