<?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/index.php?action=history&amp;feed=atom&amp;title=TEE-06_Backend_Callbacks_und_Subpaletten</id>
		<title>TEE-06 Backend Callbacks und Subpaletten - Versionsgeschichte</title>
		<link rel="self" type="application/atom+xml" href="https://de.contaowiki.org/index.php?action=history&amp;feed=atom&amp;title=TEE-06_Backend_Callbacks_und_Subpaletten"/>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;action=history"/>
		<updated>2026-05-02T10:54:47Z</updated>
		<subtitle>Versionsgeschichte dieser Seite in Contao Community Documentation</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=3076&amp;oldid=prev</id>
		<title>Stefan.sl: Formatierung Geshi</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=3076&amp;oldid=prev"/>
				<updated>2011-02-05T18:12:34Z</updated>
		
		<summary type="html">&lt;p&gt;Formatierung Geshi&lt;/p&gt;
&lt;a href=&quot;https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;amp;diff=3076&amp;amp;oldid=1483&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>Stefan.sl</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1483&amp;oldid=prev</id>
		<title>Manitougs: div. Korrekturen</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1483&amp;oldid=prev"/>
				<updated>2010-07-13T17:52:01Z</updated>
		
		<summary type="html">&lt;p&gt;div. Korrekturen&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 13. Juli 2010, 17:52 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 64:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 64:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Das werde ich gleich für das Aktivieren einer Subpalette benötigen. Der Inhalt des Feldes in der Datenbank wird später nicht gebraucht, aber leider muss das Feld vorhanden sein, um es so nutzen zu können, wie ich es vorhabe.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Das werde ich gleich für das Aktivieren einer Subpalette benötigen. Der Inhalt des Feldes in der Datenbank wird später nicht gebraucht, aber leider muss das Feld vorhanden sein, um es so nutzen zu können, wie ich es vorhabe.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Für das ''password''-Feld habe ich ich vor, dass ein dort eingegebenes Passwort SHA1-gehasht in der Datenbank abgelegt wird, nicht im Klartext. Dabei wird ein eventuell schon &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;vorhandes &lt;/del&gt;Passwort natürlich überschrieben.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Für das ''password''-Feld habe ich ich vor, dass ein dort eingegebenes Passwort SHA1-gehasht in der Datenbank abgelegt wird, nicht im Klartext. Dabei wird ein eventuell schon &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;vorhandenes &lt;/ins&gt;Passwort natürlich überschrieben.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Um Fehleingaben zu verhindern, möchte ich eine Checkbox anzeigen, die defaultmäßig &amp;quot;aus&amp;quot; ist. Erst wenn die Checkbox aktiviert ist, soll per AJAX das Passwortfeld angezeigt werden.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Um Fehleingaben zu verhindern, möchte ich eine Checkbox anzeigen, die defaultmäßig &amp;quot;aus&amp;quot; ist. Erst wenn die Checkbox aktiviert ist, soll per AJAX das Passwortfeld angezeigt werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst fügen &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;die &lt;/del&gt;wir Definition für das Checkbox-Feld in die ''field''-Sektion des DCA-Records ein:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst fügen wir &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;die &lt;/ins&gt;Definition für das Checkbox-Feld in die ''field''-Sektion des DCA-Records ein:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PHP-Code:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PHP-Code:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 82:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 82:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;''submitOnChange'' bewirkt, dass das Formular neu geladen wird, wenn das Feld angeklickt wird&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;. &lt;/del&gt;nur dann wird das Passwortfeld nachgeladen.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;''submitOnChange'' bewirkt, dass das Formular neu geladen wird, wenn das Feld angeklickt wird&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; &lt;/ins&gt;nur dann wird das Passwortfeld nachgeladen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dafür benötigen wir eine sogenannte &amp;quot;Subpalette&amp;quot;. Die Checkbox (bei mir &amp;quot;resetpassword&amp;quot;) muss als &amp;quot;__selector__&amp;quot; angegeben werden im DCA-Record:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dafür benötigen wir eine sogenannte &amp;quot;Subpalette&amp;quot;. Die Checkbox (bei mir &amp;quot;resetpassword&amp;quot;) muss als &amp;quot;__selector__&amp;quot; angegeben werden im DCA-Record:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 119:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 119:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dies bedeutet, dass das Feld ''password'' in die Subpalette ''resetpassword'' eingeblendet wird, wenn ''resetpassword'' aktiviert ist. Wird es deaktiviert, verschwindet die Subpalette wieder.&amp;#160; &amp;#160; &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dies bedeutet, dass das Feld ''password'' in die Subpalette ''resetpassword'' eingeblendet wird, wenn ''resetpassword'' aktiviert ist. Wird es deaktiviert, verschwindet die Subpalette wieder.&amp;#160; &amp;#160; &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Datei:Attachment_016.png]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Datei:Attachment_016.png&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|Passwort Checkbox&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Datei:Attachment_017.png]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Datei:Attachment_017.png&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|Passwort neu eingeben&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Die Texte hierzu wurden in den Sprachfiles entsprechend erweitert und angepasst.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Die Texte hierzu wurden in den Sprachfiles entsprechend erweitert und angepasst.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 188:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 188:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Das Gerüst habe ich mir bei anderen Extensions &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;abgeschaut&lt;/del&gt;, es scheint zumindest klug zu sein, von ''Backend'' zu erben, und den Konstruktur zu überschreiben. Vielleicht ist es auch nicht nötig, ich habe es nicht probiert. Ob der ''load_callback'' Parameter übergeben bekommt, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;weiss &lt;/del&gt;ich nicht, aber ich benötige keinen Parameter.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Das Gerüst habe ich mir bei anderen Extensions &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ab geschaut&lt;/ins&gt;, es scheint zumindest klug zu sein, von ''Backend'' zu erben, und den Konstruktur zu überschreiben. Vielleicht ist es auch nicht nötig, ich habe es nicht probiert. Ob der ''load_callback'' Parameter übergeben bekommt, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;weiß &lt;/ins&gt;ich nicht, aber ich benötige keinen Parameter.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Der ''save_callback'' erhält den Wert des Feldes, das gespeichert werden soll ($var), und den DataContainer ($dc), der zu dem Formular gehört. Meist (wie auch hier) ist es DC_Table, der DataContainer für Datenbanktabellen.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Der ''save_callback'' erhält den Wert des Feldes, das gespeichert werden soll ($var), und den DataContainer ($dc), der zu dem Formular gehört. Meist (wie auch hier) ist es DC_Table, der DataContainer für Datenbanktabellen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 244:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 244:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Abschließend gebe ich den berechneten Hash zurück. Er wird dann in die Datenbank eingetragen.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Abschließend gebe ich den berechneten Hash zurück. Er wird dann in die Datenbank eingetragen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wichtiger Hinweis noch: ''load_callback'' und ''save_callback'' müssen doppelt geschachtelte Arrays sein, weil es mehrere Callbacks geben kann, die nacheinander aufgerufen werden&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;, der &lt;/del&gt;Feldwert wird jeweils durch alle durchgeschleust. Falls man aber z.B. einen ''onSubmitCallback'' für das ganze Formular vorgeben möchte, ist das nur ein einfaches Array mit Klassennamen und Methodenname, weil es hier nur einen Callback gibt. Das ist so leider in der Referenz der möglichen Callbacks nicht dokumentiert, und hat mir kurz graue Haare beschert.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wichtiger Hinweis noch: ''load_callback'' und ''save_callback'' müssen doppelt geschachtelte Arrays sein, weil es mehrere Callbacks geben kann, die nacheinander aufgerufen werden&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;. Der &lt;/ins&gt;Feldwert wird jeweils durch alle durchgeschleust. Falls man aber z.B. einen ''onSubmitCallback'' für das ganze Formular vorgeben möchte, ist das nur ein einfaches Array mit Klassennamen und Methodenname, weil es hier nur einen Callback gibt. Das ist so leider in der Referenz der möglichen Callbacks nicht dokumentiert, und hat mir kurz graue Haare beschert.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Damit ist das Backend-Modul für die Turnierpaar-Tabelle erstmal fertig.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Damit ist das Backend-Modul für die Turnierpaar-Tabelle erstmal fertig.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weiter wird es dann (endlich) mit dem Frontendmodul für die Turnierpaarliste gehen.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weiter wird es dann (endlich) mit dem Frontendmodul für die Turnierpaarliste gehen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key kunde29sql1:diff:version:1.11a:oldid:1431:newid:1483 --&gt;
