Template-Inhalt per PHP ausgeben

Quell-ID: GitHub Discussion #8

Use Case

Der Inhalt eines REDAXO-Templates soll direkt per PHP ausgeführt und ausgegeben werden, ohne dass ein Artikel geladen wird.

Verwendete AddOns

  • REDAXO Core

Zielbeschreibung

Ein Template soll programmatisch geladen und dessen PHP-Code ausgeführt werden.

Lösung

<?php
$templateID = 6;
$template = new rex_template($templateID);
$templateContent = $template->getTemplate();
echo rex_file::getOutput(rex_stream::factory('rex:///template/' . $templateID, $templateContent));

Erklärung

  1. rex_template($templateID) – Erstellt ein Template-Objekt für die angegebene ID
  2. getTemplate() – Holt den rohen Template-Code
  3. rex_stream::factory() – Erstellt einen virtuellen Stream für den Template-Code
  4. rex_file::getOutput() – Führt den Code aus und gibt das Ergebnis zurück

Besserer Ansatz

Für die meisten Anwendungsfälle ist es empfehlenswert, Templates über die Artikel-API zu nutzen:

Alternative 1: Fragment verwenden

<?php
$fragment = new rex_fragment();
$fragment->setVar('data', $myData);
echo $fragment->parse('my_fragment.php');

Alternative 2: Include mit Variablen

Wenn Template-Logik wiederverwendet werden soll, kann diese in eine separate PHP-Datei ausgelagert werden:

// In redaxo/src/addons/project/lib/TemplateHelper.php
class TemplateHelper
{
    public static function renderHeader(array $params = []): string
    {
        ob_start();
        extract($params);
        include rex_path::addon('project', 'fragments/header.php');
        return ob_get_clean();
    }
}

// Verwendung
echo TemplateHelper::renderHeader(['title' => 'Meine Seite']);

Alternative 3: Artikel mit Template laden

<?php
// Artikel mit einem bestimmten Template laden
$article = new rex_article_content($articleId);
echo $article->getArticleTemplate();

Wann die direkte Template-Ausgabe sinnvoll ist

  • Migration von altem Code
  • Debugging
  • Spezielle Konsolenbefehle
  • Generierung von statischen Dateien

Für reguläre Webseiten-Ausgaben sollte der Standard-Artikelaufruf bevorzugt werden.