Требовать хотя бы один элемент в ZF2 FieldSet

Эта проблема

у меня есть 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']
]
]
];
}
}

редактировать: Добавлена ​​полная спецификация проверки.

0

Решение

Получив некоторые подсказки в 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 составная часть. Проблемы сообщили Вот а также Вот. Но это совсем другая проблема.

2

Другие решения

использование 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']
]
]
];
}
}

Надеюсь, это поможет!

1

По вопросам рекламы [email protected]