zf2/zf3 如何验证集合字段集中的相关输入?
zf2/zf3 how to validate dependent inputs in collection's fieldset?
我有一个表格。该表单有一个 Collection
,其目标元素是一个带有复选框和几个文本字段的字段集。作为目标元素附加到 Collection
的字段集如下所示(经过简化以避免代码过多):
class AFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct(HydratorInterface $hydrator)
{
parent::__construct();
$this->setHydrator($hydrator)
->setObject(new SomeObject());
$this->add([
'type' => Hidden::class,
'name' => 'id',
]);
$this->add([
'type' => Checkbox::class,
'name' => 'selectedInForm',
]);
$this->add([
'type' => Text::class,
'name' => 'textField1',
]);
$this->add([
'type' => Text::class,
'name' => 'textField2',
]);
}
public function getInputFilterSpecification()
{
return [
'selectedInForm' => [
'required' => false,
'continue_if_empty' => true,
'validators' => [
['name' => Callback::class // + options for the validator],
],
],
'id' => [
'requred' => false,
'continue_if_empty' => true,
],
'textField1' => [
'required' => false,
'continue_if_empty' => true,
'validators' => [
['name' => SomeValidator::class],
],
],
'textField2' => [
'required' => true,
'validators' => [
['name' => SomeValidator::class],
],
],
],
}
}
我想根据是否在表单中选中 selectedInForm
复选框来验证 textField1
和 textField2
。
我该怎么做?
我虽然为 selectedInForm
复选框使用 Callback
验证器,如下所示:
'callback' => function($value) {
if ($value) {
$this->get('textField1')->isValid();
// or $this->get('textField1')->getValue() and do some validation with it
}
}
但它的问题是,由于某种原因,textField1
值的发布值尚未附加到输入。 textField2
.
也是如此
有两种选择。一个是您开始的地方,使用回调验证器。
另一种是编写自定义验证器,并使其可重用我推荐此解决方案。
<?php
use Zend\Validator\NotEmpty;
class IfSelectedInFormThanNotEmpty extends NotEmpty
{
public function isValid($value, array $context = null): bool
{
if (! empty($context['selectedInForm']) && $context['selectedInForm']) {
return parent::isValid($value);
}
return true;
}
}
然后你可以像其他验证器一样使用它:
'textField2' => [
'required' => true,
'validators' => [
['name' => IfSelectedInFormThanNotEmpty::class],
],
],
这可能不是您的确切案例,但我希望它有助于理解这个想法。
您可以在 public function __construct($options = null)
.
中使用可配置的条件字段定义选项,使其更易于重用
我有一个表格。该表单有一个 Collection
,其目标元素是一个带有复选框和几个文本字段的字段集。作为目标元素附加到 Collection
的字段集如下所示(经过简化以避免代码过多):
class AFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct(HydratorInterface $hydrator)
{
parent::__construct();
$this->setHydrator($hydrator)
->setObject(new SomeObject());
$this->add([
'type' => Hidden::class,
'name' => 'id',
]);
$this->add([
'type' => Checkbox::class,
'name' => 'selectedInForm',
]);
$this->add([
'type' => Text::class,
'name' => 'textField1',
]);
$this->add([
'type' => Text::class,
'name' => 'textField2',
]);
}
public function getInputFilterSpecification()
{
return [
'selectedInForm' => [
'required' => false,
'continue_if_empty' => true,
'validators' => [
['name' => Callback::class // + options for the validator],
],
],
'id' => [
'requred' => false,
'continue_if_empty' => true,
],
'textField1' => [
'required' => false,
'continue_if_empty' => true,
'validators' => [
['name' => SomeValidator::class],
],
],
'textField2' => [
'required' => true,
'validators' => [
['name' => SomeValidator::class],
],
],
],
}
}
我想根据是否在表单中选中 selectedInForm
复选框来验证 textField1
和 textField2
。
我该怎么做?
我虽然为 selectedInForm
复选框使用 Callback
验证器,如下所示:
'callback' => function($value) {
if ($value) {
$this->get('textField1')->isValid();
// or $this->get('textField1')->getValue() and do some validation with it
}
}
但它的问题是,由于某种原因,textField1
值的发布值尚未附加到输入。 textField2
.
有两种选择。一个是您开始的地方,使用回调验证器。
另一种是编写自定义验证器,并使其可重用我推荐此解决方案。
<?php
use Zend\Validator\NotEmpty;
class IfSelectedInFormThanNotEmpty extends NotEmpty
{
public function isValid($value, array $context = null): bool
{
if (! empty($context['selectedInForm']) && $context['selectedInForm']) {
return parent::isValid($value);
}
return true;
}
}
然后你可以像其他验证器一样使用它:
'textField2' => [
'required' => true,
'validators' => [
['name' => IfSelectedInFormThanNotEmpty::class],
],
],
这可能不是您的确切案例,但我希望它有助于理解这个想法。
您可以在 public function __construct($options = null)
.