有人可以向我解释一下吗? 我正在尝试编写一个编辑操作,并且我不确定为什么以下操作不起作用:
public function edit($id = null) {
if (!$id) {
throw new NotFoundException('NO ID HAS BEEN SUPPLIED');
}
$data = $this->User->findById($id);
if(!$this->request->is('post')) { $this->request->data = $data; }
if($this->request->is('post') || $this->request->is('put')) {
$this->User->id = $id;
$this->User->save($this->request->data);
$this->redirect(array('action'=>'index'));
}
}
通过不工作,我的意思是,虽然它确实使用从findById($ id)收集的数据预先填充表单..但是在表单发送后,它不会使用新输入更新数据库。 / p>
我已经取代了这个:
if(!$this->request->is('post'))
以下内容:
if($this->request->is('get'))
突然,它运作正常。它使用从帖子收集的新值更新行。但是,我不明白这里发生了什么。为什么会这样!$ this-> request->是('post),不起作用,而$ this-> request->是('get')是否有效? 当然,当首次调用该动作时,它是使用GET请求调用的吗?该请求不符合条件!$ this-> request->是('post')?
编辑:
下面是ctp:app / View / Users / edit.ctp
<?php echo $this->Form->create('User'); ?>
<fieldset>
<legend><?php echo __('edit User'); ?></legend>
<?php
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->input('role');
// echo $this->Form->input('role', array(
// 'options' => array('admin' => 'Admin', 'regular' => 'Regular')
//));//
?>
</fieldset> <?php echo $this->Form->end(__('Submit')); ?>
答案 0 :(得分:2)
默认情况下,Cake使用'PUT'方法进行'edit'操作,'POST'用于'add'。所以你需要检查$this->request->isPut()
(或$this->request->is('put')
)。在你的视图中查找由$this->Form->create()
方法自动生成的hiiden字段* _method *。
如果在传递给视图的数据中设置了'id'属性,那么Cake会创建'edit'表单,如果没有'id',则为'add'。
答案 1 :(得分:1)
这样做
public function edit() {
$id = $this->params['id'];
if (!$id) {
throw new NotFoundException('NO ID HAS BEEN SUPPLIED'); }
$data = $this->User->findById($id);
if(!$this->request->is('post')) { $this->request->data = $data; }
if($this->request->is('post') || $this->request->is('put')) {
$this->User->id = $id;
$this->User->save($this->request->data);
$this->redirect(array('action'=>'index'));}
从网址传递ID进行编辑并不安全...... $this->params['id']
会有你的帖子ID
使用它$this->request->is('put')
将起作用。