首先,我是 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?我显然错过了蛋糕如何处理发布数据的一些基本知识。
也许我应该提到这是表单是插件的一部分。路由是否与数据丢失和第二个帖子有关?