2014-09-26 7 views
1

Приложение ZF2, которое я в настоящее время разрабатываю, это Apigility, но мне пришлось переместить некоторые настройки InputFilter из module.config.php, чтобы разделить InputFilter файлы/классы.Как обрабатывать случай в приложении Zend Framework 2, когда нужно установить один из нескольких элементов ввода?

Теперь у меня (среди прочих) поля 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; 
    } 

    ... 

} 

ответ

0

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

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

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

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