Verwendung von CakePHP 1.3
Ich habe einen Controller mit einem nicht standardmäßigen Aktionsnamen - sagen wir:
Klasse WidgetsController erstreckt sich AppController {
Funktion modifyColor($id = null) {
// Einige Codezeilen, die die Hintergrundfarbe eines Widgets ändern
}
}
und eine begleitende Ansicht views/widgets/modifyColor.ctp
Das modifyColor Template POSTET zur Aktion:
echo $this->Form->create('Benutzer', array('url' => array('controller' => 'widgets', 'action' => 'modifyColor')));
Ich erhalte einen 404 bei dem POST, da das CakePHP-Sicherheitskomponente das Formular validieren möchte und ich das POST validieren möchte.
Der einzige Weg, wie ich das zum Funktionieren bringen kann, scheint zu sein, die POST-Validierung auszuschalten
if ($this->action == 'modifyColor') {
$this->Security->validatePost = false;
}
Dies scheint eine schlechte Lösung zu sein.
Wie verwende ich das Sicherheitskomponente bei einer nicht standardmäßigen Aktion? allowedActions scheint nicht zu funktionieren Danke Danny
Antworte auf meine eigene Frage.
A. Es gibt kein Problem bei der Verwendung von beliebig benannten Aktionen in CakePHP B. Ein konzeptioneller Fehler in CakePHP in Bezug auf die Verwendung derselben Funktion für das Formular GET und das Formular POST
Beim Formular GET hatte ich dies:
if (empty($this->data)) {
$this->data = $this->Widget->read(null, $id);
}
Das Formular selbst enthielt Code wie diesen:
echo $this->Form->input('id');
echo $this->formView('Aktuelle Farbe', 'CurrentColor');
echo $this->formView('Neue Farbe', 'NewColor');
echo $this->formView('Neue Hintergrundfarbe', 'BackgrdColor');
Was in Ordnung war, abgesehen davon, dass keines dieser Felder im Widget-Modell vorhanden ist - und das CakePHP-Sicherheitskomponente interpretiert dies als eine Art XSRF-Angriff, da es Felder im Formular findet, die nicht zum Modell gehören. Deshalb:
$this->Security->validatePost = false;
hat das "Problem" gelöst.
Die richtige Lösung besteht einfach darin, $this->data im Controller-Action nicht mit dem Modell zu füllen und die Feldzuweisungen im POST zu verarbeiten:
Funktion modcolor() {
$this->layout = 'app_ui_listview';
if (!empty($this->data)) {
$id = $this->Session->read('Auth.User.id');
$u = $this->Widget->read(null, $id);
// Felder aus dem Formular dem Modell zuweisen....
}
}