• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Template-System?

Spoiler

Mitglied
Hallo,

ich benutze bei meinen Projekten ein eigenes Template-System.
Leider arbeite ich hier immer noch mit eval() und vielen Ersetzungen mit preg_replace ...

Ich möchte das Ganze jetzt mal überarbeiten. Dabei soll folgendes realisiert werden:
- Variablen die im PHP-Code verfügbar sind, sollen auch im Template verfügbar sein (dafür war eval() da).
- eine simple if-Konstruktion soll implementiert werden (else muss nicht)

Gibt es da einfache "Fertig-Systeme" oder hat jemand von euch eine "simple" Möglichkeit das zu realisieren?

Danke im Voraus.
 
Werbung:
Hallo,

ich benutze bei meinen Projekten ein eigenes Template-System.
Leider arbeite ich hier immer noch mit eval() und vielen Ersetzungen mit preg_replace ...

Ich möchte das Ganze jetzt mal überarbeiten. Dabei soll folgendes realisiert werden:
- Variablen die im PHP-Code verfügbar sind, sollen auch im Template verfügbar sein (dafür war eval() da).
- eine simple if-Konstruktion soll implementiert werden (else muss nicht)

Gibt es da einfache "Fertig-Systeme" oder hat jemand von euch eine "simple" Möglichkeit das zu realisieren?

Danke im Voraus.

Da gibt es eigentlich nur zwei wichtige:
Twig und Smarty.

Smarty hat eine ziemlich hässliche Syntax, ist jedoch von der Performance besser. Ich verwende tzd. Twig.
 
Hab ich mir mal angeschaut, gibt es da irgendwo noch sowas wie ein deutschsprachiges Tutorial für Twig?
 
Werbung:
Moin Moin

Ich versteh schon warum gerne es ignoriert wird, dass PHP schon so entworfen wurde, dass man es als "Template-Engine" nutzen kann. Dennoch der Vollständigkeit halber:

PHP:
<h1><?= $headline; ?></h1>

<ul>
    <?php foreach($items as $item): ?>
    <li><?= $item['text']; ?></li>
    <?php endforeach; ?>
</ul>

<?php if($something): ?>
<p>Hello World</p>
<?php endif; ?>

<p><?= $something ? 'Hello World' : 'Hello People'; ?></p>

Bevor jemand meckert dass "<?=" nicht genutzt werden sollte: Seit PHP 5.4 ist dieses Konstrukt unabhängig von der short_open_tag Einstellung immer verfügbar. Hier nachzulesen: http://php.net/manual/de/migration54.new-features.php

Um das auch noch halbwegs ordentlich zu integrieren, lässt sich die Funktion extract() benutzen. Zum Beispiel so:

DISCLAIMER: Es folgt ungetesteter Code.
PHP:
function loadTemplate($template, $dataToDisplay = []) {
    extract($dataToDisplay);

    ob_start();
    require_once(PATH_TO_TEMPLATES . $template);
    $renderedTemplate = ob_get_contents();
    ob_end_clean();
      
    return $renderedTemplate;
}

$dataToDisplay = [
    'headline' => 'Überschrift',
    'items'    => [
        0 => ['text' => 'Some Text'],
        1 => ['text' => 'Some other Text']
    ],
    'something' => true
];

echo loadTemplate('myTemplate.php', $dataToDisplay);

Grüße
 
Moin Moin

Ich versteh schon warum gerne es ignoriert wird, dass PHP schon so entworfen wurde, dass man es als "Template-Engine" nutzen kann. Dennoch der Vollständigkeit halber:

PHP:
<h1><?= $headline; ?></h1>

<ul>
    <?php foreach($items as $item): ?>
    <li><?= $item['text']; ?></li>
    <?php endforeach; ?>
</ul>

<?php if($something): ?>
<p>Hello World</p>
<?php endif; ?>

<p><?= $something ? 'Hello World' : 'Hello People'; ?></p>

Bevor jemand meckert dass "<?=" nicht genutzt werden sollte: Seit PHP 5.4 ist dieses Konstrukt unabhängig von der short_open_tag Einstellung immer verfügbar. Hier nachzulesen: http://php.net/manual/de/migration54.new-features.php

Um das auch noch halbwegs ordentlich zu integrieren, lässt sich die Funktion extract() benutzen. Zum Beispiel so:

