Как проверить, имеет ли вход значение с плавающей запятой в форме zf2?
У меня есть это в моем классе
$inputFilter->add(
$factory->createInput(array(
'name' => 'precio',
'required' => true,
'validators' => array(
array(
'name' => 'Float',
'options' => array(
'min' => 0,
),
),
),
))
);
Когда я ввожу целое число, такое как 5 или 78, все кажется нормальным, но когда я пытаюсь с числом, таким как 5.2, я получаю следующее сообщение об ошибке
Ввод не выглядит как поплавок
3 ответа
Решение
Десятичный символ в классе Float Validator зависит от локали, используемой в приложении. Попробуйте добавить локаль в качестве опции:
$factory->createInput( array(
'name' => 'precio',
'required' => true,
'validators' => array(
array(
'name' => 'Float',
'options' => array(
'min' => 0,
'locale' => '<my_locale>'
),
),
),
) );
Если вы не установите языковой стандарт, класс Float получит intl.default_locale, определенный в php.ini.
Вы можете написать собственный валидатор, например так:
class Currency extends \Zend\Validator\AbstractValidator {
/**
* Error constants
*/
const ERROR_WRONG_CURRENCY_FORMAT = 'wrongCurrencyFormat';
/**
* @var array Message templates
*/
protected $messageTemplates = array(
self::ERROR_WRONG_CURRENCY_FORMAT => "Vaule is not valid currency format. (xxx | xxx.xx | xxx,xx)",
);
/**
* {@inheritDoc}
*/
public function isValid($value) {
$exploded = null;
if (strpos($value, '.')) {
$exploded = explode('.', $value);
}
if (strpos($value, ',')) {
$exploded = explode(',', $value);
}
if (!$exploded && ctype_digit($value)) {
return true;
}
if (ctype_digit($exploded[0]) && ctype_digit($exploded[1]) && strlen($exploded[1]) == 2) {
return true;
}
$this->error(self::ERROR_WRONG_CURRENCY_FORMAT);
return false;
}
}
И значение фильтра:
class Float extends \Zend\Filter\AbstractFilter {
public function filter($value) {
$float = $value;
if($value){
$float = str_replace(',', '.', $value);
}
return $float;
}
}
Вы могли бы использовать валидатор обратного вызова.
use Zend\Validator\Callback;
$callback = new Callback([$this, 'validateFloat']);
$priceCallBack->setMessage('The value is not valid.');
тогда где-то в классе вам нужна эта функция.
public function validateFloat($value){
return (is_numeric($value));
}
И, наконец, внутри формы, добавьте этот валидатор, например.
$this->inputFilter->add([
'name'=>'pro_price',
'required' => true,
'validators'=>[$callback]
]);