6

1 つのページにログイン フォームと登録フォームの 2 つのフォームがあります。登録フォームを送信すると、ログインと登録のフォーム フィールドの両方が検証されます。両方のフォームに同じモデル (ユーザー モデル) がある場合、どのように処理できますか

登録フォーム

<?php echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'add'))); ?>
<?php echo $this->Form->input('username', array('label' => false, 'div' => false, 'class' => 'reg_input'));?>
<?php echo $this->Form->input('email', array('label' => false, 'div' => false, 'class' => 'reg_input'));?>
<?php echo $this->Form->input('password', array('label' => false, 'div' => false, 'class' => 'reg_input'));?>
<?php echo $this->Form->input('confirm_password', array('type' => 'password', 'label' => false, 'div' => false, 'class' => 'reg_input'));?>
<?php echo $this->Form->submit(__('Submit', true), array ('class' => 'reg_button', 'div' => false)); 
  echo $this->Form->end();?>

ログインフォームは以下です

  <?php echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login'))?>
  <?php echo $this->Form->input('User.username',array('label'=>false,'div'=>false, 'class' => 'reg_input'));?>
  <?php echo $this->Form->input('User.password',array('label'=>false,'div'=>false, 'class' => 'reg_input'));?>
  <?php echo $this->Form->submit(__('Log in', true), array ('class' => 'reg_button', 'div' => false)); ?>
  <?php echo $this->Form->end();?>

登録フォームを送信すると、両方のフォームが検証されます。登録フォームのみを検証したいと思います。

どうすればそれを処理できますか?

ここに画像の説明を入力

4

3 に答える 3

2

別の質問(これと非常によく似ています)に対する「解決策」(アプローチが汚いと思いますが、うまくいきます)を思いつきました。ただし、その他の質問は要素とビューで機能しました。ここにソリューション全体を投稿して、それが誰かに役立つかどうかを確認します(ただし、他の誰かが別のアプローチをとっています)。

まず、2 つのフォームの作成名を変更します。

//for the registration
<?php echo $this->Form->create('Registration', 
      array('url' => array('controller' => 'users', 'action' => 'add'))); ?>
//for the login
<?php echo $this->Form->create('Login', 
      array('controller' => 'users', 'action' => 'login'))?>

フォームは機能し、同じアクションを見て、投稿する必要があるため、害はありません。

2 番目のステップ: アクション コードを持っていないので、一般的に何をする必要があるかを説明します。

public function login() {
    if ($this->request->is('post')) {
        //we need to change the request->data indexes to make everything work
        if (isset($this->request->data['Login'] /*that's the name we gave to the form*/)) {
            $this->request->data['User'] = $this->request->data['Login'];
            unset($this->request->data['Login']); //clean everything up so all work as it is working now
            $this->set('formName', 'Login'); //we need to pass a reference to the view for validation display
     } //if there's no 'Login' index, we can assume the request came the normal way

    //your code that should work normally
    }
}

登録も同じです (「ログイン」を「登録」に変更するだけです)。

これで、アクションは正常に動作するはずです。これは、ビューのフォーム名を変更したことを認識していないためです (アクションのインデックスを変更したことを確認しました)。ただし、検証エラーがある場合、ビューはそれらをチェックします

$this->validationErrors['Model_with_errors']

また、名前を変更したため、「Model_with_errors」(この場合は「User」) はそれぞれのフォームに表示されません。そのため、ビューも微調整する必要があります。おー!index.ctpたとえば、これらの両方のフォームが というビューにあると想定していますが、それらが別々のファイルにある場合 (要素などを使用している場合)、すべてのファイルにコード行を追加することをお勧めします

//preferably in the first line of the view/element (index.ctp in this example)
if (!empty($this->validationErrors['User']) && isset($formName)) {
    $this->validationErrors[$formName] = $this->validationErrors['User'];
}

これにより、ユーザーのモデル検証を偽の名前のフォームにコピーしますが、そのフォームのみです。$this->form->create('User')同じモデルのビューに 3 番目のフォームがあり、通常の を使用する場合、その 3 番目のフォーム名を変更しない限り、そのフォームにも検証エラーが表示されることに注意してください。

これを行うと機能し、正しい名前のフォームのみが検証されます。

コントローラービューの変更が含まれるため、これは面倒なアプローチだと思います。私はすべてがコントローラーによって行われるべきだと思います、そしてビューは検証の問題について点滅さえすべきではありません...それに関する問題は、のrender機能をController.php置き換える必要があるということです...それはで行うことができますAppControllerが、すべてのCakephp のアップグレードでは、 の新しい render 関数を でController.php置き換えるものにコピーすることに注意する必要がありますAppController。ただし、このアプローチの利点は、ビューの変更を気にすることなく、すべてのフォームで「機能」を使用できることです。

とにかく、それはそれほど保守可能ではないので、この1つのケースのためだけであれば、そのままにしておく方がよいでしょう... ただし、コントローラー側でこれを処理する方法に興味がある人は、コメントして投稿します。

于 2013-07-05T18:45:05.647 に答える
1

モデルを複製して名前を変更し、$useTable を同じテーブル名として定義できます。

例 :

class Registration extends AppModel {

public $useTable = 'users';

フォームでアクションを定義します->ログインフォームの Nunser のように作成します

 <?php
    echo $this->Form->create('User',array(
        'url' => array(
            'controller' => 'Users',
            'action' => 'login',
            'user' => true
        ),
        'inputDefaults' => array(
            'div'   => false,
            'label' => false
        ),
        'novalidate'=>true,
    ));
?>

とあなたの登録フォーム

<?php
    echo $this->Form->create('Registration',array(
        'url' => array(
            'controller' => 'Users',
            'action' => 'validation_registration',
            'user' => false
        ),
        'inputDefaults' => array(
            'div'   => false,
            'label' => false
        ),
        'novalidate'=>true,
    ));
?>

コントローラーで登録検証のメソッドを定義し、最も重要なレンダリングを定義します

public function validation_registration(){
    $this->loadModel('Registration');

            if($this->request->is('post')){

                if($this->Registration->save($this->request->data)){

                    --- code ---
                }else{
                    --- code ---
                }
            }

            $this->render('user_login');
}

私の英語でごめんなさい!良い1日を !:D

于 2014-12-10T08:55:32.317 に答える