gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:30:05 26 4
gpt4 key购买 nike

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

登记表

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

最佳答案

我已经为 different question 提出了一个“解决方案”(我发现这种方法很脏,但它有效)。 (与此非常相似)。不过,另一个问题与元素和 View 有关。我将在这里发布整个解决方案,看看它是否对某人有帮助(尽管我宁愿其他人采用不同的方法)。

所以,首先:更改两个表单的创建名称。

//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
}
}

注册也是如此(只需将“登录”更改为“注册”)。

现在,操作应该正常运行,因为它不知道我们更改了 View 上的表单名称(我们确保更改了操作中的索引)。 但是,如果存在验证错误, View 将在

中检查它们
$this->validationErrors['Model_with_errors']

并且“Model_with_errors”(在本例中为“User”)不会显示在相应的表单中,因为我们更改了名称。所以我们还需要调整 View 。哦!例如,我假设这两种形式都位于名为 index.ctp 的 View 中,但如果它们位于单独的文件中(如果您使用的是元素或类似元素),我建议添加以下行所有文件的代码

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

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

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

我发现这是一种困惑的方法,因为它涉及 Controller View 的更改。我认为一切都应该由 Controller 完成, View 甚至不应该因验证问题而眨眼...问题在于 Controller.phprender 函数> 需要替换...可以在AppController中完成,但是对于Cakephp的每次升级,您必须小心复制Controller.php的新渲染函数AppController 中替换它的那个。不过,这种方法的优点是“功能”可用于每种表单,而不必担心更改 View 。

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

关于cakephp - 单页 cakephp 上具有相同型号名称的多个表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16669857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com