&lt;/table&gt;</summary>
		<author><name>Manitougs</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1431&amp;oldid=prev</id>
		<title>Schnippsel: hat „TEE-06 Callbacks und Subpaletten“ nach „TEE-06 Backend Callbacks und Subpaletten“ verschoben:&amp;#32;Die Bennenungssystematik war nicht eingehalten.</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1431&amp;oldid=prev"/>
				<updated>2010-07-08T22:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;hat „&lt;a href=&quot;/index.php?title=TEE-06_Callbacks_und_Subpaletten&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;TEE-06 Callbacks und Subpaletten (Seite nicht vorhanden)&quot;&gt;TEE-06 Callbacks und Subpaletten&lt;/a&gt;“ nach „&lt;a href=&quot;/TEE-06_Backend_Callbacks_und_Subpaletten&quot; title=&quot;TEE-06 Backend Callbacks und Subpaletten&quot;&gt;TEE-06 Backend Callbacks und Subpaletten&lt;/a&gt;“ verschoben: Die Bennenungssystematik war nicht eingehalten.&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 8. Juli 2010, 22:57 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(kein Unterschied)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Schnippsel</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1398&amp;oldid=prev</id>
		<title>Schnippsel: Die Seite wurde neu angelegt: „{{stub}} Tagebuch einer Extension-Entwicklung Category:Tagebuch_einer_Extension-Entwicklung {{AppliesTo |Ext1=Extension Creator |TLVersion=ab TL 2.8}}  =Von C…“</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/index.php?title=TEE-06_Backend_Callbacks_und_Subpaletten&amp;diff=1398&amp;oldid=prev"/>
				<updated>2010-07-07T10:45:09Z</updated>
		
		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „{{stub}} Tagebuch einer Extension-Entwicklung &lt;a href=&quot;/Kategorie:Tagebuch_einer_Extension-Entwicklung&quot; title=&quot;Kategorie:Tagebuch einer Extension-Entwicklung&quot;&gt;Category:Tagebuch_einer_Extension-Entwicklung&lt;/a&gt; {{AppliesTo |Ext1=Extension Creator |TLVersion=ab TL 2.8}}  =Von C…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{stub}}&lt;br /&gt;
