Использование CakePHP 1.3
У меня есть контроллер с нестандартным именем действия - скажем:
class WidgetsController extends AppController {
function modifyColor($id = null) {
// Some code that modifies the background color of a widget
}
}
и сопутствующее представление views / widgets / modifyColor.ctp
Шаблон modifyColor ПРЕДОСТАВЛЯЕТ действие:
echo $this->Form->create('User',array('url' => array('controller' => 'widgets', 'action' => 'modifyColor')));
Я получаю 404 на POST, поскольку компонент CakePHP Security пытается проверить форму, и я хотел бы иметь возможность проверить POST.
Кажется, что единственный способ заставить это работать - отключить проверку POST
if ($this->action == 'modifyColor') {
$this->Security->validatePost = false;
}
Это кажется плохим решением.
Как использовать компонент Security нанестандартное действие?позволенные действия, кажется, не работают Спасибо Дэнни
Отвечая на мой собственный вопрос.
A.Нет проблем с использованием любых именованных действий в CakePHP B. Концептуальная ошибка с CakePHP, связанная с использованием одной и той же функции для формы GET и формы POST
В форме GET у меня было следующее:
if (empty($this->data)) {
$this->data = $this->Widget->read(null, $id);
}
Сама форма имела некоторый код, подобный следующему:
echo $this->Form->input('id');
echo $this->formView('Current color', 'CurrentColor');
echo $this->formView('New color', 'NewColor');
echo $this->formView('New background color', 'BackgrdColor');
Что было хорошо, за исключением того, что ни одно из этих полей не появилось в модели виджетов - и компонент CakePHP Security интерпретирует это как своего родаАтака XSRF - так как она находит поля в форме, которые не принадлежат модели.Вот почему:
$this->Security->validatePost = false;
решил «проблему».
Правильное решение - просто не заполнять данные $ this-> моделью в действии контроллера и обрабатывать назначения полей наПОСТ:
function modcolor () {
$this->layout = 'app_ui_listview';
if (!empty($this->data)) {
$id = $this->Session->read('Auth.User.id');
$u = $this->Widget->read(null, $id);
// Assign fields from the form to the model....
}
}