2013-05-21 15 views
6

1つのページに2つのフォームがあります:ログインフォームと登録フォームです。私は登録フォームを提出すると、ログインしている登録欄と登録している欄の両方を検証します。両方のフォームが同じモデル(ユーザモデル)を持っている場合どのように私はそれを処理することができます1つのページに同じモデル名の複数のフォームcakephp

私は登録を送信すると登録フォーム

<?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();?> 

を下回っている、それは両方の形式を検証するフォーム登録フォームのみを検証したいと思います。

どうすれば対応できますか?

enter image description here

+0

私は同じ問題を抱えています。 この問題の解決策をお探しですか? – gonzo

+0

まだ解決策が見つかりません –

+0

この問題を解決する方法。助けてください –

答えて

0

action属性を作成するための「URL」キーが欠落している、あなたのログインフォームの作成方法。私はこれを修正した後、これを再作成しようとしましたができませんでした。多分それはそれを修正するだろうか?

+0

私はすでにそれを試してみましたが、成功しませんでした –

2

different question(これに非常に似ています)のための "解決策"(私は方法が汚いが、それが動作すると思いますが)を考え出しました。しかし、この他の質問は、要素とビューで機能しました。私は誰か(他の誰かが別のアプローチを持っていますが)を助けるかどうかを確認するためにここにソリューション全体を投稿します。

まず、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'))?> 

フォームは、同じ動作をしていて見て、投稿しなければならないので、害はありません。

第二ステップ:私はあなたのアクションコードを持っていないので、私は、登録のための一般的な

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」(この場合は「ユーザー」)は、それぞれの形式で表示されませんように彼らのためにチェックします名前を変更しました。だから我々はまた、ビューを微調整する必要があります。ああ!私はこれらの両方のフォームがindex.ctpというビュー内にあると仮定していますが、それらが別々のファイルにある場合(要素などを使用している場合)、すべてのファイルにコード行を追加することをおすすめします。

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

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

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

これはちょうどメンテナンスが容易ではないので、もしこの場合に限って残しておけばいいのです...コントローラ側でこれをどう扱うかに興味があれば、投稿する

+0

+1私のために働いた.. – Rohan210

+0

@ Nunser、私はこの解決策を試みたが、私はログインのテーブルのエラーを逃した。 – Garry

+0

あなたのコードを見ることなく、その可能性が最も高い原因は、提出されたデータの名前を元のテーブルに戻さないことです。私がコントローラのために書いたコードはどこにあるのでしょうか? 'form-> create( 'Login')'のデータを(答えに書いた例のように)ユーザに渡す必要があります。あなたはそれがそうだと言うなら、私はより多くのデバッグ、新しい質問を開くか、チャットと招待を作成するコードが必要です:)(私は利用可能な時間を保証しません:S) – Nunser

1

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

例:

class Registration extends AppModel { 

public $useTable = 'users'; 

あなたはフォーム - でアクションを定義する>ログインフォームお使いのコントローラで

<?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, 
    )); 
?> 

定義するためNunserのように作成します登録の検証のためのメソッドと最も重要なレンダリングを定義する

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'); 
} 

私の英語のために申し訳ありません!良い一日を ! :D

関連する問題