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,
)
);
}
}
È 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. –
potresti pubblicare il codice pertinente nel tuo controller e l'associazione nelle tue entità dottrina? – YRM