2013-04-05 11 views
6

Ich versuche herauszufinden, wie leere Datensätze aus einer Formularsammlung gefiltert werden. Mit meiner Bewerbung habe ich 2 Entitäten, Competition und League. Ein Wettbewerb darf keine oder mehrere Ligen haben.ZF2 Formularsammlungen - Filtern leerer Datensätze

Also erstelle ich ein Wettbewerbsformular (CompetitionForm), ein Wettbewerb fieldset (CompetitionFieldset) und ein Liga fieldset (LeagueFieldset).

The CompetitionFieldset wird die CompetitionForm und die CompetitionFieldset verwendet Zend\Form\Element\Collection der Benutzer zu ermöglichen hinzuzufügen 1 oder mehr Ligen. Ich habe den aktuellen Code für jede Klasse hinzugefügt.

standardmäßig Ich möchte in einem Wettbewerb für drei Ligen Eingabefelder angezeigt werden, so im CompetitionFieldset, wenn ich das Zend\Form\Element\Collection Element hinzufügen, ich die Zählung Option

auf 3 gesetzt

Aber wenn ein Benutzer doesn‘ Ich gebe keine Daten für die Ligen, ich möchte sie ignorieren. Gegenwärtig werden drei leere assoziierte Ligen in meiner Datenbank erstellt.

Wenn ich ein InputFilter auf dem LeagueFieldset, um das Feld name zum Beispiel erforderlich machen, dann wird das Formular nicht validiert.

Ich sollte vielleicht auch erwähnen, dass ich Doctrine2 bin mit meiner Entitäten zu modellieren und meine Formen Hydrat usw.

Ich bin sicher, ich könnte es mit einigen zusätzlichen Code auf meine Modelle funktioniert, oder sogar in meinem Controller, wo ich das Formular verarbeite, aber ich bin mir sicher, dass es eine bessere Lösung gibt, vielleicht mit Filtern.

Wenn mir jemand in die richtige Richtung zeigen könnte, wäre es sehr geschätzt.

Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.

:wq 
familymangreg 

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

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

Mein 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

Sie könnten eine Methode in das Liga-Modell schreiben, die prüft, ob die Felder leer sind. Wenn Sie dann über die Liga-Einträge iterieren, bevor Sie sie an die Datenbank übergeben, führen Sie diese Prüfung aus. Wenn es leer ist, speichern Sie es nicht. Vielleicht nicht der effizienteste Ort, um den Check zu platzieren, da die leeren Fieldsets weiterhin über Validatoren und Filter verfügen, aber es würde funktionieren. –

+0

könnten Sie den relevanten Code in Ihrem Controller und die Assoziation in Ihren Doktrinsentitäten posten? – YRM

Antwort

0

Sie müssen Daten von Anfrage zu erhalten, bevor Sie es EntityManager passieren, dass‘ s sicher. Fügen Sie einfach Ihre eigene Validierung hinzu, um leere Datensätze zu filtern. Sie können auch Javascript-Filter zur Verfügung stellen, die das Formularereignis einfangen und leere Felder vor dem Senden löschen.