Warum nicht Error & Exception Überprüfung in Validatoren
bearbeitet von Rolf BHallo MB,
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.
Zum Beispiel:
~~~php
function renderAttribute($attrName, $value) {
if (!empty($value))
echo " $attrName='$value'";
}
~~~
isset brauchst Du nicht, empty() ist ein Sprachkonstrukt, keine Funktion und prüft isset implizit mit ab. Im Handbuch steht:
> A variable is considered empty if it does not exist or if its value equals FALSE
(Beachte: equals FALSE meint `== FALSE`, nicht `=== FALSE`).
Damit schreibst Du ins Template:
~~~php
<table<?=renderAttribute("id", $attributs->id)?><?=renderAttribute("class", $attributs->class)?>>
~~~
oder verlässt PHP für den Moment gar nicht (sollte unterm Strich aber egal sein):
~~~php
<table<?=renderAttribute("id", $attributs->id) . renderAttribute("class", $attributs->class)?>>
~~~
Es geht aber noch deutlich besser. Du könntest deine Klasse `TableAttributs` ertüchtigen (und vermutlich könnte sie sogar `ElementAttributes` heißen, weil sie nicht nur für Tabellen funktioniert):
~~~php
class ElementAttributes {
public function render(...$attributes) {
foreach ($attributes as $attr) {
if (!empty($this->$attrName))
echo " $attrName='{$this->$attrName}'";
}
}
}
~~~
Ich habe das ganze Attribut mit echo ausgegeben, statt dauernd zwischen PHP und HTML zu wechseln.
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 😉
~~~php
<table <?=$attributs->render("id", "class")?> >;
~~~
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...
~~~php
<?php foreach ($section->row as $rowData) :
<tr <?=$rowData->attributs->render("id", "class")?> >
<?php for( $j = 0; $j < count( $rowData->cell ); $j++ ) :
$cellData = $rowData->cell[$j];
$cellTag = ( $key === 'head' or $j === 0 and $key !== 'foot' ) ? "th" : "td"; ?>
<<?=$cellTag . $cellData->attributs->render("id", "class", "rowSpan", "colSpan")?>>
<?=$cellData->content?>
</<?=$cellTag?>>
<?php endfor; ?>
</tr>
<?php endforeach; ?>
~~~
Das ist signifikant kleiner als dein Code. Ich find's auch besser lesbar. Schneller laufen wird's 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.
_Rolf_
--
sumpsi - posui - clusi