Как обработать случай в приложении Zend Framework 2, когда должен быть установлен один из нескольких элементов ввода?

Приложение ZF2, которое я сейчас разрабатываю, работает на Apigility, но я вынужден переместить некоторые InputFilter настройки из module.config.php разделять InputFilter файлы / классы.

Теперь у меня есть (среди прочих) поля CompanyId а также UserId, Один (один и только один) из них должен быть установлен. Я попробовал это с Callback Валидатор, см. Ниже. Но это не работает: если оба поля отсутствуют, проверка не выполняется.

Как можно решить эту проблему?

class AddressPostRequestInput implements ArraySerializableInterface {

...

public function __construct() {
$this->dataSet = [
'CompanyId' => null,
'UserId'    => null,
'Type'      => null,
];
}

...

public function getInputFilter() {

if (!$this->inputFilter) {

$inputFilter = new InputFilter();
$factory     = new InputFactory();

...

$inputFilter->add($factory->createInput(array(

...

$inputFilter->add($factory->createInput(array(
'name' => 'CompanyId',
'required' => false,
'filters' => array(
...
),
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'callback' => function ($value, $context = array()) {
$isValid =
(isset($context['UserId']) && !isset($context['CompanyId'])) ||
(!isset($context['UserId']) && isset($context['CompanyId']))
;
return $isValid;
},
),
),

$inputFilter->add($factory->createInput(array(
'name' => 'UserId',
'required' => false,
'filters' => array(
...
),
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'callback' => function ($value, $context = array()) {
$isValid =
(isset($context['UserId']) && !isset($context['CompanyId'])) ||
(!isset($context['UserId']) && isset($context['CompanyId']))
;
return $isValid;
},
),
),
)));

$this->inputFilter = $inputFilter;
}

...

}

1

Решение

Я никогда не могу вспомнить, какая комбинация этих настроек нужна, но это будет что-то вроде:

    $inputFilter->add($factory->createInput(array(
'name' => 'CompanyId',
'required' => false,
'allow_empty' => true,
'continue_if_empty' => true,
'filters' => array(
...
),

Возможно, нужно немного подправить, но должно быть в состоянии сделать это с

параметры continue_if_empty и allow_empty и средство проверки обратного вызова, которое вы реализовали

0

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

Других решений пока нет …