Warum nicht Error & Exception Überprüfung in Validatoren – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self?srt=yes Warum nicht Error & Exception Überprüfung in Validatoren Thu, 12 Dec 19 19:35:32 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761556?srt=yes#m1761556 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761556?srt=yes#m1761556 <p>moin,</p> <p>warum nicht die Überprüfungs Code in Validatoren auslagern:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> <p>warum nicht einfach den Code auslagern, wenn mehr als eine Prüfung mit dem gleichen Sachverhalt existieren.</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">DataValidator</span><span class="token operator">::</span><span class="token function">existData</span><span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>…oder…</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token class-name static-context">DataValidator</span><span class="token operator">::</span><span class="token function">existData</span><span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> <p>…dann…</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DataValidator</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">existData</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t find Data'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>die herangehensweise spart Code und trennt Code bezügl. der Zuständigkeit und bewart einen besseren überblich finde ich.</p> <p>lgmb</p> <p><em>PS: Warum funktioniert „~~~[code]“ nicht?</em></p> Warum nicht Error & Exception Überprüfung in Validatoren Thu, 12 Dec 19 19:47:50 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761558?srt=yes#m1761558 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761558?srt=yes#m1761558 <p>Hallo MB,</p> <blockquote> <p><em>PS: Warum funktioniert „~~~[code]“ nicht?</em></p> </blockquote> <p>Was meinst du damit?</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Warum nicht Error & Exception Überprüfung in Validatoren Thu, 12 Dec 19 19:54:33 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761559?srt=yes#m1761559 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761559?srt=yes#m1761559 <p>Natürlich lagern wir Code aus wenn sich Redundanzen abzeichnen und machen ihn damit wiederverwertbar. MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Thu, 12 Dec 19 23:45:45 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761566?srt=yes#m1761566 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761566?srt=yes#m1761566 <p>Tach!</p> <blockquote> <p>warum nicht die Überprüfungs Code in Validatoren auslagern:</p> </blockquote> <p>Was genau ist denn dein Problem, das du zu lösen versuchst?</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt. Der else-Zweig ist hier überflüssig, das <code>return true</code> kann einfach so notiert werden. Wenn die Bedingung zutrifft, wird die Funktion über das throw verlassen und der nachfolgende Code nicht mehr ausführt. Deshalb ist es nicht notwendig, zwischen Code im false-Fall (else) und allgemein auszuführendem Code zu trennen. Im true-Fall wird weder das eine noch das andere ausgeführt, und im false-Fall sowie beides. Daran ändert auch nicht, dass es nur ein return-Statement und keinen allgemein auszuführenden Code gibt.</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 14:59:38 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761607?srt=yes#m1761607 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761607?srt=yes#m1761607 <p>hi MB,</p> <p>ich habe Dir <a href="https://rolfrost.de/ctype.htm" rel="nofollow noopener noreferrer">hier</a> mal aufgeschrieben wie ich meine Fehlerbehandlung mache und Du kannst das da auch ausprobieren, ein Link macht einen Fehler anschaulich.</p> <p>Und natürlich lege ich auch den Code für die als statische Route an den URL gebundene Klasse offen. Wie Du sehen kannst, Fehlerbehandlung und OOP kann auch etwas Einfaches sein und das ist ja auch das Ziel einer überschaubaren Programmierung.</p> <p>Und es muss nicht immer eine Exception sein die im Fehlerfall geworfen wird. Bei mir wird z.B. nur die Zeilennummer ausgegeben, was völlig ausreicht, weil der Fehler faktisch nur in einer Datei, die dem Entwickler namentlich bekannt ist, auftreten kann. Also brauchen wir gar keinen Backtrace mit Dateinamen. Das ist der Vorteil einer flachen Klassenhierarchie.</p> <p>MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 23:19:16 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761628?srt=yes#m1761628 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761628?srt=yes#m1761628 <p><strong>Spezifischere Exceptions lassen sich besser verarbeiten.</strong><br> Aus ausgelagertem ÜberprüfungsCode ist es schwer solche zu schmeißen.</p> <p>Beispiel:</p> <p>Bei mir hat jede Domäne ihre eigene <a href="https://www.php.net/throwable" rel="nofollow noopener noreferrer">Throwable</a>-Familie.</p> <p>Vorteile:</p> <ul> <li>im <code>catch</code> wahlweise Eltern <em>und</em> Kinder fangen.</li> <li>der ClassName ersetzt die Message bzw. dient als Key für die Übersetzung.</li> <li>Reflektionen</li> <li><em>previous Exception</em> nutzen</li> <li>...</li> </ul> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">throwableException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>Exception</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app<span class="token punctuation">\</span>Customer</span><span class="token punctuation">;</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">EntityNotFoundException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>my_app<span class="token punctuation">\</span>throwableException</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app<span class="token punctuation">\</span>Product</span><span class="token punctuation">;</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">EntityNotFoundException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>my_app<span class="token punctuation">\</span>throwableException</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 07:32:27 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761574?srt=yes#m1761574 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761574?srt=yes#m1761574 <blockquote> <p>Natürlich lagern wir Code aus wenn sich Redundanzen abzeichnen und machen ihn damit wiederverwertbar. MFG</p> </blockquote> <p>PS: Eine Fehlerbehandlung über Exceptions abzuwickeln ist eine Frage ob damit der Code einfacher und leserlicher wird. In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> <p>MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 00:06:07 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761568?srt=yes#m1761568 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761568?srt=yes#m1761568 <p>Hallo dedlfix,</p> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> <p>Ich halte eine solche Funktion aber für überflüssig. Wenn ich schon die id durch fetch (also den Kunden einlesen) überprüfe und Fehler durch Exception anzeige, dann kann ich auch gleich eine Funktion get schreiben</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">getCustomer</span><span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name return-type">Customer</span> <span class="token punctuation">{</span> <span class="token variable">$customer</span> <span class="token operator">=</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$customer</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"can't find Customer ID <span class="token interpolation"><span class="token variable">$id</span></span>"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$customer</span> <span class="token punctuation">}</span> </code></pre> <p>das könnte dann in die Customer-Repositoryklasse hinein (wobei Database:fetch ein schlechter Methodenname ist um Kunden zu lesen - aber ich nehme mal an, dass der generische Name dem Umstand geschuldet ist, dass es sich um ein abstraktes Beispiel handelt).</p> <p>Wenn ich jetzt nur wissen will, ob die id ok ist, ignoriere ich die Rückgabe. Ansonsten arbeite ich gleich mit dem gefundenen Kunden weiter. So ergibt es einen Sinn.</p> <p>Eine echte checkCustomerId Methode sollte sinnvollerweise einen anderen Datenbankzugriff machen, der ausschließlich die ID validiert. Ein voller Fetch dürfte außer einem Index Seek auch das Lesen der Tabledaten benötigen. Liest man nur die ID, reicht ein Index Seek. Das ist schneller. Ich würde einer solchen Funktion aber auch einen echten bool-Rückgabewert verpassen und Exceptions nur im Fall eines fehlgeschlagenen Datenbankzugriffs werfen. Denn wenn ich eine solche Methode tatsächlich brauche, dann ist true und false halbwegs gleichwahrscheinlich, das ist nicht der Anwendungsfall für Excptions. Exceptions wirft man dann, wenn dieser Fall im Normalbetrieb nicht auftaucht; zumindest habe ich das mal so gelernt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 18:51:39 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761621?srt=yes#m1761621 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761621?srt=yes#m1761621 <p>moin,</p> <blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt.</p> </blockquote> <p>durch aus nicht</p> <blockquote> <p>Der else-Zweig ist hier überflüssig, das <code>return true</code> kann einfach so notiert werden.</p> </blockquote> <p>stimmt, aber du schreibst ja auch am ende eines <strong>Attribut</strong>-Wertes des letzten Attributes eines <em>CSS</em> Selektors ein Semikolon obwohl da keins hin muss.</p> <pre><code class="block language-css"><span class="token selector">small</span> <span class="token punctuation">{</span> <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 21:29:48 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761625?srt=yes#m1761625 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761625?srt=yes#m1761625 <p>moin,</p> <blockquote> <blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt. Der else-Zweig ist hier überflüssig[…]</p> </blockquote> <p>Ich bin wohl einwenig zu fest in der Einhaltung gefahren und ich sehe es ein. Sorry dafür. Ich weis das es keinen unterschied mach, weil ja genau das selbe heraus kommt.</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 00:16:24 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761570?srt=yes#m1761570 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761570?srt=yes#m1761570 <p>Tach!</p> <p>Wenn man den konkreten Fall kennt, kommt man durchaus zu einer anderen Antwort auf die Frage nach der sinnvollen Lösung, als wenn man irgendwelche Pauschalitäten beurteilen soll. Darin sind wir uns sicher einig, und deswegen hatte ich auch erstmal nur nach dem zu lösenden Problem gefragt, und als Nebenschauplatz ein paar technische Argumente zu if-else-Konstrukten mit Abbruch/Ende im if geliefert. Ob sowas überhaupt in der Lösung zum konkreten Problem auftaucht, steht auf einem anderen Blatt.</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 06:39:25 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761571?srt=yes#m1761571 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761571?srt=yes#m1761571 <blockquote> <p>Hallo dedlfix,</p> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> <p>Ich halte eine solche Funktion aber für überflüssig.</p> </blockquote> <p>Hier geht es ums Prinzip!</p> <p>MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 19:01:24 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761622?srt=yes#m1761622 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761622?srt=yes#m1761622 <p>moin,</p> <blockquote> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> </blockquote> <p>siehe <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761621#m1761621" rel="noopener noreferrer">hier</a></p> <blockquote> <p>Ich halte eine solche Funktion aber für überflüssig. [...]</p> </blockquote> <p>Ein Einwand. Jedoch ist diese Funktion aus der Luft gegriffen. ich hätte auch Metasyntaxtische Variablen <code>fubar</code> schreiben können, aber man hat mir gesagt - ich glaube @@Gunnar Bittersmann, @@dedlfix oder du - das es besser ist im Konkreten Fall ein exemplarisches Beispiel zu geben.</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 07:52:13 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761576?srt=yes#m1761576 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761576?srt=yes#m1761576 <p>Tach!</p> <blockquote> <p>In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Das klingt, als ob es einen unauflöslichen Zusammenhang gäbe, zwischen den Daten in einer Exception und dem, was man dem Anwender präsentiert. Man kann aber display_errors auf 0 setzen und Fehlermeldungen in Logfiles schreiben. Das wirkt auch bei Exceptions.</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 18:33:35 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761618?srt=yes#m1761618 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761618?srt=yes#m1761618 <p>moin,</p> <blockquote> <p>[...] und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Ich weiß </p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 09:16:51 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761579?srt=yes#m1761579 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761579?srt=yes#m1761579 <p>Tach!</p> <blockquote> <blockquote> <p>In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Das klingt, als ob es einen unauflöslichen Zusammenhang gäbe, zwischen den Daten in einer Exception und dem, was man dem Anwender präsentiert. Man kann aber display_errors auf 0 setzen und Fehlermeldungen in Logfiles schreiben. Das wirkt auch bei Exceptions.</p> </blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> <p>Nicht empfehlenswert!</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 10:08:21 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761591?srt=yes#m1761591 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761591?srt=yes#m1761591 <p>Hallo dedlfix,</p> <p>ich würde es eher mit try/catch versuchen und im Fall eines fachlichen Fehlers, der per Exception signalisiert wird, auch eine fachliche Fehlermeldung präsentieren.</p> <blockquote> <p>Verzeihen Sie, lieber User, aber Ihre Eingabe war einfach nur Scheiße!</p> </blockquote> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 09:22:43 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761580?srt=yes#m1761580 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761580?srt=yes#m1761580 <p>Tach!</p> <blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> </blockquote> <p>Die bessere Lösung lautet wie?</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 18:38:19 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761619?srt=yes#m1761619 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761619?srt=yes#m1761619 <p>moin,</p> <blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> <p>Nicht empfehlenswert!</p> </blockquote> <p>für kleine Projekte mag es sein das es durchaus sinnhaft und empfehlenswert ist es nicht zutun, aber bei komplexen Projekten wo ein Entwickler Team dahinter steckt, ist es - denke ich mal - pflicht es zutun!</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 18:45:03 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761620?srt=yes#m1761620 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761620?srt=yes#m1761620 <p>moin,</p> <blockquote> <p>ich würde es eher mit try/catch versuchen und im Fall eines fachlichen Fehlers, der per Exception signalisiert wird, auch eine fachliche Fehlermeldung präsentieren.</p> </blockquote> <p>sry, <code class="language-php"><span class="token function">spl_exception_handler</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code> hab ich nicht erwähnt . bei <code class="language-php"><span class="token function">error_report</span><span class="token punctuation">(</span> <span class="token constant">E_ALL</span> <span class="token punctuation">)</span></code> fängt der Interpreter auch nach <code class="language-php"><span class="token keyword">throw</span></code></p> <p><em>PS: ich muss dazu sagen das ich leider seit gefühl monaten nicht mehr mit PHP entwickelt habe und jetzt wieder entsteige.</em></p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 19:53:35 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761624?srt=yes#m1761624 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761624?srt=yes#m1761624 <p>Moin Hotti,</p> <blockquote> <p>Und natürlich lege ich auch den Code für die als statische Route an den URL gebundene Klasse offen.</p> </blockquote> <p>Hast du dazu einen Git-Link o.ä.?</p> <blockquote> <p>Und es muss nicht immer eine Exception sein die im Fehlerfall geworfen wird. Bei mir wird z.B. nur die Zeilennummer ausgegeben, was völlig ausreicht</p> </blockquote> <p>Und um einen Fehler zu analysieren musst du dir dann jeweils die Version auschecken, die zu dem genauen Zeitpunkt des Fehlers live war? Stelle ich mir recht aufwendig vor, wenn man, wie doch eigentlich üblich heutzutage, noch einen CI dazwischen hat..</p> <p>Cheers, markk</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 22:26:54 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761626?srt=yes#m1761626 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761626?srt=yes#m1761626 <blockquote> <p>moin,</p> <blockquote> <p>[...] und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Ich weiß </p> </blockquote> <p>PS: In Perl ist es wesentlich einfacher mit Exceptions zu arbeiten. So wirft ein einfaches <code>die "Das eingegebene Datum ist ungültig!\n"</code> eine Exception wobei der Backtrace infolge des angefügten Newline unterdückt wird.</p> <p>Wenn man Klassen hat wo es Fehler nur aufgrund fehlerhafte Benutzereingaben geben kann, ist das eine elegante Art und Weise der Fehlerbehandlung.</p> <p>Und noch cleverer ist es, die Fehlertexte gar nicht selber zu schreiben sondern das zu nehmen wo die Meldungen schon drinstehen. Beschwerden vom OS z.B. stehen in <code>$^E</code> sogar in deutscher Sprache.</p> <p>MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Fri, 13 Dec 19 22:42:00 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761627?srt=yes#m1761627 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761627?srt=yes#m1761627 <p>moin,</p> <blockquote> <p>PS: In Perl ist es wesentlich einfacher mit Exceptions zu arbeiten. […]</p> </blockquote> <p>Wie du weißt arbeite ich nicht mit <em>Perl</em> und ich werde es auch in meiner Lage nicht tun. Sicherlich gibt es Problemlösungen, wo diese Programmiersprache wirklich Perfekt ist, aber das sind nicht meine.</p> <p>Schönen Abend </p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 00:01:43 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761631?srt=yes#m1761631 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761631?srt=yes#m1761631 <p>moin,</p> <p>Das tut doch nichts zur Sache oder vertuhe ich mich da? Sry, dafür.</p> <p><em><strong>z.B.:</strong></em></p> <ol> <li>irgend eine <em>Business</em> Klasse von <em>Business</em> Klassen arbeitet etwas ab.</li> <li>Vor der abarbeitung, übereicht eine <em>Klassenmethode</em> den zu behandelte Sachverhalt an einen <em>Validator</em> der für diese spezielle Situation zuständig ist.</li> <li>Ist dieser zu behandelnde Sachverhalt validiert, arbeitet die <em>Klassenmethode</em> der <em>Business</em> Klasse einfach weiter, wenn nicht, wirft der <em>Validator</em> eine <em>Exception</em> oder <em>Error</em> (z.B. <code class="language php">new FoobarError()</code>, <code class="language php">new FoobarException()</code> usw.) die man geschrieben hat.</li> </ol> <p>Bist du mit diesem Thread im Bilde uns hast die Lösung die du präsentierst? Dann fürchte ich habe ich den zusammenhang nicht im Blick, sorry !</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 06:31:55 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761633?srt=yes#m1761633 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761633?srt=yes#m1761633 <p>Tach!</p> <blockquote> <ol start="3"> <li>Ist dieser zu behandelnde Sachverhalt validiert, arbeitet die <em>Klassenmethode</em> der <em>Business</em> Klasse einfach weiter, wenn nicht, wirft der <em>Validator</em> eine <em>Exception</em> oder <em>Error</em> (z.B. <code class="language php">new FoobarError()</code>, <code class="language php">new FoobarException()</code> usw.) die man geschrieben hat.</li> </ol> </blockquote> <p>Die Validatorklasse kann nur eine allgemeine ValidationFailed werfen, aber keine Exception, die für den Business Case spezifisch ist. Dazu müsste man dort die allgemeine Exception abfangen und umpacken. Das kann man sich sparen, wenn man den Aufrufer selbst die Exception werfen lässt, die er für richtig hält. Außerdem kann eine fehlende Validierung immer nur als so schwerwiegend eingestuft werden, dass eine Exception nötig ist, selbst wenn dem Aufrufer eine einfache Information reichen würde.</p> <p>Der Validator sollte seine Aufgabe des Validierens erfüllen und nicht in den Control Flow eingreifen, wenn dazu keine zwingende Notwendigkeit besteht. Wenn der Aufrufer immer eine Exception abzufangen hat, macht das die Behandlung nur unnötig komplex, auch an Stellen, wo das nicht nötig ist.</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 10:01:18 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761634?srt=yes#m1761634 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761634?srt=yes#m1761634 <p>Hallo dedlfix,</p> <p>ich glaube, ihr seit euch über die Spezifität der Validatoren uneins.</p> <p>Mir scheint, dass MB sehr spezifische Validatoren bauen will, die nur an einer einzigen Ecke der Businesslogik verwendet werden. Die können dann auch spezifische Fehler erzeugen.</p> <p>Den Nutzen des Routings der Prüfung über eine Klassenmethode (= static function?) habe ich allerdings auch nicht verstanden.</p> <p>Und das Auslagern von Code in eigene Klassen, um Klassen zu haben, scheint mir auch nicht die beste Idee. Ich weiß nicht wie gut PHP das unter Fast CGI oder mit anderen Code-Caching Verfahren optimieren kann, aber grundsätzlich ist eine Klasse erstmal eine Struktur, die PHP zur Laufzeit aufbaut. Jede zusätzliche Klasse ist zusätzliche Arbeit, die pro Request vom Server geleistet werden muss.</p> <p>Es gibt verschiedene Anlässe, technische Klassen zu bilden (ich rede nicht von Businessklassen!):</p> <ul> <li>rein statisch mit statischen Methoden. Sowas macht man bspw. in Java oder C#, um einen Namespace für eine Funktionensammlung zu haben. In PHP bieten sich da eher Funktionen und <a href="https://www.php.net/manual/en/language.namespaces.rationale.php" rel="nofollow noopener noreferrer">Namespaces</a> an</li> <li>ich baue eine Methode, und sie wird gigantisch. Es ist viel zu tun, und ich brauche eine Menge Arbeitsvariablen. Es wird gruselig, diese Methode zu testen, und es wird unüberschaubar, das Monster über Testargumente in allen Facetten zu validieren. Statt nun Code aus der Methode in private Methoden der Klasse auszulagern, die dann entweder viele Parameter haben oder die Klasse mit Instanzvariablen zumüllen, lagere ich das in eine Worker-Klasse aus, die ich dann auch separat testen kann.</li> <li>ich möchte in Test und Produktion unterschiedlichen Code laufen lassen. Insbesondere im Bereich Logging, oder auch Fehlerprüfungen. Im Test prüfe ich vielleicht deutlich aufwändiger, und logge mehr. Man kann das so lösen, dass man den Code in zwei Klassen unterbringt, eine für Test, eine für Produktion, die beide das gleiche Interface haben. Und ich stelle an geeigneter Stelle eine Instanz dieser Klasse zur Nutzung durch den Rest des Codes zur Verfügung. Dann muss ich genau 1x testen, ob ich in Test oder Prod bin, den Rest erledigt die Polymorphie.</li> </ul> <p>Sicherlich gibt's noch mehr Anlässe.</p> <p>Deine Validatoren könnten durch Anlass 3 gerechtfertigt sein.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 12:49:04 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761651?srt=yes#m1761651 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761651?srt=yes#m1761651 <p>moin,</p> <blockquote> <p>Den Nutzen des Routings der Prüfung über eine Klassenmethode (= static function?) habe ich allerdings auch nicht verstanden.</p> </blockquote> <p>Ups, sorry!!! ich meinte Instanzmethoden. Sry </p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 13:24:24 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761653?srt=yes#m1761653 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761653?srt=yes#m1761653 <p>Hallo MB,</p> <p><strong>dann</strong> verstehe ich das . Die kannst Du im Zweifel sogar von einer abstrakten Klasse erben oder als Trait einmischen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 18:12:09 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761667?srt=yes#m1761667 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761667?srt=yes#m1761667 <p>moin,</p> <blockquote> <p><strong>dann</strong> verstehe ich das . Die kannst Du im Zweifel sogar von einer abstrakten Klasse erben oder als Trait einmischen.</p> </blockquote> <p>Habe ich bei Template Construktor gemacht.</p> <pre><code class="block language-php"><span class="token comment">// create</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">foobarTable</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Table</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// built</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">foobarTable</span> <span class="token operator">-></span><span class="token function">setCaption</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setSettings</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setHead</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">foot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Tut mir wirklich leid. Ich <em><strong>„musste“</strong></em> in der Vergangenheit mit <em>CSS</em> arbeite was ich garnicht mag. Da habe ich <em>PHP</em> aus den augen verloren .</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 19:05:01 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671?srt=yes#m1761671 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671?srt=yes#m1761671 <p>moin,</p> <pre><code class="block language-php"><span class="token variable">$ta</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableAttributs</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tcol</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableColum</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'1'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tset</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSettings</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableCell</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'foobar'</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tr</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableRow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ts</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSection</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tr</span><span class="token punctuation">,</span> <span class="token variable">$tr</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableConstructor</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Foo Bar'</span><span class="token punctuation">,</span> <span class="token variable">$tset</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$t</span><span class="token punctuation">;</span> </code></pre> <p>mit Template</p> <pre><code class="block language-php"><span class="token comment"><!-- TABLE --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- COLUMN GROUPS --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>colgroup</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>col</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>colgroup</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span> <span class="token delimiter important">?></span></span> <span class="token comment"><!-- CAPTION --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$caption</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$caption</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>caption</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$caption</span> <span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>caption</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token comment"><!-- MATRIX --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span> <span class="token variable">$sections</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$section</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$section</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// if one of section is not defined like '<tfoot>' </span><span class="token delimiter important">?></span></span> <span class="token comment"><!-- SECTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>t<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$j</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$j</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$j</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$key</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span><span class="token delimiter important">?></span></span>th<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span>td<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">content</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$key</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span><span class="token delimiter important">?></span></span>th<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span>td<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>t<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endforeach</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <p>heraus kam</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span><span class="token punctuation">></span></span> <span class="token comment"><!-- COLUMN GROUPS --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>colgroup</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>col</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>colgroup</span><span class="token punctuation">></span></span> <span class="token comment"><!-- CAPTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>caption</span><span class="token punctuation">></span></span>Foo Bar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>caption</span><span class="token punctuation">></span></span> <span class="token comment"><!-- MATRIX --></span> <span class="token comment"><!-- SECTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>thead</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> foobar <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>thead</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tfoot</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tfoot</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <p>Ich habs mit abstrakten Eltern Klassen gemacht und Interfaces verwendet</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sat, 14 Dec 19 22:06:13 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761676?srt=yes#m1761676 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761676?srt=yes#m1761676 <p>Hallo MB,</p> <p>Whoa, was ist denn das für ein Template? Wieso <?php ... ?> auf jeder einzelnen Zeile? Und man darf in einem Template, wenn es mit PHP geschrieben ist, durchaus programmieren. Also Helper-Funktionen und -Variablen verwenden.</p> <p>Unter anderem auch htmlspecialchars(), das fehlt bei Dir noch ganz - es sei denn das hast Du schon anderweit gemacht. Ich baue es hier deshalb bewusst nicht ein, aber ich denke, sowas gehört eigentlich ins Template, nicht ins Viewmodel.</p> <p>Zum Beispiel könntest Du diesen Helper bauen:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">renderAttribute</span><span class="token punctuation">(</span><span class="token variable">$attrName</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token variable">$value</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>isset brauchst Du nicht, empty() ist ein Sprachkonstrukt, keine Funktion und prüft isset implizit mit ab. Im Handbuch steht:</p> <blockquote> <p>A variable is considered empty if it does not exist or if its value equals FALSE</p> </blockquote> <p>(Beachte: equals FALSE meint <code>== FALSE</code>, nicht <code>=== FALSE</code>).</p> <p>Damit schreibst Du ins Template:</p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table<span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> </code></pre> <p>oder verlässt PHP für den Moment gar nicht (sollte unterm Strich aber egal sein):</p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table<span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> </code></pre> <p>Es geht aber noch deutlich besser. Du könntest deine Klasse <code>TableAttributs</code> ertüchtigen (und vermutlich könnte sie sogar <code>ElementAttributes</code> heißen, weil sie nicht nur für Tabellen funktioniert):</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">ElementAttributes</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">render</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token variable">$attributes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$attributes</span> <span class="token keyword">as</span> <span class="token variable">$attr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token variable">$attrName</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token variable">$attrName</span><span class="token punctuation">}</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Ich habe das ganze Attribut mit echo ausgegeben, statt dauernd zwischen PHP und HTML zu wechseln.</p> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span> <span class="token punctuation">></span></span>; </code></pre> <p>Es wäre dann auch sinnvoll, hinter den beiden for-Schleifen jeweils eine Variable mit dem aktuellen Schleifenwert zu setzen. Oder gleich die foreach-Schleife zu verwenden - was aber nur sinnvoll ist wenn Du $i oder $j nicht brauchst...</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span> <span class="token keyword">as</span> <span class="token variable">$rowData</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token operator"><</span>tr <span class="token operator"><</span><span class="token operator">?</span><span class="token operator">=</span><span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span> > <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$j</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$j</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">cell</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$j</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token variable">$cellData</span> <span class="token operator">=</span> <span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span><span class="token variable">$j</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$cellTag</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token variable">$key</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string double-quoted-string">"th"</span> <span class="token punctuation">:</span> <span class="token string double-quoted-string">"td"</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellTag</span> <span class="token operator">.</span> <span class="token variable">$cellData</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"rowSpan"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colSpan"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellData</span><span class="token operator">-></span><span class="token property">content</span><span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellTag</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endforeach</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> </code></pre> <p>Das ist signifikant kleiner als dein Code. Ich find's auch besser lesbar.</p> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. Außer < und > kommt ja eh alles aus PHP.</p> <p>Schneller laufen wird's auch nicht, durch die Methodenaufrufe gehen einige Mikrosekunden drauf. Ob das jetzt sofort funktioniert weiß ich nicht, das ist teilweise in der Sandbox probiert, aber teilweise auch vom Hirn ins Forum gehauen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Thu, 19 Dec 19 07:46:53 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761906?srt=yes#m1761906 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761906?srt=yes#m1761906 <p>Nun, wie wärs denn damit:</p> <pre><code class="block language-php"><span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableConstruktor</span><span class="token punctuation">(</span> <span class="token variable">$tableprops</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">tr</span><span class="token punctuation">(</span> <span class="token variable">$rowprops</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">tbody</span><span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">th</span><span class="token punctuation">(</span><span class="token variable">$opts</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">td</span><span class="token punctuation">(</span><span class="token variable">$opts</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Da hast Du alles in einer Klasse und ruft nur noch die Methoden auf! Wobei die übergebenen Options auch die Zelleninhalte und Attribute enthalten.</p> <p>MFG</p> OOP Polymorphie Thu, 19 Dec 19 12:02:54 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761934?srt=yes#m1761934 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761934?srt=yes#m1761934 <p>Hier mal ein Beispiel was Du auch auf Deine Tabellenklasse anwenden kannst:</p> <pre><code class="block language-php"># Klasse zum Erstellen einer sitemap.xml /urlset class Sitemap{ function __construct($opts){ $opts = array_merge( array( 'proto' => '', 'domain' => '', 'version' => '1.0', 'encoding' => 'UTF-8', 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9' ), $opts); $this->OPTS = $opts; $this->URLSET = array(); $this->BUFFER = ''; } function add($url){ $this->URLSET[] = $url; } function out(){ $this->BUFFER = sprintf("<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>?xml</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span> <span class="token attr-name">encoding</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>\n", $this->OPTS['version'], $this->OPTS['encoding']); $this->BUFFER .= sprintf("\t<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>urlset</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>\n", $this->OPTS['xmlns']); $this->urlset(); $this->BUFFER .= "\t<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>urlset</span><span class="token punctuation">></span></span>"; return $this->BUFFER; } function urlset(){ foreach( $this->URLSET as $url ){ $this->BUFFER .= sprintf("\t\t<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>loc</span><span class="token punctuation">></span></span>%s<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>loc</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span>\n", $url); } } } $s = new Sitemap( array( 'proto' => 'https', 'domain' => 'example.org' )); $s->add('/index.html'); $s->add('/foo.html'); $s->add('/find'); echo $s->out(); </code></pre> <p>Damit ist es einfach, weitere XML-Elemente einzubauen. OOP lebt von der Vielgestaltigkeit und umgekehrt.</p> <p>MFG</p> Warum nicht Error & Exception Überprüfung in Validatoren Sun, 15 Dec 19 00:30:03 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761680?srt=yes#m1761680 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761680?srt=yes#m1761680 <p>moin,</p> <blockquote> <p>Whoa, was ist denn das für ein Template? Wieso <?php ... ?> auf jeder einzelnen Zeile?</p> </blockquote> <p>Kontext wechsel </p> <blockquote> <p>Und man darf in einem Template, wenn es mit PHP geschrieben ist, durchaus programmieren. Also Helper-Funktionen und -Variablen verwenden.</p> </blockquote> <blockquote></blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">renderAttribute</span><span class="token punctuation">(</span><span class="token variable">$attrName</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token variable">$value</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>mir ist es deutlich lieber wenn ich <em>BuiltIn</em>-Funktionen nehme</p> <p>Ich zerhacke immer alles und plaziere immer alles schön seeehr weit weg . Hab da gute und weniger gute Erfahrungen gemacht.</p> <blockquote> <p>Unter anderem auch htmlspecialchars(), das fehlt bei Dir noch ganz - es sei denn das hast Du schon anderweit gemacht.</p> </blockquote> <p>hätte ich is aber nur n Test </p> <blockquote> <p>Ich baue es hier deshalb bewusst nicht ein, aber ich denke, sowas gehört eigentlich ins Template, nicht ins Viewmodel.</p> </blockquote> <p>ich denke nicht, weil es ja nur ein Template ist. Aber ich bin im gegensatz zu dir (einen Profil) n echtes greenhorn .</p> <blockquote> <p>isset brauchst Du nicht, empty() ist ein Sprachkonstrukt, keine Funktion und prüft isset implizit mit ab. Im Handbuch steht:</p> </blockquote> <p>…ja ich erinner mich da an was. Danke für die Auffrischung</p> <blockquote> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> </blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so. Lasst mich erst in der <em>PHP</em>-Welt ankommen .</p> <p>Irgend wann baue ich mal einen simplen <em>MarkDown</em>-PlugIn.</p> <blockquote> <p>Es wäre dann auch sinnvoll, hinter den beiden for-Schleifen jeweils eine Variable mit dem aktuellen Schleifenwert zu setzen. Oder gleich die foreach-Schleife zu verwenden - was aber nur sinnvoll ist wenn Du $i oder $j nicht brauchst...</p> </blockquote> <p>da habe ich auch meine Problemchen wie ich das lösen kann. Dank für den Rat.</p> <blockquote> <p>[…] Das ist signifikant kleiner als dein Code. Ich find's auch besser lesbar.</p> </blockquote> <p>das ist es… ich werde mich apäter damit beschäftigen, weil ichs weniger wichtig finde, Wichtig! aber weniger.</p> <blockquote> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. […]</p> </blockquote> <p>Kontext wechsel. Wenn ich im HTML Template bin dann notiere ich z.B. <code class="language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$foobar</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></code> und <code class="language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token constant boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></code>.</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sun, 15 Dec 19 07:20:47 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761684?srt=yes#m1761684 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761684?srt=yes#m1761684 <p>Tach!</p> <blockquote> <blockquote> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> </blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so.</p> </blockquote> <p>Nein, <code><?=</code> steht seit Version 5.4 unabschaltbar zur Verfügung. Die Versionen, in denen das abschaltbar war sind ausgestorben (lies: unsupportet). Ein Zusammenhang zu DB-Handling und SQL-Injection oder jeglicher Art anderer Injection besteht auch nicht. Wenn ein Kontextwechsel vorhanden ist, muss der in beiden Schreibweisen in exakt gleicher Art und Weise berücksichtigt werden.</p> <blockquote> <blockquote> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. […]</p> </blockquote> </blockquote> <p>Jedenfalls ist es nicht sonderlich sinnvoll, zwischen <code>?></code> und <code><?php</code> nur Whitespace stehen zu haben, der für die Ausgabe irrelevant ist. Da kann man gleich im PHP-Modus bleiben. Der erzeugte HTML-Code ist nur bedingt lesbar, weil ein dem <code>?></code> nachfolgender Zeilenumbruch nicht in der Ausgabe erscheint, aber die Einrückungs-Whitespace-Zeichen. Da entsteht also ohne zusätzliche Zeilenschaltung nur eine lange Zeilenwurst. Wichtig ist in erster Linie die syntaktische Korrektheit, nicht die menschliche Lesbarkeit. Syntaktische Korrektheit kann auch ein Automat prüfen, dem der Whitespace egal ist. Inhaltliche Probleme geht man hingegen meist in der DOM-Ansicht an, die der Browser anhand der logischen Struktur des Dokuments präsentiert.</p> <p>dedlfix.</p> Warum nicht Error & Exception Überprüfung in Validatoren Sun, 15 Dec 19 10:45:17 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761694?srt=yes#m1761694 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761694?srt=yes#m1761694 <p>Hallo MB,</p> <blockquote> <p>mir ist es deutlich lieber wenn ich BuiltIn-Funktionen nehme</p> </blockquote> <p>Du musst natürlich so programmieren, wie Du es am besten lesen und verstehen kannst.</p> <p>Deswegen aber auf Helper-Funktionen zu verzichten und Megabytes an Boilerplate-Code zu tippen - ist das besser? Je mehr Code da steht, desto mehr musst Du lesen. Wenn der relevante Code aus ein paar Stecknadeln in Bergen von repetitivem Basiszeugs besteht, erschwert das die Fehlersuche ungemein. Sind nur meine 2ct dazu, die Entscheidung bleibt bei Dir. Ich werde dir - weil ich keine Akten über meine Gesprächspartner führe und sowas hier schnell wieder vergesse - vermutlich trotzdem regelmäßig dazu was erzählen wenn Du Codebeispiele bringst. Nimm's mir dann nicht übel </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Warum nicht Error & Exception Überprüfung in Validatoren Sun, 15 Dec 19 16:56:04 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761720?srt=yes#m1761720 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761720?srt=yes#m1761720 <p>moin,</p> <blockquote> <blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so.</p> </blockquote> </blockquote> <blockquote> <p>Nein, <code><?=</code> steht seit Version 5.4 unabschaltbar zur Verfügung. […]</p> </blockquote> <p>wuste ich nicht. Danke für di Info!!!</p> <blockquote> <p>Der erzeugte HTML-Code ist nur bedingt lesbar, weil ein dem <code>?></code> nachfolgender Zeilenumbruch nicht in der Ausgabe erscheint, aber die Einrückungs-Whitespace-Zeichen.</p> </blockquote> <p>habe ich mir gedacht!!! Bedankt</p> <p>lgmb</p> Warum nicht Error & Exception Überprüfung in Validatoren Sun, 15 Dec 19 16:49:57 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761719?srt=yes#m1761719 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761719?srt=yes#m1761719 <p>moin,</p> <blockquote> <blockquote> <p>mir ist es deutlich lieber wenn ich BuiltIn-Funktionen nehme</p> </blockquote> </blockquote> <blockquote> <p>Du musst natürlich so programmieren, wie Du es am besten lesen und verstehen kannst.</p> </blockquote> <p>da hast du natürlich recht. Es läst sich wohl nicht vermeiden aber da wo ich es vermeiden kann, werde ich nichtt drauf zurück greifen, esd sein den es ist im Templates üblich. Mit wachsendem Code wird es auf jeden Fall der Fall sein .</p> <blockquote> <p>Ich werde dir […] vermutlich trotzdem regelmäßig dazu was erzählen wenn Du Codebeispiele bringst. Nimm's mir dann nicht übel </p> </blockquote> <p>Ach iwo. Immer her damit.</p> <p>lgmb</p> OOP Polymorphie Thu, 19 Dec 19 13:14:12 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761942?srt=yes#m1761942 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761942?srt=yes#m1761942 <p>Hallo pl,</p> <p>Polymorphie? Wo? Ich sehe keine Klassenvererbung und keine Interfaces. Eins von beiden bräuchtest Du dafür schon.</p> <p>Zum Code:</p> <p>Du solltest deine Properties deklarieren.</p> <p>URLSET, urlset und OPTS sollten private sein.</p> <p>Nicht jede Variable muss ein Property sein. BUFFER sollte statt dessen lokale Variable sein und als Wert von urlset zurückgegeben werden. Das Ding ist temporär.</p> <p>Die Namen einer öffentlichen Schnittstelle sollen so sprechend wie möglich sein. Sprechende Namen sind besser als jede Doku. Also - beispielsweise - toXmlString statt out, addUrl statt add, getUrlSetAsXmlFragment statt urlset und urlList statt BUFFER.</p> <p>Wo findet der Kontextwechsel zu XML für die Zeichen &, ', ", < und > statt? Zumindest das & kann gern mal Teil einer URL sein, bei den vier anderen mag es weniger wichtig sein.</p> <p>Die Parametrierbarbeit von UTF-8 und XML Version ist sinnlos. Sitemaps müssen UTF-8 codiert sein, und einen Sinn in einer XML 1.1 Sitemap sehe ich nicht, da kein Freitext enthalten sein darf und eine URL immer in XML 1.0 darstellbar ist.</p> <p>Dass die Sitemap-Elemente lastmod, changefreq und priority nicht aufscheinen, ist sicherlich der Kürze des Beispiels geschuldet, oder?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> OOP Polymorphie Thu, 19 Dec 19 13:59:13 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761946?srt=yes#m1761946 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761946?srt=yes#m1761946 <blockquote> <p>Dass die Sitemap-Elemente lastmod, changefreq und priority nicht aufscheinen, ist sicherlich der Kürze des Beispiels geschuldet, oder?</p> </blockquote> <p>Nein. Warum das fehlt hab ich doch geschrieben. MFG</p> OOP Polymorphie Thu, 19 Dec 19 17:19:48 Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761971?srt=yes#m1761971 https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761971?srt=yes#m1761971 <p>Hallo pl,</p> <p>mag sein. Aber nicht in diesem Thread.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div>