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
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,
)
);
}
}
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. –
könnten Sie den relevanten Code in Ihrem Controller und die Assoziation in Ihren Doktrinsentitäten posten? – YRM