2013-05-21 53 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

相关问题