2013-05-21 98 views
6

我在一個頁面上有兩種形式:登錄表單和註冊表單。當我提交註冊表格時,它同時驗證:登錄和註冊表單域。我該如何處理它,如果這兩個形式具有相同的模式(用戶模式)在單個頁面上使用相同模型名稱的多個表單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

您的登錄表單上的創建方法缺少用於創建操作屬性「網址」鍵。我試圖重新創建這個,一旦我解決了這個問題,不能。也許這會解決它?

+0

我已經嘗試過但沒有取得任何成功 –

2

我爲different question(與此非常相似)提出了一個「解決方案」(我覺得方法很髒,但它的工作原理)。但是,其他問題與元素和意見有關。我會在這裏發佈整個解決方案,看看它是否有助於某人(儘管我寧願其他人採用不同的方法)。

因此,首先:更改兩個表單的創建名稱。

//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的視圖中,但是如果它們位於單獨的文件中(如果您使用的是元素或類似文件),則建議爲所有文件添加代碼行

//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'),那麼驗證錯誤也會針對該模型顯示,除非您更改第三種形式的名稱。

這樣做應該工作,只驗證具有正確名稱的表單。

我覺得這是一個混亂的方法,因爲它涉及控制器視圖更改。我認爲一切都應該由控制器完成,並且該視圖甚至不應該閃爍有關驗證問題......問題是需要替換Controller.phprender函數......可以在AppController中完成,但是對於CakePHP的每個更新版本,您都必須小心將Controller.php的新渲染函數複製到AppController中的替代函數中。但是,這種方法的優點是,「功能」可用於每種形式,而不必擔心改變視圖。如果僅僅是爲了這一種情況,如果任何人都對如何處理這個問題感興趣,儘管如此,評論和我的觀點是不一樣的,我會發布它。

+0

+1爲我工作.. – Rohan210

+0

@Nunser,我試過這個解決方案,但我失蹤登錄表錯誤。 – Garry

+0

而沒有看看你的代碼,最可能的原因是你沒有改變提交的數據的名稱回到它應該是原來的表。我爲控制器編寫的代碼就是發生這種情況的地方,你需要將來自'form-> create('Login')'的數據傳遞給用戶(就像我在答案中給出的例子)。如果你這樣說,那麼我需要代碼來調試更多,或者打開一個新問題或者創建一個聊天並邀請:)(我不保證我有空的時間,但是:S) – Nunser

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

對不起,我的英語!祝你今天愉快 ! :D

相關問題