PHP Code vom Template sauber trennen

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

in meinem "Blog-CMS" nutze ich bereits ein einfaches Template System.
Nun habe ich aber das Problem, dass ich meist innerhalb des Templates noch viel PHP Code nutzen muss.

Vielleicht habt ihr Anregungen, wie ich das umgehen kann:

aufruf der funktion und zuweisung des arrays:

PHP:
$tpl->assign('content_array', $content->fetchContenData($y = '', $x = '', $_GET['id']));

aufruf des templates:
PHP:
$tpl->display(TEMPLATE_SKIN.'/comments.html');

Template:

PHP:
<p>
 <? if(count($TPL['content_array'][$x]['category']) != NULL) { ?>
Kategorie: <? foreach($TPL['content_array'][$x]['category'] as $t)echo "<a href='?nav=category_filter&id=".$t['category_id']."'>".$t['category_name']."</a> ";?></br><? } ?>
            <?=$TPL['content_array'][$x]['date']?> <?=$TPL['content_array'][$x]['time']?> &middot; Author: <?=$TPL['content_array'][$x]['author_name']?> &middot; Kommentare: <a href="?nav=comments&id=<?=$TPL['content_array'][$x]['id']?>"> <?=$TPL['content_array'][$x]['comments']?> </a>
</p>
<? endfor; ?>

Besonders der Block mit den Kommentaren ist doch eher speziell.
Wenn man jetzt mehrere Templates bauen wollen würde, müsste man hier jedesmal den Block so kopieren.

Hat vielleicht jemand Anregungen für mich ?
 
Eventuell den Block in eine separate PHP Datei auslagern und dann nur noch inkluden? Alternativ kannst du den Inhalt auch aus einer Datenbank holen und das dann dort einfügen.
 
Ich würde in meine Template-Engine auch die üblichen Funktionen implementieren.
Die Benutzung von Delimitern in den Views würde dann Sinn machen.

Den so ist es nur eine "halbe" Template-Engine.

Alternativ könnte man auch derartiges in einem view model auslagern.

Aber was spricht gegen den Einsatz bewährter Template-Engines?

Ich für meinen Teil benutze gerne Twig.
 
Ich für meinen Teil mag den Ansatz, im Template nicht nur puren HTML (+Include-Variablen etc) zu verwenden, sondern auch PHP-Logik direkt schreiben zu können. In Contao wird z.B. auch so ein Ansatz verwendet, weil es einfach viel flexibler ist.
 
würde auch eher zu twig greifen.. zwar kann man php durchaus als template engine benutzen aber wie man an deinem beispiel sieht, ist es unheimlich hässlich.. aber smarty ist auch hässlich.. benutze normalerweise microframeworks wie laravel oder f3 und nehme die integrierte template engine... passt dann alles schön zusammen und man kann nach dem mvc prinzip trennen
 
klomann83 schrieb:
aber smarty ist auch hässlich..

Im Sinne von generiertem Code - das stimmt. Btw: Als Framework kann ich FuelPHP empfehlen. HMVC, REST Controller, Kommandozeilen-Tool uvm. Ansonsten natürlich - je nach Bedarf - ZFW oder Symfony 2 ...
 
Ein Framework oder eine andere Engine mag ich eigentlich nicht anbinden.
bleibt mir wohl erstmal nichts anderes übrig. muss ich halt die stellen gut dokumentieren.

trotzdem danke für die ansätze :-)
 
Dein Problem ist IMHO nicht PHP, sondern eher dass du zu viel im Template machen wilst. In Twig oder einer anderen Templateengine würde das wahrscheinlcih auch nicht anders aussehen, nur dass deine Schleife hübscher aussähe ;D
Erstmal stellt sich mir die Frage, warum du im Template selbst dieses $TPL benutzt, nimm doch gleich eine lokales Array namens $VAR, damit hast du deinen Code schonmal signifikant gekürzt, du machst dir quasi selber Arbeit.
Zweitens kannst du mit ein wenig Umformatierung die Lesbarkeit dieses Codebatzens extrem erhöhen:
PHP:
<? if(count($VAR[$x]['category'])) { ?>
  Kategorie: 
  <? foreach($VAR[$x]['category'] as $t) { ?>
  <p>
    <?= "<a href='?nav=category_filter&id=".$t['category_id']."'>".$t['category_name']."</a></br>?>
   <?= $VAR[$x]['date'] $VAR[$x]['time'] ?> 
   &middot; Author: 
   <?= $VAR[$x]['author_name']?> &middot; Kommentare: <a href="?nav=comments&id=
   <?= $VAR[$x]['id'] ?>"> <?=$VAR[$x]['comments']?> 
   </a></p>
  <? } ?>
<? }?>
(Code nicht getestet, deiner erscheint mir aber etwas komisch verschachtelt zu sein, die IF geht vorm Foreach auf aber im Foreach zu?)

Wenn dir das immer noch nicht reicht, dann bau dir ein Formatierungsobjekt (wenn du noch keins hast) mit einer Funktion um Hrefs zurückzugeben. Bekommt: array mit Getparametern, Ziel, Beschreibung; gibt zurück: kompletten Link.

Beispiel:
PHP:
<?= $format->link(array('id'=>$t['category_id']), '',$t['category_name']); ?>
 
man kann Code für Templates noch "besser" schreiben, womit man nachher dann fast keinen Vorteil mehr durch Twig, Smarty und Co hat (also rein auf "Aussehen"):
PHP:
<?php if(count($VAR[$x]['category'])): ?>
    Kategorie:
    <?php foreach($VAR[$x]['category'] as $t):?>
        <p>
            <a href="?nav=category_filter&id=<?= $t['category_id'] ?>"><?= $t['category_name'] ?></a></br>
            <?= $VAR[$x]['date'] ?> <?= $VAR[$x]['time'] ?>
            &middot; Author:
            <?= $VAR[$x]['author_name'] ?>
            &middot; Kommentare:
            <a href="?nav=comments&id=<?= $VAR[$x]['id'] ?>"> <?= $VAR[$x]['comments'] ?></a>
        </p>
    <? endforeach ?>
