<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://de.contaowiki.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://de.contaowiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Netzmacht</id>
		<title>Contao Community Documentation - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://de.contaowiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Netzmacht"/>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Spezial:Beitr%C3%A4ge/Netzmacht"/>
		<updated>2026-04-30T05:27:14Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:31:36Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Fix Pipe Problem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Contao Community Alliance&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung. Ab Version 1.11 ist die Klasse unter dem Namespace &amp;quot;ContaoCommunityAlliance\MetaPalettes\MetaPalettes&amp;quot; zu finden, der auch in Version 2.0 verwendet wird. Die alten Namespaces &amp;quot;MetaPalettes&amp;quot; und &amp;quot;Bit3\MetaPalettes\MetaPalettes&amp;quot; stehen in Version 2 nicht mehr zur Verfügung!&lt;br /&gt;
{{Hinweis|Um möglichst mit anderen Erweiterungen kompatibel zu sein, empfiehlt es sich sowohl Version 2 und 1 zu unterstützen. Mit der Versionsanforderung &amp;quot;^2.0 &amp;amp;#124;&amp;amp;#124; ^1.11&amp;quot; ist dies möglich. Selbstredend sollten dann nur Features verwendet werden, die in beiden Versionen funktionieren.}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:25:33Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Wiki-Syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Contao Community Alliance&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung. Ab Version 1.11 ist die Klasse unter dem Namespace &amp;quot;ContaoCommunityAlliance\MetaPalettes\MetaPalettes&amp;quot; zu finden, der auch in Version 2.0 verwendet wird. Die alten Namespaces &amp;quot;MetaPalettes&amp;quot; und &amp;quot;Bit3\MetaPalettes\MetaPalettes&amp;quot; stehen in Version 2 nicht mehr zur Verfügung!&lt;br /&gt;
{{Hinweis|Um möglichst mit anderen Erweiterungen kompatibel zu sein, empfiehlt es sich sowohl Version 2 und 1 zu unterstützen. Mit der Versionsanforderung &amp;quot;^2.0 || ^1.11&amp;quot; ist dies möglich. Selbstredend sollten dann nur Features verwendet werden, die in beiden Versionen funktionieren.}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:24:18Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Hinweis zur Versionskompatibilität&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Contao Community Alliance&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung. Ab Version 1.11 ist die Klasse unter dem Namespace &amp;quot;ContaoCommunityAlliance\MetaPalettes\MetaPalettes&amp;quot; zu finden, der auch in Version 2.0 verwendet wird. Die alten Namespaces &amp;quot;MetaPalettes&amp;quot; und &amp;quot;Bit3\MetaPalettes\MetaPalettes&amp;quot; stehen in Version 2 nicht mehr zur Verfügung!&lt;br /&gt;
&lt;br /&gt;
{Hinweis|Um möglichst mit anderen Erweiterungen kompatibel zu sein, empfiehlt es sich sowohl Version 2 und 1 zu unterstützen. Mit der Versionsanforderung &amp;quot;^2.0 || ^1.11&amp;quot; ist dies möglich. Selbstredend sollten dann nur Features verwendet werden, die in beiden Versionen funktionieren. }&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:21:27Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Informationen zu Namespace zwischen Version 1 und 2 hinzugefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Contao Community Alliance&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung. Ab Version 1.11 ist die Klasse unter dem Namespace &amp;quot;ContaoCommunityAlliance\MetaPalettes\MetaPalettes&amp;quot; zu finden, der auch in Version 2.0 verwendet wird. Die alten Namespaces &amp;quot;MetaPalettes&amp;quot; und &amp;quot;Bit3\MetaPalettes\MetaPalettes&amp;quot; stehen in Version 2 nicht mehr zur Verfügung!&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
\ContaoCommunityAlliance\MetaPalettes\MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:17:36Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Entwicklerinformationen aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Contao Community Alliance&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MetaPalettes</id>
		<title>MetaPalettes</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MetaPalettes"/>
				<updated>2018-01-08T12:16:48Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der Erweiterung MetaPalettes lassen sich die DCA Paletten in einem Array, statt einem String definieren. Dadurch wird es einfacher die Paletten später zu verändern.&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Tristan Lins&lt;br /&gt;
| ExtVersion=2.0.0&lt;br /&gt;
| Version=4.4+ (Version 1.11 ist sowohl mit Contao &amp;gt;= 3.5 und Contao 4.4 kompatibel)&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/metapalettes.de.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
MetaPalettes generiert aus einem Mehrdimensionalen-Array das im DCA festgelegt wird die Haupt- und Unterpaletten.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine MetaPalette aus der Erweiterung [[htaccess]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_htaccess&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_htaccess'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'htaccess_settings' =&amp;gt; array(':hide', 'htaccess_load_settings'),&lt;br /&gt;
      'htaccess_base'     =&amp;gt; array('htaccess_template'),&lt;br /&gt;
      'htaccess_etag'     =&amp;gt; array('htaccess_etag_disable'),&lt;br /&gt;
      'htaccess_mime'     =&amp;gt; array('htaccess_mime_types'),&lt;br /&gt;
      'htaccess_deflate'  =&amp;gt; array('htaccess_deflate_files'),&lt;br /&gt;
      'htaccess_headers'  =&amp;gt; array(),&lt;br /&gt;
      'htaccess_expires'  =&amp;gt; array('htaccess_expires_default', 'htaccess_expires'),&lt;br /&gt;
      'htaccess_custom'   =&amp;gt; array('htaccess_custom'),&lt;br /&gt;
      'htaccess_rewrite'  =&amp;gt; array('htaccess_rewrite_rules', 'htaccess_rewrite_prepend_www', 'htaccess_rewrite_remove_www', 'htaccess_rewrite_gzip', 'htaccess_rewrite_suffix'),&lt;br /&gt;
      'htaccess_h5bp'     =&amp;gt; array('htaccess_h5bp_ie_x_ua_compatible', 'htaccess_h5bp_cross_domain_ajax', 'htaccess_h5bp_concatenation_include', 'htaccess_h5bp_ie_flicker_fix')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anstelle einer &amp;lt;code&amp;gt;palette&amp;lt;/code&amp;gt; wird ein Feld &amp;lt;code&amp;gt;metapalette&amp;lt;/code&amp;gt; definiert. Die Schlüssel für das Array definieren wie gewohnt die Palette, jedoch werden die einzelnen Abschnitte mit den Feldern nicht als Zeichenkette, sondern als Array definiert. Der Schlüssel aus dem Meta Array beschreibt den Abschnitt, darunter kommt wiederum als Array die Felder.&lt;br /&gt;
&lt;br /&gt;
=Paletten definieren=&lt;br /&gt;
&lt;br /&gt;
Am besten zeigt sich der Zusammenhang an einem kleinen Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Array Key definieren jeweils die Legende für den Abschnitt, das '''_legend''' wird dabei automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
==:hide und andere Modifikatoren==&lt;br /&gt;
&lt;br /&gt;
Eine Palette kann versteckt angezeigt werden, wie oben chapter_two: &amp;lt;code&amp;gt;{chapter_two_legend:hide}&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dazu muss einfach das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; in das Felder-Array hinzugefügt werden.&lt;br /&gt;
MetaPalettes betrachtet alle mit ''':''' beginnenden Felder als Modifikatoren, diese werden aus der Feldliste extrahiert.&lt;br /&gt;
Zur Zeit wird aber nur das Schlüsselwort &amp;lt;code&amp;gt;:hide&amp;lt;/code&amp;gt; unterstützt.&lt;br /&gt;
&lt;br /&gt;
=Subpaletten definieren=&lt;br /&gt;
&lt;br /&gt;
Auch Subpaletten lassen sich definieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '__selector__' =&amp;gt; array('field_three'),&lt;br /&gt;
    ...&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
  'subpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'field_three' =&amp;gt; 'field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;__selector__&amp;lt;/code&amp;gt; Array wird automatisch gefüllt, es ist also nicht mehr notwendig dieses Array von Hand zu befüllen.&lt;br /&gt;
&lt;br /&gt;
=SubSelectpaletten definieren=&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Normalerweise verwendet Contao &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Felder, die als Selectoren markiert sind dazu eine Palette auszuwählen. Das ist allerdings nicht immer sinnvoll, weil man dann viele Paletten definieren muss, die oft stark redundant sind. Mit SubSelectpaletten ist es möglich, ähnlich den Subpaletten einer Checkbox ''Untermengen'' von Feldern den einzelnen Select Werten zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'default' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'example' =&amp;gt; array('subselect_field')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1' =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      'value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3' =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
  'fields' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'label'     =&amp;gt; array('SubSelect Example', 'Switch field and see how the subfields changing'),&lt;br /&gt;
      'inputType' =&amp;gt; 'select',&lt;br /&gt;
      'options'   =&amp;gt; array('value1', 'value2', 'value3'),&lt;br /&gt;
      'eval'      =&amp;gt; array('submitOnChange'=&amp;gt;true)&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Definition einfacher zu gestalten, kann man mit einem '''!''' (Ausrufezeichen) vor dem Wert auch Negativ-Paletten definieren. Diese werden immer dann angezeigt, wenn ein Wert nicht ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'metasubselectpalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    'subselect_field' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'value1'  =&amp;gt; array('value1_subfield1', 'value1_subfield2'),&lt;br /&gt;
      '!value2' =&amp;gt; array('value2_subfield1'),&lt;br /&gt;
      'value3'  =&amp;gt; array('value3_subfield1', 'value3_subfield2', 'value3_subfield3')&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Feld '''value2_subfield1''' wird immer dann angezeigt, wenn '''value1''' oder '''value3''' ausgewählt sind.&lt;br /&gt;
&lt;br /&gt;
=Paletten ergänzen=&lt;br /&gt;
&lt;br /&gt;
Ab Version 1.1 kann man vorhandene Paletten ganz einfach ergänzen. Dazu stehen 3 '''statische''' Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendTo(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette am Ende hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendTo('tl_settings', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendTo('tl_content', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' am Ende der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendBefore(..) &amp;amp; MetaPalettes::appendAfter(..)==&lt;br /&gt;
&lt;br /&gt;
Fügt eine Meta Palette vor oder nach einem Block ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendBefore('tl_settings', 'title', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''title_legend''' der '''default''' Palette von '''tl_settings''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 3. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendBefore('tl_content', 'published', 'text', array(&lt;br /&gt;
  'my_custom_settings' =&amp;gt; array(':hide', 'my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt den Block '''my_custom_settings''' vor den Block '''published_legend''' der '''text''' Palette von '''tl_content''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Die Methode &amp;lt;code&amp;gt;MetaPalettes::appendAfter(..)&amp;lt;/code&amp;gt; verhält sich äquivalent zu &amp;lt;code&amp;gt;MetaPalettes::appendBefore(..)&amp;lt;/code&amp;gt;, nur dass der Block nicht vor, sondern nach dem anderen Block eingefügt wird.&lt;br /&gt;
{{Hinweis|Sollte der Block vor oder nach dem eingefügt werden soll nicht gefunden werden, wird die Palette am Ende hinzugefügt (wie bei &amp;lt;code&amp;gt;MetaPalettes::appendTo(..)&amp;lt;/code&amp;gt;)}}&lt;br /&gt;
&lt;br /&gt;
==MetaPalettes::appendFields(..) &amp;amp; MetaPalettes::prependFields(..)==&lt;br /&gt;
(seit Version 1.2.0)&lt;br /&gt;
&lt;br /&gt;
Fügt eine Felder am Anfang oder Ende eines Blocks hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::appendFields('tl_settings', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''default''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' hinzu.&lt;br /&gt;
&lt;br /&gt;
Wenn eine andere Palette gewünscht ist, kann diese als 2. Parameter angegeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MetaPalettes::prependFields('tl_content', 'text', 'title', array(&lt;br /&gt;
  array('my_custom_field1', 'my_custom_field2', 'my_custom_field3')&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Fügt dem Block '''title_legend''' der '''text''' Palette die Felder '''my_custom_field1''', '''my_custom_field2''' und '''my_custom_field3''' am Anfang hinzu.&lt;br /&gt;
&lt;br /&gt;
=Paletten vererben=&lt;br /&gt;
(seit Version 1.3.0)&lt;br /&gt;
&lt;br /&gt;
Paletten lassen sich mit einfachen regeln vererben, die ererbten Regeln &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three' =&amp;gt; array('field_four', 'field_five')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Hinweis|Die ''_X_'' Notation mit den Unterstrichen ist '''nicht''' obligatorisch. Sie soll nur zeigen, dass diese Palette niemals direkt verwendet wird sondern nur als Basis für eine andere Palette dient!}}&lt;br /&gt;
&lt;br /&gt;
Daraus wird:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  'palettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_'  =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three',&lt;br /&gt;
    'default' =&amp;gt; '{chapter_one_legend},field_one,field_two;{chapter_two_legend:hide},field_three;{chapter_three_legend},field_four,field_five'&lt;br /&gt;
  )&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Palette zu erben wird also die einfache Notation '''''&amp;lt;palette&amp;gt;'' extends ''&amp;lt;base&amp;gt;''''' verwendet.&lt;br /&gt;
&lt;br /&gt;
==fein granulare Vererbung==&lt;br /&gt;
&lt;br /&gt;
===Gruppe überschreiben===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' enthält später das Feld ''field_four''.&lt;br /&gt;
&lt;br /&gt;
===Löschen von Gruppen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_two' =&amp;gt; array()&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_two'' wird gelöscht (leer gesetzt und damit nicht angezeigt).&lt;br /&gt;
&lt;br /&gt;
===Gruppe positionieren===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_three before chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; die Gruppe ''chapter_three'' wird vor der Gruppe ''chapter_two'' eingefügt. Mit dem ''after'' Schlüsselwort wird die Gruppe nach einer anderen Gruppe eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder hinzufügen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_two' =&amp;gt; array('field_four')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; der Gruppe ''chapter_two'' wird das Feld ''field_four'' am Ende hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
===Einzelne Felder entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_two' =&amp;gt; array('field_three')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; aus der Gruppe ''chapter_two'' wird das Feld ''field_three'' entfernt.&lt;br /&gt;
&lt;br /&gt;
===Felder an bestimmter Position hinzufügen und entfernen===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '+chapter_one' =&amp;gt; array('field_four before field_one', '-field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;amp;rarr; fügt der Gruppe ''chapter_two'' das Feld ''field_four'' vor dem Feld ''field_one'' hinzu und entfernt das Feld ''field_two''. Mit ''after'' kann ein Feld auch nach einem anderen hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Der Operator (+/-) im Palettennamen definiert die Operation für alle Felder ohne eigenem Operator. Die Operatoren können also auch umgekehrt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * DCA tl_example&lt;br /&gt;
 */&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_example'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
  // meta pallettes&lt;br /&gt;
  'metapalettes' =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    '_base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      'chapter_one' =&amp;gt; array('field_one', 'field_two'),&lt;br /&gt;
      'chapter_two' =&amp;gt; array(':hide', 'field_three')&lt;br /&gt;
    ),&lt;br /&gt;
    'default extends _base_' =&amp;gt; array&lt;br /&gt;
    (&lt;br /&gt;
      '-chapter_one' =&amp;gt; array('+field_four before field_one', 'field_two')&lt;br /&gt;
    )&lt;br /&gt;
  ),&lt;br /&gt;
...&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hat die gleiche Bedeutung wie im vorherigen Beispiel.&lt;br /&gt;
{{Hinweis|Wenn einzelne Felder hinzugefügt oder entfernt werden sollen, dann ist ein Operator (+/-) im Palettenname zwingend erforderlich, weil MetaPalettes sonst annimmt das die Palette überschrieben und nicht verändert werden soll!}}&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Contao-Bootstrap</id>
		<title>Contao-Bootstrap</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Contao-Bootstrap"/>
				<updated>2015-03-02T18:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus&lt;br /&gt;
| DevSite=http://www.netzmacht.de/&lt;br /&gt;
| ExtVersion=1.0&lt;br /&gt;
| Version=3.2 - 3.4&lt;br /&gt;
| VCSLink=https://github.com/contao-bootstrap&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Contao-Bootstrap=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung erleichtert die Verwendung von Bootstrap 3 innherhalb von Contao. Als modular aufgebaute Erweiterung bringt sie verschiedene Komponenten mit, die als [https://github.com/contao-bootstrap/bundle Bundle] oder als einzelne Pakete installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Komponenten==&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Komponenten bringen Inhaltselemente, Frontend-Module und weitere Hilfmittel wie einen Grid-Editor und angepasste Templates mit.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/contao-bootstrap/bundle Bundle]&lt;br /&gt;
* [https://github.com/contao-bootstrap/core Core]&lt;br /&gt;
* [https://github.com/contao-bootstrap/buttons Core]&lt;br /&gt;
* [https://github.com/contao-bootstrap/carousel Carousel]&lt;br /&gt;
* [https://github.com/contao-bootstrap/form Formular]&lt;br /&gt;
* [https://github.com/contao-bootstrap/grid-editor Grid-Editor]&lt;br /&gt;
* [https://github.com/contao-bootstrap/layout Layout]&lt;br /&gt;
* [https://github.com/contao-bootstrap/modal Modal]&lt;br /&gt;
* [https://github.com/contao-bootstrap/navigation Navigation]&lt;br /&gt;
* [https://github.com/contao-bootstrap/panel Panel]&lt;br /&gt;
* [https://github.com/contao-bootstrap/tab Tab]&lt;br /&gt;
* [https://github.com/contao-bootstrap/templates Templates]&lt;br /&gt;
&lt;br /&gt;
==Dokunmentation &amp;amp; Support==&lt;br /&gt;
&lt;br /&gt;
Contao-Bootstrap unterstützt nur die Installation über [[Composer/Client|Composer]]. Details und Dokumentation finden sich auf der Projektseite bzw. der Dokumentation auf readthedocs.org&lt;br /&gt;
&lt;br /&gt;
* [https://contao-bootstrap.netzmacht.de Projektseite]&lt;br /&gt;
* [https://contao-bootstrap.readthedocs.org Dokumentation]&lt;br /&gt;
* [https://community.contao.org/de/forumdisplay.php?169-contao-bootstrap Support-Forum]&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Contao-Bootstrap</id>
		<title>Contao-Bootstrap</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Contao-Bootstrap"/>
				<updated>2015-03-02T18:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus&lt;br /&gt;
| DevSite=http://www.netzmacht.de/&lt;br /&gt;
| ExtVersion=1.0&lt;br /&gt;
| Version=3.2-3.4&lt;br /&gt;
| VCSLink=https://github.com/contao-bootstrap&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Contao-Bootstrap=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung erleichtert die Verwendung von Bootstrap 3 innherhalb von Contao. Als modular aufgebaute Erweiterung bringt sie verschiedene Komponenten mit, die als [https://github.com/contao-bootstrap/bundle Bundle] oder als einzelne Pakete installiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Komponenten==&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Komponenten bringen Inhaltselemente, Frontend-Module und weitere Hilfmittel wie einen Grid-Editor und angepasste Templates mit.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/contao-bootstrap/bundle Bundle]&lt;br /&gt;
* [https://github.com/contao-bootstrap/core Core]&lt;br /&gt;
* [https://github.com/contao-bootstrap/buttons Core]&lt;br /&gt;
* [https://github.com/contao-bootstrap/carousel Carousel]&lt;br /&gt;
* [https://github.com/contao-bootstrap/form Formular]&lt;br /&gt;
* [https://github.com/contao-bootstrap/grid-editor Grid-Editor]&lt;br /&gt;
* [https://github.com/contao-bootstrap/layout Layout]&lt;br /&gt;
* [https://github.com/contao-bootstrap/modal Modal]&lt;br /&gt;
* [https://github.com/contao-bootstrap/navigation Navigation]&lt;br /&gt;
* [https://github.com/contao-bootstrap/panel Panel]&lt;br /&gt;
* [https://github.com/contao-bootstrap/tab Tab]&lt;br /&gt;
* [https://github.com/contao-bootstrap/templates Templates]&lt;br /&gt;
&lt;br /&gt;
==Dokunmentation &amp;amp; Support==&lt;br /&gt;
&lt;br /&gt;
Contao-Bootstrap unterstützt nur die Installation über [[Composer/Client|Composer]]. Details und Dokumentation finden sich auf der Projektseite bzw. der Dokumentation auf readthedocs.org&lt;br /&gt;
&lt;br /&gt;
* [https://contao-bootstrap.netzmacht.de Projektseite]&lt;br /&gt;
* [https://contao-bootstrap.readthedocs.org Dokumentation]&lt;br /&gt;
* [https://community.contao.org/de/forumdisplay.php?169-contao-bootstrap Support-Forum]&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Contao-Bootstrap</id>
		<title>Contao-Bootstrap</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Contao-Bootstrap"/>
				<updated>2015-03-02T17:58:14Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Die Seite wurde neu angelegt: „Category:Extensions {{ExtInfo | Dev=David Molineus | DevSite=http://www.netzmacht.de/ | ExtVersion=1.0 | Version=3.2-3.4 | VCSLink=https://github.com/conta…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus&lt;br /&gt;
| DevSite=http://www.netzmacht.de/&lt;br /&gt;
| ExtVersion=1.0&lt;br /&gt;
| Version=3.2-3.4&lt;br /&gt;
| VCSLink=https://github.com/contao-bootstrap&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Contao-Bootstrap =&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung erleichtert die Verwendung von Bootstrap 3 innherhalb von Contao. Als modular aufgebaute Erweiterung bringt sie verschiedene Komponenten mit, die als [https://github.com/contao-bootstrap/bundle Bundle] oder als einzelne Pakete installiert werden können.&lt;br /&gt;
&lt;br /&gt;
Contao-Bootstrap unterstützt nur die Installation über [[Composer/Client|Composer]]. Details und Dokumentation finden sich auf der Projektseite bzw. der Dokumentation auf readthedocs.org&lt;br /&gt;
&lt;br /&gt;
* [https://contao-bootstrap.netzmacht.de Projektseite]&lt;br /&gt;
* [https://contao-bootstrap.readthedocs.org Dokumentation]&lt;br /&gt;
* [https://community.contao.org/de/forumdisplay.php?169-contao-bootstrap Support-Forum]&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_General</id>
		<title>DC General</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_General"/>
				<updated>2013-04-16T12:08:43Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Rechtschreibfehler behoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
Der '''DC_General''' ist als allgemeingültiger, umfassender Treiber für das gesamte Contao-Backend konzipiert.&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| DevSite=http://www.men-at-work.de&lt;br /&gt;
| ExtVersion=0.9.0 beta1&lt;br /&gt;
| Version=2.11&lt;br /&gt;
| TrackerLink=https://github.com/MetaModels/DC_General/issues&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Was ist ein DC_General? ==&lt;br /&gt;
&lt;br /&gt;
DC_General entstand auf der Basis von dem DC_Table Treiber. Allerdings wurden einige Sachen verändert. Zum einem wurde der Treiber auf eine MVC (Model View Controller) Basis umgebaut. Dadurch entstehen folgende Vorteile:&lt;br /&gt;
* Der Datenprovider ist austauschbar, somit ist es möglich, die Daten von jedem beliebigen Ort zu laden bzw. zu speichern. Nachfolgend einige Aufzählungen für DatenProvider&lt;br /&gt;
** Datenbanken (MySql, PostgresSql etc.)&lt;br /&gt;
** XML Dateien&lt;br /&gt;
** Email (pop3, imap)&lt;br /&gt;
** API Schnittstellen&lt;br /&gt;
** RPC&lt;br /&gt;
** usw.&lt;br /&gt;
* Die Daten werden innerhalb des DC_General in Models und Collections gespeichert&lt;br /&gt;
* Die Views bzw. Controller sind austauschbar.&lt;br /&gt;
&lt;br /&gt;
Weiter Eigenschaften:&lt;br /&gt;
* Eigene Templates für alle Ansichten, kein Inline HTML mehr.&lt;br /&gt;
* In memory editing - Daten werden erst in die Datenbank gespeichert, wenn auch Speichern gedrückt wurde. &lt;br /&gt;
* Multilanguage Support - Elemente zum Wechseln der Sprache sind schon von Haus aus eingebaut.&lt;br /&gt;
&lt;br /&gt;
== Tabellenkonfiguration ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Schlüssel''' || '''Wert''' || '''Beschreibung'''&lt;br /&gt;
|-&lt;br /&gt;
| onload_callback || Callback-Funktion&amp;lt;br /&amp;gt;''array'' || Ruft eine Callback-Funktion beim Initialisieren des Data Containers auf und übergibt das DataContainer-Objekt als Argument.&lt;br /&gt;
|-&lt;br /&gt;
| onsubmit_callback || Callback-Funktion&amp;lt;br /&amp;gt;''array'' || Ruft eine Callback-Funktion nach der Aktualisierung eines Datensatzes auf und übergibt das DataContainer-Objekt als Argument.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Was ist DC_General nicht? ==&lt;br /&gt;
&lt;br /&gt;
DC_General ist zwar auf der Basis vom DC_Table entstanden, allerdings wurden viele Kernelemente umgebaut. Somit ist es nicht möglich das DC_Table und die anderen Contao Core Treiber einfach mit dem DC_General ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Vielmehr war der Gedanke das DC_General ein Treiber darstellt, der es erlaubt, mit mehr und weniger Aufwand, ein eigenes Backend ohne Contao-Core-Hacking zu erstellen.&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Button_Regeln</id>
		<title>Button Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Button_Regeln"/>
				<updated>2012-12-20T14:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
{{stub}}&lt;br /&gt;
=Button Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Button Regeln von [[dca-rules]] beschrieben. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generate=&lt;br /&gt;
&lt;br /&gt;
Dient zur Ausgabe des Buttons. Solange keine andere Ausgaberoutine verwendet wird muss sie mit angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''plain''' ''bool'', optional &amp;lt;br /&amp;gt;Verwendet nur das Href Attribut des Buttons als Link. Normalerweise wird dies mit addToHref() an den Link angefügt&lt;br /&gt;
* '''disable''' ''bool'', optional&amp;lt;br /&amp;gt;Gibt ein Icon als Bild und nicht als Link aus (nur bei normalen Operationen)&lt;br /&gt;
* '''noTable''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die Tabelle an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
* '''noId''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die ID an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// erstellt einen Button zu Google&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['href'] = 'http://www.google.com';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['button_rules'] = array('generate:plain');&lt;br /&gt;
&lt;br /&gt;
// erzeugt einen Link zur Kindertabelle ohne die aktuelle Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['href'] = 'table=ctable';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['button_rules'] = array('generate:noTable');&lt;br /&gt;
&lt;br /&gt;
// ezeugt Link zum Modul files ohne Tabelle und ID&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['file']['href'] = 'do=files';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['files']['button_rules'] = array('generate:noTable:noId');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel disableIcon=&lt;br /&gt;
&lt;br /&gt;
Mit dieser Regel ist es möglich einen Button mit einem deaktivierten Icon auszugeben. Dabei wird eine andere Regel angegeben, die bestimmt welcher Zustand angezeigt wird. Diese Regel wirkt sich nur auf normale Operationen aus.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''rule''' ''string'', &amp;lt;br /&amp;gt;Name der Regel, die den Zustand bestimmt&lt;br /&gt;
* '''icon''' ''string'', optional&amp;lt;br /&amp;gt;Das Icon, das den inaktiven Zustand anzeigen soll. Standardmäßig wird der Wert des normalen Icons genommen und mit einem Unterstrich verlängert (edit.gif -&amp;gt; edit_.gif)&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zeigt anstelle von Button wakeup nur ein deaktiviertes Icon an&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['operations']['wakeup']['button_rules'] = array('disableIcon:rule=notOnSunday:icon=snore.png', 'generate');&lt;br /&gt;
&lt;br /&gt;
// liefert falsch, damit der button deaktiviert wird&lt;br /&gt;
protected function buttonRuleNotOnSunday(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    return (date('N') != 7);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel referer=&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
=Regel isAdmin=&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
=Regel toggleIcon=&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Button_Regeln</id>
		<title>Button Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Button_Regeln"/>
				<updated>2012-12-20T14:23:44Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
{{stub}}&lt;br /&gt;
=Button Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Button Regeln von [[dca-rules]] beschrieben. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generate=&lt;br /&gt;
&lt;br /&gt;
Dient zur Ausgabe des Buttons. Solange keine andere Ausgaberoutine verwendet wird muss sie mit angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''plain''' ''bool'', optional &amp;lt;br /&amp;gt;Verwendet nur das Href Attribut des Buttons als Link. Normalerweise wird dies mit addToHref() an den Link angefügt&lt;br /&gt;
* '''disable''' ''bool'', optional&amp;lt;br /&amp;gt;Gibt ein Icon als Bild und nicht als Link aus (nur bei normalen Operationen)&lt;br /&gt;
* '''noTable''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die Tabelle an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
* '''noId''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die ID an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// erstellt einen Button zu Google&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['href'] = 'http://www.google.com';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['button_rules'] = array('generate:plain');&lt;br /&gt;
&lt;br /&gt;
// erzeugt einen Link zur Kindertabelle ohne die aktuelle Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['href'] = 'table=ctable';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['button_rules'] = array('generate:noTable');&lt;br /&gt;
&lt;br /&gt;
// ezeugt Link zum Modul files ohne Tabelle und ID&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['file']['href'] = 'do=files';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['files']['button_rules'] = array('generate:noTable:noId');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel disableIcon=&lt;br /&gt;
&lt;br /&gt;
Mit dieser Regel ist es möglich einen Button mit einem deaktivierten Icon auszugeben. Dabei wird eine andere Regel angegeben, die bestimmt welcher Zustand angezeigt wird. Diese Regel wirkt sich nur auf normale Operationen aus.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''rule''' ''string'', &amp;lt;br /&amp;gt;Name der Regel, die den Zustand bestimmt&lt;br /&gt;
* '''icon''' ''string'', optional&amp;lt;br /&amp;gt;Das Icon, das den inaktiven Zustand anzeigen soll. Standardmäßig wird der Wert des normalen Icons genommen und mit einem Unterstrich verlängert (edit.gif -&amp;gt; edit_.gif)&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zeigt anstelle von Button wakeup nur ein deaktiviertes Icon an&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['operations']['wakeup']['button_rules'] = array('disableIcon:rule=notOnSunday:icon=snore.png', 'generate');&lt;br /&gt;
&lt;br /&gt;
// liefert falsch, damit der button deaktiviert wird&lt;br /&gt;
protected function buttonRuleNotOnSunday(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    return (date('N') == 7);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel referer=&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
=Regel isAdmin=&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
=Regel toggleIcon=&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Button_Regeln</id>
		<title>Button Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Button_Regeln"/>
				<updated>2012-12-20T14:22:10Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Die Seite wurde neu angelegt: „Kategorie:Dcarules  =Button Regeln verwenden=  Auf dieser Seite werden die Button Regeln von dca-rules beschrieben. Bei dca-rules handelt es sich um eine …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Button Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Button Regeln von [[dca-rules]] beschrieben. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generate=&lt;br /&gt;
&lt;br /&gt;
Dient zur Ausgabe des Buttons. Solange keine andere Ausgaberoutine verwendet wird muss sie mit angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''plain''' ''bool'', optional &amp;lt;br /&amp;gt;Verwendet nur das Href Attribut des Buttons als Link. Normalerweise wird dies mit addToHref() an den Link angefügt&lt;br /&gt;
* '''disable''' ''bool'', optional&amp;lt;br /&amp;gt;Gibt ein Icon als Bild und nicht als Link aus (nur bei normalen Operationen)&lt;br /&gt;
* '''noTable''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die Tabelle an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
* '''noId''' ''bool'', optional&amp;lt;br /&amp;gt;Ist plain nicht gesetzt, wird standardmäßig die ID an den Link angehangen. Mit dieser Option wird es unterbunden&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// erstellt einen Button zu Google&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['href'] = 'http://www.google.com';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['google']['button_rules'] = array('generate:plain');&lt;br /&gt;
&lt;br /&gt;
// erzeugt einen Link zur Kindertabelle ohne die aktuelle Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['href'] = 'table=ctable';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['ctable']['button_rules'] = array('generate:noTable');&lt;br /&gt;
&lt;br /&gt;
// ezeugt Link zum Modul files ohne Tabelle und ID&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['file']['href'] = 'do=files';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['files']['button_rules'] = array('generate:noTable:noId');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel disableIcon=&lt;br /&gt;
&lt;br /&gt;
Mit dieser Regel ist es möglich einen Button mit einem deaktivierten Icon auszugeben. Dabei wird eine andere Regel angegeben, die bestimmt welcher Zustand angezeigt wird. Diese Regel wirkt sich nur auf normale Operationen aus.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''rule''' ''string'', &amp;lt;br /&amp;gt;Name der Regel, die den Zustand bestimmt&lt;br /&gt;
* '''icon''' ''string'', optional&amp;lt;br /&amp;gt;Das Icon, das den inaktiven Zustand anzeigen soll. Standardmäßig wird der Wert des normalen Icons genommen und mit einem Unterstrich verlängert (edit.gif -&amp;gt; edit_.gif)&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zeigt anstelle von Button wakeup nur ein deaktiviertes Icon an&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['operations']['wakeup']['button_rules'] = array('disableIcon:rule=notOnSunday:icon=snore.png', 'generate');&lt;br /&gt;
&lt;br /&gt;
// liefert falsch, damit der button deaktiviert wird&lt;br /&gt;
protected function buttonRuleNotOnSunday(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    return (date('N') == 7);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-20T10:17:15Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''key''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen, die über den GET Pataremter key definiert werden und von der Regel betroffen sind&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''array'', optional&amp;lt;br /&amp;gt;Namen der Get Parameter, mit in der Fehlermeldung ausgegeben werden sollen. Außerdem kann der Platzhalter %user für den Benutzernamen angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus show und edit sowie auf custom erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]:key=custom');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-20T10:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Mögliche Parameter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''key''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen, die über den GET Pataremter key definiert werden und von der Regel betroffen sind&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''array'', optional&amp;lt;br /&amp;gt;Namen der Get Parameter, mit in der Fehlermeldung ausgegeben werden sollen. Außerdem kann der Platzhalter %user für den Benutzernamen angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-20T10:15:14Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dcarules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc3&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der vordefinierten Regeln. Auf den jeweiligen Unterseiten ist die Verwendungsweise der Regeln näher erläutert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic&lt;br /&gt;
* hasAccess&lt;br /&gt;
* isAllowed&lt;br /&gt;
* isAdmin&lt;br /&gt;
* forbidden&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* disableIcon&lt;br /&gt;
* toggleIcon&lt;br /&gt;
* referer&lt;br /&gt;
* hasAccess&lt;br /&gt;
* isAllowed&lt;br /&gt;
* isAdmin&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Variablen per Referenz übergeben werden, können sie so von einer Regel zur nächsten weitergereicht werden. Möchte eine Regel beispielsweise das Icon ersetzen, so muss lediglich die icon Variable neu gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function buttonRuleChangeIcon(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    $strIcon = (isset($arrAttribute['icon']) ? $arrAttribute['icon'] : 'change.gif';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollen Attribute weitergereicht werden, so ist es erforderlich, diese als solche zu kennzeichnen. Damit wird verhindert, dass sich die einzelnen Regeln ungewollt gegenseitig beinflussen, aber dennoch Anweisungen an nächste Regeln gesetzt werden können. Dazu muss unter $arrAttributes['__set__'] das entsprechende Feld hinzugefügt werden. Sinnvoll ist dies beispielsweise, wenn eine Regel die Ausgabe beeinflussen möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function buttonRuleReferer(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    $strHref = $this-&amp;gt;getReferer(true);&lt;br /&gt;
&lt;br /&gt;
    // do not use addToUrl() instead use plain href&lt;br /&gt;
    $arrAttributes['plain'] = true;&lt;br /&gt;
    $arrAttributes['__set__'][] = 'plain';&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-20T09:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Eigene Regeln definieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dcarules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben. Über die Überschriften ist die Verwendung der entsprechenden Regeln dokumentiert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Variablen per Referenz übergeben werden, können sie so von einer Regel zur nächsten weitergereicht werden. Möchte eine Regel beispielsweise das Icon ersetzen, so muss lediglich die icon Variable neu gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function buttonRuleChangeIcon(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    $strIcon = (isset($arrAttribute['icon']) ? $arrAttribute['icon'] : 'change.gif';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollen Attribute weitergereicht werden, so ist es erforderlich, diese als solche zu kennzeichnen. Damit wird verhindert, dass sich die einzelnen Regeln ungewollt gegenseitig beinflussen, aber dennoch Anweisungen an nächste Regeln gesetzt werden können. Dazu muss unter $arrAttributes['__set__'] das entsprechende Feld hinzugefügt werden. Sinnvoll ist dies beispielsweise, wenn eine Regel die Ausgabe beeinflussen möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function buttonRuleReferer(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null)&lt;br /&gt;
{&lt;br /&gt;
    $strHref = $this-&amp;gt;getReferer(true);&lt;br /&gt;
&lt;br /&gt;
    // do not use addToUrl() instead use plain href&lt;br /&gt;
    $arrAttributes['plain'] = true;&lt;br /&gt;
    $arrAttributes['__set__'][] = 'plain';&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T16:46:38Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Mögliche Parameter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''array'', optional&amp;lt;br /&amp;gt;Namen der Get Parameter, mit in der Fehlermeldung ausgegeben werden sollen. Außerdem kann der Platzhalter %user für den Benutzernamen angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T16:46:11Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Mögliche Parameter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Namen der Get Parameter, mit in der Fehlermeldung ausgegeben werden sollen. Außerdem kann der Platzhalter %user für den Benutzernamen angegeben werden.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T14:42:14Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dcarules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben. Über die Überschriften ist die Verwendung der entsprechenden Regeln dokumentiert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T14:35:54Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T13:41:53Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Dcarules]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=['show']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T13:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Permission Regeln verwenden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=['show']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Permission_Regeln</id>
		<title>Permission Regeln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Permission_Regeln"/>
				<updated>2012-12-19T13:35:12Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Die Seite wurde neu angelegt: „Category:Dca-rules Kategorie:Extensions  =Permission Regeln verwenden=  Auf dieser Seite werden die Permission Regeln von dca-rules dokumentiert. Bei …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=['show']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T13:34:31Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Änderung 5678 von Netzmacht (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben. Über die Überschriften ist die Verwendung der entsprechenden Regeln dokumentiert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T13:34:03Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Änderung 5679 von Netzmacht (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus Alle löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=deleteAll');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie Alle Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[delete,deleteAll]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback trying to run action %s'&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=delete:error=&amp;amp;.errors.4:params=['delete']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T13:32:19Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Dabei sind die angegebenen Aktionen als Whitelist zu verstehen. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus show erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=show');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie show und edit erlauben&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show,edit]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback. Only action &amp;quot;%s&amp;quot; allowed';&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[show]:error=&amp;amp;.errors.4:params=['show']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff nur bei Bearbeiten überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:act=[edit,editAll]:alexf=status');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regel isAllowed=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::isAllowed zu überprüfen. Damit kann der Zugriff auf eine Seite überprüft werden. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''. Allerdings dient hierbei der Parameter als Begrenzung der Regel. Sie wird also nur dann ausgeführt, wenn die Aktion auch aufgerufen wurde.&lt;br /&gt;
&lt;br /&gt;
Diese Erweiterung erlaubt es neben der Überprüfung der aktuellen Datenreihe auch eine beliebige andere Tabelle als Grundlage der Überprüfung zu nehmen. Beispielsweise, wenn man auf der Ebene der tl_content die Rechte überprüfen will.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''operation''' ''int'', erforderlich&amp;lt;br /&amp;gt;prüft ob die Aktion auf die aktuelle Seite auszuführen ist&lt;br /&gt;
* '''ptable''' ''bool/string'', optional&amp;lt;br /&amp;gt;wahr, wenn die Elterntabelle als Grundlage genommen werden soll. alternativ einen Tabellenname&lt;br /&gt;
* '''pid''' ''string'', optional&amp;lt;br /&amp;gt;Die Spalte der aktuellen Zeile, die zum Laden der ptable als ID genommen soll, standard ist pid&lt;br /&gt;
* '''value''' ''int'', optional&amp;lt;br /&amp;gt;Alternativ einen Wert zur Überprüfung auf id=value, nur im Zusammenhang mit ptable&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff auf der Basis der aktuellen Datenzeile&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis der Elterntabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf der Basis einer beliebigen Elterntabelle mit einer beliebigen ID Spalte&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable=tl_subcontent:pid=pageid');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf eine bestimmte Zeile der ID 3&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAllowed:operation=5:ptable:value=3');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Regeln isAdmin und forbidden=&lt;br /&gt;
&lt;br /&gt;
Die Regel isAdmin dient dazu Zugriff auf den Administrator zu beschränken. Sie besitzt keine weiteren Parameter als die von der Regel generic. Die Regel forbidden verbietet den Zugriff auf die angebenen Aktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Bearbeiten nur für Admin, Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[edit,editAll]', 'forbidden:act=[delete,deleteAll]');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T13:01:42Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel generic=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient als Basis aller weiteren Permission-Regeln. Ihr Hauptaufgabe ist den Zugriff der Aktionen zu beschränken. Sie kann daher auch als eigenständige Regel verwendet werden. Außerdem besteht die Möglichkeit bei einer fehlgeschlagenen Überprüfung eine angepasste Fehlermeldung zu erstellen, die im Systemlog erscheint.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''act''' ''array/string'', optional&amp;lt;br /&amp;gt;definiert die angegebenen Aktionen des DataContainers, auf die die Regel angewendet wird&lt;br /&gt;
* '''error''' ''string'', optional&amp;lt;br /&amp;gt;die Fehlermeldung für die Logdatei&lt;br /&gt;
* '''params''' ''string'', optional&amp;lt;br /&amp;gt;Werte die in der Fehlermeldung ersetzt werden sollen&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Zugriff aus Alle löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=deleteAll');&lt;br /&gt;
&lt;br /&gt;
// Zugriff aus Löschen sowie Alle Löschen verbieten&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=[delete,deleteAll]');&lt;br /&gt;
&lt;br /&gt;
// benutzerdefinierte Fehlermeldung&lt;br /&gt;
$GLOBALS['TL_LANG']['tl_feedback']['errors'][4] = 'Hacking attempt on tl_feedback trying to run action %s'&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('generic:act=delete:error=&amp;amp;.errors.4:params=['delete']');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Permission Regeln verwenden=&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden die Permission Regeln von [[dca-rules]] dokumentiert. Bei dca-rules handelt es sich um eine Erweiterung, mit deren hilfe wiederkehrende Bedingungen für DataContainer innerhalb von DCA-Dateien angegeben werden können ohne extra Callbacks zu definieren. &lt;br /&gt;
&lt;br /&gt;
=Regel hasAccess=&lt;br /&gt;
&lt;br /&gt;
Diese Regel dient dazu Zugriffsbeschränkungen über die BackendUser::hasAccess zu überprüfen. Sie besitzt neben den hier aufgelisteten Parameter die der Regel ''generic''.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Parameter==&lt;br /&gt;
* '''module''' ''array/string'', optional&amp;lt;br /&amp;gt;Überprüft den Zugriff auf Module&lt;br /&gt;
* '''permission''' ''string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Zugriffsart für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''action''' ''array/string'', optional&amp;lt;br /&amp;gt;Definiert eine beliebige Aktion für BackendUser::hasAccess(action, permission)&lt;br /&gt;
* '''alexf''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform um Zugriff auf Feld zu überprüfen BackendUser::hasAccess(alexf, 'alexf')&lt;br /&gt;
* '''table''' ''string'', optional&amp;lt;br /&amp;gt;in Verbindung mit alexf oder action möglich die Tabelle zu bestimmen&lt;br /&gt;
* '''fop''' ''string'', optional&amp;lt;br /&amp;gt;Kurzform zur Überprüfung für BackendUser::hasAccess(fop, 'fop')&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Modulzugriff überprüfen&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=tl_article');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:module=[tl_article,tl_news]');&lt;br /&gt;
&lt;br /&gt;
// Zugriffsüberprüfung per permission und action&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=newp:action=create');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld der DCA-Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Feld einer anderen Tabelle&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:permission=alefx:action=status:table=tl_news');&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:alexf=status:table=tl:news');&lt;br /&gt;
&lt;br /&gt;
// Zugriff auf Dateioperation&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('hasAccess:fop=5');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T12:22:00Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dca-rules]]&lt;br /&gt;
[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben. Über die Überschriften ist die Verwendung der entsprechenden Regeln dokumentiert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T12:18:48Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Vorhandene Regeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben. Über die Überschriften ist die Verwendung der entsprechenden Regeln dokumentiert:&lt;br /&gt;
&lt;br /&gt;
'''[[Permission Regeln]]'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''[[Button Regeln]]'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''[[Label Regeln]]'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Font-awesome</id>
		<title>Font-awesome</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Font-awesome"/>
				<updated>2012-12-19T08:24:23Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Die Seite wurde neu angelegt: „Kategorie:Extensions {{ExtInfo | Dev=David Molineus http://www.netzmacht.de | ExtVersion=2.1.0-rc3 | Version=3.0.0 - 3.0.1 | ERLink=https://contao.org/de/exte…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=2.1.0-rc3&lt;br /&gt;
| Version=3.0.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/font-awesome.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/contao-font-awesome&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Die Erweiterung font-awesome bindet die Iconschriftart Font-Awesome[http://fortawesome.github.com/Font-Awesome/] in Contao ein. Nach der Installation befindet sich unter /assets/ der Ordner font-awesome. Die grundsätzlichen Vorteile von Iconschriftarten sind unter anderen hier[http://die-netzialisten.de/webdesign/klein-und-scharf-iconfonts/] beschrieben.&lt;br /&gt;
&lt;br /&gt;
Außerdem integriert diese Erweiterung die Icons in das Backend von Contao. Dazu muss dies entweder unter System -&amp;gt; Einstellungen -&amp;gt; Backendeinstellungen &amp;quot;Font Awesome systemweit verwenden&amp;quot; aktiviert werden. Ist dies nicht systemweit aktiviert, so kann dies unter den Benutzereinstellungen unter Backend-Theme individuell aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Die Ersetzung der Standardicons arbeitet sowohl im serverseitig als auch clientseitig mit Javascript. Aktuell werden lediglich die Navigationsicons serverseitig ersetzt. &lt;br /&gt;
&lt;br /&gt;
=Font-Awesome in eigenen Erweiterungen=&lt;br /&gt;
&lt;br /&gt;
==Icons registrieren==&lt;br /&gt;
Die Erweiterung bietet eine allgemeine Schnittstelle, sodass andere Erweiterungen ihre Icons registrieren können. Diese werden in der Konfigurationsvariable $GLOBALS['ICON_REPLACER'] gespeichert. Es werden fünf verschiedene Bereiche definiert, in denen Icons ersetzt werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['header'] = array(); // Icons im Header, wie das Refresh oder User Icon&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['buttons'] = array(); // Icons innerhalb von .tl_buttons (globale Operationen)&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['context'] = array(); // Icons die zeilenweise ausgegeben werden (innerhalb von .tl_*_right*)&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['pushided'] = array(); // Navigationsicons&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['navigation'] = array(); // Icons der Backendmodule in der linken Navigation&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da Contao Icons entweder als CSS-Klasse definiert oder als Bilddatei lädt, existieren zwei Möglichkeiten die zu ersetzenden Icons zu definieren. In einem Array wird dann das neue Icon (Font-Awesome verwendet die Syntax icon-name, wobei lediglich name angegeben werden muss) und die zu ersetzende CSS-Klasse bzw. der zu ersetzende Dateiname:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['context']['imageIcons'][] = array('pencil', 'edit.gif');&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['navigation']['styleIcons'][] = array('pencil', 'article');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An einem konkreten Beispiel der Cloud API Erweiterung sieht dies dann folgendermaßen in der config.php aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['navigation']['styleIcons'][] = array('cloud', 'cloudapi');&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['context']['imageIcons'][] = array('refresh', 'sync.gif');&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['buttons']['styleIcons'][] = array('retweet', 'header_mount');&lt;br /&gt;
$GLOBALS['ICON_REPLACER']['context']['imageIcons'][] = array('folder-open', 'mount.png');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Font-Awesome erzwingen==&lt;br /&gt;
&lt;br /&gt;
Neben der nutzerseitigen Konfiguration kann eine Erweiterung auch die Verwendung von Font-Awesome erzwingen. Dies ist beispielsweise bei einer Backend-Theme sinnvoll, das auf dem Iconset basiert. Dazu muss in der config.php der Erweiterung lediglich die entsprechende Variable konfiguriert werden. Die Benutzer- und Systemeinstellungen werden dann ignoriert. Die Benutzereinstellungen werden dann außerdem versteckt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_CONFIG']['forceFontAwesome'] = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-19T07:53:19Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Anpassungen für Version 1.0.0-rc2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc2&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung. Bei den Button Callbacks handelt es sich um magische Callbacks, die um den Buttonnamen ergänzt werden müssen. Dies ist erforderlich, damit der allgemeine Callback nur bei dem entsprechenden Button ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton*&lt;br /&gt;
* generateGlobalButton*&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
$rule = array('rule:error=&amp;amp;.errors.1'); // accessing language vars of current table&lt;br /&gt;
$rule = array('rule:error=&amp;amp;MSC.yes'); // accessing language var $GLOBALS['TL_LANG']['MSC']['yes']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonEdit'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonMember'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButtonDelete'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T15:34:03Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Button Regeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules'  		=&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' 		=&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' 		=&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Identifizierung von Buttons=&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T15:32:29Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Label Regeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 			=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 			=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 			=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Identifizierung von Buttons=&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T15:28:58Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Label Regeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
    'showColumns' 				=&amp;gt; true,&lt;br /&gt;
    'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
    'label_rules' 				=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
    'label_rules' 				=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Identifizierung von Buttons=&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T15:28:16Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: /* Permission Regeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array&lt;br /&gt;
(&lt;br /&gt;
    'isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit'&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
'showColumns' 				=&amp;gt; true,&lt;br /&gt;
'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
'label_rules' 				=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'label_rules' 				=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Identifizierung von Buttons=&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T15:26:45Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Formatierungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise ohne dca-rules=&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der tl_feedback==&lt;br /&gt;
&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==Benötigte Operationen==&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
==DataContainer Klasse==&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vorgehensweise mit dca-rules=&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
==Verwendung der vordefinierten Callbacks==&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwendung von Regeln==&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permission Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
==Button Regeln==&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Label Regeln==&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
'showColumns' 				=&amp;gt; true,&lt;br /&gt;
'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
'label_rules' 				=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'label_rules' 				=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
=Vorhandene Regeln=&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
* generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
* forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
=Eigene Regeln definieren=&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Identifizierung von Buttons=&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Dca-rules</id>
		<title>Dca-rules</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Dca-rules"/>
				<updated>2012-12-18T13:48:42Z</updated>
		
		<summary type="html">&lt;p&gt;Netzmacht: Die Seite wurde neu angelegt: „Kategorie:Extensions {{ExtInfo | Dev=David Molineus http://www.netzmacht.de | ExtVersion=1.0.0-rc1 | Version=2.11.0 - 3.0.1 | ERLink=https://contao.org/de/ext…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=David Molineus http://www.netzmacht.de&lt;br /&gt;
| ExtVersion=1.0.0-rc1&lt;br /&gt;
| Version=2.11.0 - 3.0.1&lt;br /&gt;
| ERLink=https://contao.org/de/extension-list/view/dca-rules.html&lt;br /&gt;
| TrackerLink=https://github.com/dmolineus/dca-rules/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung '''dca-rules''' ist als Hilfswerkzeug für die Entwicklung von DataContainern konzipiert. Es stellt allgemeine Callbacks für die Generierung von Operationen, Global Operationen, für die Rechteüberprüfung sowie der Ausgabe der Labeln in der Listenansicht. Diese können mit Regeln konfiguriert werden, sodass diese über die DCA-Dateien erstellt werden können ohne neue Callbacks zu definieren. Damit wird die Erzeugung redundanter Callbacks bei der Entwicklung von DataContainern reduziert.&lt;br /&gt;
&lt;br /&gt;
==Vorgehensweise ohne dca-rules==&lt;br /&gt;
&lt;br /&gt;
Um den Einsatz von den DCA-Regeln zu verdeutlichen, soll hier ein Beispiel erläutert werden. Es ist eine Erweiterung geplant, die es angemeldeten Benutzern im Frontend ermöglicht, Artikel mit Rückmeldungen zu versehen, z.B. dass sie eine Überarbeitung benötigen. Diese sollen dem Nutzer zugeordnet werden und von Redakteuren im Backend bearbeitet werden können. Backend-Redakteure ohne Bearbeitungsrechte sollen, die Feedbacks einsehen können. Hat der Benutzer Zugriff aus das Member Modul, soll außerdem ein Button zum entsprechenden Benutzer angezeigt werden. Gelöscht werden sollen die Feedbacks hingegen nur vom Administrator.&lt;br /&gt;
&lt;br /&gt;
===Aufbau der tl_feedback===&lt;br /&gt;
Man erstellt also einen DataContainer ''tl_feedback.php'', der die entsprechenden Felder ''id, pid, tstamp, created, memberid, userid, status, type, message'' beinhaltet. Pid ist hierbei die ID der Artikel, memberid die ID des Nutzers, der das Feedback abgegeben hat, userid die ID des bearbeiteten Benutzers. Außerdem wird in created die Timestamp gespeichert, als das Feedback abgegeben wurde, während tstamp bei jeder Änderung aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
===Benötigte Operationen===&lt;br /&gt;
&lt;br /&gt;
Nach den Anforderungen, müssen folgende Operationen erstellt werden:&lt;br /&gt;
&lt;br /&gt;
* Feedback bearbeiten (wenn Rechte vorhanden)&lt;br /&gt;
* Benutzer anzeigen (wenn Zugriff aus Modul member)&lt;br /&gt;
* Feedback löschen (nur Admin)&lt;br /&gt;
* Feedback anzeigen (alle Benutzer mit Zugriff auf Modul)&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet außerdem, dass die Zugriffsrechte überprüft werden müssen:&lt;br /&gt;
&lt;br /&gt;
* Bearbeiten nur Redakteure mit Lösch-Rechten&lt;br /&gt;
* Löschen Aktion nur Administrator&lt;br /&gt;
&lt;br /&gt;
===DataContainer Klasse===&lt;br /&gt;
&lt;br /&gt;
Nach dem gewöhnlichen Weg, würde man jetzt für die Buttons edit, member, delete Callbacks definieren, sowie einen onload_callback checkPermission, welches die Zugriffsrechte überprüft. Im unten dargestellten Code-Beispiel ist dies kurz verdeutlicht. Das Problem hierbei ist, dass man immer wieder die gleichen Callbacks definiert, sobald die Zugriffsrechte mal eingeschränkt sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Backend&lt;br /&gt;
{&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        parent::__construct();&lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User');&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    public function checkPermission()&lt;br /&gt;
    {&lt;br /&gt;
        $act = \Input::get('act');&lt;br /&gt;
        if(($act == 'delete' || $act == 'deletAll') &amp;amp;&amp;amp; !$this-&amp;gt;user-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            $this-&amp;gt;log('Hacking attempt');&lt;br /&gt;
            $this-&amp;gt;redirect('contao/main.php?act=error');&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // check user permission ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function generateDeleteButton($arrRow, $strHref, $strLabel, $strTitle, $strIcon, $strAttributes)&lt;br /&gt;
    {&lt;br /&gt;
        if(!$this-&amp;gt;User-&amp;gt;isAdmin)&lt;br /&gt;
        {&lt;br /&gt;
            return '';&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;....&amp;lt;/a&amp;gt;';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Vorgehensweise mit dca-rules==&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle setzt '''dca-rules''' an und bietet eine leicht zu konfigurierbare Schnittstelle, die solche Aufgaben löst. Außerdem ist sie leicht erweiterbar, sodass selbst bei komplexeren Beispielen immer noch auf die Regeln zurückgegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
===Verwendung der vordefinierten Callbacks===&lt;br /&gt;
Daher bietet die Erweiterung vordefinierte Callbacks, die anstelle der neu entwickelten aufgerufen werden. Zusätzlich werden diese noch mit Regeln definiert. Zur Zeit stehen folgende Callbacks zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* checkPermission&lt;br /&gt;
* generateButton&lt;br /&gt;
* generateGlobalButton&lt;br /&gt;
* generateLabel&lt;br /&gt;
&lt;br /&gt;
Damit diese verwendet werden können, muss die DataContainer Klasse die mitgelieferte Klasse Netzmacht\Utils\DataContainer erweitern. Diese basiert selbst auf der Backend Klasse. Außerdem benötigt sie den Namen der Tabelle. Dieser kann automatisch generiert werden, wenn die erstellte Klassen der Namenskonvention folgt. Aus der Tabelle tl_feedback wird der DataContainer Feedback. Entscheidet man sich für einen anderen Namen, muss lediglich die Variable $strTable definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Feedback extends Netzmacht\Utils\DataContainer&lt;br /&gt;
{&lt;br /&gt;
    // protected $strTable = 'tl_feedback';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nun der DataContainer verwendet, können die mitgelieferten Callbacks wie gewohnt in der DCA-Datei definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['onload_callback'][] = array('Feedback', 'checkPermission');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verwendung von Regeln===&lt;br /&gt;
&lt;br /&gt;
Neben den Callbacks werden nun die Regeln definiert. Diese werden in folgenden Variablen gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array(); // Regeln für checkPermission&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['button']['button_rules'] = array(); // Regeln für generateButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['gobal_operation']['button']['button_rules'] = array(); // Regeln für generateGlobalButton&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label']['label_rules'] = array(); // Regeln für generateLabel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anhand des oben genannten Beispiels definieren wir zwei Regeln zur Rechteüberprüfung. Zum einem verwenden wir hasAccess um den Zugriffsrechte für die Bearbeiten Funktion zu überprüfen, sowie isAdmin um die LöschFunktionen einzugrenzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin', 'hasAccess');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde allerdings dazu führen, dass die isAdmin Regel auf alle Aktionen angewandt wird. Sprich das Modul wäre nur für Administratoren nutzbar. Daher bietet dca-rules eine Möglichkeit Attribute zu definieren. Dabei wird folgende Syntax verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$rule = array('rule:attribute'); // setzt attribute=true&lt;br /&gt;
$rule = array('rule:attribute=2'); // setzt attribute=2. Boolean und Numeric werden entsprechend konvertiert&lt;br /&gt;
$rule = array('rule:attribute=$value'); // Zugriff auf eine in der Feedback definierte Variable $this-&amp;gt;value&lt;br /&gt;
$rule = array('rule:attribute=[one,two,three]'); // Ein Array array('one', 'two', 'three')&lt;br /&gt;
$rule = array('rule:attribute=[true,2,false,$value,2.3, 'hallo']'); // Werte des Array werden ebenso konvertiert: array(true, 2, false, $this-&amp;gt;value, 2.3, 'hallo');&lt;br /&gt;
$rule = array('rule:a=2:b=3:c:4');  // Mehrere Attribute können durch einen Doppelpunkt getrennt werden&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Permission Regeln===&lt;br /&gt;
&lt;br /&gt;
Die Permission Rules bieten alle die Möglichkeit über das act Attribute die Regel nur auf die definierten Aktionen anzuwenden. Dabei können diese als Arrray definiert werden. Demzufolge erweitert man das obige Beispiel. Außerdem soll überorpft werden, ob der Benutzer Zugriff aus das Modul hat. Daher übergeben wir den Modulnamen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch sind die Einschränkungen schon recht weit umgesetzt. Allerdings bekämen jetzt alle Redakteure Zugriff die Beabeiten-Funktion. Um diese einzuschränken, wendet man nochmals die Regel hasAccess die mit den Attributen permission und action beliebige BackendUser::hasAccess(action, permission)&lt;br /&gt;
Überprüfungen machen kann. Diese nuss natürlich vorher auch in der tl_user(_group) und über TL_PERMISSION definiert werden. Das soll an dieser Stelle nicht näher behandelt werden. Es wird davon ausgegangen, dass der Zugriff feedback mit dem Wert edit definiert ist. Die Regel hasAccess wird nun nur auf die Aktionen edit und editAll angewandt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['config']['permission_rules'] = array('isAdmin:act=[delete,deleteAll]', 'hasAccess:module=feedback', 'hasAccess:act=[edit,editAll]:permission=feedback:action=edit');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist alles! Damit hat man in einer Zeile in der DCA-Datei die Rechteüberprüfung vorgenommen.&lt;br /&gt;
&lt;br /&gt;
===Button Regeln===&lt;br /&gt;
&lt;br /&gt;
Das gleiche Prinzip wird bei den Button-Regeln angewandt. Diese folgen der gleichen Syntax und dem gleichen Prinzip wie die Permission Regeln. Allerdings benötigen sie noch die Regel generate, die zur Ausgabe dient. Diese muss mit angegeben werden, was den Vorteil hat, das man auch nach der Ausgabe noch Manipulationen vornehmen kann. Doch weiter an dem genannten Beispiel mit den Buttons edit,member,delete,show.&lt;br /&gt;
&lt;br /&gt;
Wie bei der Rechteübergabe, werden die Regeln nun definiert. Wichtigste Helfer, sind hierbei auch wieder die Regeln isAdmin sowie hasAccess. Die Konfigurationen de Buttons sind unten aufgeführt. den show Button muss man nicht definieren, da ja die Zugriffsbeschränkung mit dem Zugriff des Modules bereits erreicht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['edit'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:permission=feedback:action=edit', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['member'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('hasAccess:module=member', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operations']['delete'] = array&lt;br /&gt;
(&lt;br /&gt;
    // normale button konfiguration, zusätzlich&lt;br /&gt;
    'button_callback' =&amp;gt; array('Feedback', 'generateButton'),&lt;br /&gt;
    'button_rules' =&amp;gt; array('isAdmin', 'generate'),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Label Regeln===&lt;br /&gt;
&lt;br /&gt;
Die Label Regeln dienen dazu die Aufgabe der einzelnen Felder zu bestimmen. Sie dienen dazu einzelne Werte der Ausgabe anders zu formatieren. An dem oben genannten Beispiel gibt es die Spalte created. Die Übersicht soll im mode=1 erfolgen. Dabei wird der Timestamp nicht konvertiert. Dies erledigt Contao nur bei der tstamp Spalte automatisch. Außerdem soll ausgegeben werden, ob das Feedback bereits einem bearbeitenden Nutzer zugewiesen wurde. Hierbei soll lediglich ja/nein und nicht der Beutzername ausgegeben werden. Für beide Fälle bringt dca-rules wieder Regeln mit. Während alle anderen Regeln immer einen Abbruch der Überprüfung erreichen können, werden die LabelRegeln immer durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Diese werden folgendermaßen konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'fields' 				=&amp;gt; array('id', 'created', 'userid'),&lt;br /&gt;
'showColumns' 				=&amp;gt; true,&lt;br /&gt;
'label_callback' 			=&amp;gt; array('Feedback', 'generateLabel'),&lt;br /&gt;
'label_rules' 				=&amp;gt; array(),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also eine Listenansicht, die tabellarisch ausgegeben wird mit den Spalten id, created und userid. Statt der Userid werden wir eine ja/nein ausgabe machen. Auch hier wird der bereits vorhandene Callback aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Was man bei den Regeln für Label beachten muss, dass die Werte von Contao in einem Array $values nach dem Index der oben aufgelisteten Felder überliefert bekommt. in $vlaues[0] steht also die ID, nd $values[1] der Timestamp usw. Dazu gibt es auch ein Array mit den unbearbeiten Werten $row['id']. Manchmal konvertiert Contao den Wert bereits in eine Ausgabe. Beispielsweise bei einen Boolean Wert. So wird hier entweder ein - für eine leere Angabe, oder die Spaltenbezeichnung angegeben. Aus diesem Grund verwenden die Label Regeln sowohl ein Attribute index wie auch field, um zwischen den beiden Werten wählen zu können. Der Index ist immer erforderlich, da er die Position der Ausgabe entscheidet.&lt;br /&gt;
&lt;br /&gt;
Für den hier beschriebenen Fall stehen zwei Regeln zur Verfügung: parseDate und yesNo. Dabei wird der yesNo Regel sowohl der Index als auch das Feld übergeben. Das Feld wird dann anhand des Attributes condition überprüft. Da &amp;quot;ja&amp;quot; ausgeben werden soll, wenn der Wert &amp;gt; 0 ist, muss die Überprüfung noch auf false gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['label'] = array&lt;br /&gt;
(&lt;br /&gt;
'label_rules' 				=&amp;gt; array('parseDate:index=1', 'yesNo:index=2:field=created:condition=0:is=false'),			&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch könenn wir so gut wie alle Aktionen der Tabelle lösen '''ohne''' einen einzigen Callback geschrieben zu haben!&lt;br /&gt;
&lt;br /&gt;
==Vorhandene Regeln==&lt;br /&gt;
Nachdem anhand des Beispiels die Funktionsweise erläutert wurde, gibt es hier eine Übersicht der bereits vordefinierten Regeln. Dabei sind in der Klammer die möglichen Attribute angegeben:&lt;br /&gt;
&lt;br /&gt;
'''Permission Regeln'''&lt;br /&gt;
generic ''(act,error,params)'' Als Basis aller anderen Regeln, erlaubt Einschränkung auf params und individuelle Logmeldungen&lt;br /&gt;
hasAccess ''(isAdmin,module,permission,action,alexf,fop,act,error,params)'' Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
isAllowed ''(operation,table,closed,ptable,pid,where,value,act,error,params)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
isAdmin ''(act,error,params)'' überprüft ob Benuter Admin ist&lt;br /&gt;
forbidden ''(act,error,params)'' Zugriff generell verbieten&lt;br /&gt;
&lt;br /&gt;
'''Button Regeln'''&lt;br /&gt;
* toggleIcon ''(table, field, icon)'': erzeugt ein Icon zum Aktivieren/Deaktivieren&lt;br /&gt;
* referer: erzeugt ein Zurück Link&lt;br /&gt;
* hasAccess ''(isAdmin,module,permission,action,alexf,fop): Zur Überprüfung der Berechtigungen mittels BckendUser::hasAccess&lt;br /&gt;
* isAllowed ''(operation,table,closed,ptable,pid,where,value)'' Zur Überprüfung von Aktionen mittels BackendUser::isAllowed&lt;br /&gt;
* isAdmin: überprüft ob Benuter Admin ist&lt;br /&gt;
&lt;br /&gt;
'''Label Regeln'''&lt;br /&gt;
* parseDate ''(index,field,format='' einen Timestamp parsen&lt;br /&gt;
* yesNo ''(index,field,codition,is)'' ja/nein ausgeben&lt;br /&gt;
&lt;br /&gt;
==Eigene Regeln definieren==&lt;br /&gt;
&lt;br /&gt;
Neben den vordefinierten Regeln können auch eigene Regeln definiert werden. Diese werden als Methoden in dem DataContainer definiert und folgen folgenden Konventionen. Die Button Regeln werden sowohl für die globale als auch lokale Buttons verwendet. Bei globalen ist $arrRow=null. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected function permissionRule*($objDc, &amp;amp;$arrAttributes, &amp;amp;$strError);&lt;br /&gt;
protected function buttonRule*(&amp;amp;$strButton, &amp;amp;$strHref, &amp;amp;$strLabel, &amp;amp;$strTitle, &amp;amp;$strIcon, &amp;amp;$strAttributes, &amp;amp;$arrAttributes, $arrRow=null);&lt;br /&gt;
protected function labelRule*(&amp;amp;$arrRow, &amp;amp;$strLabel, &amp;amp;$objDc, &amp;amp;$arrValues, &amp;amp;$arrAttributes);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Identifizierung von Buttons==&lt;br /&gt;
&lt;br /&gt;
Zu guter Letzt noch ein Hinweis zur Identifizierung der Buttons. Damit die Regeln nur bei dem entsprechenden Button ausgeführt werden, muss dieser identifiziert werden. Normalerweise wird dafür das icon Attribute verwendet. Kommt es vor, dass mehrere Buttons (der jeweiligen Kategorie operations bzw. global_operations) das gleiche icon verwenden, muss zusätzlich eine id zugewiesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_feedback']['list']['operation']['edit']['id'] = 'edit';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Netzmacht</name></author>	</entry>

	</feed>