3.5.2 Controller-Attribute

Eine komplette Liste der Controller-Attribute, inklusive deren Beschreibung, findest Du in der CakePHP API, unter http://api.cakephp.org/1.2/class_controller.html.

3.5.2.1 $name

Menschen, die auf PHP4 angewiesen sind, sollten damit beginnen das Attribut $name zu setzen. Der Wert sollte dabei ganz einfach der Name des Controllers sein. Dieser ist meistens die Pluralform des primären Models, das der Controller nutzt. Damit kann man einigen Seltsamkeiten von PHP4 die Klassennamen betreffend aus dem Weg gehen und CakePHP dabei helfen, die Namen aufzulösen.

<?php

#   $name Controller-Attribut Beispiel

class RezepteController extends AppController {
   var $name = 'Rezepte';
}

?>	
  1. <?php
  2. # $name Controller-Attribut Beispiel
  3. class RezepteController extends AppController {
  4. var $name = 'Rezepte';
  5. }
  6. ?>

3.5.2.2 $components, $helpers und $uses

Die nächsten sehr häufig benutzten Attribute legen fest, welche Helper (Helfer), Components (Komponenten) und Models (Modelle) CakePHP in Verbindung mit dem jeweiligen Controller nutzen soll. Wenn diese Attribute genutzt werden stehen die entsprechenden MVC-Klassen als Klassenvariable zur Verfügung (als $this->ModellName).

Jedem Controller stehen standardmäßig bereits ein paar von diesen Klassen zur Verfügung, so dass es möglicherweise nicht notwendig ist, den Controller extra zu konfigurieren.

Controller haben beispielsweise standardmäßig zu ihrem primären Modell Zugriff. Unser RezepteController kann auf das Rezept-Modell über $this->Rezept und unser ProdukteController kann ähnlicherweise auf das Produkt-Modell über $this->Produkt zugreifen.

Die Html-, Form-, und Session-Helfer, sowie die Session-Komponente sind ebenso standardmäßig in jedem Controller aktiviert. Um mehr über die Helfer und Komponenten zu erfahren, solltest du einen Blick in die entsprechenden Kapitel, die später in diesem Handbuch noch kommen werden, werfen.

Lasst uns nun mal sehen, wie wir einem CakePHP-Controller nun mitteilen können, dass er zusätzliche MVC-Klassen verwenden soll.

<?php
class RezepteController extends AppController {
    var $name = 'Rezepte';

    var $uses = array('Rezept', 'Benutzer');
    var $helpers = array('Ajax');
    var $components = array('Email');
}
?>   
  1. <?php
  2. class RezepteController extends AppController {
  3. var $name = 'Rezepte';
  4. var $uses = array('Rezept', 'Benutzer');
  5. var $helpers = array('Ajax');
  6. var $components = array('Email');
  7. }
  8. ?>

Jede dieser Variablen wird mit ihrem geerbtem Wert gemischt. Zum Beispiel ist es nicht notwendig den Form-Helfer nochmals zu deklarieren. Das gleiche gilt für alle Dinge, die ihr in eurem eigenen AppController deklariert habt.

Es gibt in CakePHP ein paar Attribute mit denen es möglich ist den View zu steuern.

Das $layout-Attribut kann als Wert den Namen eines Layouts haben, das in /app/views/layouts liegt. Dabei sollte der Name ohne die .ctp Dateiendung gegeben werden. Wenn dieses Attribut leer bleibt wird die default.ctp als Layoutdatei genommen. Wenn du keine eigene in /app/views/layouts/default.ctp angelegt hast wird CakePHP die Standard-Layout-Datei nutzen.

<?php

//   Mit $layout ein alternatives Layout definieren

class RezepteController extends AppController {
    function quickSave() {
        $this->layout = 'ajax'; // Die Aktion quickSave() wird nun mit der ajax.ctp als layout gerendert.
    }
}

?>
  1. <?php
  2. // Mit $layout ein alternatives Layout definieren
  3. class RezepteController extends AppController {
  4. function quickSave() {
  5. $this->layout = 'ajax'; // Die Aktion quickSave() wird nun mit der ajax.ctp als layout gerendert.
  6. }
  7. }
  8. ?>

