5

我在 CakePHP 中使用自定义验证规则来确保在标记相应复选框时将值输入到字段中:

当。。。的时候

这是我的模型验证数组中的验证规则...

'tv_price'=>array(        
    'check'=>array(
        'rule'=>array('check_for_tv_price'),
        'message'=>'Please enter the television pricing information.',
    ),
)

...这是我非常简单的自定义验证功能:

public function check_for_tv_price($check) {
    if($this->data['Client']['tv']==1&&$this->data['Client']['tv_price']=="") {
        return false;
    }
    if($this->data['Client']['tv']==1&&$this->data['Client']['tv_price']!="") {
        return true;
    }
    if($this->data['Client']['tv']==0) {
        return true;
    }

}

我尝试在我的字段的验证数组中的不同点添加'required'=>false和,但它们总是覆盖我的自定义规则!结果,用户无法提交表单,因为浏览器阻止了它(由于 required 属性)。 'allowEmpty'=>truetv_price

作为参考,浏览器会输出以下 HTML:

<input id="ClientTvPrice" type="text" required="required" maxlength="255" minyear="2013" maxyear="2018" name="data[Client][tv_price]"></input>

(注意 minyear 和 maxyear 属性来自表单默认值。)

required有没有人找到一种方法来防止在使用自定义验证规则时自动插入属性?

任何指导将不胜感激。

谢谢!

克里斯

4

3 回答 3

10

将 required 设置为 false 并将 allowEmpty 设置为 true,这应该会为您完成。

'tv_price'=>array(        
    'check'=>array(
        'rule'=>array('check_for_tv_price'),
        'message'=>'Please enter the television pricing information.',
        'required' => false,
        'allowEmpty' => true
    ),
)

希望这可以帮助。

于 2013-04-27T00:09:38.883 回答
1

这些看起来像是 2.3 的新 HTML5 魔法东西。

尝试添加'formnovalidate' => true$this->FormHelper->input()视图中的选项。

参考:http :
//book.cakephp.org/2.0/en/appendices/2-3-migration-guide.html#formhelper http://book.cakephp.org/2.0/en/core-libraries/helpers/form
.html#FormHelper::输入

于 2013-04-27T05:07:06.557 回答
0

谢谢你的反馈!

经过进一步调查,我确实希望在检查表单时打开所需的属性;为了实现这一点,我编写了两个简单的 JavaScript 函数(并使用了我在网上找到的第三个函数)来检查复选框的当前状态,并在适当的时候将字段标记为必需。

在视图文件中,我在两个位置添加了函数调用。第一个块在 onload 函数中,在加载窗口时调用:

<script type="text/javascript">
    window.onload = function() {
        toggle_setup(document.getElementById('ClientTv'), 'tvPrice', false)
        toggle_required(document.getElementById('ClientTv'), "ClientTvPrice")
    }
</script>

这些都是一团糟,我知道。但他们奏效了!

请注意,单击复选框时出现的字段包含在一个 div 中,其名称在 toggle_setup 函数中用于根据需要显示或隐藏 div。在这种情况下,我将 div 命名为“tvPrice”

<?php echo $this->Form->input('Client.tv', array('label'=>'Purchasing TV? <small>(Check if Yes)</small>', 'onclick'=>'toggle_setup(this, "tvPrice", "TV pricing");toggle_required(this, "ClientTvPrice")'));
echo $this->Form->input('Client.tv_price', array('label'=>'Enter TV Price','div'=>array('class'=>'hidden', 'id'=>'tvPrice')));
 ?>

以下是 JavaScript 函数本身:

function toggle_required(element, id) {
    var object = document.getElementById(id)
    if(element.checked) {
        object.setAttribute( 'required', "required")
    } else {
        object.removeAttribute('required')
    }    
}
function toggle_setup(element, div, human_term) {
    if(element.checked) {
        document.getElementById(div).style.display='block'
    } else {
        if(!human_term) {
            clearChildren(document.getElementById(''+div))
            document.getElementById(div).style.display='none'
        } else {
            if(confirm('Are you sure you want to clear the client\'s '+human_term+' settings?')) {
                 clearChildren(document.getElementById(div))
                 document.getElementById(div).style.display='none'
            } else {
                element.checked = true
            }
        }
    }

}
function clearChildren(element) {
   for (var i = 0; i < element.childNodes.length; i++) {
      var e = element.childNodes[i];
      if (e.tagName) switch (e.tagName.toLowerCase()) {
         case 'input':
            switch (e.type) {
               case "radio":
               case "checkbox": e.checked = false; break;
               case "button":
               case "submit":
               case "image": break;
               default: e.value = ''; break;
            }
            break;
         case 'select': e.selectedIndex = 0; break;
         case 'textarea': e.innerHTML = ''; e.value=""; break;
         default: clearChildren(e);
      }
   }
}

上面的代码使用了一个名为“hidden”的 CSS 类,我定义如下:

.hidden {
    display: none;
}

根据上述建议,我已将'required'=>falseand'allowEmpty'=>true行添加到我的验证数组中,它似乎正在工作。

谢谢大家的帮助!

于 2013-04-30T21:53:01.863 回答