Несколько раз возникала ситуация, когда необходимо иметь возможность доступа к отфильтрованному значению другого элемента формы из валидатора. Например, у нас есть средство проверки номера телефона, которое должно знать, в какой стране проверять номер телефона.
Даже если это будет задано с помощью параметра в валидаторе, этот параметр все равно необходимо будет установить с использованием отфильтрованного значения страны из формы.
У кого-нибудь есть опыт работы с такими ситуациями?
редактировать
Я знаю о $context
аргумент, который передается Callback
валидатор после проверки, однако он содержит только входные данные как это было представлено и, следовательно, не фильтруется и не помогает.
редактировать
Я могу достичь того, что ищу ниже, хотя мне действительно не нравится реализация, и она не будет работать во многих распространенных сценариях формы. Я действительно надеюсь, что есть лучший способ. Этот пример не основан на примере страны выше, но имеет ту же идею.
<?php
class MyValidator extends \Zend\Validator\AbstractValidator {
public $form;
public function isValid($value) {
$filtered_values = $this->form->getInputFilter()->getValues();
var_dump($filtered_values);
}
}
$validator = new MyValidator();
$factory = new \Zend\Form\Factory();
$form = $factory->createForm([
'input_filter' => [
[
'name' => 'foobar',
'required' => false,
'validators' => [$validator]
],
[
'name' => 'date',
'required' => true,
'filters' => [
[
'name' => 'DateTimeFormatter',
'options' => [
'format' => 'Y-m-d g:i:s a'
]
],
['name' => 'StringToUpper']
]
]
]
]);
$validator->form = $form;
$form->setData([
'foobar' => 'abc123',
'date' => 'August 3, 2014'
]);
$form->isValid();
Выход:
array (size=2)
'foobar' => string 'abc123' (length=6)
'date' => string '2014-08-03 12:00:00 AM' (length=22)
Задача ещё не решена.
Других решений пока нет …