<?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=Deerwood</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=Deerwood"/>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Spezial:Beitr%C3%A4ge/Deerwood"/>
		<updated>2026-04-30T12:48:46Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-25T23:23:50Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Bugfix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6).&lt;br /&gt;
&lt;br /&gt;
Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt ''immer'' die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. Im Original Code war das ein ''entweder/oder'' ... das führte aber in manchen Fällen (siehe Bild) dazu, dass ein schlichtes &amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete. Der ursprüngliche Code ging offenbar davon aus, dass der Text innerhalb des div.toggler ''komplett'' von einem Tag (z.B. H1-7) umschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-25 18:02:21.339125000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = $$('div.toggler')[0] ?&lt;br /&gt;
+      'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id') : 'acc_x';&lt;br /&gt;
+  var maybeScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : &lt;br /&gt;
+                    Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,39 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +102,33 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''maybeScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1 und das entsprechende Element wird geöffnet. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Das Cookie wird im Event ''onComplete'' gelöscht bzw. neu gesetzt, abhängig davon, ob das Element geöffnet ist (Toggler hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird im Block ''if (maybeScroll == 'xxx')'' geprüft, ob das Element bereits sichtbar ist und, falls nicht, wird das Element und sein Toggler (die Bereichsüberschrift im BE) weich/animiert in Sicht gerollt. Die länglichen Berechnungen sorgen dafür, dass das Element nur gerade eben sichtbar wird (+20px oben/unten). War es ganz oder teilweise unterhalb des sichtbaren Bereichs, dann kommt es von unten herein, bis seine Unterkante sichtbar wird. War es ganz oder teilweise oberhalb, kommt es von oben, bis seine Oberkante sichtbar wird. Ist das Element höher als die Höhe des sichtbaren Bereichs, dann wird jedenfalls die Oberkante sichtbar.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-25T16:40:09Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zur Verbesserung */ Weiches Scrolling nur falls nötig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6).&lt;br /&gt;
&lt;br /&gt;
Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt ''immer'' die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. Im Original Code war das ein ''entweder/oder'' ... das führte aber in manchen Fällen (siehe Bild) dazu, dass ein schlichtes &amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete. Der ursprüngliche Code ging offenbar davon aus, dass der Text innerhalb des div.toggler ''komplett'' von einem Tag (z.B. H1-7) umschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-25 18:02:21.339125000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var maybeScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : &lt;br /&gt;
                     Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,39 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +102,33 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''maybeScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1 und das entsprechende Element wird geöffnet. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Das Cookie wird im Event ''onComplete'' gelöscht bzw. neu gesetzt, abhängig davon, ob das Element geöffnet ist (Toggler hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird im Block ''if (maybeScroll == 'xxx')'' geprüft, ob das Element bereits sichtbar ist und, falls nicht, wird das Element und sein Toggler (die Bereichsüberschrift im BE) weich/animiert in Sicht gerollt. Die länglichen Berechnungen sorgen dafür, dass das Element nur gerade eben sichtbar wird (+20px oben/unten). War es ganz oder teilweise unterhalb des sichtbaren Bereichs, dann kommt es von unten herein, bis seine Unterkante sichtbar wird. War es ganz oder teilweise oberhalb, kommt es von oben, bis seine Oberkante sichtbar wird. Ist das Element höher als die Höhe des sichtbaren Bereichs, dann wird jedenfalls die Oberkante sichtbar.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-25T16:11:47Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Weiches Scrolling nur falls nötig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6).&lt;br /&gt;
&lt;br /&gt;
Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt ''immer'' die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. Im Original Code war das ein ''entweder/oder'' ... das führte aber in manchen Fällen (siehe Bild) dazu, dass ein schlichtes &amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete. Der ursprüngliche Code ging offenbar davon aus, dass der Text innerhalb des div.toggler ''komplett'' von einem Tag (z.B. H1-7) umschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-25 18:02:21.339125000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var maybeScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : &lt;br /&gt;
                     Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,39 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +102,33 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      var toggler = this.togglers[this.previous];&lt;br /&gt;
