我有一张表格。表单有一个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],
],
],
],
}
}
我想根据表单中是否选中textField1
复选框来验证textField2
和selectedInForm
。
我怎么能这样做?
我虽然使用了Callback
selectedInForm
复选框验证器,但是这样:
'callback' => function($value) {
if ($value) {
$this->get('textField1')->isValid();
// or $this->get('textField1')->getValue() and do some validation with it
}
}
但问题在于,由于某种原因,textField1
值的发布值尚未附加到输入中。 textField2
也是如此。
答案 0 :(得分:2)
有两种选择。一个是你开始的地方,有回调验证器。
另一个是编写自定义验证器,为了使其可重复使用,我推荐这个解决方案。
<?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)
中的可配置条件字段定义选项,使其更具可重用性。