Эта проблема
у меня есть Form
и FieldSet
, Я хотел бы подтвердить, что FieldSet
не пусто Кроме того, я хочу проверить каждое поле в FieldSet
,
Пока что все, что я пробовал, проверяет одно или другое, но не оба. Если elements
присутствует в спецификации входного фильтра формы, то он проверяет, что elements
не пустой, но не проверяет bar
а также baz
поля FieldSet
, И, конечно же, наоборот. Любая подсказка о том, как подойти к этому вопросу, будет принята с благодарностью.
Форма
class FooForm extends Form implements InputFilterProviderInterface
{
public function init()
{
$this->add([
'name' => 'elements',
'type' => Collection::class,
'required' => true,
'options' => [
'target_element' => [
'type' => SomeElementFieldSet::class
]
]
]);
}
public function getInputFilterSpecification()
{
return [
[
'name' => 'elements',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
]
];
}
}
FieldSet
class SomeElementFieldSet extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
$this->add(['name' => 'bar']);
$this->add(['name' => 'baz']);
}
public function getInputFilterSpecification()
{
return [
[
'name' => 'bar',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
],
[
'name' => 'baz',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
]
];
}
}
редактировать: Добавлена полная спецификация проверки.
Получив некоторые подсказки в Google и покопавшись в исходном коде, я нашел решение. К сожалению zend-inputfilter
реализация немного глючит и не будет хорошо работать с getInputFilterSpecification()
, но мы можем просто построить свой собственный InputFilter
и вернуть это напрямую:
Форма
class FooForm extends BaseForm
{
public function init()
{
$this->add([
'name' => 'elements',
'type' => Collection::class,
'options' => [
'target_element' => [
'type' => SomeElementFieldSet::class
]
]
]);
}
public function getInputFilter()
{
if (!$this->filter) {
$this->filter = new InputFilter();
/** @var Collection $elementsCollection */
$elementsCollection = $this->fieldsets['elements'];
/** @var SomeElementFieldSet $elementsFieldSet */
$elementsFieldSet = $elementsCollection->getTargetElement();
$collectionFilter = new CollectionInputFilter();
$collectionFilter->setIsRequired(true);
$collectionFilter->setInputFilter(
$elementsFieldSet->getInputFilterSpecification()
);
$this->filter->add($collectionFilter, 'elements');
}
return $this->filter;
}
}
Это подтвердит, что в коллекции есть хотя бы один элемент. И будет проверять все элементы один за другим по спецификации FieldSet.
Одна проблема сохраняется, хотя. Всякий раз, когда коллекция пуста, проверка вернется false
, но не вернет никаких сообщений. Это связано с ошибкой в zend-inputfilter
составная часть. Проблемы сообщили Вот а также Вот. Но это совсем другая проблема.
использование setValidationGroup()
метод в Form
объект, указав массив полей ввода, которые вы хотите проверить. Пожалуйста, обратитесь к доктор!
Вы можете попробовать таким образом. Хотя я добавил некоторые дополнительные поля в форму только для тестирования.
class FooForm extends Form implements InputFilterProviderInterface
{
public function __construct($name = null, $options = array())
{
parent::__construct($name, $options);
$this->add(['name' => 'title']);
$this->add([
'name' => 'elements',
'type' => Collection::class,
'required' => true,
'options' => [
'target_element' => [
'type' => SomeElementFieldSet::class,
],
],
]);
$this->add([
'type' => 'submit',
'name' => 'submit',
'attributes' => [
'value' => 'Post'
],
]);
// I pointed this. Here you can specify fields to be validated
$this->setValidationGroup([
'title',
'elements' => [
'bar',
],
]);
}
public function getInputFilterSpecification()
{
return [
[
'name' => 'title',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
],
];
}
}
И ваш класс fieldset должен быть
class SomeElementFieldSet extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
$this->add(['name' => 'bar']);
$this->add(['name' => 'baz']);
}
public function getInputFilterSpecification()
{
return [
[
'name' => 'bar',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
],
[
'name' => 'baz',
'required' => true,
'validators' => [
['name' => 'NotEmpty']
]
]
];
}
}
Надеюсь, это поможет!