6

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

登记表

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

对于不同的问题(与此非常相似),我想出了一个“解决方案”(我发现该方法很脏,但它有效)。不过,另一个问题适用于元素和视图。我将在此处发布整个解决方案,看看它是否对某人有帮助(尽管我宁愿其他人采用不同的方法)。

因此,首先:更改两种形式的创建名称。

//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'];
}

有了这个,我们将 User 的模型验证复制到假名表单中,并且只有那个。请注意,如果您在该视图中有相同模型的第三个表单,并且您使用的是典型的$this->form->create('User'),那么除非您更改第三个表单的名称,否则验证错误也会显示在该视图中。

这样做应该有效,并且只验证具有正确名称的表单。

我发现这是一种混乱的方法,因为它涉及控制器视图的更改。我认为一切都应该由控制器完成,视图甚至不应该闪烁关于验证问题......问题是需要替换的render功能......它可以在 中完成,但对于每个Cakephp 的升级,你必须小心将新的渲染函数复制到替换它的. 但是,这种方法的优点是“功能”可用于每种形式,而不必担心更改视图。Controller.phpAppControllerController.phpAppController

好吧,无论如何它都不是那么可维护的,所以如果它只是针对这种情况,最好不要管它......但是,如果有人对如何在控制器端处理这个问题感兴趣,请发表评论,我会发布它。

于 2013-07-05T18:45:05.647 回答
1

您可以复制您的模型并更改其名称并将 $useTable 定义为相同的表名。

例子 :

class Registration extends AppModel {

public $useTable = 'users';

您在 form->create like 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

于 2014-12-10T08:55:32.317 回答
0

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

于 2013-06-11T19:00:30.380 回答