0

В моей форме у меня есть поле foo, которое должно быть уникальным в таблице базы данных. Поэтому я добавил Zend\Validator\Db\NoRecordExists в список валидаторов:Как сделать проверку поля зависимой от другой формы формы массива полей в ZF2?

namespace Bar\Form\Fieldset; 

use Zend\Form\Fieldset; 
use Zend\InputFilter\InputFilterProviderInterface; 
use Zend\Db\Adapter\AdapterInterface; 

class BuzFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    protected $dbAdapter; 

    public function __construct($name = null, $options = []) {...} 

    public function setDbAdapter(AdapterInterface $dbAdapter) {...} 

    public function init() 
    { 
     $this->add([ 
      'name' => 'id', 
      'type' => 'hidden' 
     ]); 
     $this->add(
      [ 
       'name' => 'foo', 
       'type' => 'text', 
       'options' => [...], 
       'attributes' => [ 
        'required' => 'required', 
        'class' => 'form-control' 
       ] 
      ]); 
     ... 
    } 

    public function getInputFilterSpecification() 
    { 
     return [ 
      'foo' => [ 
       'required' => true, 
       'validators' => [ 
        [ 
         'name' => 'Regex', 
         'options' => [ 
          'pattern' => '/.../', 
          'message' => _(...) 
         ] 
        ], 
        [ 
         'name' => 'Zend\Validator\Db\NoRecordExists', 
         'options' => [ 
          'table' => 'buz', 
          'field' => 'foo', 
          'adapter' => $this->dbAdapter 
         ] 
        ] 
       ] 
      ], 
      ... 
     ]; 
    } 
} 

Теперь я хочу использовать ту же форму для обновления записей и, конечно, не может получить форму проверенную. Поэтому мне нужно сделать валидацию NoRecordExists для этого поля в зависимости от поля id. Если установлено значение id (это означает, что это обновление, а не создание), все валидаторы (например, здесь Regex) должны применяться, но этого нет. Как это сделать?

ответ

3

Вы можете посмотреть валидатор Callback. Этот валидатор предоставит вам доступ к контексту формы, позволяющему получить значения других полей. Используйте валидатор NoRecordExists внутри валидатора Callback, чтобы он зависел. Что-то вроде этого. Я не тестировал это, но вы получите эту идею.

'foo' => [ 
    'required' => true, 
     'validators' => [ 
      [ 
       'name' => 'Callback', 
       'options' => [ 
        'callback' => function($value, $context = []) { 
         if (empty($context['id'])) { 
          return $this->noRecordExistsValidator->isValid($value); 
         } 
         return true; 
        }, 
       ], 
     ] 
    ] 
] 

Вам нужно вводить NoRecordExistsValidator в качестве зависимости для этого класса формы, или еще лучше создать отдельную InputFilter и соответствующие заводы, которые полностью настроить InputFilter и инъекционные этот экземпляр в Fieldset объекта.

+0

Это работает, спасибо большое! – automatix

Смежные вопросы