0

首先,我是 cakephp 的新手……我正在从数据库中提取调查问题并构建一种 type=file 的形式。

echo $this->Form->create('PersonalDetail', array('type' => 'file', 'id' => 'editProfileForm', 'class' => 'form-horizontal'));
echo $this->Form->hidden('id');
echo $this->Form->hidden('PersonalDetail.id');
echo $this->Form->input('PersonalDetail.field_name', array('label' => false, 'div' => false, 'readonly' => false));
echo $this->Form->submit('Update Profile', array('class' => 'btn btn-primary', 'id' => 'editProfileSubmitBtn'));
echo $this->Form->end();

根据 cakephp 文档,“由于这是一个编辑表单,因此会生成一个隐藏的输入字段来覆盖默认的 HTTP 方法。” 但我似乎无法弄清楚如何告诉蛋糕这是一个编辑表单。它总是插入一个隐藏的 POST not PUT 方法:

<form action="/editForm" id="editProfileForm" class="form-horizontal" enctype="multipart/form-data" method="post" accept-charset="utf-8"> 
<div style="display:none;">
<input type="hidden" name="_method" value="POST"/>   
<input type="hidden" name="data[_Token][key]" value="ff8b198e82d800a35581" id="Token836"/></div>         
<input type="hidden" name="data[id]" id="id"/>        
<input type="hidden" name="data[PersonalDetail][id]" id="PersonalDetailsId"/> 
<label class="control-label required">Username</label> 
<input name="data[PersonalDetail][field_name]" maxlength="255" type="text" id="PersonalDetailsFieldName"/> 
<input  class="btn btn-primary" id="editProfileSubmitBtn" type="submit" value="Update Profile"/> 
<div style="display:none;">  
<input type="hidden" name="data[_Token][fields]" value="a2f722badf82c0d8991ab8%3APersonalDetail.id%7Cid" id="TokenField020"/> <input type="hidden" name="data[_Token][unlocked]" value="" id="TokenUnlocked1562820470"/> </div></form>

问题是当我提交表单并使用 Firefox 的 Tamper Data 观看时,表单可以正常发布数据,但随后它会立即再次发布,所有数据都丢失了。

在一个工作表单示例中,我看到了相同的行为,除了隐藏的输入字段是“PUT”并且当表单提交时,它首先是一个带有数据的 PUT,然后立即第二次提交是带有数据的 POST,而不是开始空白.

我想我在这里遗漏了一些基本的东西,但我真的很困惑。

这是控制器,其中 PersonalForm 是传递给构建表单的元素的问题数据库。PersonalDetail 应该包含答案,但这是第一次运行,用户不会有任何答案。

public function editForm() {
    $userId = $this->UserAuth->getUserId();
    if (!empty($userId)) {
        $user_account_type = $this->UserDetail->read('account_type', $userId);
        $user_account_type = $user_account_type['UserDetail']['account_type'];
        $this->set('user_acct_type', $user_account_type);
        $this->loadModel('Usermgmt.PersonalForm');
        $forms = $this->PersonalForm->find('all');
        $this->set('forms', $forms);
        if ($this->request->isPut() || $this->request->isPost()) {
            //put in ajax verification
            //$this->PersonalDetail->saveAssociated($this->request->data);
            $this->Session->setFlash(__('Your answers have been successfully updated'));
            $this->redirect('/dashboard');
        } else {
            // read user's original responses and populate form
            $this->loadModel('Usermgmt.PersonalDetail');
            $answers = $this->PersonalDetail->read(null, $userId);
            $this->request->data = null;
            if (!empty($answers)) {
                $this->request->data = $answers;
            }
        }
    } else {
        $this->redirect('/dashboard');
    }
}

我正在使用 cakephp 2.3.7 并且正在运行 debugKit 插件(可能会导致多次提交?我不知道。) 编辑:另外我正在使用 UserAuth 和安全模块。

编辑:当我删除隐藏的 id 字段时,我过度简化了这个例子。现在我包括了两个隐藏的输入元素。但是,第一次加载此表单时没有编辑数据,因此它是创建而不是添加案例。所以我不明白为什么它会发布两次并丢失第二次发布的数据。也许这才是真正的问题,而不是应该是 PUT 还是 POST?我显然错过了蛋糕如何处理发布数据的一些基本知识。

也许我应该提到这是表单是插件的一部分。路由是否与数据丢失和第二个帖子有关?

4

2 回答 2

2

您缺少编辑表单的重要部分,即 id:

echo $this->Form->input('id');

没有它的存在 cake 假定这不是更新(编辑),而是创建(添加)。

还要注意你的外壳,它不是$this->Form->Submit()$this->Form->submit()

编辑:再看一遍:我还猜想您违反了 5 个以上的其他约定,包括最重要的一个:模型是单数,控制器是复数。意义:

$this->Form->create('PersonalDetail');

如果您的模型是PersonalDetail(从您的控制器代码中看起来像)。这可以解释为什么数据没有最终到达它应该到达的地方。

再次我的建议:烘焙你的代码,看看它是如何完成的。

于 2013-07-22T21:59:44.177 回答
0

看来这与安全模块问题有关。

通过将以下内容添加到 beforeFilter 中,我能够防止双重空数据帖子:

if (isset($this->Security) && ($this->RequestHandler->isAjax() || $this->action == 'editForm')) {
    $this->Security->csrfCheck = false;
    $this->Security->validatePost = false;
}

现在我需要用我的表单研究这个安全问题的原因来修复它。

于 2013-07-29T21:03:54.870 回答