まず、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 メソッドをオーバーライドするために非表示の入力フィールドが生成されます。」しかし、ケーキにこれが編集フォームであることを伝える方法がわかりません。PUT メソッドではなく、常に非表示の POST を挿入します。
<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 の改ざんデータを監視すると、フォームがデータを正常に投稿するのに、すべてのデータが欠落した状態ですぐに再投稿することです。
作業フォームの例では、非表示の入力フィールドが「PUT」であることを除いて同じ動作が見られます。フォームが送信されると、最初はデータを含む PUT であり、すぐに 2 番目の送信は空白ではなくデータを含む 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 および Security モジュールも使用しています。
編集: 非表示の id フィールドを削除したときに、例を単純化しすぎました。ここで、2 つの非表示の入力要素を含めました。ただし、このフォームが初めてロードされるときは、編集データがないため、追加ではなく作成になります。そのため、2 回投稿して 2 回目の投稿でデータが失われる理由がわかりません。おそらくそれが本当の問題であり、PUT と POST の違いではないのでしょうか? Cake が投稿データを処理する方法について、明らかに根本的なことが欠けています。
おそらく、これはフォームがプラグインの一部であることを言及する必要があります。ルーティングは、データの損失と 2 番目の投稿と関係があるのでしょうか?