CakePHP: Fat Models innerhalb von Plugins…

… oder auch: Wieso wirft CakePHP ständig den SQL Error: 1064 und nimmt als SQL Query meinen Methodennamen?

Folgender Hintergrund: Wir befinden uns innerhalb eines Plugins (‘app/plugins/pluginname/’). Innerhalb des Plugins exisiteren die Controller, die Models und die Views. Die Models erben vom PluginnameAppModel, dieses wiederrum erbt vom AppModel.

Macht man das Model zu einem “Fat Model”, also ergänzt eigene Methoden und ruft diese Methoden innerhalb des dazugehörigen Controllers auf, so erscheint der SQL Error Code 1064.

Die Lösung zum Problem ist recht simpel und einleuchtend, man kommt nur nicht so schnell drauf ;-) . Innerhalb des Controllers muss man mit dem $uses-Attribut das zu nutzende Model bestimmen. Nur reicht es nicht aus, den Modelnamen in das Array zu schreiben, sondern das dazugehörige Plugin eben auch, getrennt durch einen Punkt.

var $uses = array('Pluginname.Model1', 'Pluginname.Model2');

CakePHP: Redirect auf statische Seite

Vermutlich kommt das Problem seltener vor, aber nichts destotrotz verdeutlicht es ganz anschaulich die Funktionsweise der ‘redirect‘-Methode.
Angenommen man befindet sich innerhalb eines Controllers in einem Plugin und möchte nach der Ausführung einer Methode auf eine statische Seite umleiten (redirecten), dann übergibt man dieser Methode mehrere Parameter in der folgenden Form:

$this->redirect(array('controller' => 'pages', 'action'=>'display','ueberuns/kontakt', 'plugin' => null));

Der ‘action‘-Schlüssel muss ‘display‘ als Wert haben, da nur diese Methode im pages_controller existiert. Damit der pages_controller weiß, welche statische Seite aufgerufen werden soll, wird als weiterer Parameter die View übergeben (in diesem Fall die View ‘kontakt‘ im Ordner ‘ueberuns‘. Damit das Ganze nicht innerhalb des momentanen Plugins stattfindet, setzen wir den ‘plugin‘-Schlüssel noch null und schon funktioniert der Redirect.

CakePHP: Plugins mit AuthComponent schützen oder ‘Wie erstelle ich ein Plugin, welches ebenfalls den UsersController der Hauptanwendung nutzt?’

Normalerweise wird durch die ‘loginAction‘-Variable der AuthComponent die Action definiert, die bei dem Versuch eine geschützte Seite aufzurufen, angezeigt werden soll.

Wenn ein Plugin in eine CakePHP-Anwendung eingebunden und ebenfalls durch die AuthComponent geschützt werden soll, dann wird der Nutzer auf eine Seite in der Form ‘http://www.domain.de/plugin_name/users/login‘ weitergeleitet. Ist letztendlich auch logisch, denn CakePHP geht davon aus, dass der UsersController Teil des Plugins ist.

Um dies zu umgehen und den “richtigen” UsersController der Hauptanwendung aufzurufen, muss der ‘loginAction‘ der AuthComponent eine weitere Variable, nämlich ‘plugin‘, übergeben werden. D.h. normalerweise in der beforeFilter()-Methode des UsersController oder des AppController muss der Aufruf folgendermaßen lauten:

 $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'plugin' => null);

Anschließend nutzt CakePHP den UserController als globalen UserController.

PS: Eine ähnliche Problematik tritt bei

$html->link();

usw. auf. Auch hier muss der Parameter ‘plugin‘ übergeben werden.