我在一个页面上有两个表单:登录表单和注册表单。当我提交注册表单时,它会验证两个:登录和注册的表单字段。如果两个表单具有相同的模型(用户模型)
,我该如何处理它注册表格
<?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();?>
当我提交注册表格时,它会验证两个表格,我只想验证注册表格。
我该如何处理?
答案 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”键。一旦我解决了这个问题,我就试图重新创建它。也许这会解决它?