+      if (element &amp;amp;&amp;amp; toggler &amp;amp;&amp;amp; toggler.hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        if (maybeScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          maybeScroll = false;&lt;br /&gt;
+&lt;br /&gt;
+          var wc = {top: window.getScroll().y, height: window.getSize().y};&lt;br /&gt;
+          var tc = toggler.getCoordinates();&lt;br /&gt;
+          var ec = element.getCoordinates();&lt;br /&gt;
+          var sc =&lt;br /&gt;
+          {&lt;br /&gt;
+            top:    Math.max(0, tc.top - 20),&lt;br /&gt;
+            height: Math.min(tc.height + ec.height + 40, wc.height)&lt;br /&gt;
+          };&lt;br /&gt;
+          if (sc.top &amp;lt; wc.top)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top);&lt;br /&gt;
+          }&lt;br /&gt;
+          else if (sc.top + sc.height &amp;gt; wc.top + wc.height)&lt;br /&gt;
+          {&lt;br /&gt;
+            new Fx.Scroll($(document.body)).start(0, sc.top + sc.height - wc.height);&lt;br /&gt;
+          }&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist (der Abzug von 30/50 Pixel vertikal zeigt ein wenig &amp;quot;drumherum oberhalb&amp;quot;, so dass klar wird, dass es noch andere Akkordeon Elemente gibt) ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T04:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zur Verbesserung */ Noch mehr Erklärungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6).&lt;br /&gt;
&lt;br /&gt;
Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt ''immer'' die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. Im Original Code war das ein ''entweder/oder'' ... das führte aber in manchen Fällen (siehe Bild) dazu, dass ein schlichtes &amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete. Der ursprüngliche Code ging offenbar davon aus, dass der Text innerhalb des div.toggler ''komplett'' von einem Tag (z.B. H1-7) umschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist (der Abzug von 30/50 Pixel vertikal zeigt ein wenig &amp;quot;drumherum oberhalb&amp;quot;, so dass klar wird, dass es noch andere Akkordeon Elemente gibt) ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T03:15:03Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zum Code */ Mehr Erklärungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6).&lt;br /&gt;
&lt;br /&gt;
Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt ''immer'' die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. Im Original Code war das ein ''entweder/oder'' ... das führte aber in manchen Fällen (siehe Bild) dazu, dass ein schlichtes &amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete. Der ursprüngliche Code ging offenbar davon aus, dass der Text innerhalb des div.toggler ''komplett'' von einem Tag (z.B. H1-7) umschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T03:03:33Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code/Template */ Wort ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das verschachtelte Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T02:33:15Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Verbesserung: Akkordeons geöffnet halten */ Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und ist die Eingabe des Besuchers nicht korrekt, dann wird die Seite erneut aufgerufen. Eigentlich, um die Fehler anzuzeigen; da aber das Akkordeon automatisch zuklappt bzw. irgend etwas anderes aufklappt, kann der Besucher die Meldungen nicht sehen und das andere Auf/Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;. Erst eine aktives wieder Aufklappen des Formulars durch den Besucher zeigt ihm, dass sein ''Absenden'' &amp;quot;voll in die Hose gegangen&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T02:15:47Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zur Verbesserung */ article alias explained&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase''). Diese ID ist (soweit ich sehen kann) immer gesetzt: es ist das Artikel-Alias.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T02:01:41Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zur Verbesserung */ Code Änderungen erklärt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird geprüft, ob/welche geöffnete Akkordeon-Ebene (durch Scroll) &amp;quot;in Sicht&amp;quot; sein soll. Der Scroll-Hinweis wird später aber nur beachtet, wenn die Seite neu angezeigt wid, nicht bei jedem Klick auf einen Toggler ('''var''' ''mustScroll''). Vorrang hat jedenfalls ein geöffnetes Akkordeon der inneren Ebene.&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event ''onComplete'' gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird gescrollt, so dass das geöffnete Akkordeon-Element sichtbar ist ... aber nur beim ersten Anzeigen der Seite. Dieser Teil des Codes ist noch ein wenig verbesserungswürdig:&lt;br /&gt;
&lt;br /&gt;
* es sollte geprüft werden, ob das Element nicht sowieso schon sichtbar ist; dann braucht es kein Scroll&lt;br /&gt;
* der Scroll könnte weich/animiert erfolgen&lt;br /&gt;
&lt;br /&gt;
Vorschläge bitte.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-24T01:25:59Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Rollen zum geöffneten Akkordeon ebenfalls implementiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-24 03:18:05.261000000 +0200&lt;br /&gt;
@@ -3,10 +3,12 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
+  var mustScroll = Cookie.read(cookieBase + '_inner') ? 'inner' : Cookie.read(cookieBase + '_outer') ? 'outer' : false;&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +39,22 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'outer')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 30);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,16 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        if (mustScroll == 'inner')&lt;br /&gt;
+        {&lt;br /&gt;
+          window.scrollTo(0, this.togglers[this.previous].getPosition().y - 50);&lt;br /&gt;
+          mustScroll = false;&lt;br /&gt;
+        }&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T23:23:05Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Security: niemals Userwerte ungeprüft verwenden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-23 21:17:55.073500000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? parseInt(Cookie.read(cookieBase + '_outer')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? parseInt(Cookie.read(cookieBase + '_inner')) : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +79,11 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T22:13:36Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-23 21:17:55.073500000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +79,11 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T22:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Verbesserung: Akkordeons geöffnet halten */ Weiteres Scenario&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt (auch mit Browser Back Button). Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Scenario, in dem das Zuklappen höchst unfreundlich zum Besucher ist: hat man ein Formular in einem Akkordeon-Element und validiert die Eingabe nicht, dann wird die Seite erneut aufgerufen, eigentlich um die Fehler anzuzeigen, da aber das Akkordeon zuklappt, kann der Besucher die Meldungen nicht sofort sehen und das Zuklappen signalisiert eher: &amp;quot;ist alles gut gegangen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-23 21:17:55.073500000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +79,11 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T19:25:09Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Code vereinfacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt. Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl        2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl 2011-06-23 21:17:55.073500000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +79,11 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+      if (this.previous &amp;gt;= 0 &amp;amp;&amp;amp; this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+      {&lt;br /&gt;
+        Cookie.write(cookieBase + '_inner', this.previous);&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T19:13:13Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Verbesserung: Akkordeons geöffnet halten */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt. Bei verschachtelten Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl	2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl	2011-06-23 18:27:35.651625000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,23 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T19:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zur Verbesserung */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt. Bei verschachteltetn Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl	2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl	2011-06-23 18:27:35.651625000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,23 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet ist (hat die CSS-Klasse ''active'') oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T19:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code der Verbesserung */ Kein Anhang möglich&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt. Bei verschachteltetn Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff (leider erlaubt dies Wiki weder *.zip noch *.txt als Anhang).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl	2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl	2011-06-23 18:27:35.651625000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,23 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet (hat die CSS-Klasse ''active'') ist oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-23T17:51:30Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zum Code */ Code zur Verbesserung des Verhaltens&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
==Verbesserung: Akkordeons geöffnet halten==&lt;br /&gt;
&lt;br /&gt;
Ein generelles Problem mit Akkordeons ist, dass sie immmer in der Voreinstellung (z.B. alles zugeklappt) erscheinen, wenn man die Seite kurz verläßt, etwa um einem Link im Akkordeontext zu folgen, und wieder zurückkehrt. Bei verschachteltetn Akkoredeons ist das besonders nervig, weil die Gefahr besteht, dass der Besucher nicht mehr genau weiss, wo er war, als er dem Link folgte. Dann muss er mühsam mit mehreren Klicks seinen Kontext wieder finden ... sehr frustrierend.&lt;br /&gt;
&lt;br /&gt;
Um die Akkordeons einer Seite wieder so zu öffnen, wie der Besucher sie verlassen hat, ist es nötig, den Zustand irgenwo zu speichern. Dazu bieten sich, wie oft, Cookies an.&lt;br /&gt;
&lt;br /&gt;
==Code der Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird hier nur das diff, das komplette Template ist im Anhang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=diff&amp;quot;&amp;gt;&lt;br /&gt;
--- moo_accordion_act_nested.tpl	2011-06-14 18:55:54.735250000 +0200&lt;br /&gt;
+++ moo_accordion_act_nested_cookie.tpl	2011-06-23 18:27:35.651625000 +0200&lt;br /&gt;
@@ -3,10 +3,11 @@&lt;br /&gt;
 window.addEvent('domready', function()&lt;br /&gt;
 {&lt;br /&gt;
   var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
+  var cookieBase = 'acc_' + $$('div.toggler')[0].getParent('div.mod_article').getProperty('id');&lt;br /&gt;
 &lt;br /&gt;
   this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display: Cookie.read(cookieBase + '_outer') ? Cookie.read(cookieBase + '_outer') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -37,12 +38,23 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_outer', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_outer');&lt;br /&gt;
+        }&lt;br /&gt;
+      }&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
 &lt;br /&gt;
   this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
   {&lt;br /&gt;
-    display: -1,&lt;br /&gt;
+    display : Cookie.read(cookieBase + '_inner') ? Cookie.read(cookieBase + '_inner') : -1,&lt;br /&gt;
     alwaysHide: true,&lt;br /&gt;
     opacity: false,&lt;br /&gt;
 &lt;br /&gt;
@@ -73,6 +85,17 @@&lt;br /&gt;
       {&lt;br /&gt;
         element.setStyle('height', heightValue);&lt;br /&gt;
       }&lt;br /&gt;
+      if (this.previous &amp;gt;= 0)&lt;br /&gt;
+      {&lt;br /&gt;
+        if (this.togglers[this.previous].hasClass('active'))&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.write(cookieBase + '_inner', this.previous);&lt;br /&gt;
+        }&lt;br /&gt;
+        else&lt;br /&gt;
+        {&lt;br /&gt;
+          Cookie.dispose(cookieBase + '_inner');&lt;br /&gt;
+        }&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;
==Erläuterungen zur Verbesserung==&lt;br /&gt;
&lt;br /&gt;
Da man auf verschiedenen Seiten des Auftritts Akkordeons haben kann, muss dafür gesorgt werden, dass jede dieser Seiten eigene Cookies erhält. Dazu wird ganz am Anfang die CSS ID des Artikel-DIVs herangezogen, in dem sich das Akkordeon befindet ('''var''' ''cookieBase'').&lt;br /&gt;
&lt;br /&gt;
Die Option ''display:'' wird ergänzt, so dass zunächst geprüft wird, ob ein Cookie für das betreffende Akkordeon gesetzt ist. Der Wert des Cookies ist eine Integerzahl 0 bis Anzahl Elemente - 1. Nur wenn das Cookie nicht gesetzt ist, wird die Vorgabe verwendet (hier -1 für zugeklappt). Das Cookie ist nicht gesetzt beim ersten Besuch oder wenn das Akkordeon aktiv zugeklappt wurde.&lt;br /&gt;
&lt;br /&gt;
Schließlich wird das Cookie im Event onComplete gesetzt oder gelöscht, abhängig davon, ob das Element geöffnet (hat die CSS-Klasse ''active'') ist oder nicht. Dabei werden für äußere und innere Akkordeon-Elemente unterschiedliche (Session-)Cookies gesetzt.&lt;br /&gt;
&lt;br /&gt;
Auch die Verbesserung funktioniert sowohl mit einfachen, wie auch mit verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 19:51, 23. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-16T15:17:58Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Code/Template */ Nur 1 moo_accordeon Template zur Zeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dies neue Template '''anstatt''' des Core &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-16T00:28:45Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zum Code */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der äußeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-16T00:27:42Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Erläuterungen zum Code */ Weitere Hinweise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden, besonders im Fall, dass beide Ebenen völlig zugeklappt und dann wieder geöffnet werden. Gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Der JS Code oben klappt initial beide Akkordeon-Ebenen zu und erlaubt auch aktives Zuklappen durch den Besucher. Will man das anders haben, dann kann man die beiden Optionen &amp;quot;display:&amp;quot; bzw. &amp;quot;alwaysHide:&amp;quot; verändern:&lt;br /&gt;
&lt;br /&gt;
* '''display''': Vorgabe ist ''-1'' =&amp;gt; alles zugeklappt. Ändern auf ''0'', ''1'', ''2'' ... um das 1., 2., 3. ... Akkordeon von vornherein aufzuklappen. Sinnvoll wäre etwa ''display: 0'' oben (toggler_outer/accordion_outer) um das erste Element der aüßeren Ebene zu öffnen und die zweite Ebene geschlossen zu halten.&lt;br /&gt;
* '''alwaysHide''': Vorgabe ist ''true'' =&amp;gt; erlaubt das aktive Zuklappen. Ändern auf ''false'', um das aktive Zuklappen zu verhindern.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac (diverse Browser, Liste folgt)&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-15T23:45:53Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Editieren im Backend */ Lesbarkeit weiter verbessert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte (siehe Forumsthread [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]). Auf diese Weise könnte man z.B. FAQ's  mit Akkordeons realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat unter bestimmten Umständen nicht funktioniert; auch war es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Der Diskussionsthread ist jedoch alt; MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Inhaltselement ''Akkordeon'' in Betriebsart ''Umschlag Anfang'' [### ACCORDION WRAPPER START ###] bzw. Betriebsart ''Umschlag Ende'' [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene (zwischen den äußeren Umschlag-Elementen) wird ganz normal mit weiteren Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Betriebsart ''Einzelnes Element'') oder ebenfalls ''Umschlag Anfang/Ende'', wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert, muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu [[Templates_bearbeiten|erzeugt]] man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. [http://websites-erstellen-mit-contao.de/ Peter Müllers Buch] Kapitel 10.2.6). Allerdings wurde eine Unschönheit beseitigt: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;. Gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in manchen Fällen (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden (gefunden in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog]).&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das in allen gängigen Browsern:&lt;br /&gt;
*Opera 11.11 (XP, W7)&lt;br /&gt;
*FireFox 3.6.17 (XP)&lt;br /&gt;
*FireFox 4.0.1 (W7)&lt;br /&gt;
*Safari 5.0.5 (XP, W7)&lt;br /&gt;
*Chrome 11.0.696.77 (XP, W7)&lt;br /&gt;
*IE 8.0.6001.18702 (XP)&lt;br /&gt;
*IE 9.0.8112.16421 (W7)&lt;br /&gt;
*Mac&lt;br /&gt;
Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-15T14:55:44Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Einleitung */ Hinweis auf Erweiterung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte. Siehe Forum [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]. Z.B. könnte man sowas wie eine elegante FAQ realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat für mich nicht funktioniert; auch fand ich es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Die Diskussion ist ja alt, MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
Hinweis: für eine FAQ als verschachteltes Akkordeon gibt es inzwischen die Erweiterung [[http://www.contao.org/erweiterungsliste/view/faqaccordion.10000009.de.html faqaccordion]].&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Umschlag Anfang [### ACCORDION WRAPPER START ###] / Umschlag Ende [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene wird ganz normal mit Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Einzelnes Element) oder ebenfalls Umschlag Anfang/Ende, wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu erzeugt man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. Peter Müllers Buch Kapitel 10.2.6). Allerdings habe ich mir die Freiheit genommen, eine Unschönheit zu beseitigen: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;, gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in meinem Fall (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden. Gefunden habe ich das in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Für mich funktioniert das in allen gängigen Browsern: Opera 11.11 (XP, W7); FireFox 3.6.17 (XP); FireFox 4.0.1 (W7); Safari 5.0.5 (XP, W7); Chrome 11.0.696.77 (XP, W7); IE 8.0.6001.18702 (XP); IE 9.0.8112.16421 (W7) und unter Mac ebenfalls. Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-14T21:22:23Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: hat „Verschachteltes Akkordeon“ nach „Akkordeons verschachteln“ verschoben:&amp;amp;#32;Umbenennung gemäß Diskussionsseite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte. Siehe Forum [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]. Z.B. könnte man sowas wie eine elegante FAQ realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat für mich nicht funktioniert; auch fand ich es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Die Diskussion ist ja alt, MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Umschlag Anfang [### ACCORDION WRAPPER START ###] / Umschlag Ende [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene wird ganz normal mit Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Einzelnes Element) oder ebenfalls Umschlag Anfang/Ende, wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu erzeugt man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. Peter Müllers Buch Kapitel 10.2.6). Allerdings habe ich mir die Freiheit genommen, eine Unschönheit zu beseitigen: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;, gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in meinem Fall (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden. Gefunden habe ich das in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Für mich funktioniert das in allen gängigen Browsern: Opera 11.11 (XP, W7); FireFox 3.6.17 (XP); FireFox 4.0.1 (W7); Safari 5.0.5 (XP, W7); Chrome 11.0.696.77 (XP, W7); IE 8.0.6001.18702 (XP); IE 9.0.8112.16421 (W7) und unter Mac ebenfalls. Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Diskussion:Akkordeons_verschachteln</id>
		<title>Diskussion:Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Diskussion:Akkordeons_verschachteln"/>
				<updated>2011-06-14T21:22:23Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: hat „Diskussion:Verschachteltes Akkordeon“ nach „Diskussion:Akkordeons verschachteln“ verschoben:&amp;amp;#32;Umbenennung gemäß Diskussionsseite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vorschlag: Umbennen in Akkordeon, verschachtelt und verschieben nach A.&lt;br /&gt;
Vorteil: alle Akkordeon Artikel wäre unter A gelistet (soweit ich gesehen habe)&lt;br /&gt;
----&lt;br /&gt;
Hi&lt;br /&gt;
&lt;br /&gt;
Hätte ich eh gemacht, wenn ich den Artikel durchsehe / aufbereite.&amp;lt;br /&amp;gt;&lt;br /&gt;
Titel hätte ich &amp;quot;Akkordions verschachteln&amp;quot; gewählt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PS: Heisst es eigentlich jetzt Akkordion oder Akkordeon?? (In den anderen Artikel wird es mit i geschrieben.)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Manitougs|Manitougs]] 13:08, 10. Jun. 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Benennt das gerne um (ich weiß gerade nicht, wie das geht). Im Deutschen heißt es &amp;quot;Akkordeon&amp;quot;, im Englischen &amp;quot;accordion&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 03:00, 11. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Diskussion:Akkordeons_verschachteln</id>
		<title>Diskussion:Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Diskussion:Akkordeons_verschachteln"/>
				<updated>2011-06-11T01:00:12Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vorschlag: Umbennen in Akkordeon, verschachtelt und verschieben nach A.&lt;br /&gt;
Vorteil: alle Akkordeon Artikel wäre unter A gelistet (soweit ich gesehen habe)&lt;br /&gt;
----&lt;br /&gt;
Hi&lt;br /&gt;
&lt;br /&gt;
Hätte ich eh gemacht, wenn ich den Artikel durchsehe / aufbereite.&amp;lt;br /&amp;gt;&lt;br /&gt;
Titel hätte ich &amp;quot;Akkordions verschachteln&amp;quot; gewählt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PS: Heisst es eigentlich jetzt Akkordion oder Akkordeon?? (In den anderen Artikel wird es mit i geschrieben.)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Manitougs|Manitougs]] 13:08, 10. Jun. 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Benennt das gerne um (ich weiß gerade nicht, wie das geht). Im Deutschen heißt es &amp;quot;Akkordeon&amp;quot;, im Englischen &amp;quot;accordion&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 03:00, 11. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-09T22:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Überschriften, weiteres Bild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
[[Datei:Nested_accordion.jpg|thumb|350px|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte. Siehe Forum [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]. Z.B. könnte man sowas wie eine elegante FAQ realisieren:&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat für mich nicht funktioniert; auch fand ich es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Die Diskussion ist ja alt, MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
==Editieren im Backend==&lt;br /&gt;
[[Datei:Nested_accordion_be.jpg|thumb|350px|Eingabe der Klassen 1. Ebene im BE]]&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Umschlag Anfang [### ACCORDION WRAPPER START ###] / Umschlag Ende [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene wird ganz normal mit Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Einzelnes Element) oder ebenfalls Umschlag Anfang/Ende, wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
==Code/Template==&lt;br /&gt;
Damit das Akkordeon richtig funktioniert muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu erzeugt man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erläuterungen zum Code==&lt;br /&gt;
&lt;br /&gt;
Die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. Peter Müllers Buch Kapitel 10.2.6). Allerdings habe ich mir die Freiheit genommen, eine Unschönheit zu beseitigen: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;, gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in meinem Fall (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden. Gefunden habe ich das in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Für mich funktioniert das in allen gängigen Browsern: Opera 11.11 (XP, W7); FireFox 3.6.17 (XP); FireFox 4.0.1 (W7); Safari 5.0.5 (XP, W7); Chrome 11.0.696.77 (XP, W7); IE 8.0.6001.18702 (XP); IE 9.0.8112.16421 (W7) und unter Mac ebenfalls. Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Datei:Nested_accordion_be.jpg</id>
		<title>Datei:Nested accordion be.jpg</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Datei:Nested_accordion_be.jpg"/>
				<updated>2011-06-09T22:46:34Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Screenshot selbst erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot selbst erstellt&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-09T16:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Artikel fertig gestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte. Siehe Forum [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]. Z.B. könnte man sowas wie eine elegante FAQ realisieren:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nested_accordion.jpg|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat für mich nicht funktioniert; auch fand ich es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Die Diskussion ist ja alt, MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Akkordeon-Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Umschlag Anfang [### ACCORDION WRAPPER START ###] / Umschlag Ende [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
* die zweite Akkordeon-Ebene wird ganz normal mit Akkordeons eingegeben, die die Standard-Klassen &amp;quot;toggler&amp;quot; und &amp;quot;accordion&amp;quot; bekommen (Klassenfelder leer lassen). Das dürfen normale Akkordeons sein (Einzelnes Element) oder ebenfalls Umschlag Anfang/Ende, wenn man dazwischen mehrere Inhaltselemente benötigt.&lt;br /&gt;
&lt;br /&gt;
Der Zusatzaufwand der speziellen Klassen ist also nur bei der ersten Ebene erforderlich, deren Anzahl ja typisch viel geringer ist als die Anzahl der Akkordeons in der zweiten Ebene. Der Hauptteil der Arbeit ist also ganz normal zu bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
Damit das Akkordeon richtig funktioniert muss man MooTools nun noch die beiden neuen Akkordeon-Klassen beibringen. Dazu erzeugt man im Template-Verzeichnis eine Datei &amp;quot;moo_accordion_nested.tpl&amp;quot; und wählt im Seitenlayout dieses Template statt &amp;quot;moo_accordion.tpl&amp;quot;. Der Code des neuen Templates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--//--&amp;gt;&amp;lt;![CDATA[//&amp;gt;&amp;lt;!--&lt;br /&gt;
window.addEvent('domready', function()&lt;br /&gt;
{&lt;br /&gt;
  var heightValue = window.ie6 ? '100%' : '';&lt;br /&gt;
&lt;br /&gt;
  this.accordion_outer = new Accordion($$('div.toggler_outer'), $$('div.accordion_outer'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  this.accordion = new Accordion($$('div.toggler'), $$('div.accordion'),&lt;br /&gt;
  {&lt;br /&gt;
    display: -1,&lt;br /&gt;
    alwaysHide: true,&lt;br /&gt;
    opacity: false,&lt;br /&gt;
&lt;br /&gt;
    onActive: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.addClass('active');&lt;br /&gt;
      toggler.removeClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().addClass('active');&lt;br /&gt;
        toggler.getFirst().removeClass('inactive');&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onBackground: function(toggler, element)&lt;br /&gt;
    {&lt;br /&gt;
      toggler.removeClass('active');&lt;br /&gt;
      toggler.addClass('inactive');&lt;br /&gt;
      if (toggler.getFirst()) {&lt;br /&gt;
        toggler.getFirst().removeClass('active');&lt;br /&gt;
        toggler.getFirst().addClass('inactive')&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    onComplete: function()&lt;br /&gt;
    {&lt;br /&gt;
      var element = $(this.elements[this.previous]);&lt;br /&gt;
      if (element &amp;amp;&amp;amp; element.offsetHeight &amp;gt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        element.setStyle('height', heightValue);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
//--&amp;gt;&amp;lt;!]]&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erläuterungen zum Code:&lt;br /&gt;
&lt;br /&gt;
die beiden Hauptabteilungen sind weitgehend identisch, nur die Resultate und Parameter für ''new Accordion(...)'' unterscheiden sich. Der Code für die Events ''onActive'' und ''onBackground'' ist im Prinzip bekannt von &amp;quot;moo_accordion_active.tpl&amp;quot; (von xchs im Forum bzw. Peter Müllers Buch Kapitel 10.2.6). Allerdings habe ich mir die Freiheit genommen, eine Unschönheit zu beseitigen: die ''div.toggler'' bekommen jetzt immer die Klassen &amp;quot;in/active&amp;quot;, gibt es ein HTML Element innerhalb des div, dann bekommt es diese Klassen ebenfalls/zusätzlich. In xchs Original Code war das ein entweder/oder ... das führte aber in meinem Fall (siehe Bild) dazu, dass das &amp;lt;nowiki&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/nowiki&amp;gt; die Klassen bekam und das +/- Symbol des div.toggler nicht umschaltete.&lt;br /&gt;
&lt;br /&gt;
Der Event ''onComplete'' ist nötig, damit die Akkordeons zuverlässig in korrekter Höhe angezeigt werden. Gefunden habe ich das in [http://blog.medianotions.de/en/articles/2008/mootools-nested-accordion diesem Blog].&lt;br /&gt;
&lt;br /&gt;
Für mich funktioniert das in allen gängigen Browsern: Opera 11.11 (XP, W7); FireFox 3.6.17 (XP); FireFox 4.0.1 (W7); Safari 5.0.5 (XP, W7); Chrome 11.0.696.77 (XP, W7); IE 8.0.6001.18702 (XP); IE 9.0.8112.16421 (W7) und unter Mac ebenfalls. Auch einfache, unverschachtelte Akkordions sind weiterhin möglich, der zusätzliche ''onComplete'' Event richtet keinen Schaden an. Man benötigt also kein spezielles Seitenlayout für die verschachtelten Akkordeons.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Deerwood|Deerwood]] 18:16, 9. Jun. 2011 (CEST)&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Akkordeons_verschachteln</id>
		<title>Akkordeons verschachteln</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Akkordeons_verschachteln"/>
				<updated>2011-06-09T02:25:14Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Artikel angefangen ... muss ins Bett&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wäre es schön, wenn man in einem äußeren Akkordeon als Inhaltselemente auch innere Akkordeons haben könnte. Siehe Forum [http://www.contao-community.de/showthread.php?1910 Akkordeons im Akkordeon]. Z.B. könnte man sowas wie eine elegante FAQ realisieren:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nested_accordion.jpg|Ein verschachteltes Akkorden]]&lt;br /&gt;
&lt;br /&gt;
Der im Forum gezeigte MooTools JavaScript Code hat für mich nicht funktioniert; auch fand ich es unbefriedigend, die inneren Akkordeon Elemente via HTML Inhalts-Elementen eingeben zu müssen. Die Diskussion ist ja alt, MooTools und TypoLight/Contao haben sich seither weiter entwickelt. Dennoch Dank an Max und Sebastian für ihre Hinweise/Tips.&lt;br /&gt;
&lt;br /&gt;
In Contao 2.9.5 sind verschachtelte Akkordeons (2 Ebenen) recht einfach, wenn man so vorgeht:&lt;br /&gt;
&lt;br /&gt;
* die erste Ebene wird (unbedingt/selbstverständlich) als &amp;quot;Klammer&amp;quot; angelegt (Umschlag Anfang [### ACCORDION WRAPPER START ###] / Umschlag Ende [### ACCORDION WRAPPER END ###])&lt;br /&gt;
* in beiden Klammer-Elementen werden die Akkordeon-Klassen &amp;quot;toggler_outer&amp;quot; und &amp;quot;accordion_outer&amp;quot; eingetragen&lt;br /&gt;
&lt;br /&gt;
WIP (Work In Progress) ... nachher mach ich weiter&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Datei:Nested_accordion.jpg</id>
		<title>Datei:Nested accordion.jpg</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Datei:Nested_accordion.jpg"/>
				<updated>2011-06-09T01:51:10Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Video_galerie</id>
		<title>Video galerie</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Video_galerie"/>
				<updated>2011-06-06T00:08:58Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: added to admin howtos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin HOWTOS]]&lt;br /&gt;
[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die normale Galerie des Contao-Core kann bereits für (externe) Videos genutzt werden. Dazu legt man für jedes anzuzeigende Video ein Screenshot-Bild ab (z.B. in &amp;quot;.../tl_files/videos/gallery_01/&amp;quot;) und erzeugt eine Datei &amp;quot;meta.txt&amp;quot; im gleichen Verzeichnis, die, neben alternativem Text und Bildunterschrift, auch die URL zum Video enthält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dateiname.endung = Alternativer Text | URL | Bildunterschrift&lt;br /&gt;
The_Police_-_Roxanne_live_1979.jpg = The Police - Roxanne, live 1979 | http://www.youtube.com/watch?v=-wpX6drarrs | &amp;lt;p&amp;gt;The (very young) Police at Pinkpop 1979&amp;lt;/p&amp;gt;&lt;br /&gt;
Brazil.jpg = Brazil - Terry Gilliam (1985) | http://video.google.com/videoplay?docid=5752843086186063624# | &amp;lt;p&amp;gt;Brazil - Google Video (2:16:49)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt man daraus eine Galerie und aktiviert im Backend die Checkbox &amp;quot;Großansicht/Neues Fenster&amp;quot;, dann wird bei einem Klick auf einen Galerie-Screenshot die angegebene URL in einem neuen Browser-Fenster geöffnet und das Video darin abgespielt.&lt;br /&gt;
&lt;br /&gt;
Schön und gut ... allerdings will man oft die Besucher auf der eigenen Seite halten und ihnen dennoch das Abspielen der Videos gestatten. Peter Müller hat in seinem excellenten Buch &amp;quot;Websites erstellen mit CONTAO&amp;quot; gezeigt, wie man Videos per Link im Text in einer Media/LightBox öffnen kann (Kapitel 10.3.1 &amp;quot;Inhaltselement Text: Ein Link in einer Mediabox&amp;quot;). Das sollte doch auch mit einer Gallerie funktionieren?&lt;br /&gt;
&lt;br /&gt;
Na klar! In weiser Voraussicht bietet Contao für das Inhalts-Element &amp;quot;Galerie&amp;quot; eine Auswahl des Templates im Backend an. Dort wird normalerweise nur &amp;quot;gallery_default&amp;quot; angeboten ... also muss man eine Kopie dieses Templates im Verzeichnis &amp;quot;.../templates&amp;quot; erzeugen, umbenennen und modifizieren.&lt;br /&gt;
&lt;br /&gt;
Die Änderungen betreffen nur wenige Zeilen, deshalb hier nur das diff:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
--- gallery_default.tpl	Fr 27. Mai 23:57:03 2011&lt;br /&gt;
+++ gallery_videos.tpl	Sa 28. Mai 02:51:13 2011&lt;br /&gt;
@@ -1,6 +1,7 @@&lt;br /&gt;
 &lt;br /&gt;
-&amp;lt;table cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; summary=&amp;quot;Image gallery&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;lt;table class=&amp;quot;videos&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; summary=&amp;quot;Video gallery&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tbody&amp;gt;&lt;br /&gt;
+&amp;lt;?php $lightbox_id = rand(10000, 99999); ?&amp;gt;&lt;br /&gt;
 &amp;lt;?php foreach ($this-&amp;gt;body as $class=&amp;gt;$row): ?&amp;gt;&lt;br /&gt;
 &amp;lt;tr class=&amp;quot;&amp;lt;?php echo $class; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php foreach ($row as $col): ?&amp;gt;&lt;br /&gt;
@@ -10,7 +11,7 @@&lt;br /&gt;
   &amp;lt;td class=&amp;quot;&amp;lt;?php echo $col-&amp;gt;class; ?&amp;gt;&amp;quot; style=&amp;quot;width:&amp;lt;?php echo $col-&amp;gt;colWidth; ?&amp;gt;;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;image_container&amp;quot;&amp;lt;?php if ($col-&amp;gt;margin): ?&amp;gt; style=&amp;quot;&amp;lt;?php echo $col-&amp;gt;margin; ?&amp;gt;&amp;quot;&amp;lt;?php endif; ?&amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;?php if ($col-&amp;gt;href): ?&amp;gt;&lt;br /&gt;
-    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $col-&amp;gt;href; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;attributes; ?&amp;gt; title=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
+    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $col-&amp;gt;href; ?&amp;gt;&amp;quot; rel=&amp;quot;lightbox[lbv&amp;lt;?php echo $lightbox_id; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;width; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;height; ?&amp;gt;]&amp;quot; title=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 &amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
     &amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz am Anfang bekommt die Tabelle eine zusätzliche Klasse (optional) und ein angepasstes Attribut &amp;quot;summary&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird eine Pseudo-ID erzeugt, die weiter unten im &amp;quot;rel&amp;quot; Attribut verwendet wird. Der Sinn: hat man mehrere Video-Galerien auf einer Seite, dann soll man in der Mediabox zwar von Video zu Video in EINER Galerie schalten, aber nicht zwischen Galerien wechseln können.&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Änderung gegen Ende:&lt;br /&gt;
* &amp;quot;'''&amp;lt;?php echo $col-&amp;gt;attributes; ?&amp;gt;'''&amp;quot; wird ersetzt durch&lt;br /&gt;
* &amp;quot;''' rel=&amp;quot;lightbox[lbv&amp;lt;?php echo $lightbox_id; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;width; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;height; ?&amp;gt;]&amp;quot;'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Damit wird der JavaScript Code von $col-&amp;gt;attributes (window.open...) weggeworfen und stattdessen die Mediabox angefordert. Diese erhält, neben der oben erwähnten ID, auch eine Angabe für Breite und Höhe ... das ist die Größe des Original-Bildes, das für die Galerie verwendet wurde (auch wenn das nie gezeigt wird), nicht die Größe des Thumbnails!&lt;br /&gt;
&lt;br /&gt;
Im Backend muß man nun nur noch das neue Template &amp;quot;gallery_videos&amp;quot; wählen und die Videos erscheinen in einer Mediabox auf der eigenen Seite; man kann von Video zu Video innerhalb einer Galerie schalten und die (streaming) Videos damit &amp;quot;anteasern&amp;quot;; die Größe der Mediabox passt sich an das Video an (indirekt über die Größe des Original-Bildes); schaltet man zwischen den Videos hin und her oder schließt die Mediabox, hält das Abspielen automatisch an. Je nach Video-Lieferant kann das Video auch Fullscreen abgespielt werden (YouTube: ja, Google: nein).&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Video_galerie</id>
		<title>Video galerie</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Video_galerie"/>
				<updated>2011-05-31T03:34:30Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Artikel neu angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die normale Galerie des Contao-Core kann bereits für (externe) Videos genutzt werden. Dazu legt man für jedes anzuzeigende Video ein Screenshot-Bild ab (z.B. in &amp;quot;.../tl_files/videos/gallery_01/&amp;quot;) und erzeugt eine Datei &amp;quot;meta.txt&amp;quot; im gleichen Verzeichnis, die, neben alternativem Text und Bildunterschrift, auch die URL zum Video enthält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dateiname.endung = Alternativer Text | URL | Bildunterschrift&lt;br /&gt;
The_Police_-_Roxanne_live_1979.jpg = The Police - Roxanne, live 1979 | http://www.youtube.com/watch?v=-wpX6drarrs | &amp;lt;p&amp;gt;The (very young) Police at Pinkpop 1979&amp;lt;/p&amp;gt;&lt;br /&gt;
Brazil.jpg = Brazil - Terry Gilliam (1985) | http://video.google.com/videoplay?docid=5752843086186063624# | &amp;lt;p&amp;gt;Brazil - Google Video (2:16:49)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt man daraus eine Galerie und aktiviert im Backend die Checkbox &amp;quot;Großansicht/Neues Fenster&amp;quot;, dann wird bei einem Klick auf einen Galerie-Screenshot die angegebene URL in einem neuen Browser-Fenster geöffnet und das Video darin abgespielt.&lt;br /&gt;
&lt;br /&gt;
Schön und gut ... allerdings will man oft die Besucher auf der eigenen Seite halten und ihnen dennoch das Abspielen der Videos gestatten. Peter Müller hat in seinem excellenten Buch &amp;quot;Websites erstellen mit CONTAO&amp;quot; gezeigt, wie man Videos per Link im Text in einer Media/LightBox öffnen kann (Kapitel 10.3.1 &amp;quot;Inhaltselement Text: Ein Link in einer Mediabox&amp;quot;). Das sollte doch auch mit einer Gallerie funktionieren?&lt;br /&gt;
&lt;br /&gt;
Na klar! In weiser Voraussicht bietet Contao für das Inhalts-Element &amp;quot;Galerie&amp;quot; eine Auswahl des Templates im Backend an. Dort wird normalerweise nur &amp;quot;gallery_default&amp;quot; angeboten ... also muss man eine Kopie dieses Templates im Verzeichnis &amp;quot;.../templates&amp;quot; erzeugen, umbenennen und modifizieren.&lt;br /&gt;
&lt;br /&gt;
Die Änderungen betreffen nur wenige Zeilen, deshalb hier nur das diff:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
--- gallery_default.tpl	Fr 27. Mai 23:57:03 2011&lt;br /&gt;
+++ gallery_videos.tpl	Sa 28. Mai 02:51:13 2011&lt;br /&gt;
@@ -1,6 +1,7 @@&lt;br /&gt;
 &lt;br /&gt;
-&amp;lt;table cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; summary=&amp;quot;Image gallery&amp;quot;&amp;gt;&lt;br /&gt;
+&amp;lt;table class=&amp;quot;videos&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; summary=&amp;quot;Video gallery&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tbody&amp;gt;&lt;br /&gt;
+&amp;lt;?php $lightbox_id = rand(10000, 99999); ?&amp;gt;&lt;br /&gt;
 &amp;lt;?php foreach ($this-&amp;gt;body as $class=&amp;gt;$row): ?&amp;gt;&lt;br /&gt;
 &amp;lt;tr class=&amp;quot;&amp;lt;?php echo $class; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php foreach ($row as $col): ?&amp;gt;&lt;br /&gt;
@@ -10,7 +11,7 @@&lt;br /&gt;
   &amp;lt;td class=&amp;quot;&amp;lt;?php echo $col-&amp;gt;class; ?&amp;gt;&amp;quot; style=&amp;quot;width:&amp;lt;?php echo $col-&amp;gt;colWidth; ?&amp;gt;;&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;image_container&amp;quot;&amp;lt;?php if ($col-&amp;gt;margin): ?&amp;gt; style=&amp;quot;&amp;lt;?php echo $col-&amp;gt;margin; ?&amp;gt;&amp;quot;&amp;lt;?php endif; ?&amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;?php if ($col-&amp;gt;href): ?&amp;gt;&lt;br /&gt;
-    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $col-&amp;gt;href; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;attributes; ?&amp;gt; title=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
+    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $col-&amp;gt;href; ?&amp;gt;&amp;quot; rel=&amp;quot;lightbox[lbv&amp;lt;?php echo $lightbox_id; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;width; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;height; ?&amp;gt;]&amp;quot; title=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 &amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
     &amp;lt;img src=&amp;quot;&amp;lt;?php echo $col-&amp;gt;src; ?&amp;gt;&amp;quot;&amp;lt;?php echo $col-&amp;gt;imgSize; ?&amp;gt; alt=&amp;quot;&amp;lt;?php echo $col-&amp;gt;alt; ?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz am Anfang bekommt die Tabelle eine zusätzliche Klasse (optional) und ein angepasstes Attribut &amp;quot;summary&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Direkt danach wird eine Pseudo-ID erzeugt, die weiter unten im &amp;quot;rel&amp;quot; Attribut verwendet wird. Der Sinn: hat man mehrere Video-Galerien auf einer Seite, dann soll man in der Mediabox zwar von Video zu Video in EINER Galerie schalten, aber nicht zwischen Galerien wechseln können.&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Änderung gegen Ende:&lt;br /&gt;
* &amp;quot;'''&amp;lt;?php echo $col-&amp;gt;attributes; ?&amp;gt;'''&amp;quot; wird ersetzt durch&lt;br /&gt;
* &amp;quot;''' rel=&amp;quot;lightbox[lbv&amp;lt;?php echo $lightbox_id; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;width; ?&amp;gt; &amp;lt;?php echo $col-&amp;gt;height; ?&amp;gt;]&amp;quot;'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Damit wird der JavaScript Code von $col-&amp;gt;attributes (window.open...) weggeworfen und stattdessen die Mediabox angefordert. Diese erhält, neben der oben erwähnten ID, auch eine Angabe für Breite und Höhe ... das ist die Größe des Original-Bildes, das für die Galerie verwendet wurde (auch wenn das nie gezeigt wird), nicht die Größe des Thumbnails!&lt;br /&gt;
&lt;br /&gt;
Im Backend muß man nun nur noch das neue Template &amp;quot;gallery_videos&amp;quot; wählen und die Videos erscheinen in einer Mediabox auf der eigenen Seite; man kann von Video zu Video innerhalb einer Galerie schalten und die (streaming) Videos damit &amp;quot;anteasern&amp;quot;; die Größe der Mediabox passt sich an das Video an (indirekt über die Größe des Original-Bildes); schaltet man zwischen den Videos hin und her oder schließt die Mediabox, hält das Abspielen automatisch an. Je nach Video-Lieferant kann das Video auch Fullscreen abgespielt werden (YouTube: ja, Google: nein).&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Code_Styleguide</id>
		<title>Code Styleguide</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Code_Styleguide"/>
				<updated>2011-05-31T01:25:41Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: /* Klammerung, Leerzeichen und Kommata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[en:Code_Styleguide]]&lt;br /&gt;
&lt;br /&gt;
Diese Seite soll einen allgemeinen Styleguide für Entwicklung von Contao Extensions darstellen.&lt;br /&gt;
Die hier gemachten Angaben entstanden aus der Auswertung des Contao Core, erheben jedoch keinen Anspruch auf Vollständigkeit, Richtigkeit oder gar Übereinstimmung mit den Ansichten des Core Entwicklers Leo Feyer.&lt;br /&gt;
&lt;br /&gt;
==Dateien==&lt;br /&gt;
===Dateinamen===&lt;br /&gt;
In jeder Datei sollte nur eine Klasse enthalten sein. Ausgenommen sind Hilfsklassen, die nur von der einen Klasse aufgerufen werden, oder deren Aufruf die Einbindung der einen Klasse voraussetzt (siehe [[Database]], [[Database_Statement]], [[Database_Result]]).&lt;br /&gt;
&lt;br /&gt;
Der Dateiname muss, damit die Klasse automatisch geladen werden kann (siehe [[Autoloader]]), gleich wie der Klassenname sein. Gross- und Kleinschreibung muss beachtet werden, da ansonsten auf Unix-/Linux-Servern die Klasse nicht gefunden werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Klassenname sollte, sofern er aus mehreren Worten besteht, in lower [[w:de:CamelCase|CamelCase]] geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
===Header===&lt;br /&gt;
In jeder Datei sollte oben ein Header enthalten sein, welcher mindestens folgende Informationen beinhalten sollte:&lt;br /&gt;
* die Lizenz, unter deren der Code veröffentlicht wurde.&lt;br /&gt;
* der Name des Autors.&lt;br /&gt;
* ggf. der Name der Firma, für welche der Code geschrieben wurde und deren geistiges Eigentum er somit ist.&lt;br /&gt;
* das Paket, zu welchem die Datei gehört.&lt;br /&gt;
&lt;br /&gt;
Diese Informationen sollten bestenfalls in [[w:de:PhpDocumentor|PhpDocumentor Notation]] vorgenommen werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Contao Open Source CMS&lt;br /&gt;
 * Copyright (C) 2005-2010 Leo Feyer&lt;br /&gt;
 *&lt;br /&gt;
 * Formerly known as TYPOlight Open Source CMS.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software: you can redistribute it and/or&lt;br /&gt;
 * modify it under the terms of the GNU Lesser General Public&lt;br /&gt;
 * License as published by the Free Software Foundation, either&lt;br /&gt;
 * version 3 of the License, or (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU&lt;br /&gt;
 * Lesser General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU Lesser General Public&lt;br /&gt;
 * License along with this program. If not, please visit the Free&lt;br /&gt;
 * Software Foundation website at &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
 *&lt;br /&gt;
 * PHP version 5&lt;br /&gt;
 * @copyright  Some Company 2010&lt;br /&gt;
 * @author     Max Mustercoder &amp;lt;mustercoder@somedomain.tld&amp;gt;&lt;br /&gt;
 * @package    RealCoolExtension&lt;br /&gt;
 * @license    http://opensource.org/licenses/lgpl-3.0.html&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
===Einrückung===&lt;br /&gt;
In Contao werden zum Einrücken von Code in der Regel normale TABulatoren (ASCII 0x09) und keine Leerzeichen verwendet. Eine Ausnahme hiervon stellen Einrückungen von zwei bis drei Leerzeichen dar, welche zur Formatierung von beispielsweise Datenbankabfragen eingefügt werden können.&lt;br /&gt;
&lt;br /&gt;
===Klammerung, Leerzeichen und Kommata===&lt;br /&gt;
In Contao werden geschweifte Klammern grundsätzlich auf eine neue Zeile geschoben. Nach öffnenden und vor schließenden runden Klammern wird kein Leerzeichen geschrieben. Nach einem Komma und Schleifen-Schlüsselwörtern (if, while, for, foreach) wird ein Leerzeichen eingefügt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function somefunction($param)&lt;br /&gt;
{&lt;br /&gt;
   if ($param=='foo')&lt;br /&gt;
   {&lt;br /&gt;
     // do something&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
     // do something else&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leerzeilen===&lt;br /&gt;
Leerzeilen sollten verwendet werden um logische Codeabschnitte zu gruppieren. Leerzeilen sollten von allen Tabulator- und Leerzeichen bereinigt werden und wirkliche Leerzeilen sein.&lt;br /&gt;
&lt;br /&gt;
Nach einer Funktion (bzw. Methode) sollten zwei Leerzeilen folgen, nach einer Objekt-Variable jeweils eine Leerzeile.&lt;br /&gt;
&lt;br /&gt;
===Zeilenlänge===&lt;br /&gt;
Abweichend vom Contao Core sollte Code in Erweiterungen so geschrieben werden, dass er möglichst auf einen Blick sichtbar und damit wartbar ist, insbesondere sollte es nur in Ausnahmefällen nötig sein, horizontal zu rollen. Eine feste Maximal-Breite kann nicht sinnvoll definiert werden, weil das von zu vielen Dingen abhängt (verfügbare Pixel des Bildschirms, Größe der Schrift, Komplexität und Einrücktiefe des Codes). Dennoch kann man sich an der Lesbarkeit/Erfassbarkeit für Menschen orientieren (60-80 Zeichen/Zeile). Das ist verflixt wenig ... und kann nicht immer eingehalten werden. Jedoch erlauben sowohl PHP wie auch SQL Zeilen-Umbrüche, so dass man z.B. ein komplexes IF Statement auf mehrere kurze Zeilen verteilen kann (Beispiel folgt). Bei SQL Statements (im Core durchgängig auf einer Zeile mit teilweise mehreren hundert Zeichen) kann man den Query-String ohne weiteres auf mehrere Zeilen verteilen und damit erheblich leichter verständlich machen ... die Klasse &amp;quot;Database&amp;quot; bzw. die DB räumt überflüssige Leerzeichen automatisch auf. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT   exp.*,&lt;br /&gt;
         cty.city AS city_name&lt;br /&gt;
FROM     tl_immo_expose AS exp,&lt;br /&gt;
         tl_immo_city AS cty&lt;br /&gt;
WHERE    exp.city = cty.id&lt;br /&gt;
AND      object_category = ?&lt;br /&gt;
AND      object_status = ?&lt;br /&gt;
AND      object_type LIKE ?&lt;br /&gt;
AND      cty.city LIKE ?&lt;br /&gt;
ORDER BY rooms ASC,&lt;br /&gt;
         stories ASC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist lesbar und halbwegs nachvollziehbar, jedoch das gleiche Statement auf einer einzigen Zeile (mit mehr als 220 Zeichen) ist nicht mehr wartbar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT exp.*,cty.city AS city_name FROM tl_immo_expose AS exp,tl_immo_city AS cty WHERE exp.city = cty.id AND object_category = ? AND object_status = ? AND object_type LIKE ? AND cty.city LIKE ? ORDER BY rooms ASC,stories ASC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Wartungsmodus_mit_exclusiven_Zugriff</id>
		<title>Wartungsmodus mit exclusiven Zugriff</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Wartungsmodus_mit_exclusiven_Zugriff"/>
				<updated>2011-05-31T00:59:10Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: PHP Code vor jede Ausgabe verschoben, weil ein Cookie Header sendet. Andere Kleinigkeiten.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Dev Snippets]]{{AppliesTo&lt;br /&gt;
|TLVersion=ab 2.7&lt;br /&gt;
|Version=ab 2.9&lt;br /&gt;
}}&lt;br /&gt;
Diese Anleitung beschreibt, wie man einen Wartungsmodus erstellt und trotzdem Kunden und sich selbst Zugang zur Seite bietet.&lt;br /&gt;
&lt;br /&gt;
Befindet sich eine Seite online im Aufbau und ein Kunde soll sich Anpassungen anschauen können, jedoch normale Besucher und Suchmaschinen nicht, ist es durch diese kleinen Anpassungen möglich, dies zu verwirklichen.&lt;br /&gt;
&lt;br /&gt;
Aufbau einer geheimen Landingpage, die ein Cookie im Browser setzt. Diese kann zusätzlich noch via htaccess-Passwort geschützt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php setcookie('gesicherteSeite', 'halloWelt'); ?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ihr &amp;lt;a href=&amp;quot;http://example.com&amp;quot;&amp;gt;Zugang zu example.com&amp;lt;/a&amp;gt; wurde gewaehrt!&lt;br /&gt;
Sobald Sie Ihren Browser schliessen, sind Sie wieder abgemeldet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann dem Kunden nun diesen Link mitteilen. Wird diese Seite dann aufgerufen, wird ein Cookie im Browser gesetzt.&lt;br /&gt;
&lt;br /&gt;
Jetzt nur noch in der fe_page.tpl eine kleine Anpassung in der ersten Zeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php if ($_COOKIE[&amp;quot;gesicherteSeite&amp;quot;] != &amp;quot;halloWelt&amp;quot;) $this-&amp;gt;redirect(&amp;quot;http://www.contao.org&amp;quot;); ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit wird beim Aufruf der eigentlichen Webseite (des Frontends) kontrolliert, ob das Cookie gesetzt ist. Wenn ja, geht alles normal weiter und der Kunde kann die normale Webseite sehen. Ist das Cookie nicht vorhanden, wird direkt auf eine andere Seite umgeleitet, in diesem Falle auf contao.org. Das Backend ist unbetroffen ... bis man die Frontend-Vorschau aufruft, dann muß ebenfalls das Cookie gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
{{msgInfo|Das Cookie sollte auch noch die Domain enthalten (damit das Cookie garantiert nur an die zu schützende Domain example.com geliefert wird) und es könnte auch eine Verfallszeit haben. Dies ist hier nicht gezeigt. Nachzulesen hier : http://php.net/manual/de/function.setcookie.php}}&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Code_Styleguide</id>
		<title>Code Styleguide</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Code_Styleguide"/>
				<updated>2010-06-21T04:13:40Z</updated>
		
		<summary type="html">&lt;p&gt;Deerwood: Abschnitt zur Zeilenlänge begonnen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite soll einen allgemeinen Styleguide für Entwicklung von Contao Extensions darstellen.&lt;br /&gt;
Die hier gemachten Angaben entstanden aus der Auswertung des Contao Core, erheben jedoch keinen Anspruch auf Vollständigkeit, Richtigkeit oder gar Übereinstimmung mit den Ansichten des Core Entwicklers Leo Feyer.&lt;br /&gt;
&lt;br /&gt;
==Dateien==&lt;br /&gt;
===Dateinamen===&lt;br /&gt;
In jeder Datei sollte nur eine Klasse enthalten sein. Ausgenommen sind Hilfsklassen, die nur von der einen Klasse aufgerufen werden, oder deren Aufruf die Einbindung der einen Klasse voraussetzt (siehe [[Database]], [[Database_Statement]], [[Database_Result]]).&lt;br /&gt;
&lt;br /&gt;
Der Dateiname muss, damit die Klasse automatisch geladen werden kann (siehe [[Autoloader]]), gleich wie der Klassenname sein. Gross- und Kleinschreibung muss beachtet werden, da ansonsten auf Unix-/Linux-Servern die Klasse nicht gefunden werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Klassenname sollte, sofern er aus mehreren Worten besteht, in lower [[w:de:CamelCase|CamelCase]] geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
===Header===&lt;br /&gt;
In jeder Datei sollte oben ein Header enthalten sein, welcher mindestens folgende Informationen beinhalten sollte:&lt;br /&gt;
* die Lizenz, unter deren der Code veröffentlicht wurde.&lt;br /&gt;
* der Name des Autors.&lt;br /&gt;
* ggf. der Name der Firma, für welche der Code geschrieben wurde und deren geistiges Eigentum er somit ist.&lt;br /&gt;
* das Paket, zu welchem die Datei gehört.&lt;br /&gt;
&lt;br /&gt;
Diese Informationen sollten bestenfalls in [[w:de:PhpDocumentor|PhpDocumentor Notation]] vorgenommen werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 /**&lt;br /&gt;
  * Contao Open Source CMS&lt;br /&gt;
  * Copyright (C) 2005-2010 Leo Feyer&lt;br /&gt;
  *&lt;br /&gt;
  * This program is free software: you can redistribute it and/or&lt;br /&gt;
  * modify it under the terms of the GNU Lesser General Public&lt;br /&gt;
  * License as published by the Free Software Foundation, either&lt;br /&gt;
  * version 3 of the License, or (at your option) any later version.&lt;br /&gt;
  *&lt;br /&gt;
  * This program is distributed in the hope that it will be useful,&lt;br /&gt;
  * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU&lt;br /&gt;
  * Lesser General Public License for more details.&lt;br /&gt;
  *&lt;br /&gt;
  * You should have received a copy of the GNU Lesser General Public&lt;br /&gt;
  * License along with this program. If not, please visit the Free&lt;br /&gt;
  * Software Foundation website at &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
  *&lt;br /&gt;
  * PHP version 5&lt;br /&gt;
  * @copyright  Some Company 2010&lt;br /&gt;
  * @author     Max Mustercoder &amp;lt;mustercoder@somedomain.tld&amp;gt;&lt;br /&gt;
  * @package    RealCoolExtension&lt;br /&gt;
  * @license    LGPL&lt;br /&gt;
  * @filesource&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
===Einrückung===&lt;br /&gt;
In Contao werden zum Einrücken von Code in der Regel normale TABulatoren (ASCII 0x09) und keine Leerzeichen verwendet. Eine Ausnahme hiervon stellen Einrückungen von zwei bis drei Leerzeichen dar, welche zur Formatierung von beispielsweise Datenbankabfragen eingefügt werden können.&lt;br /&gt;
&lt;br /&gt;
===Klammerung, Leerzeichen und Kommata===&lt;br /&gt;
In Contao werden geschweifte Klammern grundsätzlich auf eine neue Zeile geschoben. Nach öffnenden und schließenden runden Klammern wird kein Leerzeichen geschrieben. Nach einem Komma und Schleifen-Schlüsselwörtern (if, while, for, foreach) wird ein Leerzeichen eingefügt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 public function somefunction($param)&lt;br /&gt;
 {&lt;br /&gt;
 	if ($param=='foo')&lt;br /&gt;
 	{&lt;br /&gt;
 		// do something&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		// do something else&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Leerzeilen===&lt;br /&gt;
Leerzeilen sollten verwendet werden um logische Codeabschnitte zu gruppieren. Leerzeilen sollten von allen Tabulator- und Leerzeichen bereinigt werden und wirkliche Leerzeilen sein.&lt;br /&gt;
&lt;br /&gt;
Nach einer Funktion (bzw. Methode) sollte mindestens eine Leerzeile folgen.&lt;br /&gt;
&lt;br /&gt;
===Zeilenlänge===&lt;br /&gt;
Abweichend vom Contao Core sollte Code in Erweiterungen so geschrieben werden, dass er möglichst auf einen Blick sichtbar und damit wartbar ist, insbesondere sollte es nur in Ausnahmefällen nötig sein, horizontal zu rollen. Eine feste Maximal-Breite kann nicht sinnvoll definiert werden, weil das von zu vielen Dingen abhängt (verfügbare Pixel des Bildschirms, Größe der Schrift, Komplexität und Einrücktiefe des Codes). Dennoch kann man sich an der Lesbarkeit/Erfassbarkeit für Menschen orientieren (60-80 Zeichen/Zeile). Das ist verflixt wenig ... und kann nicht immer eingehalten werden. Jedoch erlauben sowohl PHP wie auch SQL Zeilen-Umbrüche, so dass man z.B. ein komplexes IF Statement auf mehrere kurze Zeilen verteilen kann (Beispiel folgt). Bei SQL Statements (im Core durchgängig auf einer Zeile mit teilweise mehreren hundert Zeichen) kann man den Query-String ohne weiteres auf mehrere Zeilen verteilen und damit erheblich leichter verständlich machen ... die Klasse &amp;quot;Database&amp;quot; bzw. die DB räumt überflüssige Leerzeichen automatisch auf. Beispiel:&lt;br /&gt;
&lt;br /&gt;
 SELECT   exp.*,&lt;br /&gt;
          cty.city AS city_name&lt;br /&gt;
 FROM     tl_immo_expose AS exp,&lt;br /&gt;
          tl_immo_city AS cty&lt;br /&gt;
 WHERE    exp.city = cty.id&lt;br /&gt;
 AND      object_category = ?&lt;br /&gt;
 AND      object_status = ?&lt;br /&gt;
 AND      object_type LIKE ?&lt;br /&gt;
 AND      cty.city LIKE ?&lt;br /&gt;
 ORDER BY rooms ASC,&lt;br /&gt;
          stories ASC&lt;br /&gt;
&lt;br /&gt;
ist lesbar und halbwegs nachvollziehbar, jedoch das gleiche Statement auf einer einzigen Zeile (mit mehr als 220 Zeichen) ist nicht mehr wartbar:&lt;br /&gt;
&lt;br /&gt;
 SELECT exp.*,cty.city AS city_name FROM tl_immo_expose AS exp,tl_immo_city AS cty WHERE exp.city = cty.id AND object_category = ? AND object_status = ? AND object_type LIKE ? AND cty.city LIKE ? ORDER BY rooms ASC,stories ASC&lt;/div&gt;</summary>
		<author><name>Deerwood</name></author>	</entry>

	</feed>