我在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
字段的验证数组的不同位置添加'allowEmpty'=>true
和tv_price
,但它们总是覆盖我的自定义规则!因此,用户无法提交表单,因为浏览器会阻止它(由于必需的属性)。
作为参考,浏览器会吐出以下HTML:
<input id="ClientTvPrice" type="text" required="required" maxlength="255" minyear="2013" maxyear="2018" name="data[Client][tv_price]"></input>
(注意minyear和maxyear属性来自表单默认值。)
有没有人找到一种方法来阻止在使用自定义验证规则时自动插入required
属性?
非常感谢任何指导。
谢谢!
克里斯
答案 0 :(得分:9)
将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
),
)
希望这有帮助。
答案 1 :(得分: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::input
答案 2 :(得分: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中,该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'=>false
和'allowEmpty'=>true
行添加到我的验证数组中,它似乎正在运行。
感谢您的帮助!