在单页cakephp上具有相同型号名称的多个表单

时间:2013-05-21 12:19:34

标签: cakephp cakephp-2.0 multiple-forms

我在一个页面上有两个表单:登录表单和注册表单。当我提交注册表单时,它会验证两个:登录和注册的表单字段。如果两个表单具有相同的模型(用户模型)

,我该如何处理它

注册表格

<?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

3 个答案:

答案 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'(在本例中为'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'),那么除非您更改第三个表单的表单名称,否则验证错误也将显示该错误。

这样做应该有效,只能使用正确的名称验证表单。

我觉得这是一个混乱的方法,因为它涉及控制器视图的变化。我认为一切都应该由控制器完成,并且视图甚至不应该在验证问题上闪烁......问题在于render Controller.php函数需要被替换...它可以在AppController中完成,但是对于Cakephp的每个升级,你必须小心将Controller.php的新渲染函数复制到AppController中替换它的那个。不过,这种方法的优点是,每个表单都可以使用“功能”,而无需担心更改视图。

嗯,无论如何都不是那么可维护,如果只是针对这一个案例,最好不要管它......如果有人对如何在控制器方面处理这个问题感兴趣,那么评论我会发布它。

答案 1 :(得分: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

答案 2 :(得分:0)

登录表单上的create方法缺少用于创建action属性的“url”键。一旦我解决了这个问题,我就试图重新创建它。也许这会解决它?