Die neuen Möglichkeiten von DisplayCond

Einleitung

Seit vielen Jahren gibt es die Möglichkeit, ausgewählte Felder nur für einen bestimmten Kontext anzeigen zu lassen.

So konnte der Extensionentwickler zum Beispiel vorgeben, Feld X nur dann anzeigen zu lassen, wenn Feld Y einen zuvor vorgegebenen Wert enthält. Von dieser Möglichkeit macht auch TYPO3 selbst Gebrauch und zwar im Bereich der Inhaltselemente. Wenn Sie als Inhaltstyp "Text" auswählen, werden Ihnen völlig andere Felder zur Bearbeitung angezeigt als zum Beispiel beim Typ "Bilder" oder "Formular".

Dieses Aktivieren/Deaktivieren von Feldern kann der Extensionentwickler über die Eigenschaft "displayCond" innerhalb der TCA steuern. Jedoch mit einer Beschränkung: pro Feld kann immer nur EINE Bedingung angegeben werden. Zwar kann man abfragen, ob ein Feld den Wert x, y oder z aufweist, aber es gibt keine Möglichkeit abzufragen, ob die Extension x installiert ist UND dass ein anderes Feld einen bestimmten vorgegebenen Wert aufweist.

Hier ein Ausschnitt, was bisher möglich ist:

Einfaches Beispiel

'street' => array(
  'displayCond' => 'EXT:test123:LOADED:FALSE',
  'label' => 'Straße',
  'config' => array(
    'type' => 'input',
    'size' => 30
  ),
),

Ab TYPO3 6.1

Die Core-Entwickler haben im Bereich dieser displayCond enorm aufgeräumt und die Möglichkeit mehrere Bedingungen anzugeben eingebaut. So wird nun innerhalb des Quellcodes abgefragt, ob es sich bei dem Wert für displayCond um einen String handelt, dann ist wie im oberen Beispiel nur eine Bedingung möglich, oder um ein Array, dann steht die geballte Ladung von mehreren und auch verschachtelten Bedingungen zur Verfügung. Hier nun ein paar Beispiele:

AND-Bedingung

'street' => array(
  'displayCond' => array(
    'AND' => array(
      'EXT:test123:LOADED:FALSE',
      'FIELD:title:REQ:TRUE',
    ),
  ),
  'label' => 'Straße',
  'config' => array(
    'type' => 'input',
    'size' => 30
  ),
),

Das Feld street wird nur dann angezeigt wenn die Extension test123 nicht geladen ist und das Feld title einen Wert aufweist.

OR-Bedingung

'street' => array(
  'displayCond' => array(
    'OR' => array(
      'EXT:test123:LOADED:TRUE',
      'FIELD:amount:<:10',
    ),
  ),
  'label' => 'Straße',
  'config' => array(
    'type' => 'input',
    'size' => 30
  ),
),

Das Feld street wird nur dann angezeigt wenn entweder die Extension test123 geladen ist ODER das Feld amount einen Wert kleiner 10 aufweist.

Verschachtelte Bedingungen

'street' => array(
  'displayCond' => array(
    'AND' => array(
      'EXT:test123:LOADED:TRUE',
      'OR' => array(
        'FIELD:amount:<:10',
        'FIELD:excludes:>:5',
      ),
    ),
  ),
  'label' => 'Straße',
  'config' => array(
    'type' => 'input',
    'size' => 30
  ),
),

Dieses Beispiel ist schon etwas komplexer und zeigt die Möglichkeit von verschachtelten Bedingungen. Das Feld street wird nur dann angezeigt, wenn die Extension test123 geladen ist UND entweder die Bedingung amount kleiner 10 ODER das Feld excludes größer 5 ist.

displayCond in FlexForms

<feld1>
  <TCEforms>
    <label>Feld 1</label>
    <config>
      <type>input</type>
      <size>30</size>
    </config>
  </TCEforms>
</feld1>

<feld2>
  <TCEforms>
    <label>Feld 2</label>
    <config>
      <type>input</type>
      <size>30</size>
    </config>
  </TCEforms>
</feld2>

<cond>
  <TCEforms>
    <label>Teste Bedingung</label>
    <displayCond>
      <AND>
        <numIndex index="0">FIELD:feld1:REQ:TRUE</numIndex>
        <numIndex index="1">FIELD:feld2:REQ:TRUE</numIndex>
        <OR>
          <numIndex index="0"><![CDATA[FIELD:feld1:<:12]]></numIndex>
          <numIndex index="1">FIELD:feld2:>:20</numIndex>
        </OR>
      </AND>
    </displayCond>
    <config>
      <type>input</type>
      <size>30</size>
    </config>
  </TCEforms>
</cond>

Bei forge.typo3.org kam bereits die Frage auf, wie man diese displayCond auch für FlexForms verwenden kann. In dem oberen Beispiel zeigen wir, wie man mit Hilfe von FlexForms verschachtelte Bedingungen realisieren kann.

Aktualisiert: 26.11.2016