Erstellen der Action
Steht das Model bereit, kann man daran gehen, die Programmlogik zum Verändern des Models umzusetzen. Der dazu benötigte Code wird in einer Controlleraction untergebracht. Für unsere Anmeldeseite kann der Code so aussehen:
public function actionLogin() { $model=new LoginForm; if(isset($_POST['LoginForm'])) { // Erfasst die gesendeten Formulardaten $model->attributes=$_POST['LoginForm']; // Validiert die Daten und kehrt zur vorherigen Seite zurück, // wenn die Prüfung erfolgreich war. if($model->validate()) $this->redirect(Yii::app()->user->returnUrl); } // Zeigt das Anmeldeformular $this->render('login',array('model'=>$model)); }
Zunächst wird eine Instanz des LoginForms
erstellt. Liegen Formulardaten im
POST-Request vor (was heißt, dass das Formular abgeschickt wurde), wird
$model
mit den Daten aus $_POST['LoginForm']
befüllt. Ist die folgende
Validierung des Models erfolgreich, wird der Browser auf die Seite umgeleitet,
die der Besucher ohne die dafür nötige Anmeldung aufrufen wollte. Ergab die Prüfung
Fehler oder wird die Action zum ersten mal ausgeführt, wird der View login
gerendert. Darauf werden wir im nächsten Abschnitt näher eingehen.
Tipp: Die
login
-Action benutztYii::app()->user->returnUrl
um die URL der Seite zu ermitteln, für die der Benutzer zunächst authentifiziert werden musste. Die KomponenteYii::app()->user
ist vom Typ CWebUser (oder einer Kindklasse) und steht für Informationen der aktuellen Benutzersitzung (z.B. Benutzername, Status). Weitere Einzelheiten dazu finden Sie unter Authentifizierung und Autorisierung.
Sehen wir uns die folgende Anweisung aus obigem Code genauer an:
$model->attributes=$_POST['LoginForm'];
Wie im Abschnitt Sichere Attributzuweisungen
beschrieben, befüllt diese Codezeile das Model mit den gesendeten
Formulardaten. Die attributes
-Eigenschaft ist in CModel definiert. Sie erwartet
ein Array aus Name-Wert-Paaren und weist jedem Modelattribut den entsprechenden Wert zu.
Geht man davon aus, dass in $_POST['LoginForm']
ein Array in eben dieser
Form übergeben wird, könnte man statt dieser einen Zeile auch folgenden, etwas
länglichen Code verwenden (vorausgesetzt, dass jedes erforderliche Attribut im Array
vorhanden ist):
$model->username=$_POST['LoginForm']['username']; $model->password=$_POST['LoginForm']['password']; $model->rememberMe=$_POST['LoginForm']['rememberMe'];
Hinweis: Damit
$_POST['LoginForm']
ein Array statt eines String liefert, hält Yii sich an eine Konvention bezüglich Namen für Formularfelder in einem View. Das Eingabefeld, das dem Attributa
einer ModelklasseC
entspricht, heißtC[a]
. Das Eingabefeld für das das Attributusername
aus obigem Beispiel würde daherLoginForm[username]
heißen.
Schließlich muss nun noch der login
-View mit einem HTML-Formular erstell
werden.