Diese Woche möchte ich euch den bisherigen Fortschritt des Portfolios präsentieren. Es hat sich in der letzter Woche tatsächlich etwas am Code bzw. an unserer Basis-Implementation getan. Natürlich auch am Layout – Ich war fleißig 😉

Was die Code-Basis angeht, so bin ich zum Beispiel auf die Beta Version von RainTPL 3 umgestiegen. Diese Version bietet einige neue Features die ich gerne benutzen möchte: Ganz speziell geht es mir dabei um die Möglichkeit eigene Template-Tags zu definieren. Das sieht in der Praxis folgendermaßen aus:

Tpl::register_tag('({i18n=".*?"})', '{i18n="(.*?)"}', function ($params) {
    // Code...
});

Selbst-definierte Tags lassen sich z.B. benutzen für Mehrsprachigkeit – Derzeit bietet nämlich weder RainTPL noch das Slim Framework eine eigenen Lösung. Im RainTPL Forum gibt es zwar ein-zwei Diskussionen bzw. Featurewünsche, doch im Code gibt es noch nichts konkretes.
RainTPL v3 nutzt nun auch Namespaces und (laut Entwickler) einen verbesserten Parser mit weniger Quellcode. Ich habe angefangen das Github Repository zu beobachten und bin gespannt wie sich RainTPL in der kommenden Zeit entwickelt. Bisher habe ich übrigens (trotz Beta-Phase) noch keine Fehler gefunden, die mich von der Nutzung abhalten.

Nun aber zu den tatsächlichen Änderungen am Code!

// Zuerst finden wir die Sprache anhand der Domain heraus.
$lang = end(explode('.', $_SERVER['SERVER_NAME']));

if ($lang == 'de')
{
    setlocale(LC_ALL, 'de_DE.utf-8');
}
else if ($lang == 'com')
{
    setlocale(LC_ALL, 'en_US.utf-8');
}

// Slim Framework sowie RainTPL + Plugins einbinden.
require 'Slim/Slim.php';
require 'RainTPL/Tpl.php';
require 'RainTPL/Tpl/Plugin/PathReplace.php';

// Angabe der zu nutzenden Namespaces.
use Rain\Tpl, Slim\Slim;

// Slim autoloader vorbereiten.
Slim::registerAutoloader();

// RainTPL konfigurieren.
Tpl::configure(array(
    "tpl_dir"   => "tpl/",
    "cache_dir" => "tmp/"
));

// Plugin zur Verzeichnis-ersetzung aktivieren.
Tpl::register_plugin(new Tpl\Plugin\PathReplace());

// Tag für Übersetzungen einbauen.
Tpl::register_tag('({i18n=".*?"})', '{i18n="(.*?)"}', function ($params) {
    // TODO: Funktion zum übersetzen von Strings.
});

// Routen definieren.
$app->get('/', function () use ($tpl, $app) {
    $tpl->assign(array(
        'title' => 'Es funktioniert!',
        'content' => 'Das System funktioniert wie gewünscht.'
    ));
    $app->response()->body($tpl->draw('_base', true));
});

// Slim starten.
$app->run();

Wenn wir uns den Code genauer ansehen fallen uns folgende Änderungen auf:

  • Sprache wird anhand der Domain („example.de“, „example.com“, …) identifiziert. Alternativ funktioniert dies aber auch via URL Segment – Diese Methode würde sich allerdings auf das Routing auswirken.
    $lang = current(explode('/', ltrim($_SERVER['REQUEST_URI'], '/')));
  • Kommentare in Deutsch 😉
  • Das „Verzeichnis-ersetzen“-Feature von RainTPL wurde als Plugin ausgelagert und muss explizit aktiviert werden
  • Die „Standard“-Pfade von RainTPL haben sich geändert, weshalb ich nun RainTPL’s statische „configure()“ Methode benutze
  • Ein selbstdefiniertes Tag für Übersetzungen (zumindest solange es keins vom Framework selbst gibt)
  • Das gerenderte Template wird an den Body der Slim Framework Response übergeben (nächter Schritt: Einen Wrapper in Slim für RainTPL bauen)

Ein erstes Layout

Und damit wir auch was schönes zum ansehen haben, hier eine erste Layout-Idee – Natürlich 100% responsive!
Ich bin damit noch nicht sehr zufrieden. Das ganze sollte derzeit also eher als eine Art „Arbeitsversion“ angesehen werden.

Doch widmen wir uns wieder der technischen Seite!

Ziel dieses kleinen Projektes soll natürlich ein Portfolio sein, das sich schnell erweitern und bearbeiten lässt. Es soll also keinen großen Pflegeaufwand geben! Ich stelle mir folgende Logik vor…

$app->get('/', function () use ($tpl, $app) {
    // Erstellen einer Struktur für die Startseite
    $structure = array(
        array(
            'tpl' => 'text',
            'data' => array(
                'headline' => 'Hello there'
                'paragraphs' => array(
                    'Paragraph 1',
                    'Paragraph 2',
                    'Paragraph 3'
                )
            )
        ),
        array(
            'tpl' => 'bars',
            'data' => array(
                'headline' => 'Skills'
                'bar_types' => array(
                    'PHP' => array(
                        'Kohana' => 100,
                        'ProcessWire' => 75,
                        'Wordpress' => 25,
                        'Slim Framework' => 50,
                        'Smarty' => 100,
                        'RainTPL' => 50
                    ),
                    'Javascript' => array( /* ... */ ),
                    'Misc' => array( /* ... */ )
                )
            )
        ),
        /* ... */
    );

    $tpl->assign('structure', $structure);

    // Das zusammenstellen der einzelnen Elemente passiert im Base-Template.
    $app->response()->body($tpl->draw('_base', true));
});

Ich hatte die Idee, die einzelnen Seiten mit Hilfe einer kleinen Struktur aus mini-Templates zu definieren!
In meinem Beispiel (siehe Quelltext und Layout-Screenshot) gibt es also mini-Templates für „Text“ (Der Einleitungstext mit Überschrift und Paragraphen), „Bars“ (Für die verschiedenen Prozentbalken) und ggf. so etwas wie „projects“ oder vielleicht „gallery“ (Um das ganze schön generisch und wiederverwendbar zu halten – DRY).

Die Quelltext-Lösung oben stellt dabei nur die ganz grobe Idee dar – Denn die reinen PHP Arrays werden zwar am schnellsten abgearbeitet, doch wir sind schließlich Entwickler und möchten einen schönen Objekt-Orientierten Ansatz der sich schnell abstrahieren und weiterentwickeln lässt! Vielleicht lässt sich dann die fertige Lösung auch für weitere Projekte nutzen?

An dieser Stelle müssen wir also tatsächlich (erstmals) selbst aktiv entwickeln, da uns weder das schlanke Micro-Framework noch die Template-Engine entsprechende Komponenten bietet. Auf dem Plan stehen somit primär zwei Ziele:

  • Die RainTPL Wrapper Klasse für das Slim Framework soll entwickelt werden
  • Es gilt eine Klasse zu erstellen, die uns bei der Strukturierung der einzelnen Seiten hilft.

Die Details muss ich erst noch ausarbeiten…

Mit diesen Worten möchte ich mich für diese Woche abmelden. Schaut auch nächsten Dienstag wieder rein um zu erfahren wie sich das Projekt entwickelt!
Bis dahin wünsche ich allen Lesern und Leserinnen eine angenehme Woche!

5 comments on “Das eigene kleine Portfolio mit dem Slim Framework, RainTPL & Co. – Teil 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.