cakephp - CakePHP 表单上多个复选框 (HABTM) 的验证问题

标签 cakephp

简短版本

我的表单上有一些 HABTM 复选框。验证工作正常(至少需要选中一个复选框才能通过验证),但未按应有的方式生成 CakePHP 错误消息 div。

长版

我有一个允许用户填写姓名和电子邮件地址,然后从他们想要接收的小册子(复选框)列表中进行选择的列表。

表格如下所示:

<?php
echo $this->Form->create('Request',array('action' => 'index'));
echo $this->Form->input('id');
echo $this->Form->input('name');
echo $this->Form->input('email');
echo $this->Form->input('Brochure',array(
        'label' => __('Information Required:',true),
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $list,
        'selected' => $this->Html->value('Brochure.Brochure'),
));
echo $this->Form->submit('Submit');
echo $this->Form->end();
?>

在我的 Controller 中,$list设置如下:

$this->Request->Brochure->find('list',array('fields'=>array('id','name')));

阅读 HABTM form validation in CakePHP 中的第二个答案(由 user448164 发布)后在 Stack Overflow 上,我将请求模型设置如下:

<?php

class Request extends AppModel {

var $name = 'Request';

function beforeValidate() {
    foreach($this->hasAndBelongsToMany as $k=>$v) {
        if(isset($this->data[$k][$k]))
        {
            $this->data[$this->alias][$k] = $this->data[$k][$k];
        }
    }
}

var $validate = array(
    'name' => array(
        'rule' => 'notEmpty',
        'message' => 'Please enter your full name'
    ),
    'email' => array(
        'rule' => 'email',
        'message' => 'Please enter a valid email address'
    ),
    'Brochure' => array(
        'rule' => array('multiple', array('min' => 1)),
        'message' => 'Please select 1'
    ),
);
?>

这实际上有 99% 的效果。如果没有选中任何复选框,验证就会失败。然而,唯一的问题是 Cake 没有在 <div> 上设置“错误”类。 ,也不是创建 <div class="error-message">Please select 1</div>正如它应该的那样。

对于姓名和电子邮件,没有问题 - 错误 div 已正确创建。

所以,澄清一下,验证适用于我的 HABTM 复选框。唯一的问题是错误 div 没有生成。

最佳答案

我在这里发布这个问题是因为这实际上是一个比 the related question 更好的问题。你发现了。

我正在用头撞墙,试图解决让验证错误显示在页面中的相同问题。我正在使用 CakePHP v1.2,并且遇到了类似的问题,尽管我实际上已将 HABTM 拆分为各个表,即 Request->BrochuesRequest->Brochure。这是因为我无法让它随意删除和重新添加连接表行。

首先我认为accepted answer from your linked question假设您在触发 beforeValidate 调用时执行 save/saveAll,但我是通过 validates 调用执行此操作。不同的是,你需要先调用Request->set方法。这是 Jonathan Snook 发表在 Multiple Validation Sets 上的文章向我指出了这个问题。

第二个问题实际上是显示错误消息取决于您在调用 invalidate 时使用的 $field 值。多年来,我一直在包含模型和字段,假设这就是它与输入的无效调用相匹配的方式,即您有 $form->input('BrochuresRequest.brochures_id') 所以您需要$this->BrochuresRequest->invalidate('BrochuresRequest.brochures_id')

但是这是错误的,您只需要$this->BrochuresRequest->invalidate('brochures_id')

<?php   
// requests/add view
echo $form->input('BrochuresRequest.brochures_id', array('multiple' => true));

// requests_controller
function add() {
    if (!empty($this->data)) {
        $this->Request->create();
        // critical set to have $this->data 
        // for beforeValidate when calling validates
        $this->Request->set($this->data); 
        if ($this->Request->validates()) {
            $this->Request->saveAll($this->data);
        }
    }
}

// request model
function beforeValidate() {
    if (count($this->data['BrochuresRequest']['brochures_id']) < 1) {
        $this->invalidate('non_existent_field'); // fake validation error on Project
        // must be brochures_id and not BrochuresRequest.brochures_id
        $this->BrochuresRequest->invalidate('brochures_id', 'Please select 1');
        return false;
    }
    return true;
}
?>

我在过程中学到的其他一些东西:

  1. 您不需要 separate $form->error in the view
  2. 我一生都无法让“多重”验证规则在模型中发挥作用
  3. accepted answer检查 isset,但我相信这不是必需的,并且掩盖了没有 $this->data 被传递的问题。
  4. 如果您希望 beforeValidate 阻止任何保存操作,则应返回 false。

关于cakephp - CakePHP 表单上多个复选框 (HABTM) 的验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10529291/

相关文章:

找不到 CakePHP 3 插件开发 Controller 错误

php - CakePHP 查找没有 HABTM 关系记录的项目

cakephp - 何时在 CakePHP 中进行清理

.htaccess - CakePHP 和 .htaccess 资源缓存

cakephp - Cakephp 翻译行为的默认行为不起作用

cakephp 行为 afterFind 没有在相关模型上调用

postgresql - 带有 UUID 主键的 CakePHP ACL

php - CakePHP 4 - 保存关联数据不适用于 3 个简单表格

php - cakephp中的sql查询

php - CakePHP GET 请求仅在部分时间失败