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,
)
);
}
}
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. –
Czy możesz umieścić odpowiedni kod w kontrolerze i powiązanie w swoich jednostkach doktrynalnych? – YRM