Weiterhin ist es möglich einen Seitentitel zu vergeben (steht dann oben in der Titelzeile des Browsers), indem man $pageTitle verwendet. Damit dieser dann auch angezeigt wird, muss in deinem Layout an einer Stelle die $title_for_layout-Variable ausgegeben werden (am besten natürlich, in den dafür vorgesehenen <title>-Tag im head-Bereich des HTML-Dokuments.

<?php

//   Mit $pageTitle den Seitentitel festlegen

class RezepteController extends AppController {
    function quickSave() {
        $this->pageTitle = 'Meine neuer Suchmaschinenoptimierter Titel';
    }
}

?>
  1. <?php
  2. // Mit $pageTitle den Seitentitel festlegen
  3. class RezepteController extends AppController {
  4. function quickSave() {
  5. $this->pageTitle = 'Meine neuer Suchmaschinenoptimierter Titel';
  6. }
  7. }
  8. ?>

Es ist auch möglich den Seitentiel aus dem View heraus festzulegen mit $this->pageTitle. Das ist sogar empfohlen, weil es der MVC-Idee gerechter wird, da ein Seitentitel eher zum View als zum Controller gehört. Für eine statische Seite muss der Seitentitel im View festgelegt werden.

Wenn $this->pageTitel nicht gesetzt ist, wird CakePHP versuchen einen Titel automatisch auf Basis des Controller-Namens oder der View-Datei, im Falle einer statischen Seite, zu generieren.

3.5.2.4 Das Parameter-Attribut ($params)

Controller-Parameter sind über $this->params in Deinem CakePHP Controller verfügbar. Diese Variable dient der Bereitstellung von Informationen über den aktuellen Request. Am häufigsten wird $this->params genutzt, um auf Daten zuzugreifen, die per POST- oder GET-Operationen an den Controller übergeben wurden.

3.5.2.4.1 form

$this->params['form']
  1. $this->params['form']

Die POST Daten jeder Form werden hierin gespeichert, inklusive der Informationen aus $_FILES.

3.5.2.4.2 admin

$this->params['admin']

Dient dazu festzustellen, ob die aufgerufene Aktion durch das Admin-Routing aufgerufen wurde.

3.5.2.4.3 bare

$this->params['bare']

Ist true wenn das aktuelle Layout leer ist und false andererseits.

3.5.2.4.4 isAjax

$this->params['ajax']

Ist true, wenn die aktuelle Anfrage ein Ajax-Aufruf ist und false andererseits. Diese Variable ist nur dann gesetzt, wenn die RequestHandler Komponente im Kontroller genutzt wird.

3.5.2.4.5 controller

$this->params['controller']

Enthält den Namen des Controllers, der die Anfrage gemacht hat. Ruft man zum Beispiel die Adresse /posts/view/1 auf, dann ist der Inhalt von $this->params['controller'] "posts".

3.5.2.4.6 action

$this->params['action']

Enthält den Namen der Aktion, die die Anfrage gemacht hat. Ruft man zum Beispiel /posts/view/1 auf, dann ist der Inhalt von $this->params['action'] "view".

3.5.2.4.7 pass

$this->params['pass']

Enthält den GET-String, der in der Anfrage enthalten ist. Ruft man zum Beispiel die Adresse /posts/view/?var1=3&var2=4 auf, ist der Inhalt von $this->params['pass'] "?var1=3&var2=4".

3.5.2.4.8 url

$this->params['url']

Enthält einen assoziativen Array der als erstes die aufgerufene URL enthält (ohne Domain und GET-String) und danach Schlüssel-Wert-Paare von GET-Variablen. Ruft man zum Beispiel /posts/view/?var1=3&var2=4 auf, so ist der Inhalt von $this->params['url']:

[url] => Array
(
    [url] => posts/view
    [var1] => 3
    [var2] => 4
)

3.5.2.4.9 data

$this->data

Wird benutzt um POST Daten zu verarbeiten, die vom FormHelper "forms" an den Controller gesendet werden.

// Der FormHelper wird benutzt, um ein "form"-Element zu erstellen:
$form->text('User.first_name');
  1. // Der FormHelper wird benutzt, um ein "form"-Element zu erstellen:
  2. $form->text('User.first_name');

In der Ausgabe sieht das ungefähr so aus:

 
<input name="data[User][first_name]" value="" type="text" />

Wenn das Formular über POST an den Controller übergeben wird, tauchen die Daten in this->data auf.

 
//Der im Formular übergebene "first_name" lässt sich wie folgt auslesen:
$this->data['User']['first_name'];
  1. //Der im Formular übergebene "first_name" lässt sich wie folgt auslesen:
  2. $this->data['User']['first_name'];

3.5.2.4.10 prefix

$this->params['prefix']

Enthält das routing prefix. Zum Beispiel würde dieses Attribut den String "admin" enthalten, wenn der URL /admin/posts/someaction aufgerufen wurde.

3.5.2.4.11 named

$this->params['named']

Stores any named parameters in the url query string in the form /key:value/. For example, if the URL /posts/view/var1:3/var2:4 was requested, $this->params['named'] would be an array containing:

[named] => Array
(
    [var1] => 3
    [var2] => 4
)

3.5.2.5 Andere Attribute

Auch wenn Du Details zu allen Controller-Attributen im API findest, gibt es Controller-Attribute, die einen eingenen Abschnitt im Handbuch verdient haben.

Das $cacheAction Attribut hilft Dir beim "caching" (vorgeparsten Zwischenspeichern), und das $paginate Attribut wird benutzt um Umblätter-Standards für den Controller zu setzen. Für genauere Informationen zu diesen Attributen kannst Du einfach im betreffenden Abschnitt dieses Handbuchs nachschlagen.