我正在寻找在isValid()方法中获取表单元素值的最佳方法。
我有类似的东西isValid():
public function isValid($data) {
$start = (int)($data['start_hour'] . $data['start_minute']);
$end = (int)($data['end_hour'] . $data['end_minute']);
if ($start >= $end) {
$this->getElement('start_hour')->addError('Start time should be less than end time');
return false;
}
return parent::isValid($data);
}
但问题是,当我的数据结构发生变化时,我也必须更改验证。 例如,现在 start_hour , start_minute 等的值成为多维数组的元素,我需要编辑验证,如
public function isValid($data) {
$start = (int)($data['send']['start_hour'] . $data['send']['start_minute']);
$end = (int)($data['send']['end_hour'] . $data['send']['end_minute']);
.......
}
通过永久密钥(如元素名称)获取元素的值会很棒,所以我的isValid看起来像:
public function isValid($data) {
$start = (int)($this->getElement('start_hour')->getValue() . $this->getElement('start_minute')->getValue());
$end = (int)($this->getElement('end_hour')->getValue() . $this->getElement('end_minute')->getValue());
.......
}
但验证方法中的 $ this-> getElement('start_hour') - > getValue()会返回一个空值。
这可能以这种方式获得元素值吗?
感谢。
答案 0 :(得分:3)
尝试使用$ this-> getValue('start_hour');
答案 1 :(得分:1)
尝试拨打
$form->populate($data)
在以这种方式调用isValid之前,数据将在您的表单中。
然后$this->getValue('start_hour');
应该在isValid()
内工作。
所以要确定: 代码中的某个地方(可能是控制器)有类似的东西:
$this->view->form = new MyForm();
$this->populate($data); //add this
if($this->view->form->isValid($data)){
//do stuff
}
答案 2 :(得分:1)
如果此代码在表单的isValid()
方法中进行,那么请确保您可以按照您的描述进行操作。只是isValid()
通常需要传递一些数据 - 例如$form->isValid($_POST)
- 而你最终会忽略它(假设父级是Zend_Form
,它有一个空的isValid()
方法;中间祖先可能会检查传递的数据)。我认为这可能会引起混淆。
替代方案可以是创建custom validator,将其附加到表单元素的一个(例如,start_hour
元素)。验证者isValid()
的签名可以使用可选的$context
参数 - isValid($value, $context = null)
。当您致电$form->isValid($data)
时,它会将$data
作为$context
传递给元素验证程序。然后,您可以使用该$context
变量检查其他值(start_min
,end_hour
,end_min
等。