<?php endif ?>


@mambokurt: Ob short-open-tags an oder aus ist, ist immer so eine Frage, darauf würde ich mich als Entwickler nur verlassen, wenn du für ein ganz bestimmtes Setup entwickelst. Und auf <?= kann man sich auch nur in PHP 5.4 verlassen, davor fällt es auch unter die Short-Open-Tags. Bei PHP vor 5.4 würde ich also ein <?php echo schreiben.
 
Ich versteh auch nicht, warum Leute immer ganze HTML-Tags per echo ausgeben. Das versaut doch jedes Syntax Highlighting hinsichtlich HTML. Es geht doch nix über die if(): ... endif; - Schreibweise
 
Das hängt ganz davon ab, ob du eher Programmierer oder eher Webdesigner bist. Als Programmierer werden dir geschweifte Klammern immer liber sein, die erfreuen einfach nur das Auge.
Als Webdesigner, der sein Augenmerk eher auf das HTML als auf den Code legt, ist natürlich das endif übersichtlicher. Ansonsten hat btw if nix mit Ausgabe zu tun ;D
Ergänzung ()

ice-breaker schrieb:
@mambokurt: Ob short-open-tags an oder aus ist, ist immer so eine Frage, darauf würde ich mich als Entwickler nur verlassen, wenn du für ein ganz bestimmtes Setup entwickelst. Und auf <?= kann man sich auch nur in PHP 5.4 verlassen, davor fällt es auch unter die Short-Open-Tags. Bei PHP vor 5.4 würde ich also ein <?php echo schreiben.

Das ist mir durchaus bewußt, benutzt hat das als erstes der TE, deswegen bin ich davon ausgegangen dass sein Server das beherrscht. So oder so kannst du aber auf Servern die nicht <?= unterstützen per Kommandozeile rüberaufen und <?php echo statt dessen einfügen, wobei ich lieber die erste Variante durchboxen möchte...
 
Weil ich nicht deiner Meinung bin, werde ich zum Webdesigner heruntergestuft? Interessante Diskussionsstrategie...

HTML-code unterscheidet sich eben schon rein optisch deutlich von PHP, womit man in PHP die geschweiften Klammern nutzen kann und im Template die ausgeschriebene Variante, das ist kein Wiederspruch. Die Entwickler des Zend Framework sehen das z.B. uch so und schlagen explizit die von mir genannte Schreibweise vor - und das sind auch keine Webdesigner.
 
ice-breaker schrieb:
Weil ich nicht deiner Meinung bin, werde ich zum Webdesigner heruntergestuft? Interessante Diskussionsstrategie...
Was is eigentlich, wenn man wie ich sowohl den Frontend-Code als auch die Backend-Logik schreibt? Ist man dann Webdesigner, Programmierer oder einfach nur Entwickler? Ich nenn mich lieber Entwickler mit Fokus auf PHP....

Nur um sich dann elitär vorzukommen muss man sich in Templates, die doch etwas Programmlogik enthalten, nicht das Syntax Highlighting total versauen und alles mit Klammern und echo '<a href=".$target.">' zuballern... Syntax Highlighting ist eines der wichtigsten Mittel, um schnell auf Schreibfehler im Code zu stoßen. Wozu es also verkrüppeln? Ein Template enthält ja auch gern mal geringe Mengen Inline-JS oder Inline-CSS. Da ist ein funktionierender Highlighter doch echt nützlich.
 
ice-breaker schrieb:
Weil ich nicht deiner Meinung bin, werde ich zum Webdesigner heruntergestuft? Interessante Diskussionsstrategie...

HTML-code unterscheidet sich eben schon rein optisch deutlich von PHP, womit man in PHP die geschweiften Klammern nutzen kann und im Template die ausgeschriebene Variante, das ist kein Wiederspruch. Die Entwickler des Zend Framework sehen das z.B. uch so und schlagen explizit die von mir genannte Schreibweise vor - und das sind auch keine Webdesigner.

Fühl dich mal nicht gleich auf den Schlips getreten, damit wollte ich eigentlich nur sagen, dass diese Schreibweise für Webdesigner, die quasi nur Templates bauen, sicherlich leichter zu verstehen und zu erfassen ist als geschweifte Klammern ^^ Und ob wir Entwickler jetzt mehr wert sind als ein Webdesigner sei jetzt mal dahingestellt, solche Einstufungen finde ich immer etwas gewagt. Ich persönlich würde auch als Müllmann arbeiten und mich nicht herabgestuft fühlen, ist schließlich auch Arbeit. Ob ich meine Arbeitskraft jetzt für X oder Y verkaufe ist doch letztendlich nebensächlich, wobei es sicherlich etwas hilft wenn man seine Arbeit mag ;)

Daaron schrieb:
Was is eigentlich, wenn man wie ich sowohl den Frontend-Code als auch die Backend-Logik schreibt? Ist man dann Webdesigner, Programmierer oder einfach nur Entwickler? Ich nenn mich lieber Entwickler mit Fokus auf PHP....

Softwareentwickler, und fertig ist der Lack. In welcher Sprache ich entwickle und GUIs baue ist mir letztendlich relativ egal, dewegen sehe ich nicht so ganz ein mich da auf eine Sprache festzulegen bei der Berufsbezeichnung, das kann letztendlich nur nachteilig sein.
 

Ähnliche Themen

Zurück
Oben