Cake Bakery

Rezepte für die Entwicklung mit CakePHP

Ausblick auf Cake3

In einem Interview hat Nate Abele, der Hauptentwickler von CakePHP, ein paar Ausblicke zu Cake 3 gegeben. Das hört sich wirklich spannend, modern und vielversprechend an.

Sofort dachte ich mir aber: Dann bin ich ja monatelang damit beschäftigt, den Code von NoseRub kompatibel mit Cake 3 zu bekommen…

Das mag zwar ein wenig Panikmache sein, denn noch ist überhaupt nicht klar, wie die Umstellung auf Cake 3 laufen soll, aber ich mache mir trotzdem schon einmal Gedanken dazu, wie man die Umstellung möglichst reibungslos hinbekommt.

Ich denke mal, dass Tests der Schlüssel zum Erfolg sind. Dabei sind jedoch nicht nur Unittests gemeint, sondern auch Tests mit Selenium um die Funktionalität überprüfen zu können.

Da kommt noch eine ganze Menge Arbeit auf mich zu…

Themes in CakePHP

CakePHP bringt von Haus aus eine Unterstützung sogenannter “Themes”. Man kann sie mit Wordpress-Themes vergleichen, wobei CakePHP hier natürlich nur die Möglichkeit anbietet, diese Themes den eigenen Nutzern zur Verfügung zu stellen.

Wenn man aber, wie bei NoseRub Admins und Usern die Möglichkeit geben möchte, das Aussehen der gesamten Installation, oder aber der eigenen Profilseite anzupassen, sind die Themes eine prima Sache – und auch sehr leicht zu implementieren.

Die Templates für die Webseiten sind bei Cake in sogenannte Views organisiert und liegen im Normalfall unter /app/views. Zugehörige CSS- und JavaScript-Dateien befinden sich unter /app/webroot/.

Um die Unterstützung von Themes im eigenen CakePHP Projekt zu aktivieren, muss man erst einmal im entsprechenden Controller auf eine andere View-Klasse wechseln. Der Einfachheit halber kann man das direkt im AppController machen:

class AppController extends Controller {
    public $view = 'Theme';
    ...
}

Vor dem Rendern muss CakePHP nun außerdem mitgeteilt werden, welches Theme benutzt werden soll. Für NoseRub habe ich das ebenfalls im AppController gemacht um als Standardwert ein vorgegebenes Theme auszuwählen:

class AppController extends Controller {
    public $view = 'Theme';
    public $theme = 'default';
    ...
}

Man kann das aber natürlich auch an anderer Stelle im Controller ändern. Wenn also z.B. eine Profilseite des Users angezeigt werden soll und dabei ein vom User ausgewähltes Design genommen werden soll, kann man dies so erreichen:

class UsersController extends AppController {
    public $uses = array('User');

    public function view($username) {
        $user = $this->find('first', array(
            'conditions' => array(
                'User.username' => $username
            )
        ));
        $this->set('user', $user);

        // todo: check that user exists before proceeding!
        // todo: check that value of user theme is valid

        $this->theme = $user['User']['theme'];
    }
}

Die Daten für dieses View such CakePHP nun an folgenden Orten: /app/views/themed/[theme name]/ und /app/webroot/themed/[theme name]/. Für ein Theme mit dem Namen green würde Cake nun also zuerst das Default-Layout (ein anderes ist ja nicht gesetzt) unter /app/views/themed/green/layouts/default.ctp suchen und dann das View, welches hier gerendert werden soll in /app/views/themed/green/users/view.ctp.

Dabei ist das schöne, dass Cake immer auf die Version ohne themed im Pfad zurückgreift, falls die Variante mit themed gar nicht vorhanden ist. Wenn man seine Applikation also schön mit Views und Elementen strukturiert, können die Themes sehr einfach ausfallen und teilweise nur anderes CSS enthalten. (Man denke nur an CSS Zen Garden!)

Das funktioniert natürlich auch für Javascript Dateien. In NoseRub wird das JavaScript per Element in das Layout hinzugefügt und zwar über folgende zwei Zeilen:

echo $javascript->link('theme.js');
echo $javascript->link('noserub.js');

Unter /app/webroot/js/theme.js liegt nun eine leere Implementierung, die automatisch von einer themespezifischen theme.js überschrieben wird, weil CakePHP diese ja beim Rendern vorziehen wird.

Einziger wirklicher Nachteil der Themes in CakePHP ist, das Views und CSS/JS von einander getrennt sind. Man kann also nicht einfach nur ein einziges Verzeichnis irgendwo hochladen um ein Theme zu “installieren”, wie das z.B. bei Wordpress geht. Andererseits ist das aber auch ein riesiger Sicherheitsgewinn, weil der PHP-Code in den Views abseits des öffentlich zugänglichen Webroots (vorausgesetzt, der liegt auf /app/webroot/, wie es empfohlen wird).

Für NoseRub werden wir dafür aber im Admin-Bereich eine Upload-Möglichkeit geben, wo dann ein Archiv mit zwei Ordnern views und webroot erwartet werden – sofern uns keine bessere Möglichkeit einfällt…

Update: In den Kommentaren hat Robert noch eine wichtige Anmerkung zum Thema Caching und Themes gemacht.

CakeBakery nun auch auf Englisch

Hier soll zukünftig wieder ein bisschen mehr passieren, schließlich fallen mir eigentlich fast täglich wieder Sachen in Bezug auf CakePHP auf. Die Arbeit mit NoseRub (Code) liefert dazu genügend Nachschub :-)

Gleichzeitig werde ich die Artikel auch auf Englisch veröffentlichen. Meistens wahrscheinlich mit einem kleinen Zeitverzug werden sie dann unter CakeBakery.net erscheinen.

« Previous Entries  Nächste Seite »
Werbung