[Tutorial] Yii Tutorial #3

Heute spielen wir zum ersten Mal in der Codebase herum und lernen das MVC-Pattern in Yii mit einem einfachen ‚Hallo Welt‘ Beispiel kennen!

3. Hallo Routing

3.1 Die View

In views Ordner gibt es drei Dinge, die das Aussehen der Seite bestimmen. Layouts beinhalten Dinge die auf jeder Seite zu sehen sein sollen, wie das Menü. Sites, sind einzelne Seiten, wie ein Impressum. Und Widgets sind Bauklötze für die Sites, wie die Alert-Box. Wie letztes Mal erklärt findet sich der tatsächliche Code der Startseite unter frontend/views/site/index.php. Die ganz Wilden unter euch können hier einfach mal den h1-Tag in den Namen eures Projektes ändern. Wahnsinn, es funktioniert! Doch unser eigentliches Ziel ist, zu einer eigenen site zu routen.

Lasst uns also eine solche erstellen. Legt eine Datei unter views/site/hallowelt.php an (Achtung, Großbuchstaben scheinen Schwierigkeiten zu bereiten). 

Hallo Welt, wie gehts denn so?

Das hier ist eine site in Yii.

Das reicht auch schon für das Beispiel für die View. Unsere ganze Seite wird also ein bisschen Text enthalten und alles was die main.php vorgibt, also die Menüleiste und der Footer. Weiter gehts.

3.2 Der Controller

Unter frontend/controllers findet ihr den SiteController.php. Um den zu verstehen, geht mal in euren Browser, startet die Seite(Xampp nicht vergessen, dann localhost/Projektname) und klickt im Menü auf About. Nun beachtet die Adressleite.

YiiRouting

Hier sieht man zuerst nach index.php den Aufruf des site-Controllers mit ?r=site. Danach wird mit %2FAbout angegeben, welche site geöffnet werden soll (/about geht auch). Wir wollen nun unsere hallowelt-View so aufrufen können. Und das geht, indem wir im SiteController eine Action dafür anlegen, die die site rendert:

//Das war hier schon 
public function actionAbout(){
        return $this->render('about');
    }

//Wir erstellen eine neue Action
public function actionHallowelt(){
//this ist dieser controller und der macht nix außer unser hallowelt zu rendern
        return $this->render('hallowelt');
    }

Jetzt können wir in der Adresszeile diese site ansteuern! Gebt am Ende index.php?r=site/hallowelt ein(die %2F Variante geht auch). Das ist jetzt noch nicht ganz so cool ohne Knopf im Menü. Machen wir den schnell. In views/layout/main.php ist die Menüleiste definiert.

//Sucht das in main.php
$menuItems = [
             ['label' => 'Home', 'url' => ['/site/index']],
             ['label' => 'About', 'url' => ['/site/about']],
             ['label' => 'Contact', 'url' => ['/site/contact']],
             //Hier der neue Knopf
             ['label' => 'Hallo', 'url' => ['/site/hallowelt']],
];

Und hier das Ergebnis: Wir können aus der Hauptmenüleiste eine von uns erstellte Seite über eine Aktion im SiteController aufrufen!

hallo

Kurze Info zur Hintergrundfarbe: Diese habe ich unter web/css/style.css geändert

3.3 Das Model

Models werden zum Festhalten von Daten verwendet. Zum Model programmieren wir erst nächstes Mal selbst etwas. Für heute öffnen wir eine der vorgegebenen Models, das SignupForm-Model, und inspizieren dieses. Dieses Model ermöglicht es uns, neue User in der Datenbank zu registrieren. Beachtet das Gegenstück hierzu in der view heißt site/signup.php und beinhaltet die Html Felder des Signup-Forms. Drückt man hier nun auf Submit, kommt das Model ins Spiel(natürlich über den Controller). Lest die Kommentare aufmerksam:

 'trim'],
            //Username darf nicht leer sein
            ['username', 'required'],
            //Der Name darf nicht schon existieren
            ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
            //Der Name muss zwischen 2 und 255 Zeichen lang sein
            ['username', 'string', 'min' => 2, 'max' => 255],

            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required'],
            //Überprüft ob es aussieht wie eine email
            ['email', 'email'],
            ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],

            ['password', 'required'],
            ['password', 'string', 'min' => 6],
        ];
    }

    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    //Das passiert nachdem der User den Knopf drückt
    public function signup()
    {
        //Wenn die Daten nach den Regeln Ok sind, returne den neuen User
        if ($this->validate()) {
            $user = new User();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->setPassword($this->password);
            $user->generateAuthKey();
            if ($user->save()) {
                //Das geht an den Controller, der das mit Post an die Datenbank schickt
                return $user;
            }
        }

        return null;
    }
}

Das ist eine ziemliche Wucht an Funktionalität, weshalb ich mich nächste Woche einzeln daran machen möchte, ein Model zu coden. Bis jetzt haben wir also gesehen, wie wir eine neue Seite anlegen und diese über den Controller aufrufen. Dann haben wir uns den Aufbau eines der vorgefertigten Models angesehen. Passt doch! Man sieht sich nächste Woche 🙂

*24/7 lernen*