2013-04-05 15 views
6

Próbuję dowiedzieć się, jak filtrować puste rekordy z kolekcji formularzy. Z moją aplikacją mam 2 podmioty, Competition i League. Konkurencja może mieć zero lub więcej lig.ZF2 Form Collection - filtrowanie pustych rekordów

Tak więc tworzę formularz konkursowy (CompetitionForm), zestaw pól konkursowych (CompetitionFieldset) i zestaw pól ligowych (LeagueFieldset).

The CompetitionFieldset dodano do CompetitionForm i CompetitionFieldset wykorzystuje Zend\Form\Element\Collection aby umożliwić użytkownikowi włożyć 1 lub więcej lig. Dodałem obecny kod dla każdej klasy poniżej.

Domyślnie chcę wyświetlić pola wejściowe dla 3 lig w konkursie, więc w CompetitionFieldset, kiedy dodać element Zend\Form\Element\Collection, ustawić opcję zliczania do 3.

Ale jeśli użytkownik robi” • Podaj dane dla lig, chcę je zignorować. Obecnie w mojej bazie danych są tworzone trzy puste skojarzone ligi.

Jeśli ustawię InputFilter na LeagueFieldset, aby na przykład wymagane było pole name, formularz nie zostanie zatwierdzony.

Powinienem być może również wspomnieć, że używam Doctrine2 modelować swoje jednostki i nawilżają moje formularze itd

Jestem pewien, że mogę zrobić to praca z jakiegoś dodatkowego kodu na moich modeli, a nawet w moim Kontroler, w którym przetwarzam formularz, ale jestem pewny, że istnieje lepsze rozwiązanie, może przy użyciu filtrów.

Jeśli ktoś mógłby wskazać mi właściwy kierunek, byłoby to bardzo cenne.

Z góry dziękujemy za wszelką pomoc.

:wq 
familymangreg 

Moja CompetitionForm

use Kickoff\Form\AbstractAdminForm; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\Stdlib\Hydrator\ClassMethods; 

class CompetitionForm extends AbstractAdminForm 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager, 'competition-form'); 

     $fieldset = new CompetitionFieldset($objectManager); 
     $fieldset->setUseAsBaseFieldset(true); 
     $this->add($fieldset); 

     $this->add(array(
      'name' => 'submit', 
      'attributes' => array(
       'type' => 'submit', 
       'value' => 'Submit', 
       'id' => 'submitbutton', 
      ), 
     )); 
    } 
} 

My CompetitionFieldset

use Kickoff\Form\AbstractFieldset; 
use Kickoff\Model\Entities\Competition; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 

class CompetitionFieldset extends AbstractFieldset 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager,'Competition'); 

     $this->setHydrator(new DoctrineHydrator($this->objectManager,'Kickoff\Model\Entities\Competition')) 
      ->setObject(new Competition()); 

     $this->setLabel('Competition'); 

     $this->add(array(
      'name' => 'name', 
      'options' => array(
       'label' => 'Competition name (e.g. Premier League)',     
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $this->add(array(
      'name' => 'long_name', 
      'options' => array(
       'label' => 'Competition long name (e.g. Barclays Premier League)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $leagueFieldset = new LeagueFieldset($objectManager); 
     $this->add(array(
      'type' => 'Zend\Form\Element\Collection', 
      'name' => 'leagues', 
      'options' => array(
       'label' => 'Leagues', 
       'count' => 3, 
       'should_create_template' => true, 
       'allow_add' => true, 
       'target_element' => $leagueFieldset, 
      ), 
     )); 
    } 
} 

My LeagueFieldset

use Kickoff\Form\AbstractFieldset; 
use Kickoff\Model\Entities\League; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\InputFilter\InputFilterProviderInterface; 

class LeagueFieldset extends AbstractFieldset implements InputFilterProviderInterface 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager,'League'); 

     $this->setHydrator(new DoctrineHydrator($this->objectManager,'Kickoff\Model\Entities\League')) 
      ->setObject(new League()); 

     $this->setLabel('League'); 

     $this->add(array(
      'name' => 'name', 
      'options' => array(
       'label' => 'League name (e.g. First Qualifying Round)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $this->add(array(
      'name' => 'long_name', 
      'options' => array(
       'label' => 'League long name (e.g. UEFA Champions League First Qualifying Round)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 
    } 

    public function getInputFilterSpecification() 
    { 
     return array(
      'name' => array(
       'required' => true, 
      ) 
     ); 
    } 

} 
+0

Można napisać metodę w modelu Ligi, która sprawdza, czy pola są puste, a następnie podczas powtarzania wpisów w Lidze tuż przed wysłaniem ich do bazy DB, która sprawdza. Jeśli jest pusty, nie zapisuj go. Być może nie jest to najbardziej wydajne miejsce na sprawdzenie, ponieważ puste zestawy pól będą nadal miały weryfikatory i filtry działające na nim, ale zadziała. –

+0

Czy możesz umieścić odpowiedni kod w kontrolerze i powiązanie w swoich jednostkach doktrynalnych? – YRM

Odpowiedz

0

Trzeba pobrać dane z wniosku przed przekazać go do EntityManager, że” na pewno. Po prostu dodaj własne sprawdzanie poprawności, aby filtrować puste rekordy. Możesz również podać filtry javascript, które będą łapać zdarzenie typu "submit form" i usuwać puste pola przed jego przesłaniem.