Hallo 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.
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.
Zum Beispiel könntest Du diesen Helper bauen:
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:
<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):
<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):
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 😉
<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 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.
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.
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.
Rolf
sumpsi - posui - clusi