DISCLAIMER: Es folgt ungetesteter Code.
PHP:
function loadTemplate($template, $dataToDisplay = []) {
    extract($dataToDisplay);

    ob_start();
    require_once(PATH_TO_TEMPLATES . $template);
    $renderedTemplate = ob_get_contents();
    ob_end_clean();

    return $renderedTemplate;
}

$dataToDisplay = [
    'headline' => 'Überschrift',
    'items'    => [
        0 => ['text' => 'Some Text'],
        1 => ['text' => 'Some other Text']
    ],
    'something' => true
];

echo loadTemplate('myTemplate.php', $dataToDisplay);

Grüße

Nur wenn man etwas nutzen kann, heißt das nicht dass man es auch nutzen soll :)

Ich kann jetzt zwar nur für Twig sprechen, aber eine gute Template-Engine bringt schon enorme Vorteile gegenüber plain PHP.

So ist dein PHP Template, ohne weitere Maßnahmen, anfällig für Code Injection.
Bei Twig werden alle Variablen direkt vor der Ausgabe maskiert:
Code:
<p>{{ user_input }}<p>
In plain PHP wäre es hierfür notwendig jede Ausgabe zusätzlich in eine escaping-Funktion zu wrappen was nur überflüssigen Code produziert.

Ein weiteres tolles Feature ist es, andere Templates 'extenden' zu können:
Code:
# base.html.twig

<!DOCTYPE html>
<html>
  <head>
    {% block head %}{% endblock %}
  </head>
  <body>
    {% block body %}{% endblock %}
    {% block javascripts %}{% endblock %}
  </body>
</html>

Code:
# layout-1.html.twig

{% extends 'base.html.twig' %}

{% block head %}<link href="app.css" rel="stylesheet">{% endblock %}

{% block body %}
  <h1>Layout 1</h1>
{% endblock %}

{% block javascripts %}
  <script>console.log('hi!');</script>
{% endblock %}

Code:
# layout-2.html.twig

{% extends 'layout-1.html.twig' %}

{% block body %}
  <h1>Layout 2</h1>
{% endblock %}

Das sind nur zwei Beispiele warum ich Templating Engines in jedem Fall bevorzuge.
Diese beiden Features in PHP Templates umzusetzen wäre nämlich nahezu unmöglich.

Ich muss natürlich auch dazu sagen, dass ich Twig immer vorkonfiguriert durch das Symfony Framework erhalte. Darum fällt jeglicher Konfigurationsaufwand weg und alles läuft "out of the box". Wäre also schön blöde nicht Twig zu verwenden :)
 
Zuletzt bearbeitet:
Moin
Nur wenn man etwas nutzen kann, heißt das nicht dass man es auch nutzen soll
[...]
So ist dein PHP Template, ohne weitere Maßnahmen, anfällig für Code Injection.

Ich habe mit meinem Beitrag weder zum Ausdruck bringen wollen, dass plain PHP der heilige Gral ist, noch das die geposteten Codes wasserdicht sind. Gerade Letzteres - so dachte ich - sollte eigentlich aufgrund meines Teilsatzes "der Vollständigkeit halber" klar sein. Wenn ich zur grundlegenden Veranschaulichung eines Funktionsprinzipes schon bombensichere Codes posten soll, dann müsste man mich dafür schon bezahlen :D

Das sind nur zwei Beispiele warum ich Templating Engines in jedem Fall bevorzuge.
Ich will dir nicht wiedersprechen. Klar bietet eine vielfach genutzte und durchgetestete Templating-Engine wesentlich mehr Vorteile. Ich selbst nutze - da es mir ebenso von Laravel vorkonfiguriert zur Verfügung gestellt wird - mit Vorliebe Blade.

Grüße
 
Werbung:
Also ich habe mir jetzt mal Twig installiert und mir Tutorials angeschaut.
Ich denke ich komme damit klar ... für das, was ich machen will ist das quasi schon überdimensioniert ;)

Aber auch wenn ich nicht alle Funktionen nutze oder gleich korrekt einsetzen werde, sollte das zum Schluss besser sein, als das, was ich jetzt grad nutze.

Danke nochmal, und auch für den Hinweis mit PHP, aber das wollte ich bewusst nicht einsetzen ;)
 
Zurück
Oben