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 メソッドをオーバーライドするために非表示の入力フィールドが生成されます。」しかし、ケーキにこれが編集フォームであることを伝える方法がわかりません。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 番目の投稿と関係があるのでしょうか?

4

2 に答える 2

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 に答える