2013-04-05 17 views
6

Sto cercando di capire come filtrare i record vuoti da una raccolta di moduli. Con la mia applicazione ho 2 entità, Competition e League. Una competizione può avere zero o più leghe.Raccolte moduli ZF2: filtraggio di record vuoti

Così ho generare una forma di concorrenza (CompetitionForm), un fieldset Concorrenza (CompetitionFieldset) e di un fieldset League (LeagueFieldset).

Il CompetitionFieldset viene aggiunto al CompetitionForm, e il CompetitionFieldset utilizza Zend\Form\Element\Collection per consentire all'utente di aggiungere 1 o più leghe. Ho aggiunto il codice corrente per ogni classe qui sotto.

Per impostazione predefinita, voglio visualizzare i campi di input per 3 campionati all'interno di un concorso, in modo all'interno del CompetitionFieldset, quando aggiungo l'oggetto Zend\Form\Element\Collection, ho impostato l'opzione conteggio di 3.

Ma se un utente doesn' t fornire dati per i campionati, voglio ignorarli. Attualmente, tre leghe associate vuote vengono create all'interno del mio database.

Se si imposta uno su LeagueFieldset per rendere il campo name richiesto, ad esempio, il modulo non verrà convalidato.

Dovrei forse anche ricordare che sto usando Doctrine2 per modellare i miei soggetti e idratare le mie forme ecc

Sono sicuro che avrei potuto farlo funzionare con un codice addizionale sui miei modelli, o anche nel mio Controller in cui elaboro il modulo, ma sono sicuro che ci sia una soluzione più nitida magari usando i filtri.

Se qualcuno potesse indicarmi la giusta direzione, sarebbe molto apprezzato.

Mille grazie in anticipo per qualsiasi aiuto tu possa fornire.

:wq 
familymangreg 

mio 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', 
      ), 
     )); 
    } 
} 

mio 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, 
      ), 
     )); 
    } 
} 

mio 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

È possibile scrivere un metodo nel modello di League che controlla se i campi sono vuoti, quindi quando si esegue l'iterazione delle voci del campionato prima di inviarli al DB esegue tale controllo. Se è vuoto, non salvarlo. Forse non è il posto più efficiente dove mettere il controllo poiché i campi vuoti avranno ancora validatori e filtri, ma funzionerebbe. –

+0

potresti pubblicare il codice pertinente nel tuo controller e l'associazione nelle tue entità dottrina? – YRM

risposta

0

devi ottenere i dati da richiesta prima di passare a EntityManager, che' di sicuro. Basta aggiungere la propria convalida per filtrare i record vuoti. Puoi anche fornire filtri javascript che cattureranno l'evento di invio del modulo e cancelleranno i campi vuoti prima di inviarlo.