4

ウェブサイトにはたくさんのフォームがあります。それらはすべて同じように作成されます

<?php echo $this->Form->create('SysUser');?>
<fieldset>
<legend><?php echo __('Edit Basic Information'); ?></legend>
<?php
echo $this->Form->input('SysUser.first_name');
echo $this->Form->input('SysUser.family_name',array('label'=>__("Last Name")));
echo $this->Form->input('SysUser.mobile_phone_number');
echo $this->Form->input('SysUser.user_name',array('label'=>__("Screen Name")));
echo $this->Form->input('action', array('type'=>'hidden','value'=>'edit_basic_info'));
echo $this->Form->input('SysUser.id', array('type'=>'hidden','value'=>$user["id"]));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit'));?>

ただし、1つの形式のタイプは、「post」ではなく「put」になります。これらのフォームを作成するときに、タイプを明示的に「投稿」に設定することはありません。CakePHPがデフォルト値をpostに設定していることを収集します。今、私がこの新しい特別なフォームを作成する方法に何か問題があるようです。奇妙なことに、これは数日前に機能していました!

何が悪いのかわかりません。はい、これ:

<?php echo $this->Form->create('Member'); ?>
<fieldset>
    <legend><?php echo __('Basic Profile Setup'); ?></legend>
    <?php
    echo $this->Form->input('Member.gender_id');
    $w = array();
    for ($i = 40; $i < 120; $i++) {
        $w[$i] = $i . " kg";
    }
    $h = array();
    for ($i = 120; $i < 230; $i++) {
        $h[$i] = $i . " cm";
    }
    echo $this->Form->input('Member.height', array(
        'options' => $h,
        'empty' => __("choose one")
    ));
    echo $this->Form->input('Member.weight', array(
        'options' => $w,
        'empty' => __("choose one")
    ));
    $options['minYear'] = date('Y') - 78;
    $options['maxYear'] = date('Y') - 18;
    echo $this->Form->input('Member.birthdate', $options);
    echo $this->Form->input('Member.residential_location_id', array('label' => __("City/Location")));
    echo $this->Form->input('Member.occupation_id',array('id'=>'MemberOccupationId'));
    echo $this->Form->input('action', array('type' => 'hidden', 'value' => 'create_member'));
    ?>
</fieldset>
<?php
echo $this->Form->end(array("label" => __('Save')));
4

6 に答える 6

18

Request dataModel.idCakeRequest::method()が に設定されている場合put。これを CakePHP で処理する好ましい方法は次のとおりです。

if ($this->request->is(array('post', 'put'))) {
    // Code
}

これは、ベイクされたコントローラー、編集アクションで確認できます。

于 2014-10-21T19:21:09.693 に答える
5

理由はわかりませんが、次の方法でフォーム タイプを設定できます。

<?php echo $this->Form->create('Member', array('type' => 'post')); ?>
于 2013-02-05T18:15:15.780 に答える
3

私もこの問題を抱えていました。私の状況では、検証エラーが発生したときにこれが発生していました。そのため、2 回目の実行では、スクリプトは POST 要求ではなく PUT 要求であると認識しました。これは PUT だったので、POST であるかどうかを確認する if 句の内部にも入らなかったため、入力に戻って POST 要求を作成しようとしました。これは永遠にループしていました。

ソリューション?NOT GET をチェックしています。

したがって、次のようなものが得られます。

if (!$this->request->is('get')){
    //Save logic here
}

クックブックでこのような例を見たことがありますが、見つかりません。更新されたような気がしますが、私に関する限り、この方法を使用する必要があります。したがって、PUT 要求と POST 要求について説明します。

アップデート

このアプローチを使用することはお勧めしません。idがフォームに設定されているかどうかに基づく PUT/POST です。リクエストの種類に基づいてIDを設定していたので、実際に存在するかどうかではなく、何度も切り替えていました。addとアクションに 1 つのフォームを使用していeditます。どちらも、edit.ctpより柔軟にセットアップされた を使用します。

于 2013-02-05T20:03:24.620 に答える
0

この状況に対処した方法の 1 つは、post OR put のコンテキストを定義する独自の検出器を作成することです。これは、beforeFilter()AppController のメソッドに入ります。

// add a simple form post detector
    $this->request->addDetector('formPosted', array(
    'env' => 'REQUEST_METHOD',
    'options' => array('post', 'put')
));

次に、フォームが投稿された (または「置かれた」) かどうかを確認する必要がある場合は、次のようにします。

if ($this->request->is('formPosted')) { ... }

ディテクタは AppController に追加されているため、どのコントローラ メソッド内からでも状態を確認できます。

于 2014-02-20T00:03:19.670 に答える
0

クックブックから:

$this->request->dataフォームのモデルにちなんで名付けられた配列要素が含まれており、その配列にモデルの主キーの空でない値が含まれている場合、FormHelper はそのレコードの編集フォームを作成します。

そうですか、もしかして?のMember主キーは何ですか?

于 2013-02-05T17:31:48.003 に答える
0

同じ問題があり、4時間検索した後、次のようにモデル名をビューのフィールドに追加して解決しました。

<?php echo $this->Form->create('User');?>

<?php
    echo $this->Form->input('User.id');
    echo $this->Form->input('User.username', array('readonly' => true));
    echo $this->Form->input('User.email', array('readonly' => true));
    echo $this->Form->input('User.name');
    echo $this->Form->input('User.phone');
    echo $this->Form->input('User.gender');
    echo $this->Form->input('User.locale', array('id' => 'locale_select', 'options' => array('es' => __('Spanish'), 'en' => __('English'))));
    echo $this->Form->input('User.birthday', array('type' => 'date', 'dateFormat' => 'DMY', 'minYear' => date('Y') - 100, 'maxYear' => date('Y')));
?>
<?php echo $this->Form->end(__('Save', true));?>

このコードはプラグインに含まれていると言わざるを得ないので、他に問題があるかどうかはわかりません。しかし、そのプラグインの他のフォームは完璧に機能し、これにはモデル名が必要です。

于 2013-11-06T21:11:49.647 に答える