2 Stimmen

Wie validiert man einen POST einer nicht standardmäßigen Aktion in Cake PHP 1.3

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....

    }
}

0voto

Chris Pierce Punkte 707

Das Problem besteht darin, dass du versuchst, die URL zu übergeben und auch die Controller-Sachen zu übergeben.

echo $this->Form->create('Widget', array('controller' => 'widgets', 'action' => 'modifyColor'));

oder

echo $this->Form->create('Widget', array('url' => '/widgets/modifyColor'));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X