<?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=Toflar</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=Toflar"/>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Spezial:Beitr%C3%A4ge/Toflar"/>
		<updated>2026-05-01T18:53:21Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://de.contaowiki.org/Online-Shops</id>
		<title>Online-Shops</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Online-Shops"/>
				<updated>2015-01-29T11:17:29Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
Auf dieser Seite soll ein Überblick über die bestehenden Shop-Lösungen für Contao entstehen.&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|An alle Entwickler: Bitte haltet diese Seite aktuell. Vielen Dank.}}&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Der ch_shop nutzt die veraltete Erweiterung 'Katalog', die nicht mehr weiterentwickelt wird. Es ist keine gute Idee, damit einen neuen Shop aufzusetzen.}}&lt;br /&gt;
== Vergleichstabelle ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! Kompatibilität !! [http://www.contao-webshop.de/software.html Contao webShop&amp;lt;br /&amp;gt;Community Edition] !! [http://www.contao-webshop.de/software.html Contao webShop&amp;lt;br /&amp;gt;Business Edition] !! [http://isotopeecommerce.org Isotope&amp;lt;br /&amp;gt;eCommerce] !! [http://www.delahaye.de/chshop.html chShop] !! [http://www.contao-acquisto.de/de/ acquistoShop] !! [http://www.merconis.com/ MERCONIS]&lt;br /&gt;
|-&lt;br /&gt;
| Shop/Contao, Shop/Contao ||  ||  ||  || 0.1.1-beta1 / 2.9.3 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Kategorien !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| beliebige Haupt- und Unterkategorien || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Kategoriebeschreibung || Ja || Ja || Ja, über Artikel || via [[Catalog|Katalog-Extension]] || Ja || Ja/über Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Kategoriebild hinzufügen || Ja || Ja || Ja, über Artikel || via [[Catalog|Katalog-Extension]] || Ja || Ja/über Artikel&lt;br /&gt;
|-&lt;br /&gt;
| geschützte Kategorien für Kundengruppen || Ja || Ja || Ja, über Seitenstruktur || via [[Catalog|Katalog-Extension]] || Ja || Ja/über Seitenstruktur&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Artikelverwaltung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Artikel || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Produktgruppen || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel mit Varianten || Nein || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel mit beliebigen Produktkonfiguratoren || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel in mehreren Kategorien || Nein || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Downloadartikel || Nein || Ja || Ja || Bezahlte Inhalte || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Artikelfilter / Produktfinder || Nein || Ja || Ja (ab v1.3) || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel TagCloud || Ja || Ja || Nein || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Artikelempfehlungen (zu Artikel x paßt Artikel y) || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Nein || Ja (s. auch Cross Selling)&lt;br /&gt;
|-&lt;br /&gt;
| Artikel als NEU markieren || Ja || Ja || Ja (Anpassung) || via [[Catalog|Katalog-Extension]] || Ja (Artikelzustand) || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel als ANGEBOT markieren || Ja || Ja || Ja (Anpassung) || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelnummern || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelnummern je Variante || Nein || Ja || Ja || automatisch generiert || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelbild hinzufügen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelbild je Variante hinzufügen || Nein || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Zoomfunktion || Nein || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja (nur Bildgalerie) || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Video || ? || ? || via Erweiterung (v1.3) || Nein || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie je Variante || Nein || Ja || Ja || Nein || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Slider || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Reitern (Tabs) || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lagerbestand mit optionalem Abverkauf || Ja || Ja || Nein || Nein || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || ?&lt;br /&gt;
|-&lt;br /&gt;
| Lagerbestandsverwaltung || ? || ? || Nein || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Benachrichtigung bei Mindestlagerbestand || ? || ? ||Nein || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Einzelpreis || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Einzelpreis je Variante || Nein || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreis || Ja || Ja || via Preisregeln || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreis je Variante || Nein || Ja || via Preisregeln || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreise für Kundengruppen || Ja || Ja || ab v1.3 || via [[Catalog|Katalog-Extension]] || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreise für Kundengruppen je Variante || Nein || Ja || ab v1.3 || via [[Catalog|Katalog-Extension]] || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Staffelpreise || Ja || Ja || ab v1.3 || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Staffelpreise je Variante || ? || ? || ? || ? || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Grundpreis (je kg, Liter etc.) || Ja || Ja || Nein || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gewicht zur Berechnung der Versandkosten || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuersatz auswählbar || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;Twittern&amp;quot;-Button || Ja || Ja || via Contao || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;Like it&amp;quot;-Facebook-Button || Ja || Ja || via Contao || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Recently Viewed (Zuletzt angeschaut) || ? || ? || ? || ? || Ja || Ja (s. auch Cross Selling)&lt;br /&gt;
|-&lt;br /&gt;
| Vordefinierte Attribute || ? || ? || ? || ? || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Produkauktionen || ? || ? || ? || ? || Ja (benötigt Addon Acquisto Auktionen &amp;gt; 30,- EUR) || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Mehrsprachenfähigkeit !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Mehrsprachenfähig || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Gutscheine !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Allgemeiner Gutschein || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutschein für einen Kunden || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheincode vorgeben || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheincode autom. generieren lassen || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheinwert in Euro oder Prozent || Ja || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Nutzung zeitlich limitieren || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Nutzung in der Anzahl limitieren || Ja || Ja || Ja || Ja || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Steuern !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Steuerzonen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuerklassen || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuersätze || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Versand !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Versandzonen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Versandoptionen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Gewicht mit Staffelmöglichkeit || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Preis mit Staffelmöglichkeit || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Verpackungseinheiten mit Staffelmöglichkeit || Nein || Nein || Nein || Ja || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Versandtrackinginformationen in Nachrichten || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Zahlungsmodule !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Rechnung/Vorauskasse/Nachnahme  || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| PayPal Standard || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| PayPal Payflow Pro || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| sofortueberweisung.de || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Authorize.Net || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Postfinance || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cybersource || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Saferpay || Ja || Ja || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| PayOne || Nein || Nein || Ja || ? || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Paybyway || ? || ? || Ja || ? || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| ExperCash || Nein || Nein || Ja || ? || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| ePay || ? || ? || Ja || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Sparkasse/Postbank || ? || ? || Ja || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Datatrans || ? || ? || Ja || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Volksbanken Karten/ELV/Giropay || Nein || Nein || Nein || Ja || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| VIVEUM || ? || ? || Ja || ? || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| WorldPay || ? || ? || Ja || ? || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| Rabattmöglichkeit in Euro oder Prozent || Ja || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Cross Selling !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Direkte Produktauswahl || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Dynamisch nach Kriterien || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Zubehörteile || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Zuletzt gesehen || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Empfohlene Produkte || ? || ? || Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Merklisten durch Kunden || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Bestellungen &amp;amp; Kundenverwaltung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Gastzugang bzw. -bestellung || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| autom. Versand der Bestellbestätigung || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| inkl. AGB und Widerrufsbelehrung als PDF || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellhistorie im Frontend und Backend || Ja || Ja || Ja || Ja || im BE - FE in entwicklung || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellstatus veränderbar || Ja || Ja || Ja || Ja || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| erweiterte Kundendaten || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| beliebige Lieferadressen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen || Ja || Ja || Mitgliedergruppen || Mitgliedergruppen || Ja || Ja/Mitgliedergruppen&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Nachrichtenmanagement !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Beliebige Nachrichten erstellbar || ? || ? || Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbestätigung an Kunde || ? || ? ||  Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellinfo an Shopbetreiber || ? || ? ||  Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Versandbestätigung || ? || ? ||  Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestätiung für Zahlungseingang || ? || ? ||  Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Beliebige dynamisch generierte PDF-Anhänge || ? || ? ||  Ja || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Einstellungen !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Länderinformationen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Währungsangaben || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Preisanzeige (brutto/netto) || Ja || Ja ||  Ja (ab 2.3) || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Mindestbestellwert || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Rabattsystem || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| E-Mail Versandeinstellungen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Exportschnittstellen/Anbindung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Google Shopping || Ja || Ja || via Erweiterung || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| billiger.de || ? || ? || ? || ? || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Veha24 Warenwirtschaft || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cash Software (Warenwirtschaft &amp;amp; Kasse) || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Lizenzierung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Shop Template &amp;amp; Layout inkl. || Ja || Ja || Ja || ohne Layout || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per E-Mail || Nein || Ja || Ja (Isotope Circle) || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per Forum || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per Ticketsystem || Ja || Ja || Ja (Isotope Circle) || Nein || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lizenz || EULA || EULA || LGPL || LGPL || LGPL || EULA&lt;br /&gt;
|-&lt;br /&gt;
| '''Preis netto''' || '''0,00 €''' || '''499,00 €''' || '''0,00 €''' || '''0,00 €''' || '''0,00 €''' || '''189,00 € / 389,00 €'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Benutzer:Toflar</id>
		<title>Benutzer:Toflar</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Benutzer:Toflar"/>
				<updated>2015-01-29T11:07:56Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Online-Shops</id>
		<title>Online-Shops</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Online-Shops"/>
				<updated>2014-05-19T09:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Isotope war schon immer mehrsprachig...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
Auf dieser Seite soll ein Überblick über die bestehenden Shop-Lösungen für Contao entstehen.&lt;br /&gt;
&lt;br /&gt;
{{Anmerkung|An alle Entwickler: Bitte haltet diese Seite aktuell. Vielen Dank.}}&lt;br /&gt;
== Vergleichstabelle ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! Kompatibilität !! [http://www.contao-webshop.de/software.html Contao webShop&amp;lt;br /&amp;gt;Community Edition] !! [http://www.contao-webshop.de/software.html Contao webShop&amp;lt;br /&amp;gt;Business Edition] !! [http://isotopeecommerce.org Isotope&amp;lt;br /&amp;gt;eCommerce] !! [http://www.delahaye.de/chshop.html chShop] !! [http://www.contao-acquisto.de/de/ acquistoShop] !! [http://www.merconis.com/ MERCONIS]&lt;br /&gt;
|-&lt;br /&gt;
| Shop/Contao, Shop/Contao ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Kategorien !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| beliebige Haupt- und Unterkategorien || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Kategoriebeschreibung || Ja || Ja || Ja, über Artikel || via [[Catalog|Katalog-Extension]] || Ja || Ja, über Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Kategoriebild hinzufügen || Ja || Ja || Ja, über Artikel || via [[Catalog|Katalog-Extension]] || Ja || Ja, über Artikel&lt;br /&gt;
|-&lt;br /&gt;
| geschützte Kategorien für Kundengruppen || Ja || Ja || Ja, über Seitenstruktur || via [[Catalog|Katalog-Extension]] || Ja || Ja, über Seitenstruktur&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Artikelverwaltung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Artikel || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Produktgruppen || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel mit Varianten || Nein || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel mit beliebigen Produktkonfiguratoren || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel in mehreren Kategorien || Nein || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Downloadartikel || Nein || Ja || Ja || Bezahlte Inhalte || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Artikelfilter / Produktfinder || Nein || Ja || Ja (ab v1.3) || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel TagCloud || Ja || Ja || Nein || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Artikelempfehlungen (zu Artikel x paßt Artikel y) || Ja || Ja || Ja || via [[Catalog|Katalog-Extension]] || Nein || Ja (s. auch Cross Selling)&lt;br /&gt;
|-&lt;br /&gt;
| Artikel als NEU markieren || Ja || Ja || Ja (Anpassung) || via [[Catalog|Katalog-Extension]] || Ja (Artikelzustand) || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikel als ANGEBOT markieren || Ja || Ja || Ja (Anpassung) || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelnummern || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelnummern je Variante || Nein || Ja || Ja || automatisch generiert || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelbild hinzufügen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Artikelbild je Variante hinzufügen || Nein || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Zoomfunktion || Nein || Ja || Ja || via [[Catalog|Katalog-Extension]] || Ja (nur Bildgalerie) || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Video || ? || ? || via Erweiterung (v1.3) || Nein || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie je Variante || Nein || Ja || Ja || Nein || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Slider || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bildergalerie mit Reitern (Tabs) || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lagerbestand mit optionalem Abverkauf || Ja || Ja || Nein || Nein || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || ?&lt;br /&gt;
|-&lt;br /&gt;
| Lagerbestandsverwaltung || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Benachrichtigung bei Mindestlagerbestand || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Einzelpreis || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Einzelpreis je Variante || Nein || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreis || Ja || Ja || via Preisregeln || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreis je Variante || Nein || Ja || via Preisregeln || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreise für Kundengruppen || Ja || Ja || ab v1.3 || via [[Catalog|Katalog-Extension]] || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Sonderpreise für Kundengruppen je Variante || Nein || Ja || ab v1.3 || via [[Catalog|Katalog-Extension]] || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Staffelpreise || Ja || Ja || ab v1.3 || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Staffelpreise je Variante || ? || ? || ? || ? || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Grundpreis (je kg, Liter etc.) || Ja || Ja || Nein || via [[Catalog|Katalog-Extension]] || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gewicht zur Berechnung der Versandkosten || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuersatz auswählbar || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;Twittern&amp;quot;-Button || Ja || Ja || via Contao || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;Like it&amp;quot;-Facebook-Button || Ja || Ja || via Contao || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Recently Viewed (Zuletzt angeschaut) || ? || ? || ? || ? || Ja || Ja (s. auch Cross Selling)&lt;br /&gt;
|-&lt;br /&gt;
| Vordefinierte Attribute || ? || ? || ? || ? || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Produkauktionen || ? || ? || ? || ? || Ja (benötigt Addon Acquisto Auktionen &amp;gt; 30,- EUR) || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Mehrsprachenfähigkeit !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Mehrsprachenfähig || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Gutscheine !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Allgemeiner Gutschein || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutschein für einen Kunden || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheincode vorgeben || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheincode autom. generieren lassen || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Gutscheinwert in Euro oder Prozent || Ja || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Nutzung zeitlich limitieren || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Nutzung in der Anzahl limitieren || Ja || Ja || Ja || Ja || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Steuern !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Steuerzonen || Ja || Ja || Nein || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuerklassen || Ja || Ja || Ja || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Steuersätze || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Versand !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Versandzonen || Ja || Ja || Nein || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Versandoptionen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Gewicht mit Staffelmöglichkeit || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Preis mit Staffelmöglichkeit || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Berechnung nach Verpackungseinheiten mit Staffelmöglichkeit || Nein || Nein || Nein || Ja || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Versandtrackinginformationen in Nachrichten || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Zahlungsmodule !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Rechnung/Vorauskasse/Nachnahme  || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| PayPal Standard || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| PayPal Payflow Pro || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| sofortueberweisung.de || Ja || Ja || via Erweiterung || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Authorize.Net || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Postfinance || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cybersource || Nein || Nein || Ja || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Saferpay || Ja || Ja || via Erweiterung || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| PayOne || Nein || Nein || via Erweiterung || ? || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| ExperCash || Nein || Nein || via Erweiterung || ? || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| ePay || ? || ? || Ja/via Erweiterung (v1.3) || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Sparkasse/Postbank || ? || ? || via Erweiterung || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Datatrans || ? || ? || via Erweiterung || ? || ? || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Volksbanken Karten/ELV/Giropay || Nein || Nein || Nein || Ja || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Rabattmöglichkeit in Euro oder Prozent || Ja || Ja || Ja || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Cross Selling !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Direkte Produktauswahl || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Dynamisch nach Kriterien || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Zubehörteile || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Zuletzt gesehen || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Empfohlene Produkte || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Bestellungen &amp;amp; Kundenverwaltung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Gastzugang bzw. -bestellung || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| autom. Versand der Bestellbestätigung || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| inkl. AGB und Widerrufsbelehrung als PDF || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellhistorie im Frontend und Backend || Ja || Ja || Ja || Ja || im BE - FE in entwicklung || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellstatus veränderbar || Ja || Ja || Ja || Ja || Nein &amp;gt; [http://contao-acquisto.de/de/aktuelle-projekte.html Wir sammeln spenden für die Entwicklung] || Ja&lt;br /&gt;
|-&lt;br /&gt;
| erweiterte Kundendaten || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| beliebige Lieferadressen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen || Ja || Ja || Mitgliedergruppen || Mitgliedergruppen || Ja || Mitgliedergruppen&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Nachrichtenmanagement !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Beliebige Nachrichten erstellbar || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellbestätigung an Kunde || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestellinfo an Shopbetreiber || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Versandbestätigung || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bestätiung für Zahlungseingang || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Beliebige dynamisch generierte PDF-Anhänge || ? || ? || ? || ? || ? || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Einstellungen !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Länderinformationen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Währungsangaben || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Preisanzeige (brutto/netto) || Ja || Ja || ? || Ja || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Mindestbestellwert || Ja || Ja || Ja (v1.3) || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Rabattsystem || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| E-Mail Versandeinstellungen || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Exportschnittstellen/Anbindung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Google Shopping || Ja || Ja || via Erweiterung || Nein || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| billiger.de || ? || ? || ? || ? || Ja || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Veha24 Warenwirtschaft || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| Cash Software (Warenwirtschaft &amp;amp; Kasse) || Ja || Ja || Nein || Nein || Nein || Nein&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Lizenzierung !! Contao webShop&amp;lt;br /&amp;gt;Community Edition !! Contao webShop&amp;lt;br /&amp;gt;Business Edition !! Isotope&amp;lt;br /&amp;gt;eCommerce !! chShop !! acquistoShop !! MERCONIS&lt;br /&gt;
|-&lt;br /&gt;
| Demo-Shop Template &amp;amp; Layout inkl. || Ja || Ja || Ja || ohne Layout || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per E-Mail || Nein || Ja || Nein || Nein || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per Forum || Ja || Ja || Ja || Ja || Ja || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Support per Ticketsystem || Ja || Ja || Ja || Nein || Nein || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lizenz || EULA || EULA || LGPL || LGPL || LGPL || EULA&lt;br /&gt;
|-&lt;br /&gt;
| '''Preis netto''' || '''0,00 €''' || '''499,00 €''' || '''0,00 €''' || '''0,00 €''' || '''0,00 €''' || '''189,00 € / 389,00 €'''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/InKuerzeVerfuegbar</id>
		<title>InKuerzeVerfuegbar</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/InKuerzeVerfuegbar"/>
				<updated>2013-02-06T08:03:46Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
&lt;br /&gt;
Um zu vermeiden, dass parallele Entwicklung unnötige Ressourcen benötigt, können Entwickler hier Erweiterung eintragen, die &amp;quot;in Kürze verfügbar&amp;quot; sein sollen.&lt;br /&gt;
&lt;br /&gt;
== ETES GmbH ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Jan Theofel, Marc Schneider, Sebastian Leitz&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@etes.de E-Mail] [http://www.etes.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* (Neues) Trackback-Modul für News (andere Features als das bestehende)&lt;br /&gt;
* (Neues) Gravatar-Modul (Gravatare auch für Kommentare etc.)&lt;br /&gt;
* Wordpress-Import (basiert auf den oberen beiden)&lt;br /&gt;
* htaccess-Erweiterung zur Konfiguration der zentralen .htaccess mit der Möglichkeit, dass Module dort per Hook eigene Definitionen einfügen können&lt;br /&gt;
* Erweiterungen für unsere Jobbörse (Onlinebewerbung/Bewertung von Bewerbern/Anbindung an Paymentsysteme)&lt;br /&gt;
&lt;br /&gt;
== terminal42 gmbh ==&lt;br /&gt;
&lt;br /&gt;
Siehe Github-Accounts: [https://github.com/terminal42 terminal42], [https://github.com/Toflar Yanick Witschi], [https://github.com/aschempp Andreas Schempp]&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.terminal42.ch/de/mannschaft.html Mannschaft]&lt;br /&gt;
&lt;br /&gt;
== InfinitySoft - Innovative Softwarelösungen ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Tristan Lins (aka tril)&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:tristan.lins@infinitysoft.de E-Mail] [http://www.infinitysoft.de Webseite]&lt;br /&gt;
&lt;br /&gt;
Am besten die aktuellen Entwicklungen auf [https://github.com/organizations/InfinitySoft github] verfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
== BugBuster ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Glen Langer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum] | [http://www.contao.Glen-Langer.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* Idee: moopeel - diese nette Ecke auf Mootoolsbasis (no Flash!)&lt;br /&gt;
* Idee: Insert-Tag Checker - Prüft ob die Kette nicht irgendwo unterbrochen ist, weil wieder mal jemand das &amp;quot;return false;&amp;quot; vergessen hat&lt;br /&gt;
&lt;br /&gt;
== MEN AT WORK ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Andreas Isaak, David Maack&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:cms@men-at-work.de E-Mail]&lt;br /&gt;
&lt;br /&gt;
* recursiveDownload: Rekursive Downloads basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* recursiveGallery: Rekursive Galerie basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* [http://www.contao-forge.org/projects/language4translation/issues language4translation]: Exportierte Sprachtexte im Frontend übersetzen und später wieder via language2file importieren&lt;br /&gt;
* dashboard: Erweiterung der Dashboard Extension von Andreas Schempp&lt;br /&gt;
* [http://www.contao-forge.org/projects/backendfavourites backendFavourites] Favouriten/Sprungmarker für das Backend definieren&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/menatwork Übersicht all unserer Entwicklungen]&lt;br /&gt;
&lt;br /&gt;
== hofemich ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Michael Hofer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum]&lt;br /&gt;
&lt;br /&gt;
* isotope_request: Ermöglicht die Verknüpfung mit einem Formular, für Produkt-Anfragen&lt;br /&gt;
&lt;br /&gt;
== Cliff Parnitzky ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Cliff Parnitzky&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@cliff-parnitzky.de contao@cliff-parnitzky.de]&lt;br /&gt;
&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/BirthdayMailer.html BirthdayMailer]: fertig&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/EfgMemberSelectMailer.html EfgMemberSelectMailer]: fertig&lt;br /&gt;
* [http://www.contao.org/de/extension-list/view/CheckedEmail.html CheckedEmail]: fertig&lt;br /&gt;
* ConditionalInserttags: Inserttags für einfache Bedingungen (if, ifelse)&lt;br /&gt;
* MemberNumber: Mitgliedernummer (BE) automatisch hochzählen, ggf. mit Präfixauswahl&lt;br /&gt;
* ExtendedListing: Erweitert das Listing Modul um die Möglichkeit, Tabellen miteinander zu verknüpfen (SQL JOIN)&lt;br /&gt;
&lt;br /&gt;
== IMS Internet Marketing Solutions Ltd. ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Dominik Zogg&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:dz@erfolgreiche-internetseiten.ch E-Mail]&lt;br /&gt;
&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/calendarextended.de.html calendarextended]: Erweiterung des Standardkalenders, von einer Kontaktperson bis hin zu einer Registrierung ist alles dabei&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/gist.de.html gist]: Erweiterung welche aus einem gist Inserttag den jeweiligen Javascript Code lädt&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Contao_Community_Alliance</id>
		<title>Contao Community Alliance</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Contao_Community_Alliance"/>
				<updated>2011-11-16T14:06:29Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Link zu github korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contao Community Alliance (CCA)=&lt;br /&gt;
&lt;br /&gt;
ist eine Gruppierung auf [https://github.com/ContaoCommunityAlliance github].&lt;br /&gt;
Ziel der CCA ist es, einen zentralen Ort zum Austauschen von Ideen und zur gemeinsamen Entwicklung zu haben.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Anwendungsfälle der CCA==&lt;br /&gt;
&lt;br /&gt;
* Gemeinsame Prototypeentwicklung&lt;br /&gt;
* Gemeinsame Entwicklung neuer Extensions&lt;br /&gt;
* Gemeinsames Patchen von Fehlern in Contao und anderen Extensions&lt;br /&gt;
&lt;br /&gt;
==Grobes Vorgehen in der CCA (Richtlinien)==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich steht es jedem Entwickler frei, eigene Repositories anzulegen. Vorhandene Repositories zu klonen. Eigene Changes zu commiten usw.&lt;br /&gt;
Die CCA ist so konzipiert, dass schnell und unbürokratisch andere Entwickler sich an der Entwicklung zu beteiligen. Das führt natürlich auch zu der Problematik, dass man schnell und ungefragt die Entwicklung anderer überschreiben kann. Deshalb muss jeder Entwickler aufpassen, was er verändert und commited.&lt;br /&gt;
&lt;br /&gt;
==Was wird aus den Projekten?==&lt;br /&gt;
&lt;br /&gt;
Die Projekte könnten theoretisch auf ewig im CCA bleiben. Jedoch macht das Konzept des CCA dafür wenig Sinn. Sinnvoll wäre es, wenn im CCA zuerst eine Konzeptfindung statt findet. Wenn sich dann heraus stellt, dass man daraus eine Verbesserung für Contao machen kann, kann dieser hier vorbereitet und als Patch bereitgestellt werden. Stellt sich heraus, dass sich der Bau einer Extension lohnt, sollte sich ein oder mehrere Entwickler zu einer eigenen Gruppe finden und das Projekt aus dem CCA zu einem Mainteiner oder einer Maintainer-Gruppe übertragen werden. Dort kann dann eine &amp;quot;kontrollierte&amp;quot; Entwicklung stattfinden.&lt;br /&gt;
&lt;br /&gt;
==Wer bekommt Zugriff?==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich bekommt jeder Entwickler, der sich bereits in die Community eingebracht hat Zugriff. Den Zugriff erlauben kann [https://github.com/ContaoCommunityAlliance jeder, der bereits Zugriff auf den CCA besitzt]. Am einfachsten ist es, wenn Ihr euch bei Xtra (auf github [https://github.com/Discordier Discordier]) oder tril (auf github [https://github.com/tristanlins tristanlins]) meldet. Verwaltet, Moderiert und Organisiert wird es vorwiegend von den 2 Entwicklern, jeder Entwickler ist aber ebenfalls dazu in der Lage, diese Aufgaben mit zu übernehmen.&lt;br /&gt;
&lt;br /&gt;
==Der Grundsatz!==&lt;br /&gt;
&lt;br /&gt;
Zum Schluss sollte sich jeder noch mal eines klar machen: Das CCA ist eine sich selbst organisierende Gruppe. Die Gründer haben kein Interesse daran, irgendwelche Restriktionen einzuführen. Diese würden einer schnellen from Scratch Entwicklung im Wege stehen, wie sie oft sinnvoll ist wenn man neue Ansätze ausprobieren will. Daher kann das System nur überleben, wenn alle Beteiligten Entwickler sich gleichermaßen an Entwicklung und Organisation beteiligen.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T10:48:35Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Technisch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Einfache Request Klasse&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL) - Mögliche Frameworks: Doctrine DBAL&lt;br /&gt;
* Objective-Relational-Mapping (ORM) - Mögliche Frameworks: Doctrine ORM&lt;br /&gt;
* Umfangreiches Caching [Was ist hiermit gemeint? Was den FECache angeht, wäre es super, wenn wir das über die htaccess ziehen könnten, ähnlich wie das bei WP das Supercache Modul mach (backbone)]&lt;br /&gt;
* HTTP Request Handler [Was ist hiermit gemeint? (backbone) Klassen die mit HTTP-Requests umgehen (Toflar)]&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL) (via Permissions) + Role Based (+ multiple Identities, also Trennung von Anmelde- und Benutzerinformationen)&lt;br /&gt;
* Globale Validatoren (damit Widgets, die identisch validieren, den gleichen Validator nutzen)&lt;br /&gt;
* Übersetzungen auch auf DB-Ebene [Würde das nicht auf DB-Ebene zwingen, lieber einen Übersetzungsdatei-Editor (backbone) Das meinte ich nicht, ich meine Datensätze für verschiedene Sprachen editierbar zu machen. Sowas gehört garantiert nicht in ein File ;-) (Toflar)]&lt;br /&gt;
* Versionierung von Inhalten nicht über separate Tabelle, sondern in die Inhaltstabellen integriert&lt;br /&gt;
* Verbesserte relationale Baumstrukturen&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
* Auslagern von Standardkomponenten (Nachrichten, Events, Newsletter usw.) in Erweiterungen (die eventuell bei einer Standardinstallation mitgeliefert werden).&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3) [auch ein Muss, aber wenn die Erweiterungen nicht kompatibel sind, stelle ich mir das schwer vor (Glen) Naja, der Core muss sich ja updaten können und ich denke da geht es vor allem um Content, nicht um Settings oder Dinge von Erweiterungen (Toflar)]&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden! [würde ich als Muss, bezeichnen (backbone)]&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;br /&gt;
* Zuordnung von Inhalten/Seiten zu Publication-Sets, welche von einer Publication verwendet werden um für einen bestimmten Zeitraum den Zustand der Seite zu representieren. Also sozusagen, ein integriertes Dev -&amp;gt; Stage -&amp;gt; Live System.&lt;br /&gt;
* Jeder Inhalt, der eine eigene Seite erfordert (Newseinträge), bekommt auch einen Eintrag in der Seitenstruktur, damit die Seitenstruktur die komplette URL-Struktur representiert.&lt;br /&gt;
* INSERT-only Prinzip für Inhalts-/Seiten-Tabellen (und DELETE von alten/ungenutzen Datensätzen)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T10:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Nice to have */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Einfache Request Klasse&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL) - Mögliche Frameworks: Doctrine DBAL&lt;br /&gt;
* Objective-Relational-Mapping (ORM) - Mögliche Frameworks: Doctrine ORM&lt;br /&gt;
* Umfangreiches Caching [Was ist hiermit gemeint? Was den FECache angeht, wäre es super, wenn wir das über die htaccess ziehen könnten, ähnlich wie das bei WP das Supercache Modul mach (backbone)]&lt;br /&gt;
* HTTP Request Handler [Was ist hiermit gemeint? (backbone) Klassen die mit HTTP-Requests umgehen (Toflar)]&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL) (via Permissions) + Role Based (+ multiple Identities, also Trennung von Anmelde- und Benutzerinformationen)&lt;br /&gt;
* Globale Validatoren (damit Widgets, die identisch validieren, den gleichen Validator nutzen)&lt;br /&gt;
* Übersetzungen auch auf DB-Ebene [Würde das nicht auf DB-Ebene zwingen, lieber einen Übersetzungsdatei-Editor (backbone)]&lt;br /&gt;
* Versionierung von Inhalten nicht über separate Tabelle, sondern in die Inhaltstabellen integriert&lt;br /&gt;
* Verbesserte relationale Baumstrukturen&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
* Auslagern von Standardkomponenten (Nachrichten, Events, Newsletter usw.) in Erweiterungen (die eventuell bei einer Standardinstallation mitgeliefert werden).&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3) [auch ein Muss, aber wenn die Erweiterungen nicht kompatibel sind, stelle ich mir das schwer vor (Glen) Naja, der Core muss sich ja updaten können und ich denke da geht es vor allem um Content, nicht um Settings oder Dinge von Erweiterungen (Toflar)]&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden! [würde ich als Muss, bezeichnen (backbone)]&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;br /&gt;
* Zuordnung von Inhalten/Seiten zu Publication-Sets, welche von einer Publication verwendet werden um für einen bestimmten Zeitraum den Zustand der Seite zu representieren. Also sozusagen, ein integriertes Dev -&amp;gt; Stage -&amp;gt; Live System.&lt;br /&gt;
* Jeder Inhalt, der eine eigene Seite erfordert (Newseinträge), bekommt auch einen Eintrag in der Seitenstruktur, damit die Seitenstruktur die komplette URL-Struktur representiert.&lt;br /&gt;
* INSERT-only Prinzip für Inhalts-/Seiten-Tabellen (und DELETE von alten/ungenutzen Datensätzen)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T10:44:21Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Einfache Request Klasse&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL) - Mögliche Frameworks: Doctrine DBAL&lt;br /&gt;
* Objective-Relational-Mapping (ORM) - Mögliche Frameworks: Doctrine ORM&lt;br /&gt;
* Umfangreiches Caching [Was ist hiermit gemeint? Was den FECache angeht, wäre es super, wenn wir das über die htaccess ziehen könnten, ähnlich wie das bei WP das Supercache Modul mach (backbone)]&lt;br /&gt;
* HTTP Request Handler [Was ist hiermit gemeint? (backbone) Klassen die mit HTTP-Requests umgehen (Toflar)]&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL) (via Permissions) + Role Based (+ multiple Identities, also Trennung von Anmelde- und Benutzerinformationen)&lt;br /&gt;
* Globale Validatoren (damit Widgets, die identisch validieren, den gleichen Validator nutzen)&lt;br /&gt;
* Übersetzungen auch auf DB-Ebene [Würde das nicht auf DB-Ebene zwingen, lieber einen Übersetzungsdatei-Editor (backbone)]&lt;br /&gt;
* Versionierung von Inhalten nicht über separate Tabelle, sondern in die Inhaltstabellen integriert&lt;br /&gt;
* Verbesserte relationale Baumstrukturen&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
* Auslagern von Standardkomponenten (Nachrichten, Events, Newsletter usw.) in Erweiterungen (die eventuell bei einer Standardinstallation mitgeliefert werden).&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3) [auch ein Muss, aber wenn die Erweiterungen nicht kompatibel sind, stelle ich mir das schwer vor (Glen)]&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden! [würde ich als Muss, bezeichnen (backbone)]&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;br /&gt;
* Zuordnung von Inhalten/Seiten zu Publication-Sets, welche von einer Publication verwendet werden um für einen bestimmten Zeitraum den Zustand der Seite zu representieren. Also sozusagen, ein integriertes Dev -&amp;gt; Stage -&amp;gt; Live System.&lt;br /&gt;
* Jeder Inhalt, der eine eigene Seite erfordert (Newseinträge), bekommt auch einen Eintrag in der Seitenstruktur, damit die Seitenstruktur die komplette URL-Struktur representiert.&lt;br /&gt;
* INSERT-only Prinzip für Inhalts-/Seiten-Tabellen (und DELETE von alten/ungenutzen Datensätzen)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T10:43:58Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Technisch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL) - Mögliche Frameworks: Doctrine DBAL&lt;br /&gt;
* Objective-Relational-Mapping (ORM) - Mögliche Frameworks: Doctrine ORM&lt;br /&gt;
* Umfangreiches Caching [Was ist hiermit gemeint? Was den FECache angeht, wäre es super, wenn wir das über die htaccess ziehen könnten, ähnlich wie das bei WP das Supercache Modul mach (backbone)]&lt;br /&gt;
* HTTP Request Handler [Was ist hiermit gemeint? (backbone) Klassen die mit HTTP-Requests umgehen (Toflar)]&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL) (via Permissions) + Role Based (+ multiple Identities, also Trennung von Anmelde- und Benutzerinformationen)&lt;br /&gt;
* Globale Validatoren (damit Widgets, die identisch validieren, den gleichen Validator nutzen)&lt;br /&gt;
* Übersetzungen auch auf DB-Ebene [Würde das nicht auf DB-Ebene zwingen, lieber einen Übersetzungsdatei-Editor (backbone)]&lt;br /&gt;
* Versionierung von Inhalten nicht über separate Tabelle, sondern in die Inhaltstabellen integriert&lt;br /&gt;
* Verbesserte relationale Baumstrukturen&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
* Auslagern von Standardkomponenten (Nachrichten, Events, Newsletter usw.) in Erweiterungen (die eventuell bei einer Standardinstallation mitgeliefert werden).&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3) [auch ein Muss, aber wenn die Erweiterungen nicht kompatibel sind, stelle ich mir das schwer vor (Glen)]&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden! [würde ich als Muss, bezeichnen (backbone)]&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;br /&gt;
* Zuordnung von Inhalten/Seiten zu Publication-Sets, welche von einer Publication verwendet werden um für einen bestimmten Zeitraum den Zustand der Seite zu representieren. Also sozusagen, ein integriertes Dev -&amp;gt; Stage -&amp;gt; Live System.&lt;br /&gt;
* Jeder Inhalt, der eine eigene Seite erfordert (Newseinträge), bekommt auch einen Eintrag in der Seitenstruktur, damit die Seitenstruktur die komplette URL-Struktur representiert.&lt;br /&gt;
* INSERT-only Prinzip für Inhalts-/Seiten-Tabellen (und DELETE von alten/ungenutzen Datensätzen)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T09:10:04Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Technisch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL)&lt;br /&gt;
* Objective-Relational-Mapping (ORM)&lt;br /&gt;
* Umfangreiches Caching&lt;br /&gt;
* HTTP Request Handler&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL)&lt;br /&gt;
* Globale Validatoren (damit Widgets, die identisch validieren, den gleichen Validator nutzen)&lt;br /&gt;
* Übersetzungen auch auf DB-Ebene&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3)&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden!&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T09:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen für statischen Text&lt;br /&gt;
* Validatoren pro Widget&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL)&lt;br /&gt;
* Objective-Relational-Mapping (ORM)&lt;br /&gt;
* Umfangreiches Caching&lt;br /&gt;
* HTTP Request Handler&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL)&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3)&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden!&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T09:01:54Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen (wo haben wir die?)&lt;br /&gt;
* Formular Builder (wo haben wir den?)&lt;br /&gt;
* Validatoren (wo haben wir den?)&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL)&lt;br /&gt;
* Objective-Relational-Mapping (ORM)&lt;br /&gt;
* Umfangreiches Caching&lt;br /&gt;
* HTTP Request Handler&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL)&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3)&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden!&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Futuretable</id>
		<title>Futuretable</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Futuretable"/>
				<updated>2011-09-05T07:51:37Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Technisch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Wir haben und wollen behalten=&lt;br /&gt;
&lt;br /&gt;
* Übersichtliches einfaches Backend&lt;br /&gt;
* Strukturierte Inhalte&lt;br /&gt;
* Frontend Themes aus Modulen, Layouts usw.&lt;br /&gt;
&lt;br /&gt;
=Wir haben und können eventuell drauf verzichten (zu Gunsten von etwas besserem)=&lt;br /&gt;
&lt;br /&gt;
* Einfaches Caching&lt;br /&gt;
* Session Handling für Logins etc.&lt;br /&gt;
* Browser Detection&lt;br /&gt;
* Class Loader&lt;br /&gt;
* File-Handling&lt;br /&gt;
* Übersetzungen&lt;br /&gt;
* Formular Builder&lt;br /&gt;
* Validatoren&lt;br /&gt;
&lt;br /&gt;
=Ein Muss für die Zukunft=&lt;br /&gt;
&lt;br /&gt;
==Technisch==&lt;br /&gt;
&lt;br /&gt;
* PHP 5.3 Namespaces&lt;br /&gt;
* Database Abstraction Layer (DBAL)&lt;br /&gt;
* Objective-Relational-Mapping (ORM)&lt;br /&gt;
* Umfangreiches Caching&lt;br /&gt;
* HTTP Request Handler&lt;br /&gt;
* Virtual File System, VFS&lt;br /&gt;
* Access Control List (ACL)&lt;br /&gt;
&lt;br /&gt;
==Funktional==&lt;br /&gt;
&lt;br /&gt;
* Updatefähig (Contao 2 -&amp;gt; Contao 3)&lt;br /&gt;
* Gut Dokumentiert&lt;br /&gt;
* Einfach zu handhaben&lt;br /&gt;
&lt;br /&gt;
=Nice to have=&lt;br /&gt;
&lt;br /&gt;
* Template Engine (Twig, Smarty)&lt;br /&gt;
* Ein neues, richtig geiles Extension Repository&lt;br /&gt;
* Ein neues Backend-Theme, mehr Javascript/Ajax für den User wie z.B. Drag n' Drop etc. Dinge die uns HTML5 bringt - Dinge die nicht dazu erfunden wurden, um links liegen gelassen zu werden!&lt;br /&gt;
* WebDAV Access auf die Dateiverwaltung&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-09-04T11:17:44Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Ich war mal so frei ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Stefan Lindecke, Yanick Witschi&lt;br /&gt;
| ExtVersion=0.5.0 rc1&lt;br /&gt;
| Version=2.9.0 - 2.10,0 RC1&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/DC_Memory.de.html&lt;br /&gt;
| Depending=[http://www.contao.org/erweiterungsliste/view/3CFramework.de.html 3CFramework]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, als die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
=Daten laden und speichern=&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten ''onload_callbacks'' und ''onsubmit_callbacks'' genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Versionierung=&lt;br /&gt;
Auf die Contao-eigene Versionierung wird verzichtet, da diese für die meisten Entwickler zu wenig Flexibilität bietet (was aber nicht bedeutet, dass man die Core-Versionierung nicht auch einbauen kann).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mehrsprachigkeit=&lt;br /&gt;
&lt;br /&gt;
Die DC_Memory unterstützt auch Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen und Methoden zur Abfrage anzubieten, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im ''onload_callback'' und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier ein Feld, das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
=Buttons hinzufügen=&lt;br /&gt;
Im Contao-Core ist es äußerst mühsam, eigene Buttons à la &amp;quot;Speichern und Schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, liegt es am Programmierer, diesen Fall vorherzusehen. Der ''onsubmit_callback' wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
=Die Listenansicht=&lt;br /&gt;
Contao verlangt von einem DataContainer, welcher Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DC_Memory_Helpers=&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
==Beispiel für eine listView und Panel mit Limit wie bei DC_Table==&lt;br /&gt;
Dieses Beispiel wird eine Listenansicht generieren; mit einem Panel und der Auswahl, welche Einträge man ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich &amp;quot;edit&amp;quot; und &amp;quot;copy&amp;quot;; das Ganze gruppiert nach Anfangsbuchstabe des Usernames.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;getLimitForSQL());&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// 2 Einträge pro Seite&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total, 2);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:32:35Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, als die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
Dieses Beispiel wird mir eine Listenansicht generieren mit einem Panel und der Auswahl, welche Einträge ich ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.&lt;br /&gt;
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich &amp;quot;edit&amp;quot; und &amp;quot;copy&amp;quot; und das ganze Gruppiert nach Anfangsbuchstabe des Usernames.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;getLimitForSQL());&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// 2 Einträge pro Seite&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total, 2);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:31:31Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für eine listView und Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
Dieses Beispiel wird mir eine Listenansicht generieren mit einem Panel und der Auswahl, welche Einträge ich ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.&lt;br /&gt;
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich &amp;quot;edit&amp;quot; und &amp;quot;copy&amp;quot; und das ganze Gruppiert nach Anfangsbuchstabe des Usernames.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;getLimitForSQL());&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// 2 Einträge pro Seite&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total, 2);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:30:29Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für eine listView und Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
Dieses Beispiel wird mir eine Listenansicht generieren mit einem Panel und der Auswahl, welche Einträge ich ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.&lt;br /&gt;
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich &amp;quot;edit&amp;quot; und &amp;quot;copy&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;getLimitForSQL());&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// 2 Einträge pro Seite&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total, 2);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:28:07Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für eine listView und Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;getLimitForSQL());&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total, 2);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:20:14Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für eine listView und Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$strLimit = '';&lt;br /&gt;
	if(strlen($objHelper-&amp;gt;strLimit))&lt;br /&gt;
	{&lt;br /&gt;
		$strLimit = ' LIMIT ' . $objHelper-&amp;gt;strLimit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $strLimit);&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:19:36Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für eine listView und Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$strLimit = '';&lt;br /&gt;
	if(strlen($objHelper-&amp;gt;strLimit))&lt;br /&gt;
	{&lt;br /&gt;
		$strLimit = ' LIMIT' . $objHelper-&amp;gt;strLimit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $strLimit);&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:14:35Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Die Listenansicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$strLimit = '';&lt;br /&gt;
	if(strlen($objHelper-&amp;gt;strLimit))&lt;br /&gt;
	{&lt;br /&gt;
		$strLimit = ' LIMIT' . $objHelper-&amp;gt;strLimit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;strLimit);&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T17:12:53Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Beispiel für ein Panel mit Limit à la DC_Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][] = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][] = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][] = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für eine listView und Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	// sets the current limits to the session according to DC_Table&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
	&lt;br /&gt;
	// total&lt;br /&gt;
	$objTotal = $this-&amp;gt;Database-&amp;gt;execute(&amp;quot;SELECT COUNT(id) AS total FROM tl_user&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	// get the data&lt;br /&gt;
	$strLimit = '';&lt;br /&gt;
	if(strlen($objHelper-&amp;gt;strLimit))&lt;br /&gt;
	{&lt;br /&gt;
		$strLimit = ' LIMIT' . $objHelper-&amp;gt;strLimit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$objData = $this-&amp;gt;Database-&amp;gt;execute('SELECT id,username FROM tl_user' . $objHelper-&amp;gt;strLimit);&lt;br /&gt;
	$arrDataArray = array();&lt;br /&gt;
	&lt;br /&gt;
	while($objData-&amp;gt;next())&lt;br /&gt;
	{&lt;br /&gt;
		// get the first letter of the username&lt;br /&gt;
		$strFirstLetter = substr($objData-&amp;gt;username,0,1);&lt;br /&gt;
		&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);&lt;br /&gt;
		$arrDataArray[$strFirstLetter]['data'][] = array&lt;br /&gt;
		(&lt;br /&gt;
			'id'		=&amp;gt; $objData-&amp;gt;id,&lt;br /&gt;
			'class'		=&amp;gt; 'list_icon',&lt;br /&gt;
			'style'		=&amp;gt; 'background-image:url(\'system/themes/default/images/user.gif\');',&lt;br /&gt;
			'label'		=&amp;gt; $objData-&amp;gt;username,&lt;br /&gt;
			'buttons'	=&amp;gt; array&lt;br /&gt;
			(&lt;br /&gt;
				'edit' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=edit&amp;amp;amp;id=' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Edit user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/edit.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '12',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Edit user'				&lt;br /&gt;
				),&lt;br /&gt;
				'copy' =&amp;gt; array&lt;br /&gt;
				(&lt;br /&gt;
					'href'		=&amp;gt; 'contao/main.php?do=user&amp;amp;amp;act=copy&amp;amp;amp;id= ' . $objData-&amp;gt;id,&lt;br /&gt;
					'title'		=&amp;gt; 'Duplicate user ID ' . $objData-&amp;gt;id,&lt;br /&gt;
					'icon'		=&amp;gt; 'system/themes/default/images/copy.gif',&lt;br /&gt;
					'icon_w'	=&amp;gt; '14',&lt;br /&gt;
					'icon_h'	=&amp;gt; '16',&lt;br /&gt;
					'alt'		=&amp;gt; 'Duplicate user'				&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString($objTotal-&amp;gt;total);&lt;br /&gt;
	&lt;br /&gt;
	$strPanel = $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
	$strGlobalOperations = $objHelper-&amp;gt;generateGlobalOperationsString();&lt;br /&gt;
	$strListView = $objHelper-&amp;gt;generateListViewString($arrDataArray);&lt;br /&gt;
	return $strPanel . $strGlobalOperations . $strListView;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T13:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
== Die Listenansicht ==&lt;br /&gt;
Contao verlangt von einem DataContainer der Daten auflistet, dass vier Methoden eingebunden werden:&lt;br /&gt;
* showAll()&lt;br /&gt;
* show()&lt;br /&gt;
* delete()&lt;br /&gt;
* undo()&lt;br /&gt;
&lt;br /&gt;
Deshalb gibt es für die vier Methoden jeweils Callbacks:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][] = array('class', 'dcMemory_show_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][] = array('class', 'dcMemory_delete_callback');&lt;br /&gt;
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][] = array('class', 'dcMemory_undo_callback');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	&lt;br /&gt;
	// Liest das Formular aus und setzt das Limit neu. Kann auch über $objHelper-&amp;gt;strLimit direkt gesetzt werden&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
&lt;br /&gt;
	// Generiert das Limit-Dropdown für 1600 Einträge&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString(1600);&lt;br /&gt;
&lt;br /&gt;
	// Generiert das Panel&lt;br /&gt;
	return $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-30T13:55:10Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
= DC_Memory_Helpers =&lt;br /&gt;
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein Panel mit Limit à la DC_Table ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_showAll_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$objHelper = new DC_Memory_Helpers($dc);&lt;br /&gt;
	&lt;br /&gt;
	// Liest das Formular aus und setzt das Limit neu. Kann auch über $objHelper-&amp;gt;strLimit direkt gesetzt werden&lt;br /&gt;
	$objHelper-&amp;gt;setCurrentLimits();&lt;br /&gt;
&lt;br /&gt;
	// Generiert das Limit-Dropdown für 1600 Einträge&lt;br /&gt;
	$strLimitHtml = $objHelper-&amp;gt;generateLimitMenuString(1600);&lt;br /&gt;
&lt;br /&gt;
	// Generiert das Panel&lt;br /&gt;
	return $objHelper-&amp;gt;generatePanel($strLimitHtml);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T21:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Mehrsprachigkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur nach Deutsch und Französisch übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de', 'fr')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T21:16:08Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Mehrsprachigkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('*')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur für die Deutsche Sprache übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T18:53:48Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Versionierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'dcMemory_versioning_list_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_list_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_restore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_restore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_versioning_createInitial_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_versioning_createInitial_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array_keys($this-&amp;gt;getLanguages())&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur für die Deutsche Sprache übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T18:37:09Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Mehrsprachigkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'createInitialVersion_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'createInitialVersion_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function createInitialVersion_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.&lt;br /&gt;
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array_keys($this-&amp;gt;getLanguages())&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Hier eines das nur für die Deutsche Sprache übersetzbar ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'name' =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['table']['name'],&lt;br /&gt;
	'inputType'               =&amp;gt; 'text',&lt;br /&gt;
	'eval'                    =&amp;gt; array('mandatory'=&amp;gt;true,'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
	'translatableFor'         =&amp;gt; array('de')&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Paramter &amp;quot;translatableFor&amp;quot; gänzlich, so ist das Feld nicht übersetzbar.&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T18:32:54Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Mehrsprachigkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'createInitialVersion_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'createInitialVersion_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function createInitialVersion_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de',&lt;br /&gt;
		'fr'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:44:56Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Versionierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
),&lt;br /&gt;
'createInitialVersion_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'createInitialVersion_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function createInitialVersion_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Erstversion anlegen&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:41:54Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Buttons hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bei einem Button die Daten nicht gespeichert werden sollen, ist es am Programmierer, diesen Fall vorzusehen. Der onsubmit_callback wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this-&amp;gt;Input-&amp;gt;post('myButton') gesetzt ist.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Buttons hinzufügen ==&lt;br /&gt;
Im Contao-Core ist es äusserst mühsam eigene Buttons à la &amp;quot;Speichern und schliessen&amp;quot; hinzuzufügen. Mit der DC_Memory geht das ganz einfach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$arrData = array&lt;br /&gt;
	(&lt;br /&gt;
		'id'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'formkey'=&amp;gt;'saveNredirectToGoogle',&lt;br /&gt;
		'class'=&amp;gt;'',&lt;br /&gt;
		'accesskey'=&amp;gt;'g',&lt;br /&gt;
		'value'=&amp;gt;specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),&lt;br /&gt;
		'button_callback' =&amp;gt; array('class', 'saveNredirectToGoogleButtonCallback')&lt;br /&gt;
	);&lt;br /&gt;
	$dc-&amp;gt;addButton('saveNredirectToGoogle', $arrData)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Nach dem Speichern zu Google weiterleiten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$this-&amp;gt;redirect('http://www.google.com');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:23:54Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Mehrsprachigkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:23:27Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Daten laden und speichern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Laden der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Speichern der Daten&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 */&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:22:41Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Versionierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param array&lt;br /&gt;
 * @return array&lt;br /&gt;
 */&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Ist dafür verantwortlich, was nach dem Klick auf &amp;quot;Wiederherstellen&amp;quot; passiert (also evtl. auch $this-&amp;gt;reload() aufrufen!)&lt;br /&gt;
 * @param DataContainer&lt;br /&gt;
 * @param string | enthält die Version&lt;br /&gt;
 */&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:13:21Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:11:20Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
[php]&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
[/php]&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
[php]&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
[php]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T15:11:07Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
= DC_Memory =&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
[php]&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Werte holen von der DB oder einem File oder was auch immer&lt;br /&gt;
&lt;br /&gt;
	// Setzen eines Wertes&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
[/php]&lt;br /&gt;
public function onsubmit_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Holen eines Wertes&lt;br /&gt;
	$strField1 $dc-&amp;gt;getData('field1');&lt;br /&gt;
&lt;br /&gt;
	// auch das Holen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = $dc-&amp;gt;getDataArray();&lt;br /&gt;
&lt;br /&gt;
	// und dann ab in die DB oder in ein File oder wohin auch immer&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).&lt;br /&gt;
&lt;br /&gt;
Folgende Konfiguration ist notwendig:&lt;br /&gt;
[php]&lt;br /&gt;
'enableVersioning'			=&amp;gt; true,&lt;br /&gt;
'listversions_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'listversions_callback'),&lt;br /&gt;
),&lt;br /&gt;
'dcMemory_onrestore_callback'     =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'dcMemory_onrestore_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function listversions_callback(DataContainer $dc, $arrVersions)&lt;br /&gt;
{&lt;br /&gt;
	$arrVersions[] = array&lt;br /&gt;
	(&lt;br /&gt;
		'value'		=&amp;gt; 'version_1',&lt;br /&gt;
		'selected'	=&amp;gt; true, // Diese Version ist die jüngste&lt;br /&gt;
		'label'		=&amp;gt; 'Meine jüngste Version'&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	return $arrVersions;&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
[php]&lt;br /&gt;
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)&lt;br /&gt;
{&lt;br /&gt;
	// $strVersion enthält den value, also z.B. &amp;quot;version_1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;br /&gt;
&lt;br /&gt;
== Mehrsprachigkeit ==&lt;br /&gt;
&lt;br /&gt;
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.&lt;br /&gt;
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:&lt;br /&gt;
[php]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	// Sprachwechsel-Konfiguration&lt;br /&gt;
	$objLangConfig = new stdClass();&lt;br /&gt;
&lt;br /&gt;
	// Fallback zusätzlich zu den Sprachen anbieten&lt;br /&gt;
	$objLangConfig-&amp;gt;enableFallback = true;&lt;br /&gt;
&lt;br /&gt;
	// Sprachen-Array&lt;br /&gt;
	$objLangConfig-&amp;gt;arrLanguages = array&lt;br /&gt;
	(&lt;br /&gt;
		'de'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Deutsch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'de')&lt;br /&gt;
		),&lt;br /&gt;
		'fr'	=&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'		=&amp;gt; 'Französisch',&lt;br /&gt;
			'selected'	=&amp;gt; ($dc-&amp;gt;getLanguage() == 'fr')&lt;br /&gt;
		)&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	// und jetzt das ganze noch aktivieren&lt;br /&gt;
	$dc-&amp;gt;enableLanguageSwitch($objLangConfig);&lt;br /&gt;
&lt;br /&gt;
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	&lt;br /&gt;
	switch($dc-&amp;gt;getLanguage())&lt;br /&gt;
	{&lt;br /&gt;
		case 'de':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'Wir sprechen sowas von Deutsch!');&lt;br /&gt;
			break;&lt;br /&gt;
		case 'fr':&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'On parle le français aussi!');&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			$dc-&amp;gt;setData('name', 'What about a fallback?');&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Sprachen können auch gelöscht werden.&lt;br /&gt;
	$strEditMode = $dc-&amp;gt;getLanguageEditMode() // enthält entweder &amp;quot;edit&amp;quot; wenn man eine Sprache bearbeitet oder &amp;quot;delete&amp;quot; wenn die Sprache gelöscht werden soll&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T14:55:15Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
= DC_Memory =&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
[code=php]&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/code]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/DC_Memory</id>
		<title>DC Memory</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/DC_Memory"/>
				<updated>2011-08-29T14:54:49Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Die Seite wurde neu angelegt: „Danke für's Formatieren :D  = DC_Memory = == Allgemeines == Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für d…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Danke für's Formatieren :D&lt;br /&gt;
&lt;br /&gt;
= DC_Memory =&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.&lt;br /&gt;
&lt;br /&gt;
== Daten laden und speichern ==&lt;br /&gt;
&lt;br /&gt;
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
[php]&lt;br /&gt;
'onload_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onload_callback'),&lt;br /&gt;
),&lt;br /&gt;
'onsubmit_callback'           =&amp;gt; array&lt;br /&gt;
(&lt;br /&gt;
	array('class', 'onsubmit_callback'),&lt;br /&gt;
)&lt;br /&gt;
[/php]&lt;br /&gt;
public function onload_callback(DataContainer $dc)&lt;br /&gt;
{&lt;br /&gt;
	$dc-&amp;gt;setData('field', 'Wert');&lt;br /&gt;
&lt;br /&gt;
	// auch das Setzen aller Werte auf einmal funktioniert:&lt;br /&gt;
	$arrData = array();&lt;br /&gt;
	$arrData['field1'] = 'Wert 1';&lt;br /&gt;
	$arrData['field2'] = 'Wert 2';&lt;br /&gt;
	$dc-&amp;gt;setDataArray($arrData);&lt;br /&gt;
}&lt;br /&gt;
[/php]&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Backboneit_navigation</id>
		<title>Backboneit navigation</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Backboneit_navigation"/>
				<updated>2011-08-28T11:20:24Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Anpassung Version und ER-Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Oliver Hoff&lt;br /&gt;
| DevSite=http://www.hofff.com/&lt;br /&gt;
| ExtVersion=1.1.0&lt;br /&gt;
| Version=ab 2.9&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| TrackerLink=http://www.contao-forge.org/projects/backboneitnavigation/issues&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/backboneit_navigation.html&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= backboneit_navigation =&lt;br /&gt;
&lt;br /&gt;
Erweiterung bestehend aus einer Sammlung von Navigationselementen (vorerst nur ein erweitertes Navigationsmodul).&lt;br /&gt;
&lt;br /&gt;
Anmerkungen zum Bestimmen der Sichtbarkeit einer Seite:&lt;br /&gt;
* Der Veröffentlichungsstatus gilt ausschließlich für eine Seite selbst. Das heißt zum Beispiel, dass eine Navigation durchaus dargestellt wird, selbst wenn die Referenzseite nicht veröffentlicht ist.&lt;br /&gt;
* Der Seitenschutz für bestimmte Mitgliedergruppen vererbt sich auf alle Unterseiten, außer denjenigen die selbst explizit einen Seitenschutz für Mitgliedergruppen definieren und deren Unterseiten.&lt;br /&gt;
* Die Einstellung &amp;quot;Nur Gästen anzeigen&amp;quot; gilt nur für die Seite selbst. Tatsächlich ist die Seite für angemeldete Benutzer auch noch verfügbar, soll nur in keiner Navigation angezeigt werden. (Anders als zum Beispiel Artikel, die nur Gästen angezeigt werden. Diese werden gar nicht mehr gerendert.)&lt;br /&gt;
* &amp;quot;Im Menü verstecken&amp;quot; gilt nur für die Seite selbst.&lt;br /&gt;
&lt;br /&gt;
== Navigationsmenü ==&lt;br /&gt;
&lt;br /&gt;
Ein Multitalent: Es ist alles möglich was mit einem Navigationsmenü oder einer Individuellen Navigation möglich ist, Kombinationen aus beiden und noch einiges mehr. Einfach ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Funktionen:&lt;br /&gt;
* Kompatibel zu den Templates für das Standard-Navigationsmenü (einziger Unterschied ist, das Seiten die CSS-Klasse &amp;quot;submenu&amp;quot; tatsächlich auch nur dann bekommen, wenn dieses Untermenü gerendert wird)&lt;br /&gt;
* Mehrere Referenzseiten (Wurzeln der Navigation)&lt;br /&gt;
* Aktuelle Seite als Referenzseite&lt;br /&gt;
* Startebene wird relativ zu den Referenzseiten berechnet (negative Startebene möglich)&lt;br /&gt;
* Hardlimit flexibel (Anmerkung: Stopebene und Hardlimit beziehen sich relativ zur Startebene &amp;amp;endash; diessollte auch durch die geänderten Labels der Moduleinstellungen hervorgehen.&lt;br /&gt;
* Versteckte und geschützte Seiten anzeigen&lt;br /&gt;
* Als Sitemap verwendbar&lt;br /&gt;
* Optimierte Algorithmen: Zum Beispiel wird pro Navigationsebene nur noch eine Datenbankabfrage durchgeführt, was vorallem bei einer sehr verzweigten Navigation Vorteile bringen sollte.&lt;br /&gt;
* Erweiterbar per Hook&lt;br /&gt;
&lt;br /&gt;
=== Navigation per Hook erweitern ===&lt;br /&gt;
config.php&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
$GLOBALS['TL_HOOKS']['backboneit_navigation_menu'][] = array('MyNavigationHook', 'hook');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyNavigationHook.php&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
class MyNavigationHook {&lt;br /&gt;
&lt;br /&gt;
  // ... singleton dummy code ...&lt;br /&gt;
&lt;br /&gt;
  public function hook($objThis, $arrRoots) {&lt;br /&gt;
    $intParentID = 1; // the ID of the parent node, were your new node should be appended/inserted to.&lt;br /&gt;
&lt;br /&gt;
    if(!isset($objThis-&amp;gt;arrItems[$intParentID])) // test if the parent should be rendered (to avoid my hook, if it is not needed)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    $strMyNewNodeID = 'MyNavigationHook' . 1; // to avoid collision do not use plain numbers (reservered for tl_page dataset IDs)&lt;br /&gt;
    // and prefix the ID with something specific to your hook&lt;br /&gt;
&lt;br /&gt;
    $objThis-&amp;gt;varActiveID = $strMyNewNodeID; // set my new node as active navigation item&lt;br /&gt;
&lt;br /&gt;
    $objThis-&amp;gt;arrSubpages[$intParentID][] = $strMyNewNodeID; // append the my new node to the end of $intParentIDs childs&lt;br /&gt;
    $arrRoots[] = $strMyNewNodeID; // additionally add my new node to the end of the first level&lt;br /&gt;
&lt;br /&gt;
    $objThis-&amp;gt;arrItems[$strMyNewNodeID] = array(&lt;br /&gt;
      'class' =&amp;gt; 'myclass',&lt;br /&gt;
      'isTrail' =&amp;gt; true, // whether this node is in the trail path of the active page&lt;br /&gt;
      // ... more rendering information for the navigation template (see class AbstractNavigationMenu for all fields) ...&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return $arrRoots; // return the modified first navigation level (not needed if unmodified)&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
''Danke an Christoph Wiechert a.k.a. psi''&lt;br /&gt;
&lt;br /&gt;
Folgendes Beispiel fügt einen Level_1 Eintrag und dazu mehrere Level_2 Einträge zum aktuellen Level_0 Eintrag hinzu:&lt;br /&gt;
&lt;br /&gt;
- Level_0&amp;lt;br&amp;gt;&lt;br /&gt;
-- Level_1 (wird eingefügt)&amp;lt;br&amp;gt;&lt;br /&gt;
--- Level_2.0 (wird eingefügt)&amp;lt;br&amp;gt;&lt;br /&gt;
--- Level_2.1 (wird eingefügt)&amp;lt;br&amp;gt;&lt;br /&gt;
--- Level_2.2 (wird eingefügt)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Helperclass to insert navigation-items&lt;br /&gt;
 * @author psi&lt;br /&gt;
 */&lt;br /&gt;
class Brands_BackboneNavi extends Controller&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	public function hook($objNav, $arrRoots)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;import('Database');&lt;br /&gt;
		&lt;br /&gt;
		// Eine contao-seite enthält ein modul mit &amp;quot;virtuellen&amp;quot; unterseiten&lt;br /&gt;
		// Bsp: http://example.com/module-page/item1.html&lt;br /&gt;
		// Bsp2: http://example.com/module-page/item1/subitem1.html&lt;br /&gt;
		// herrausschneiden von &amp;quot;item1&amp;quot;&lt;br /&gt;
		if(!preg_match(&amp;quot;~^&amp;quot;.preg_quote($GLOBALS['objPage']-&amp;gt;alias,'~').&amp;quot;/([a-z0-9_-]+).*\.html$~i&amp;quot;,$this-&amp;gt;Environment-&amp;gt;request,$erg)) return;&lt;br /&gt;
		&lt;br /&gt;
		// level_1 Eintrag anhand von &amp;quot;item1&amp;quot; einfügen&lt;br /&gt;
		$objDesigner = $this-&amp;gt;Database-&amp;gt;prepare('SELECT id,title,alias FROM tl_brand WHERE alias=? AND published=?')-&amp;gt;execute($erg[1],'1');&lt;br /&gt;
		if(!$objDesigner-&amp;gt;numRows) return;&lt;br /&gt;
		&lt;br /&gt;
		// Seite in den Navigations-Pool hinzufügen&lt;br /&gt;
		$objNav-&amp;gt;arrItems[$objDesigner-&amp;gt;alias.'-'.$objDesigner-&amp;gt;id] = array&lt;br /&gt;
		(&lt;br /&gt;
			'link'	=&amp;gt; $objDesigner-&amp;gt;title,&lt;br /&gt;
			'href'  =&amp;gt; $this-&amp;gt;generateFrontendUrl($GLOBALS['objPage']-&amp;gt;row(),'/'.$objDesigner-&amp;gt;alias),&lt;br /&gt;
			// 'isTrail' =&amp;gt; (preg_match(&amp;quot;~&amp;quot;.preg_quote($objDesigner-&amp;gt;alias,'~').&amp;quot;\.html$~i&amp;quot;,$this-&amp;gt;Environment-&amp;gt;request))&lt;br /&gt;
			'isTrail' =&amp;gt; true // wir zeigen ohnehin immer nur einen Eintrag des level_1 an, deshalb immer true&lt;br /&gt;
		);	&lt;br /&gt;
		&lt;br /&gt;
		// als Unterseite von level_0 zuweisen &lt;br /&gt;
		$objNav-&amp;gt;arrSubpages[$GLOBALS['objPage']-&amp;gt;id][] = $objDesigner-&amp;gt;alias.'-'.$objDesigner-&amp;gt;id;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// level_2 Einträge einfügen&lt;br /&gt;
		$objCats = $this-&amp;gt;Database-&amp;gt;prepare('SELECT category,categoryAlias FROM tl_brand_product WHERE pid=? AND published=? GROUP BY category')-&amp;gt;execute($objDesigner-&amp;gt;id,'1');&lt;br /&gt;
		while($objCats-&amp;gt;next())&lt;br /&gt;
		{&lt;br /&gt;
			// Seite in den Navigations-Pool hinzufügen&lt;br /&gt;
			$objNav-&amp;gt;arrItems[$objDesigner-&amp;gt;id.'-'.$objCats-&amp;gt;categoryAlias] = array&lt;br /&gt;
			(&lt;br /&gt;
				'link'	=&amp;gt; $objCats-&amp;gt;category,&lt;br /&gt;
				'href'  =&amp;gt; $this-&amp;gt;generateFrontendUrl($GLOBALS['objPage']-&amp;gt;row(),'/'.$objDesigner-&amp;gt;alias.'/'.$objCats-&amp;gt;categoryAlias),&lt;br /&gt;
				'isTrail' =&amp;gt; (preg_match(&amp;quot;~&amp;quot;.preg_quote($objCats-&amp;gt;categoryAlias,'~').&amp;quot;(/.+|.html)$~i&amp;quot;,$this-&amp;gt;Environment-&amp;gt;request)) &lt;br /&gt;
			);	&lt;br /&gt;
			// Seite als Unterseite des level_1 Eitnrags zuweisen&lt;br /&gt;
			$objNav-&amp;gt;arrSubpages[$objDesigner-&amp;gt;alias.'-'.$objDesigner-&amp;gt;id][] = $objDesigner-&amp;gt;id.'-'.$objCats-&amp;gt;categoryAlias;&lt;br /&gt;
		} &lt;br /&gt;
		&lt;br /&gt;
		return $arrRoots;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/InKuerzeVerfuegbar</id>
		<title>InKuerzeVerfuegbar</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/InKuerzeVerfuegbar"/>
				<updated>2011-08-22T15:00:13Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* certo web &amp;amp; design GmbH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
&lt;br /&gt;
Um zu vermeiden, dass parallele Entwicklung unnötige Ressourcen benötigt, können Entwickler hier Erweiterung eintragen, die &amp;quot;in Kürze verfügbar&amp;quot; sein sollen.&lt;br /&gt;
&lt;br /&gt;
== ETES GmbH ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Jan Theofel, Marc Schneider, Sebastian Leitz&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@etes.de E-Mail] [http://www.etes.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* (Neues) Trackback-Modul für News (andere Features als das bestehende)&lt;br /&gt;
* (Neues) Gravatar-Modul (Gravatare auch für Kommentare etc.)&lt;br /&gt;
* Wordpress-Import (basiert auf den oberen beiden)&lt;br /&gt;
* htaccess-Erweiterung zur Konfiguration der zentralen .htaccess mit der Möglichkeit, dass Module dort per Hook eigene Definitionen einfügen können&lt;br /&gt;
* Erweiterungen für unsere Jobbörse (Onlinebewerbung/Bewertung von Bewerbern/Anbindung an Paymentsysteme)&lt;br /&gt;
&lt;br /&gt;
== certo web &amp;amp; design GmbH ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Yanick Witschi (aka Toflar)&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:yanick.witschi@certo-net.ch E-Mail] [http://www.certo-net.ch Webseite]&lt;br /&gt;
&lt;br /&gt;
* Votebox, Prinzip der Votebox von Dropbox&lt;br /&gt;
&lt;br /&gt;
== InfinitySoft - Innovative Softwarelösungen ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Tristan Lins (aka tril)&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:tristan.lins@infinitysoft.de E-Mail] [http://www.infinitysoft.de Webseite]&lt;br /&gt;
&lt;br /&gt;
zur Zeit nur Projektpflege oder kleine Erweiterungen. Große Projekte sind zur Zeit nicht in Entwicklung.&lt;br /&gt;
&lt;br /&gt;
== BugBuster ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Glen Langer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum] | [http://www.contao.Glen-Langer.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* [http://de.contaowiki.org/Replace_Language Replace Language] - mittlerweile fertig.&lt;br /&gt;
* Idee: moopeel - diese nette Ecke auf Mootoolsbasis (no Flash!)&lt;br /&gt;
* Idee: BotDetection Add-on: Suchmaschinen Statistik&lt;br /&gt;
* Idee: Mitglieder Gruppe erweitern, automatisch Enddatum setzen bei den Mitgliedern, Zeitraum wählbar für Gruppe&lt;br /&gt;
&lt;br /&gt;
== MEN AT WORK ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Andreas Isaak, David Maack&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:cms@men-at-work.de E-Mail]&lt;br /&gt;
&lt;br /&gt;
* recursiveDownload: Rekursive Downloads basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* recursiveGallery: Rekursive Galerie basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* [http://www.contao-forge.org/projects/synccto/issues syncCto]: Sychronisation vieler Contao-Installationen&lt;br /&gt;
* [http://www.contao-forge.org/projects/language2xml/issues language2xml]: Sprachtexte als XML exportieren und wieder importieren&lt;br /&gt;
* [http://www.contao-forge.org/projects/language4translation/issues language4translation]: Exportierte Sprachtexte im Frontend übersetzen und später wieder via language2xml importieren&lt;br /&gt;
* dashboard: Erweiterung der Dashboard Extension von Andreas Schempp&lt;br /&gt;
* [http://www.contao-forge.org/projects/copyright/issues copyright]: Copyright Hinweise ohne Änderungen am Template in den Header schreiben und in den Themes pflegen.&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/MultiColumnWizard.html MultiColumnWizard] Mit dem MultiColumnWizard können alle DCA-Feldtypen gemischt und gemeinsam in einer Konfiguration verwendet werden.&lt;br /&gt;
* [http://www.contao-forge.org/projects/backendfavourites backendFavourites] Favouriten/Sprungmarker für das Backend definieren&lt;br /&gt;
* [http://www.contao-forge.org/projects/zipdown zipdown] Dynamische Komprimierung (ZIP) von Dateien (Array als Rückgabewert)&lt;br /&gt;
&lt;br /&gt;
== Andreas Schempp ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Andreas Schempp&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:andreas@schempp.ch andreas@schempp.ch]&lt;br /&gt;
&lt;br /&gt;
* ajaxform: Formular per Ajax senden und Antwort per Ajax laden&lt;br /&gt;
* aliascompiler: Seitenalias aus Prefix und Postfix zusammenfügen (z.B. damit der Anwender nur Postfix bearbeiten kann)&lt;br /&gt;
* articlelanguage: Artikel in einer zweiten Sprache zur Verfügung stellen&lt;br /&gt;
* autocompletetextfield: Feld das Vorschläge für Eingabe (z.B. Tags) macht&lt;br /&gt;
* barcode: Generierung von QRcode und MS Tag Bildern&lt;br /&gt;
* blog: Umfangreiche Blog-Funktionen (ProofOfConcept)&lt;br /&gt;
* documentsearch: Dokumente (PDF, DOC, PPT, XLS) in die Contao-Suche aufnehmen (erfordert Server-Binaries)&lt;br /&gt;
* e2photogallery: Contao Extension für die [http://www.e2interactive.com/e2_photo_gallery/ e2 Photo Gallery]&lt;br /&gt;
* exams: Ein- oder mehrseitige Prüfungen mit Punkte-System und Resultat-Auswertung&lt;br /&gt;
* fancyavatar: Avatar mittels Ajax hochladen und zuschneiden&lt;br /&gt;
* folderpage: Ordner-Seiten zur Gruppierung der Seitenstruktur&lt;br /&gt;
* htmlpurifier: Integration des [http://htmlpurifier.org/ HTML Purifier] in Contao&lt;br /&gt;
* importoption: Options-Daten für Formularfelder (Select, Radio, Checkbox) aus CSV importieren&lt;br /&gt;
* joomlaboard_import: JoomlaBoard in Contao Helpdesk Erweiterung migrieren&lt;br /&gt;
* member_album: Fotoalbum für Mitglieder anlegen&lt;br /&gt;
* memberfiles: Zeigt im Backend die Dateien aus dem Benutzerverzeichnis zum Download an&lt;br /&gt;
* mobile_stylesheets: Stylesheet-Targeting für iPhone, iPad und Co&lt;br /&gt;
* news_loader: Lädt beim Scrollen der Seite automatisch die nächsten News nach&lt;br /&gt;
* newsalert: Automatische Newsletter aus News-Archiven&lt;br /&gt;
* newscategories: Kategorisierung und Auflistung von News-Beiträgen (über Archive hinweg)&lt;br /&gt;
* newsletter-article: Newsletter aus Artikel generieren&lt;br /&gt;
* openid-consumer: Anmelden bei Contao mittels OpenID (sehr altes Modul...)&lt;br /&gt;
* pagepdf: PDF aus Seite generieren, oder Seiten im Backend direkt als PDF ausgeben (via kostenpflichtigem [http://html2pdf.seven49.net/ HTML2PDF]&lt;br /&gt;
* previewdownload: Download-Datei mit Vorschau. Kann automatisch aus PDF ein Bild generieren, wenn imagemagick verfügbar ist.&lt;br /&gt;
* qtplayer: Quicktime-Video und -Audio Dateien einbinden&lt;br /&gt;
* rootsearch: Suche über mehrere Root-Seiten&lt;br /&gt;
* shibboleth: Anmeldung an Contao mittels [http://de.wikipedia.org/wiki/Shibboleth_(Internet) Shibboleth]&lt;br /&gt;
* singlegallery: Gibt das erste Galeriebild aus, erlaubt die Navigation in der lightbox/mediabox zu den restlichen Bildern&lt;br /&gt;
* siximages: Galerie-Modul von [http://www.soleil-royal.ch/lage.html Soleil Royal]&lt;br /&gt;
* z_modulealias: Alias-Modul welches andere Module automatisch entsprechend der aktiven Seite einbindet (praktisch für mehrsprachige Seiten)&lt;br /&gt;
* zz_compressor: Automatische Komprimierung und Zusammeführung ALLER lokalen CSS- und JS-Dateien auf der Seite&lt;br /&gt;
&lt;br /&gt;
== Küstenschmiede - Ideen, Software &amp;amp; Design ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Jürgen Witte, Matthias Eilers&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:info@kuestenschmiede.de E-Mail] [http://www.kuestenschmiede.info Webseite]&lt;br /&gt;
&lt;br /&gt;
* cfs_maps: OpenLayers-Integration zur Anzeige von OpenStreetMap und Bing-Maps (u.a.) als Inhaltselement und Frontend-Modul - fertig seit 07/2011 ab Contao 2.10 RC1&lt;br /&gt;
&lt;br /&gt;
== hofemich ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Michael Hofer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum]&lt;br /&gt;
&lt;br /&gt;
* isotope_request: Ermöglicht die Verknüpfung mit einem Formular, für Produkt-Anfragen&lt;br /&gt;
&lt;br /&gt;
== Cliff Parnitzky ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Cliff Parnitzky&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@cliff-parnitzky.de contao@cliff-parnitzky.de]&lt;br /&gt;
&lt;br /&gt;
* BirthdayMailer: Schickt eine Geburtstagsmail an die Mitglieder konfigurierter Mitgliedergruppen, die am aktuellen Tag Geburtstag haben.&lt;br /&gt;
* ExtendedListing: Erweitert das Listing Modul um die Möglichkeit, Tabellen miteinander zu verknüpfen (SQL JOIN)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/InKuerzeVerfuegbar</id>
		<title>InKuerzeVerfuegbar</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/InKuerzeVerfuegbar"/>
				<updated>2011-08-22T14:59:57Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* certo web &amp;amp; design GmbH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
&lt;br /&gt;
Um zu vermeiden, dass parallele Entwicklung unnötige Ressourcen benötigt, können Entwickler hier Erweiterung eintragen, die &amp;quot;in Kürze verfügbar&amp;quot; sein sollen.&lt;br /&gt;
&lt;br /&gt;
== ETES GmbH ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Jan Theofel, Marc Schneider, Sebastian Leitz&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@etes.de E-Mail] [http://www.etes.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* (Neues) Trackback-Modul für News (andere Features als das bestehende)&lt;br /&gt;
* (Neues) Gravatar-Modul (Gravatare auch für Kommentare etc.)&lt;br /&gt;
* Wordpress-Import (basiert auf den oberen beiden)&lt;br /&gt;
* htaccess-Erweiterung zur Konfiguration der zentralen .htaccess mit der Möglichkeit, dass Module dort per Hook eigene Definitionen einfügen können&lt;br /&gt;
* Erweiterungen für unsere Jobbörse (Onlinebewerbung/Bewertung von Bewerbern/Anbindung an Paymentsysteme)&lt;br /&gt;
&lt;br /&gt;
== certo web &amp;amp; design GmbH ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Yanick Witschi (aka Toflar)&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:yanick.witschi@certo-net.ch E-Mail] [http://www.certo-net.ch Webseite]&lt;br /&gt;
&lt;br /&gt;
* Votebox, Prinzip der Dropbox&lt;br /&gt;
&lt;br /&gt;
== InfinitySoft - Innovative Softwarelösungen ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Tristan Lins (aka tril)&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:tristan.lins@infinitysoft.de E-Mail] [http://www.infinitysoft.de Webseite]&lt;br /&gt;
&lt;br /&gt;
zur Zeit nur Projektpflege oder kleine Erweiterungen. Große Projekte sind zur Zeit nicht in Entwicklung.&lt;br /&gt;
&lt;br /&gt;
== BugBuster ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Glen Langer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum] | [http://www.contao.Glen-Langer.de/ Webseite]&lt;br /&gt;
&lt;br /&gt;
* [http://de.contaowiki.org/Replace_Language Replace Language] - mittlerweile fertig.&lt;br /&gt;
* Idee: moopeel - diese nette Ecke auf Mootoolsbasis (no Flash!)&lt;br /&gt;
* Idee: BotDetection Add-on: Suchmaschinen Statistik&lt;br /&gt;
* Idee: Mitglieder Gruppe erweitern, automatisch Enddatum setzen bei den Mitgliedern, Zeitraum wählbar für Gruppe&lt;br /&gt;
&lt;br /&gt;
== MEN AT WORK ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Andreas Isaak, David Maack&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:cms@men-at-work.de E-Mail]&lt;br /&gt;
&lt;br /&gt;
* recursiveDownload: Rekursive Downloads basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* recursiveGallery: Rekursive Galerie basierend auf dem Benutzerverzeichnis&lt;br /&gt;
* [http://www.contao-forge.org/projects/synccto/issues syncCto]: Sychronisation vieler Contao-Installationen&lt;br /&gt;
* [http://www.contao-forge.org/projects/language2xml/issues language2xml]: Sprachtexte als XML exportieren und wieder importieren&lt;br /&gt;
* [http://www.contao-forge.org/projects/language4translation/issues language4translation]: Exportierte Sprachtexte im Frontend übersetzen und später wieder via language2xml importieren&lt;br /&gt;
* dashboard: Erweiterung der Dashboard Extension von Andreas Schempp&lt;br /&gt;
* [http://www.contao-forge.org/projects/copyright/issues copyright]: Copyright Hinweise ohne Änderungen am Template in den Header schreiben und in den Themes pflegen.&lt;br /&gt;
* [http://www.contao.org/erweiterungsliste/view/MultiColumnWizard.html MultiColumnWizard] Mit dem MultiColumnWizard können alle DCA-Feldtypen gemischt und gemeinsam in einer Konfiguration verwendet werden.&lt;br /&gt;
* [http://www.contao-forge.org/projects/backendfavourites backendFavourites] Favouriten/Sprungmarker für das Backend definieren&lt;br /&gt;
* [http://www.contao-forge.org/projects/zipdown zipdown] Dynamische Komprimierung (ZIP) von Dateien (Array als Rückgabewert)&lt;br /&gt;
&lt;br /&gt;
== Andreas Schempp ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Andreas Schempp&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:andreas@schempp.ch andreas@schempp.ch]&lt;br /&gt;
&lt;br /&gt;
* ajaxform: Formular per Ajax senden und Antwort per Ajax laden&lt;br /&gt;
* aliascompiler: Seitenalias aus Prefix und Postfix zusammenfügen (z.B. damit der Anwender nur Postfix bearbeiten kann)&lt;br /&gt;
* articlelanguage: Artikel in einer zweiten Sprache zur Verfügung stellen&lt;br /&gt;
* autocompletetextfield: Feld das Vorschläge für Eingabe (z.B. Tags) macht&lt;br /&gt;
* barcode: Generierung von QRcode und MS Tag Bildern&lt;br /&gt;
* blog: Umfangreiche Blog-Funktionen (ProofOfConcept)&lt;br /&gt;
* documentsearch: Dokumente (PDF, DOC, PPT, XLS) in die Contao-Suche aufnehmen (erfordert Server-Binaries)&lt;br /&gt;
* e2photogallery: Contao Extension für die [http://www.e2interactive.com/e2_photo_gallery/ e2 Photo Gallery]&lt;br /&gt;
* exams: Ein- oder mehrseitige Prüfungen mit Punkte-System und Resultat-Auswertung&lt;br /&gt;
* fancyavatar: Avatar mittels Ajax hochladen und zuschneiden&lt;br /&gt;
* folderpage: Ordner-Seiten zur Gruppierung der Seitenstruktur&lt;br /&gt;
* htmlpurifier: Integration des [http://htmlpurifier.org/ HTML Purifier] in Contao&lt;br /&gt;
* importoption: Options-Daten für Formularfelder (Select, Radio, Checkbox) aus CSV importieren&lt;br /&gt;
* joomlaboard_import: JoomlaBoard in Contao Helpdesk Erweiterung migrieren&lt;br /&gt;
* member_album: Fotoalbum für Mitglieder anlegen&lt;br /&gt;
* memberfiles: Zeigt im Backend die Dateien aus dem Benutzerverzeichnis zum Download an&lt;br /&gt;
* mobile_stylesheets: Stylesheet-Targeting für iPhone, iPad und Co&lt;br /&gt;
* news_loader: Lädt beim Scrollen der Seite automatisch die nächsten News nach&lt;br /&gt;
* newsalert: Automatische Newsletter aus News-Archiven&lt;br /&gt;
* newscategories: Kategorisierung und Auflistung von News-Beiträgen (über Archive hinweg)&lt;br /&gt;
* newsletter-article: Newsletter aus Artikel generieren&lt;br /&gt;
* openid-consumer: Anmelden bei Contao mittels OpenID (sehr altes Modul...)&lt;br /&gt;
* pagepdf: PDF aus Seite generieren, oder Seiten im Backend direkt als PDF ausgeben (via kostenpflichtigem [http://html2pdf.seven49.net/ HTML2PDF]&lt;br /&gt;
* previewdownload: Download-Datei mit Vorschau. Kann automatisch aus PDF ein Bild generieren, wenn imagemagick verfügbar ist.&lt;br /&gt;
* qtplayer: Quicktime-Video und -Audio Dateien einbinden&lt;br /&gt;
* rootsearch: Suche über mehrere Root-Seiten&lt;br /&gt;
* shibboleth: Anmeldung an Contao mittels [http://de.wikipedia.org/wiki/Shibboleth_(Internet) Shibboleth]&lt;br /&gt;
* singlegallery: Gibt das erste Galeriebild aus, erlaubt die Navigation in der lightbox/mediabox zu den restlichen Bildern&lt;br /&gt;
* siximages: Galerie-Modul von [http://www.soleil-royal.ch/lage.html Soleil Royal]&lt;br /&gt;
* z_modulealias: Alias-Modul welches andere Module automatisch entsprechend der aktiven Seite einbindet (praktisch für mehrsprachige Seiten)&lt;br /&gt;
* zz_compressor: Automatische Komprimierung und Zusammeführung ALLER lokalen CSS- und JS-Dateien auf der Seite&lt;br /&gt;
&lt;br /&gt;
== Küstenschmiede - Ideen, Software &amp;amp; Design ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Jürgen Witte, Matthias Eilers&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:info@kuestenschmiede.de E-Mail] [http://www.kuestenschmiede.info Webseite]&lt;br /&gt;
&lt;br /&gt;
* cfs_maps: OpenLayers-Integration zur Anzeige von OpenStreetMap und Bing-Maps (u.a.) als Inhaltselement und Frontend-Modul - fertig seit 07/2011 ab Contao 2.10 RC1&lt;br /&gt;
&lt;br /&gt;
== hofemich ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Michael Hofer&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [http://www.contao-community.de/ Forum]&lt;br /&gt;
&lt;br /&gt;
* isotope_request: Ermöglicht die Verknüpfung mit einem Formular, für Produkt-Anfragen&lt;br /&gt;
&lt;br /&gt;
== Cliff Parnitzky ==&lt;br /&gt;
&lt;br /&gt;
Entwickler: Cliff Parnitzky&lt;br /&gt;
&lt;br /&gt;
Entwicklerkontakt: [mailto:contao@cliff-parnitzky.de contao@cliff-parnitzky.de]&lt;br /&gt;
&lt;br /&gt;
* BirthdayMailer: Schickt eine Geburtstagsmail an die Mitglieder konfigurierter Mitgliedergruppen, die am aktuellen Tag Geburtstag haben.&lt;br /&gt;
* ExtendedListing: Erweitert das Listing Modul um die Möglichkeit, Tabellen miteinander zu verknüpfen (SQL JOIN)&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Backboneit_navigation</id>
		<title>Backboneit navigation</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Backboneit_navigation"/>
				<updated>2011-07-07T11:31:23Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: Hook-Registrierung in config.php korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Module]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Version=Alle Versionen&lt;br /&gt;
|Ext1=backboneit_navigation}}&lt;br /&gt;
&lt;br /&gt;
= backboneit_navigation =&lt;br /&gt;
&lt;br /&gt;
Erweiterung bestehend aus einer Sammlung von Navigationselementen (vorerst nur ein erweitertes Navigationsmodul).&lt;br /&gt;
&lt;br /&gt;
ER: http://www.contao.org/erweiterungsliste/view/backboneit_navigation.10000009.de.html&lt;br /&gt;
&lt;br /&gt;
Anmerkungen zum Bestimmen der Sichtbarkeit einer Seite:&lt;br /&gt;
* Der Veröffentlichungsstatus gilt ausschließlich für eine Seite selbst. Das heißt zum Beispiel, dass eine Navigation durchaus dargestellt wird, selbst wenn die Referenzseite nicht veröffentlicht ist.&lt;br /&gt;
* Der Seitenschutz für bestimmte Mitgliedergruppen vererbt sich auf alle Unterseiten, außer denjenigen die selbst explizit einen Seitenschutz für Mitgliedergruppen definieren und derren Unterseiten.&lt;br /&gt;
* Die Einstellung &amp;quot;Nur Gästen anzeigen&amp;quot; gilt nur für die Seite selbst. Tatsächlich ist die Seite für angemeldete Benutzer auch noch verfügbar, soll nur in keiner Navigation angezeigt werden. (Anders als zum Beispiel Artikel, die nur Gästen angezeigt werden. Diese werden gar nicht mehr gerendert.)&lt;br /&gt;
* &amp;quot;Im Menü verstecken&amp;quot; gilt nur für die Seite selbst.&lt;br /&gt;
&lt;br /&gt;
== Navigationsmenü ==&lt;br /&gt;
&lt;br /&gt;
Ein Multitalent: Es ist alles möglich was mit einem Navigationsmenü oder einer Individuellen Navigation möglich ist, Kombinationen aus beiden und noch einiges mehr. Einfach ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Funktionen:&lt;br /&gt;
* Kompatibel zu den Templates für das Standard-Navigationsmenü (einziger Unterschied ist, das Seiten die CSS-Klasse &amp;quot;submenu&amp;quot; tatsächlich auch nur dann bekommen, wenn dieses Untermenü gerendert wird)&lt;br /&gt;
* Mehrere Referenzseiten (Wurzeln der Navigation)&lt;br /&gt;
* Aktuelle Seite als Referenzseite&lt;br /&gt;
* Startebene wird relativ zu den Referenzseiten berechnet (negative Startebene möglich)&lt;br /&gt;
* Hardlimit flexibel (Anmerkung: Stopebene und Hardlimit beziehen sich relativ zur Startebene &amp;amp;endash; diessollte auch durch die geänderten Labels der Moduleinstellungen hervorgehen.&lt;br /&gt;
* Versteckte und geschützte Seiten anzeigen&lt;br /&gt;
* Als Sitemap verwendbar&lt;br /&gt;
* Optimierte Algorithmen: Zum Beispiel wird pro Navigationsebene nur noch eine Datenbankabfrage durchgeführt, was vorallem bei einer sehr verzweigten Navigation Vorteile bringen sollte.&lt;br /&gt;
* Erweiterbar per Hook&lt;br /&gt;
&lt;br /&gt;
=== Navigation per Hook erweitern ===&lt;br /&gt;
config.php&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
$GLOBALS['TL_HOOKS']['backboneit_navigation_menu'][] = array('MyNavigationHook', 'hook');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyNavigationHook.php&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
class MyNavigationHook {&lt;br /&gt;
&lt;br /&gt;
  // ... singleton dummy code ...&lt;br /&gt;
&lt;br /&gt;
  public function hook($objThis, $arrRoots) {&lt;br /&gt;
    $intParentID = 1; // the ID of the parent node, were your new node should be appended/inserted to.&lt;br /&gt;
&lt;br /&gt;
    if(!isset($objThis-&amp;gt;arrItems[$intParentID])) // test if the parent should be rendered (to avoid my hook, if it is not needed)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    $strMyNewNodeID = 'MyNavigationHook' . 1; // to avoid collision do not use plain numbers (reservered for tl_page dataset IDs)&lt;br /&gt;
    // and prefix the ID with something specific to your hook&lt;br /&gt;
&lt;br /&gt;
    $objThis-&amp;gt;arrSubpages[$intParentID][] = $strMyNewNodeID; // append the my new node to the end of $intParentIDs childs&lt;br /&gt;
    $arrRoots[] = $strMyNewNodeID; // additionally add my new node to the end of the first level&lt;br /&gt;
&lt;br /&gt;
    $objThis-&amp;gt;arrItems[$strMyNewNodeID] = array(&lt;br /&gt;
      'class' =&amp;gt; 'myclass',&lt;br /&gt;
      'active' =&amp;gt; true,&lt;br /&gt;
      // ... more rendering information for the navigation template ...&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    global $objPage;&lt;br /&gt;
    $objThis-&amp;gt;arrItems[$objPage-&amp;gt;id]['active'] = false; // unset active state of current page&lt;br /&gt;
&lt;br /&gt;
    return $arrRoots; // return the modified first navigation level (not needed if unmodified)&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-03-21T13:52:39Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Angabe mit columnsData */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[en:MultiSelectWizard]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.1.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs untereinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'columnwithforeignkey',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['columnwithforeignkey'],&lt;br /&gt;
								'source' =&amp;gt; 'tl_table.column'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Javascript-Fallback==&lt;br /&gt;
Falls kein Javascript vorhanden ist, werden die Modifikationen (hinzufügen, löschen etc.) manuell ausgeführt. Viele Widgets führen dabei eine Datenbankoperation aus, was zwar in 99.9% aller Fälle korrekt ist, jedoch gibt es auch Ausnahmen, wie z.B. die Speicherung in der localconfig.php.&lt;br /&gt;
Der MultiSelectWizard unterstützt sowohl die localconfig.php als auch eine beliebige Routine, welche per Callback definiert werden kann.&lt;br /&gt;
&lt;br /&gt;
===localconfig.php===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'eval'	=&amp;gt; array('storeInLocalConfig'=&amp;gt;true)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beliebige Routine===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'eval'	=&amp;gt; array('storeCallback'=&amp;gt;array('MyClass','MyMethod'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class MyClass extends Backend&lt;br /&gt;
{&lt;br /&gt;
   public function MyMethod($objWidget)&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
In der Erweiterung wurden auch Helper-Methoden eingebaut, die man verwenden kann.&lt;br /&gt;
&lt;br /&gt;
===getByKey===&lt;br /&gt;
Die einfachere Methode ist mittels '''&amp;lt;code&amp;gt;MultiSelectWizard::getByKey($strSerialized, $strKey)&amp;lt;/code&amp;gt;'''. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und man bekommt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getByKey($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getFilteredByKey (AND Verknüpfung)===&lt;br /&gt;
Die etwas kompliziertere Methode ist mit '''&amp;lt;code&amp;gt;MultiSelectWizard::getFilteredByKey($strSerialized, $strKey, $arrAnotherKey)&amp;lt;/code&amp;gt;'''. Der Anfang ist genau gleich: Man übergibt einen serialisierter Wert und Key. Dann kommt ein Array, mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn man also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutzt man die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getFilteredByKey($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;. Als Rückgabe erhält man nur diejenigen Werte, die mit '''allen''' Filterparametern übereinstimmen.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-03-21T13:21:44Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[en:MultiSelectWizard]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.1.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs untereinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'columnwithforeignkey',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['columnwithforeignkey'],&lt;br /&gt;
								'source' =&amp;gt; 'tl_table.column'&lt;br /&gt;
						)&lt;br /&gt;
					)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Javascript-Fallback==&lt;br /&gt;
Falls kein Javascript vorhanden ist, werden die Modifikationen (hinzufügen, löschen etc.) manuell ausgeführt. Viele Widgets führen dabei eine Datenbankoperation aus, was zwar in 99.9% aller Fälle korrekt ist, jedoch gibt es auch Ausnahmen, wie z.B. die Speicherung in der localconfig.php.&lt;br /&gt;
Der MultiSelectWizard unterstützt sowohl die localconfig.php als auch eine beliebige Routine, welche per Callback definiert werden kann.&lt;br /&gt;
&lt;br /&gt;
===localconfig.php===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'eval'	=&amp;gt; array('storeInLocalConfig'=&amp;gt;true)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beliebige Routine===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'eval'	=&amp;gt; array('storeCallback'=&amp;gt;array('MyClass','MyMethod'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class MyClass extends Backend&lt;br /&gt;
{&lt;br /&gt;
   public function MyMethod($objWidget)&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
In der Erweiterung wurden auch Helper-Methoden eingebaut, die man verwenden kann.&lt;br /&gt;
&lt;br /&gt;
===getByKey===&lt;br /&gt;
Die einfachere Methode ist mittels '''&amp;lt;code&amp;gt;MultiSelectWizard::getByKey($strSerialized, $strKey)&amp;lt;/code&amp;gt;'''. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und man bekommt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getByKey($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getFilteredByKey (AND Verknüpfung)===&lt;br /&gt;
Die etwas kompliziertere Methode ist mit '''&amp;lt;code&amp;gt;MultiSelectWizard::getFilteredByKey($strSerialized, $strKey, $arrAnotherKey)&amp;lt;/code&amp;gt;'''. Der Anfang ist genau gleich: Man übergibt einen serialisierter Wert und Key. Dann kommt ein Array, mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn man also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutzt man die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getFilteredByKey($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;. Als Rückgabe erhält man nur diejenigen Werte, die mit '''allen''' Filterparametern übereinstimmen.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-02-25T07:22:37Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[en:MultiSelectWizard]]&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.0.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs nebeneinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
In der Erweiterung wurden auch Helper-Methoden eingebaut, die man verwenden kann.&lt;br /&gt;
&lt;br /&gt;
===getByKey===&lt;br /&gt;
Die einfachere Methode ist mittels '''&amp;lt;code&amp;gt;MultiSelectWizard::getByKey($strSerialized, $strKey)&amp;lt;/code&amp;gt;'''. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und man bekommt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getByKey($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getFilteredByKey===&lt;br /&gt;
Die etwas kompliziertere Methode ist mit '''&amp;lt;code&amp;gt;MultiSelectWizard::getFilteredByKey($strSerialized, $strKey, $arrAnotherKey)&amp;lt;/code&amp;gt;'''. Der Anfang ist genau gleich: Man übergibt einen serialisierter Wert und Key. Dann kommt ein Array, mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn man also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutzt man die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getFilteredByKey($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich kann man auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-02-23T18:51:42Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($strSerialized, $strKey, $arrAnotherKey) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.0.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs nebeneinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
Da ich Fan von wiederverwendbarem Code und somit von der faulen Garde bin, hab ich selbstverständlich auch Helper-Methoden eingebaut, die ihr verwenden könnt.&lt;br /&gt;
Sorry, ich konnte die Methoden irgendwie nicht kürzer benennen :D&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getByKey($strSerialized, $strKey)===&lt;br /&gt;
Die einfachere Methode. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und ihr kriegt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getByKey($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getFilteredByKey($strSerialized, $strKey, $arrAnotherKey)===&lt;br /&gt;
Dies ist die etwas kompliziertere Methode. Der Anfang ist genau gleich: Serialisierter Wert und Key übergeben. Dann kommt ein Array mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn ich also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutze ich die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getFilteredByKey($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich könnt ihr auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-02-23T18:51:25Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* MultiSelectWizard::getArrayByKeyFromSerializedData($strSerialized, $strKey) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.0.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs nebeneinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
Da ich Fan von wiederverwendbarem Code und somit von der faulen Garde bin, hab ich selbstverständlich auch Helper-Methoden eingebaut, die ihr verwenden könnt.&lt;br /&gt;
Sorry, ich konnte die Methoden irgendwie nicht kürzer benennen :D&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getByKey($strSerialized, $strKey)===&lt;br /&gt;
Die einfachere Methode. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und ihr kriegt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getByKey($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($strSerialized, $strKey, $arrAnotherKey)===&lt;br /&gt;
Dies ist die etwas kompliziertere Methode. Der Anfang ist genau gleich: Serialisierter Wert und Key übergeben. Dann kommt ein Array mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn ich also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutze ich die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich könnt ihr auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-02-23T18:25:15Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.0.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/MultiSelectWizard.html&lt;br /&gt;
| TrackerLink=http://contao-forge.org/projects/multiselectwizard&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs nebeneinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
Da ich Fan von wiederverwendbarem Code und somit von der faulen Garde bin, hab ich selbstverständlich auch Helper-Methoden eingebaut, die ihr verwenden könnt.&lt;br /&gt;
Sorry, ich konnte die Methoden irgendwie nicht kürzer benennen :D&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getArrayByKeyFromSerializedData($strSerialized, $strKey)===&lt;br /&gt;
Die einfachere Methode. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und ihr kriegt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getArrayByKeyFromSerializedData($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($strSerialized, $strKey, $arrAnotherKey)===&lt;br /&gt;
Dies ist die etwas kompliziertere Methode. Der Anfang ist genau gleich: Serialisierter Wert und Key übergeben. Dann kommt ein Array mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn ich also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutze ich die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich könnt ihr auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/MultiSelectWizard</id>
		<title>MultiSelectWizard</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/MultiSelectWizard"/>
				<updated>2011-02-23T18:07:22Z</updated>
		
		<summary type="html">&lt;p&gt;Toflar: /* Angabe mit Callback */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Extensions]]&lt;br /&gt;
{{ExtInfo&lt;br /&gt;
| Dev=Yanick Witschi&lt;br /&gt;
| DevSite=http://www.certo-net.ch&lt;br /&gt;
| ExtVersion=1.0.0&lt;br /&gt;
| Version=2.9.0 - 2.9.3&lt;br /&gt;
| TLVersion=2.7.0 - 2.8.4&lt;br /&gt;
| ERLink=http://www.contao.org/erweiterungsliste/view/catalog.html&lt;br /&gt;
| DonateLink=http://www.cyberspectrum.de/spendmegoodies.html&lt;br /&gt;
| TrackerLink=http://code.google.com/p/typolight-catalog/issues/list&lt;br /&gt;
| Depending=[[Taxonomy]] [[backend_filterwiz]]&lt;br /&gt;
| Comment=Demo: [http://catalogdemo.dasprojekt.org/ Catalog Demo]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Widget ist dafür gedacht, mehrere Select-Inputs nebeneinander zu definieren.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Widget ist eigentlich das gleiche wie der [[MultiTextWizard]], jedoch mit Dropdown-Feldern.&lt;br /&gt;
&lt;br /&gt;
=Aussehen=&lt;br /&gt;
Das Modul sieht haargenau gleich aus wie der ModuleWizard vom Contao-Core. Das Problem bei diesem Wizard ist nur, dass die Quellen alle hardgecodet sind und es deshalb für Drittentwickler unbrauchbar ist.&lt;br /&gt;
[[Datei:MultiSelectWizard.png|MultiSelectWizard|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Verwendung=&lt;br /&gt;
Es gibt zwei Verwendungsmöglichkeiten. Entweder direkt mit der Angabe von &amp;quot;columnsData&amp;quot; im &amp;quot;eval&amp;quot;-Array oder mit einem Callback.&lt;br /&gt;
&lt;br /&gt;
==Angabe mit columnsData==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
	'label'          =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
	'exclude'	 =&amp;gt; true,&lt;br /&gt;
	'inputType'	 =&amp;gt; 'multiSelectWizard',&lt;br /&gt;
	'eval'		 =&amp;gt; array&lt;br /&gt;
				   (&lt;br /&gt;
				   		'mandatory'=&amp;gt;true,&lt;br /&gt;
				   		'columnsData'=&amp;gt; array&lt;br /&gt;
						(&lt;br /&gt;
							'columns' =&amp;gt; array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'language',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['mylanguagelabel'],&lt;br /&gt;
								'source' =&amp;gt; $this-&amp;gt;getLanguages(),&lt;br /&gt;
								'style' =&amp;gt; 'width:200px'&lt;br /&gt;
							),&lt;br /&gt;
							array&lt;br /&gt;
							(&lt;br /&gt;
								'key'	=&amp;gt; 'secondcolumn',&lt;br /&gt;
								'label' =&amp;gt; $GLOBALS['TL_LANG']['MSC']['secondcolumn'],&lt;br /&gt;
								'source' =&amp;gt; array&lt;br /&gt;
								(&lt;br /&gt;
									'option1'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option1'],&lt;br /&gt;
									'option2'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option2'],&lt;br /&gt;
									'option3'	=&amp;gt; $GLOBALS['TL_LANG']['MSC']['option3']&lt;br /&gt;
								),&lt;br /&gt;
								'style' =&amp;gt; 'width:100px'&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;
==Angabe mit Callback==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_table']['fields']['anything'] = array&lt;br /&gt;
(&lt;br /&gt;
		'label'                 =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_table']['anything'],&lt;br /&gt;
		'exclude'		=&amp;gt; true,&lt;br /&gt;
		'inputType'		=&amp;gt; 'multiSelectWizard',&lt;br /&gt;
		'eval'			=&amp;gt; array('mandatory'=&amp;gt;true,'columnsCallback'=&amp;gt;array('Class', 'Method'))&lt;br /&gt;
										&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei natürlich der Return-Wert genau das selbe Array sein muss, wie bei der &amp;quot;columnsData&amp;quot;-Variante.&lt;br /&gt;
&lt;br /&gt;
==Helper Methoden==&lt;br /&gt;
Da ich Fan von wiederverwendbarem Code und somit von der faulen Garde bin, hab ich selbstverständlich auch Helper-Methoden eingebaut, die ihr verwenden könnt.&lt;br /&gt;
Sorry, ich konnte die Methoden irgendwie nicht kürzer benennen :D&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getArrayByKeyFromSerializedData($strSerialized, $strKey)===&lt;br /&gt;
Die einfachere Methode. Einfach den serialisierten Wert aus der Datenbank plus den gewünschten Key mitgeben (im obigen Beispiel z.B. &amp;quot;language&amp;quot;) und ihr kriegt ein aggregiertes Array mit allen Werten von dieser Spalte.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguages = MultiSelectWizard::getArrayByKeyFromSerializedData($obj-&amp;gt;myField, 'language');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($strSerialized, $strKey, $arrAnotherKey)===&lt;br /&gt;
Dies ist die etwas kompliziertere Methode. Der Anfang ist genau gleich: Serialisierter Wert und Key übergeben. Dann kommt ein Array mit dessen Hilfe man Return-Werte filtern kann.&lt;br /&gt;
Wenn ich also alle Sprachen möchte, die in der &amp;quot;secondcolumn&amp;quot; den Wert &amp;quot;option2&amp;quot; haben, nutze ich die Methode wie folgt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arrLanguagesOption2 = MultiSelectWizard::getArrayByKeyMatchinAnotherKeyFromSerializedData($obj-&amp;gt;myField, 'language', array('secondcolumn'=&amp;gt;'option2'));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich könnt ihr auch mehrere Filterangaben mitgeben. Einfach immer im Stil von &amp;quot;column_key&amp;quot; =&amp;gt; &amp;quot;source_value&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Toflar</name></author>	</entry>

	</feed>