0

Существует сложная форма с множеством вложенных полей. Некоторые поля должны быть проверены в зависимости от поля (-s) в другом наборе полей. Поэтому я не могу определить все правила проверки непосредственно в getInputFilterSpecification()Fieldset, так как там я не могу получить доступ к другим полям (только пополам). Единственный способ сделать это - расширить проверку Form. Правильно? Если да, то как это сделать?Каков правильный способ добавления проверки на уровне формы в ZF2?

MyForm extends Form 
{ 
    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isFieldXyzValid = // my additional validation logic 
     if(! $isFieldXyzValid) { 
      $fieldXyz->setMessages(...); 
     } 
     return $isFormValid && $isFieldXyzValid; 
    } 
} 

Нравится? Или это более чистый способ решить эту проблему?

ответ

0

Я уже разработал нечто подобное в своем предыдущем проекте.

Для этого я использовал сервис, который принимает мою форму и устанавливает динамический набор полей и, очевидно, пользовательские правила валидации.

В контроллере, получить форму (с помощью инъекции зависимостей formManager (polyfilled или нет).

$form = $this->formManager->get('{your form}'); 

Позвоните в службу и придать ему форму.

И в службе вы можете сделать что вы хотите нравится:

  • получить свои вещи (из БД или других), чтобы определить, Wich поля являются обязательными
  • для каждый на форме
  • Добавить или удалить FIELDSET
  • Добавить или удалить поля ValidationGroup
  • Добавить или удалить фильтры
  • Добавить или удалить валидатор

я выполнил те через (образец) в Еогеаспе где $stuff является элементом коллекции доктрины

$nameFieldset = 'my_fieldset-'.$stuff->getId(); 
      $globalValidator = new GlobalValidator(); 
      $globalValidator->setGlobalValue($gloablValue); 

      $uoValidator = new UcValidator(); 
      $uoValidator->setOptions(array(
       'idToValidate' => $stuff->getId(), 
       'translator' => $this->translator 
      )); 

      $globalValidator->setOptions(array(
       'idToValidate' => $stuff->getId(), 
       'translator' => $this->translator 
      )); 

      $name = 'qty-'.$stuff->getId(); 

      $form = $this->setFilters($form, $name, $nameFieldset); 
      $globalValidator->setData($data); 
      $form = $this->setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset); 

Где setFilters и setValidato rs - это настраиваемые методы, которые добавляют фильтры и валидатор в мои поля (также пользовательские)

/** 
* @param myForm $form 
* @param $name 
* @param string $nameFieldset 
* @return myForm 
*/ 
public function setFilters($form, $name, $nameFieldset) 
{ 
    $form->getInputFilter()->get('items')->get($nameFieldset) 
     ->get($name) 
     ->getFilterChain() 
     ->getFilters() 
     ->insert(new StripTags()) 
     ->insert(new StringTrim()); 

    return $form; 
} 


/** 
* @param myForm $form 
* @param $name 
* @param $globalValidator 
* @param $uoValidator 
* @param $nameFieldset 
* @return myForm 
*/ 
public function setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset) 
{ 
    $optionsSpace = [ 
     'translator' => $this->translator, 
     'type' => NotEmpty::SPACE 
    ]; 
    $optionsString = [ 
     'translator' => $this->translator, 
     'type' => NotEmpty::STRING 
    ]; 
    $optionsDigits = [ 
     'translator' => $this->translator, 
    ]; 
    $form->getInputFilter()->get('items') 
     ->get($nameFieldset) 
     ->get($name) 
     ->setRequired(true) 
     ->getValidatorChain() 
     ->attach($uoValidator, true, 1) 
     ->attach($globalValidator, true, 1) 
     // We authorize zéro but not space nor strings 
     ->attach(new NotEmpty($optionsSpace), true, 2) 
     ->attach(new NotEmpty($optionsString), true, 2) 
     ->attach(new Digits($optionsDigits), true, 2); 
    return $form; 
} 
+0

Благодарим вас за подробный ответ! Но я думаю, что это не то, что я ищу: 1. Я «скомпилирую» свою «форму» по-другому - есть только одна «форма», и она (и ее 'Fieldset') становится другой (sub -) 'Fieldset' в зависимости от контекста. 2. Фактическая проблема заключается в проверке полей, когда эта проверка зависит от полей другого «Полевого набора». – automatix

+0

В этом примере у меня есть только одна форма, и, как вы можете видеть в этом ответе, я добавляю столько же набора полей, сколько у меня в моей коллекции. – Hooli