Php ZF2正在将0传递给所需的formfield
好吧,我在这里有点沮丧。 根据下面的代码,似乎不可能将“0”传递给Zend Framework 2中所需的formfield,而不使其获得“无效”状态Php ZF2正在将0传递给所需的formfield,php,zend-framework2,zend-form-element,Php,Zend Framework2,Zend Form Element,好吧,我在这里有点沮丧。 根据下面的代码,似乎不可能将“0”传递给Zend Framework 2中所需的formfield,而不使其获得“无效”状态 // FLOAT (0.0) if ($type >= self::FLOAT) { $type -= self::FLOAT; if (is_float($value) && ($value == 0.0)) { $this->error(self::I
// FLOAT (0.0)
if ($type >= self::FLOAT) {
$type -= self::FLOAT;
if (is_float($value) && ($value == 0.0)) {
$this->error(self::IS_EMPTY);
return false;
}
}
// INTEGER (0)
if ($type >= self::INTEGER) {
$type -= self::INTEGER;
if (is_int($value) && ($value == 0)) {
$this->error(self::IS_EMPTY);
return false;
}
}
此代码来自“Zend\Validator\NotEmpty”,由inputFilterSpecification()方法中的属性“required=true”调用
那么我的问题是:为什么?在我看来,0是一个完全有效的整数,0.0是一个完全有效的浮点数
此外:如何在保持“required=true”的同时避免此验证?你知道,我的领域仍然需要
这是我的表单元素:
$this->add(
array(
'name' => 'price',
'type' => 'Zend\Form\Element\Text',
'options' => array(
'label' => 'Price'
)
)
);
这是我的inputFilterSpecification:
'price' => array(
'required' => true,
'validators' => array(
array(
'name' => 'Float',
),
),
'filters' => array (
array(
'name' => 'Shop\Form\Filter\CurrencyFilter',
)
),
),
只需像这样从zf2扩展验证器类
namespace Application\Validator;
use Zend\Validator\NotEmpty;
class NotEmptyAllowZero extends NotEmpty {
public function isValid( $value ) {
$type = $this->getType();
// allow zero float
if($type >= self::FLOAT && $value == 0.0) {
return true;
}
// allow integer zero
if ($type >= self::INTEGER && $value == 0) {
return true;
}
// go on with zend validator
return parent::isValid( $value );
}
}
在模块配置中注册自定义验证器(如Application/Config.php)
您可以将其用作验证器(!而不是筛选器)
您可以扩展验证器并允许零值,这将是一个选项,但随后我被迫将“required”设置为false,并使用自定义版本的“NotEmpty”验证器。我希望有一种更优雅的方式。这个答案可能会有所帮助->
'service_manager' => array(
'invokables' => array(
'NotEmptyAllowZero' => 'Application\Validator\NotEmptyAllowZero'
)
)
'price' => array(
'required' => true,
'validators' => array(
array(
'name' => '\Application\Validator\NotEmptyAllowZero',
),
),
'filters' => array (
array(
'name' => 'Shop\Form\Filter\CurrencyFilter',
)
),
),