Seiten Typen erstellen
Für jede Seite müssen wir einen Seiten Typ zur Verfügung stellen. Seiten Typen können wir definieren, indem wir Page Controller erstellen. An diese Page Controller delegiert das Page Modul die Anfragen. In diesem Kapitel zeigen wir dir, wie du entsprechende Seiten Typen erstellen kannst.
Template Modul erstellen
Bevor wir unsere Page Controller erstellen, brauchen wir einen Ort, wo wir diese ablegen können. Wir erstellen dafür ein neues Modul mit dem Namespace template
. Erstelle dazu die folgenden Verzeichnisse:
app/template
var/etc/template
public/assets/template
Exkurs: sichere Namespaces
Der Namespace template
ist so offensichtlich, dass grosse Gefahr besteht, dass neben dir noch andere Entwickler den gleichen Namespace wählen. Gerade wenn du Module erstellen willst, welche du später wiederverwenden oder gar weitergeben möchtest, empfehlen wir dir, einen sicheren Namespace zu wählen, der eindeutig für dich ist! Empfehlung: ch.hnm.template
. Der Namespace wird dabei aus einer Domain abgeleitet, welche dir gehört.
ch.hnm.template
erfordert folgende Verzeichnisse: app/ch/hnm/template
, public/assets/ch-hnm-template
, var/etc/ch-hnm-template
. Beachte dass der Pfad im public/assets
und im /var/etc
die Punkte des Namespaces durch -
ersetzt.Controller erstellen
Erstelle jetzt den PageController app/template/controller/TemplatePageController.php
mit folgendem Inhalt:
<?php namespace template\controller; use page\bo\PageController; use n2n\reflection\annotation\AnnoInit; use page\annotation\AnnoPage; class TemplatePageController extends PageController { private static function _annos(AnnoInit $ai) { $ai->m('startPage', new AnnoPage()); $ai->m('standardPage', new AnnoPage()); } public function startPage() { $this->forward('..\view\startPage.html'); } public function standardPage() { $this->forward('..\view\standardPage.html'); } }
Mit der Annotation teilen wir dem Page Modul mit, dass TemplatePageController
zwei Seitentypen zur Verfügung stellt: "startPage" und "standardPage".
Datenbank
Achtung: Page Controller sind Entitäten. Sie müssen registriert und in der Datenbank eröffnet werden. Das Registrieren erledigen wir in der app.ini
von unserem Modul. Da es var/etc/template/app.ini
bisher noch nicht gibt, erstellen wir das File gleich mit folgendem Inhalt:
[orm] entities[] = "template\controller\TemplatePageController"
Eine Entität braucht aber auch eine Tabelle in der Datenbank:
CREATE TABLE `template_page_controller` ( `id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Richtig, die Datentabelle für TemplatePageController
besteht nur aus einer ID Spalte.
EiSpec
Unsere Entität braucht jetzt noch eine EiSpec. Gehe dazu in den Hangar und klicke mit der Rechten Maustauste unter "Entities", "template", "template\controller" auf "TemplatePageController" und wähle "Generate EiSpec". Daraufhin wird die EiSpec erstellt. Die EiSpec müssen wir nicht weiter konfigurieren.
Views
Du hast sicher festgestellt, dass die beiden Methoden in unserem Controller Views aufrufen, die es noch nicht gibt. Wir erstellen diese darum:
app/template/view/startPage.html.php
<?php use n2n\impl\web\ui\view\html\HtmlView; use n2n\web\ui\view\View; use page\ui\PageHtmlBuilder; $view = HtmlView::view($view); $pageHtml = new PageHtmlBuilder($view); ?> <div class="jumbotron"> <div class="container"> <h1><?php $pageHtml->title() ?></h1> </div> </div> <div class="container"> Content kommt hier... </div>
Neu ist in dieser View der PageHtmlBuilder
. Dieser stellt verschiedene Methoden für die Page spezifische HTML Ausgabe zur Verfügung. Ein Beispiel dafür ist $pageHtml->title()
. Diese Methode gibt den Titel für die aktuelle Seite aus. Ist der Titel nicht gesetzt, gibt die Methode den Name aus.
app/template/view/standardPage.html.php
<?php use n2n\impl\web\ui\view\html\HtmlView; use n2n\web\ui\view\View; use page\ui\PageHtmlBuilder; $view = HtmlView::view($view); $pageHtml = new PageHtmlBuilder($view); ?> <div class="container"> <h1><?php $pageHtml->title() ?></h1> Content kommt hier... </div>
app/qst/controller/QstPageController
(für den TemplatePageController
). Die beiden Views findest du unter app/qst/view/
. Beachte, dass sowohl der QstPageController
, als auch die beiden Views in app/qst/view
bereits etwas weiter ausgebaut sind, als der Stand, den sie hier in diesem Kapitel haben. Der Grund sind die Content Items, welche erst im übernächsten Kapitel behandelt werden.