0

那么有人可以向我解释一下吗?我正在尝试编写一个编辑操作,但有点不确定为什么以下内容不起作用:

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).. 收集的数据预先填充了表单,但它不会在表单发送后使用新输入更新数据库。

我已经替换了这个:

if(!$this->request->is('post'))

具有以下内容:

if($this->request->is('get'))

突然间,它工作正常。它使用从帖子中收集的新值更新该行。但是,我不明白这里发生了什么。为什么 !$this->request->is('post), 不起作用,而 $this->request->is('get') 起作用?当然,当第一次调用该操作时,它是使用 GET 请求调用的吗?该请求不符合 !$this->request->is('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')); ?>
4

2 回答 2

2

默认情况下,Cake 对“编辑”操作使用“PUT”方法,对“添加”使用“POST”方法。所以你需要检查$this->request->isPut()(或$this->request->is('put'))。$this->Form->create()在您的视图中查找由方法自动生成的隐藏字段 *_method* 。

如果在传递给视图的数据中设置了“id”属性,Cake 将创建“编辑”表单,如果没有“id”,则创建“添加”。

于 2013-08-30T07:12:14.003 回答
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 从 url 传递给编辑不是安全的方式......$this->params['id']将有你的帖子 id,所以它$this->request->is('put')会起作用。

于 2013-08-29T23:55:12.000 回答