Tagebuch einer Extension-Entwicklung&lt;br /&gt;
[[Category:Tagebuch_einer_Extension-Entwicklung]]&lt;br /&gt;
{{AppliesTo&lt;br /&gt;
|Ext1=Extension Creator&lt;br /&gt;
|TLVersion=ab TL 2.8}}&lt;br /&gt;
&lt;br /&gt;
=Von Callbacks und Subpaletten=&lt;br /&gt;
Nachdem auch das englische Sprachfile fertig ist, geht es nun an die letzte fehlende Funktionalität der Backend-Maske. Zunächst gibt es aber noch einige Detailkorrekturen.&lt;br /&gt;
&lt;br /&gt;
Da MySQL keinen ''Boolean''-Datentyp bietet, hatte ich die Felder, die nur true/false sein können, als int(1) angelegt, mit den möglichen Werten 0/1. Das klappt auch prinzipiell, die Stati der Checkboxen werden gespeichert und wieder aus der Datenbank ausgelesen, aber ein Problem zeigt sich, wenn man nach so einem Feld filtern will: Ich will nach dem ''aktiv''-Feld filtern können. Häufig sind die die &amp;quot;aktiven&amp;quot; Turnierpaare von Interesse, die nicht mehr aktiven verstopfen aber die Liste.&lt;br /&gt;
&lt;br /&gt;
Wählt man dieses Feld nun als Filter-Feld aus, werden in der DropDown-Liste als Filtermöglichkeiten aber nur &amp;quot;Ja&amp;quot; und nochmals &amp;quot;Ja&amp;quot; angezeigt. Das Filtern klappt damit auch, bei dem einen &amp;quot;Ja&amp;quot; werden nur die aktiven Paare angezeigt, beim anderen &amp;quot;Ja&amp;quot; die inaktiven. Aber das ist natürlich nicht so gewollt.&lt;br /&gt;
&lt;br /&gt;
Durch Abschauen bei anderen Extensions bin ich darauf gekommen, die Checkbox-Felder durch ''char(1)'' statt ''int(1)'' abzubilden. Das klappt genau so gut, und auch das Filtern funktioniert mit &amp;quot;Ja&amp;quot; und &amp;quot;Nein&amp;quot;. Alle ''int(1)''-Felder wurden entsprechend in ''char(1)'' verändert. Nach dem Anpassen der ''database.sql'' muss natürlich das Install-Tool ausgeführt werden, um die Änderungen in der Datenbank durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Die ''database.sql'' sieht jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE `tl_gw_turnierpaare` (&lt;br /&gt;
  `id` int(10) unsigned NOT NULL auto_increment,&lt;br /&gt;
  `sorting` int(10) unsigned NOT NULL default '0',&lt;br /&gt;
  `tstamp` int(10) unsigned NOT NULL default '0',&lt;br /&gt;
  `partnernachname` varchar(64) NOT NULL default '',&lt;br /&gt;
  `partnervorname` varchar(64) NULL default NULL,&lt;br /&gt;
  `partnerinnachname` varchar(64) NULL default NULL,&lt;br /&gt;
  `partnerinvorname` varchar(64) NULL default NULL,&lt;br /&gt;
  `startgruppe` varchar(32) NOT NULL default '',&lt;br /&gt;
  `startklasselatein` varchar(12) NULL default NULL,&lt;br /&gt;
  `startklassestandard` varchar(12) NULL default NULL,&lt;br /&gt;
  `aktiv` char(1) NOT NULL default '',&lt;br /&gt;
  `aktivseit` int(4) NULL default NULL,&lt;br /&gt;
  `aktivbis` int(4) NULL default NULL,&lt;br /&gt;
  `resetpassword` char(1) NULL default '',&lt;br /&gt;
  `password` varchar(64) NULL default NULL,&lt;br /&gt;
  `bild` varchar(255) NULL default NULL,&lt;br /&gt;
  `anschrift` text NULL,&lt;br /&gt;
  `zeigeanschrift` char(1) NOT NULL default '',&lt;br /&gt;
  `telefon` varchar(32) NULL default NULL,&lt;br /&gt;
  `zeigetelefon` char(1) NOT NULL default '',&lt;br /&gt;
  `fax` varchar(32) NULL default NULL,&lt;br /&gt;
  `zeigefax` char(1) NOT NULL default '',&lt;br /&gt;
  `mobil` varchar(32) NULL default NULL,&lt;br /&gt;
  `zeigemobil` char(1) NOT NULL default '',&lt;br /&gt;
  `email` varchar(128) NULL default NULL,&lt;br /&gt;
  `zeigeemail` char(1) NOT NULL default '',&lt;br /&gt;
  `homepage` varchar(128) NULL default NULL,&lt;br /&gt;
  `zeigehomepage` char(1) NOT NULL default '',&lt;br /&gt;
  `beschreibung` text NULL,&lt;br /&gt;
  PRIMARY KEY  (`id`),&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=utf8;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer aufgepasst hat, dem ist auch noch ein neues Feld aufgefallen:&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  `resetpassword` char(1) NULL default '',&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das werde ich gleich für das Aktivieren einer Subpalette benötigen. Der Inhalt des Feldes in der Datenbank wird später nicht gebraucht, aber leider muss das Feld vorhanden sein, um es so nutzen zu können, wie ich es vorhabe.&lt;br /&gt;
&lt;br /&gt;
Für das ''password''-Feld habe ich ich vor, dass ein dort eingegebenes Passwort SHA1-gehasht in der Datenbank abgelegt wird, nicht im Klartext. Dabei wird ein eventuell schon vorhandes Passwort natürlich überschrieben.&lt;br /&gt;
&lt;br /&gt;
Um Fehleingaben zu verhindern, möchte ich eine Checkbox anzeigen, die defaultmäßig &amp;quot;aus&amp;quot; ist. Erst wenn die Checkbox aktiviert ist, soll per AJAX das Passwortfeld angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst fügen die wir Definition für das Checkbox-Feld in die ''field''-Sektion des DCA-Records ein:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        'resetpassword' =&amp;gt; array &lt;br /&gt;
        ( &lt;br /&gt;
            'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_gw_turnierpaare']['resetpassword'], &lt;br /&gt;
            'inputType'               =&amp;gt; 'checkbox', &lt;br /&gt;
            'default'                 =&amp;gt; '', &lt;br /&gt;
            'eval'                    =&amp;gt; array('mandatory'=&amp;gt;false, 'isBoolean' =&amp;gt; true, 'submitOnChange' =&amp;gt; true), &lt;br /&gt;
        ), &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''submitOnChange'' bewirkt, dass das Formular neu geladen wird, wenn das Feld angeklickt wird. nur dann wird das Passwortfeld nachgeladen.&lt;br /&gt;
&lt;br /&gt;
Dafür benötigen wir eine sogenannte &amp;quot;Subpalette&amp;quot;. Die Checkbox (bei mir &amp;quot;resetpassword&amp;quot;) muss als &amp;quot;__selector__&amp;quot; angegeben werden im DCA-Record:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    // Palettes &lt;br /&gt;
    'palettes' =&amp;gt; array &lt;br /&gt;
    ( &lt;br /&gt;
        '__selector__'                =&amp;gt; array('resetpassword'), &lt;br /&gt;
...  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der ''default''-Sektion sieht die Palettendefinition so aus:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                                  .'{aktiv_legend:hide},aktiv,aktivseit,aktivbis;{password_legend:hide},resetpassword;'  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier steht also der Name der Subpalette. Der Name des Passwortfeldes steht hier nicht mehr. Das wird in der ''subpalettes''-Sektion angegeben:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    // Subpalettes &lt;br /&gt;
    'subpalettes' =&amp;gt; array &lt;br /&gt;
    ( &lt;br /&gt;
        'resetpassword'               =&amp;gt; 'password' &lt;br /&gt;
    ),  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass das Feld ''password'' in die Subpalette ''resetpassword'' eingeblendet wird, wenn ''resetpassword'' aktiviert ist. Wird es deaktiviert, verschwindet die Subpalette wieder.    &lt;br /&gt;
&lt;br /&gt;
[[Datei:Attachment_016.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Attachment_017.png]]&lt;br /&gt;
&lt;br /&gt;
Die Texte hierzu wurden in den Sprachfiles entsprechend erweitert und angepasst.&lt;br /&gt;
&lt;br /&gt;
Für beide Felder, ''resetpassword'' und ''password'', benötige ich besondere Funktionalitäten. ''resetpassword'' soll bei Öffnen der Backendmaske IMMER deaktiviert, das Passwort-Feld also versteckt sein - egal was in der Datenbank für das Feld steht. Dafür setze ich zunächst&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            'default'                 =&amp;gt; '',  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
was dafür sorgt, dass beim Anlegen eines neuen Datensatzes die Checkbox deaktiviert ist. Und dann gibt es noch die Option ''load_callback'', in der eine Funktion angegeben werden kann, die beim Laden des Feldes aufgerufen wird (Zu den Details von Callbacks gleich mehr).&lt;br /&gt;
&lt;br /&gt;
Hier habe ich versucht, durch ''return &amp;lt;nowiki&amp;gt;' '&amp;lt;/nowiki&amp;gt;;'' immer den Defaultwert zurückzugeben. Leider klappt das nicht richtig, wenn der Datensatz mit &amp;quot;speichern&amp;quot; gespeichert wird, aber geöffnet bleibt. Obwohl die Checkbox dann deaktiviert dargestellt wird, bleibt das Passwort-Feld trotzdem angezeigt und wird nicht versteckt. Erst durch manuelles Aktivieren und erneutes Deaktivieren verschwindet das Passwortfeld wieder. Ich weiß nicht, ob das ein Bug oder gewollt ist, zumindest gefiel es mir nicht.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Versuch scheiterte mit dem ''save_callback'': also einer Funktion, die aufgerufen wird, bevor das Feld in die Datenbank gespeichert wird. Hier versuchte ich ebenfalls durch ein ''return &amp;lt;nowiki&amp;gt;' '&amp;lt;/nowiki&amp;gt;;'' zu erzwingen, dass immer ein deaktiviertes Feld gespeichert wird, und damit auch beim erneuten Anzeigen des Formulars deaktiviert bleibt.&lt;br /&gt;
&lt;br /&gt;
Das funktioniert optisch auch sehr gut. Leider werden dann aber keine Eingaben im Passwort-Feld gespeichert.&lt;br /&gt;
&lt;br /&gt;
Der Grund wird sehr wahrscheinlich sein, dass der ''save_callback'' auf dem ''resetpassword''-Feld ausgeführt wird, bevor der Input im ''password''-Feld verarbeitet wird. Mein ''Save-Callback'' deaktiviert die Checkbox, und damit auch die Subpalette, und das Feld in der Subpalette wird gar nicht mehr ausgewertet oder gespeichert. Auch die Reihenfolge der Felddefinitionen hat darauf keinen Einfluss, es kommt wohl auf die Reihenfolge in der Palettendefinition an, und die kann ich nicht umdrehen.&lt;br /&gt;
&lt;br /&gt;
An der Stelle war tiefe Frustration angesagt, aber ich habe das Problem anders lösen können. Beim ''resetpassword''-Feld werden jetzt keine Callbacks verwendet.&lt;br /&gt;
&lt;br /&gt;
Dafür aber beim ''password''-Feld, was jetzt in der Definition so aussieht:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        'password' =&amp;gt; array &lt;br /&gt;
        ( &lt;br /&gt;
            'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_gw_turnierpaare']['password'], &lt;br /&gt;
            'inputType'               =&amp;gt; 'text', &lt;br /&gt;
            'eval'                    =&amp;gt; array('mandatory'=&amp;gt;false, 'minlength' =&amp;gt; 1, 'maxlength' =&amp;gt; 64), &lt;br /&gt;
            'load_callback'           =&amp;gt; array(array('tl_gw_turnierpaare','password_load_callback')), &lt;br /&gt;
            'save_callback'           =&amp;gt; array(array('tl_gw_turnierpaare','password_save_callback')) &lt;br /&gt;
        ), &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch diese Definition wird beim Laden des Feldes die Funktion ''password_load_callback'' und beim Speichern ''password_save_callback'' aufgerufen, die sich in der Klasse ''tl_gw_turnierpaare'' befinden. Diese Klasse lege ich in der DCA-Definitions-Datei ''/modules/gw_turnierpaare/dca/tl_gw_turnierpaare.php'' an.&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class tl_gw_turnierpaare extends Backend &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * Import the back end user object &lt;br /&gt;
     */ &lt;br /&gt;
    public function __construct() &lt;br /&gt;
    { &lt;br /&gt;
        parent::__construct(); &lt;br /&gt;
        $this-&amp;gt;import('BackendUser', 'User'); &lt;br /&gt;
    } &lt;br /&gt;
   &lt;br /&gt;
  public function password_load_callback() &lt;br /&gt;
  { &lt;br /&gt;
 ... &lt;br /&gt;
 } &lt;br /&gt;
   &lt;br /&gt;
  public function password_save_callback($var, $dc) &lt;br /&gt;
  { &lt;br /&gt;
... &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Gerüst habe ich mir bei anderen Extensions abgeschaut, es scheint zumindest klug zu sein, von ''Backend'' zu erben, und den Konstruktur zu überschreiben. Vielleicht ist es auch nicht nötig, ich habe es nicht probiert. Ob der ''load_callback'' Parameter übergeben bekommt, weiss ich nicht, aber ich benötige keinen Parameter.&lt;br /&gt;
&lt;br /&gt;
Der ''save_callback'' erhält den Wert des Feldes, das gespeichert werden soll ($var), und den DataContainer ($dc), der zu dem Formular gehört. Meist (wie auch hier) ist es DC_Table, der DataContainer für Datenbanktabellen.&lt;br /&gt;
&lt;br /&gt;
Mein ''password''-Feld in der Datenbank wird den SHA1-Hash, also einen langen String unverständlicher hexadezimaler Zahlen enthalten. Es nützt nichts, wenn ich den im Backend im Passwort-Feld anzeige. Dort will der Admin Klartext-Passwörter eingeben. Im Load-Callback setze ich den Wert des ''password''-Felds also auf einen leeren String, egal was in der Datenbank steht:&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  public function password_load_callback() &lt;br /&gt;
  { &lt;br /&gt;
    // Passwort-Feld immer leer anzeigen (Damit der User SHA1-Hash nicht sieht) &lt;br /&gt;
    return ''; &lt;br /&gt;
  } &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird der User schon mal nicht vom &amp;quot;Müll&amp;quot; aus der Datenbank belästigt. Umgekehrt müssen wir aber nicht das Klartext-Passwort, sondern den Hash in die Datenbank schreiben. Das macht der ''save_callback'':&lt;br /&gt;
&lt;br /&gt;
PHP-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  public function password_save_callback($var, $dc) &lt;br /&gt;
  { &lt;br /&gt;
    // Kein neues PW angegeben: Feld nicht ändern &lt;br /&gt;
    if(strlen($var) &amp;lt; 1) return ''; &lt;br /&gt;
    // Aktuellen Datensatz aus DB holen &lt;br /&gt;
    $row = $this-&amp;gt;Database-&amp;gt;prepare(&amp;quot;SELECT * FROM tl_gw_turnierpaare WHERE id=?&amp;quot;) &lt;br /&gt;
                              -&amp;gt;execute($dc-&amp;gt;id); &lt;br /&gt;
    // PW in Passwort und Salt aufspalten &lt;br /&gt;
    list($strPassword, $strSalt) = explode(':', $row-&amp;gt;password); &lt;br /&gt;
    // Falls kein Salt vorhanden, dann erzeugen &lt;br /&gt;
        if (!strlen($strSalt)) &lt;br /&gt;
        { &lt;br /&gt;
            $strSalt = substr(md5(uniqid('', true)), 0, 23); &lt;br /&gt;
        } &lt;br /&gt;
    // SHA1-Hash aus Salt+neuem Passwort berechnen, Salt anhängen &lt;br /&gt;
    $pwd = sha1($strSalt . $var) . ':' . $strSalt; &lt;br /&gt;
    // Das resetpassword-Feld löschen &lt;br /&gt;
    $this-&amp;gt;Database-&amp;gt;prepare(&amp;quot;UPDATE tl_gw_turnierpaare SET resetpassword='' WHERE id=?&amp;quot;) &lt;br /&gt;
                              -&amp;gt;executeUncached($dc-&amp;gt;id); &lt;br /&gt;
    return $pwd; &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls kein Passwort angegeben wurde, macht der ''save_callback'' garnichts, und gibt einen leeren String zurück. &lt;br /&gt;
&lt;br /&gt;
Das Feld ''Id'' des DataContainers enthält die ''id'' des aktuellen Datensatzes in der Datenbank. Um den Hash berechnen zu können, benötige ich das &amp;quot;alte&amp;quot; Passwort in der Datenbank. Darum hole ich mir erstmal den gesamten Datensatz mit der ID ab.&lt;br /&gt;
&lt;br /&gt;
Die Hash-Erzeugung habe ich mir beim File ''/system/libraries/User.php'' abgeschaut und funktioniert genauso wie in der Userverwaltung von TYPOlight: Der Hash wird zusammen mit einem &amp;quot;Salt&amp;quot; erzeugt, der zusammen mit dem Hash (durch Doppelpunkt getrennt) im ''password''-Feld abgespeichert wird. Existiert noch kein Salt, wird er erzeugt. Existiert der Salt schon, wird er weiterverwendet (und dafür muss ich das alte Passwort aus der Datenbank auslesen - um an den evtl. schon vorhandenen Salt zu kommen). Die Hash-Erzeugung läuft dann ziemlich straight-forward ab.&lt;br /&gt;
&lt;br /&gt;
Und fast ganz am Ende nochmal der Knackpunkt: Hier setze ich das ''resetpassword''-Feld in der Datenbank auf ''. &lt;br /&gt;
&lt;br /&gt;
Das (und leider nur das) sorgt in allen Fällen dafür, dass beim Öffnen von Datensätzen die Subpalette für das ''password''-Feld geschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Abschließend gebe ich den berechneten Hash zurück. Er wird dann in die Datenbank eingetragen.&lt;br /&gt;
&lt;br /&gt;
Wichtiger Hinweis noch: ''load_callback'' und ''save_callback'' müssen doppelt geschachtelte Arrays sein, weil es mehrere Callbacks geben kann, die nacheinander aufgerufen werden, der Feldwert wird jeweils durch alle durchgeschleust. Falls man aber z.B. einen ''onSubmitCallback'' für das ganze Formular vorgeben möchte, ist das nur ein einfaches Array mit Klassennamen und Methodenname, weil es hier nur einen Callback gibt. Das ist so leider in der Referenz der möglichen Callbacks nicht dokumentiert, und hat mir kurz graue Haare beschert.&lt;br /&gt;
&lt;br /&gt;
Damit ist das Backend-Modul für die Turnierpaar-Tabelle erstmal fertig.&lt;br /&gt;
&lt;br /&gt;
Weiter wird es dann (endlich) mit dem Frontendmodul für die Turnierpaarliste gehen.&lt;/div&gt;</summary>
		<author><name>Schnippsel</name></author>	</entry>

	</feed>