7

フォーム コレクションから空のレコードをフィルター処理する方法を考えています。私のアプリケーションでは、2 つのエンティティがCompetitionあり、League. 大会には 0 個以上のリーグがある場合があります。

そのため、コンペティション フォーム ( CompetitionForm)、コンペティション フィールドセット ( CompetitionFieldset)、およびリーグ フィールドセット ( LeagueFieldset) を作成します。

CompetitionFieldsetが に追加され、をCompetitionForm使用CompetitionFieldsetZend\Form\Element\Collectionてユーザーが 1 つ以上のリーグを追加できるようになります。以下の各クラスの現在のコードを追加しました。

デフォルトでは、1 つの競技内で 3 つのリーグの入力フィールドを表示したいので、 内でアイテムCompetitionFieldsetを追加するときにZend\Form\Element\Collectioncount オプションを 3 に設定します。

しかし、ユーザーがリーグのデータを提供しない場合は、無視したいと思います。現在、3 つの空の関連付けられたリーグがデータベース内に作成されています。

たとえば、フィールドを必須にするために を設定するInputFilterと、フォームは検証されません。LeagueFieldsetname

エンティティのモデル化やフォームの水和などにDoctrine2を使用していることにも言及する必要があります.

モデルに追加のコードを追加したり、フォームを処理するコントローラーでも機能させることができると確信していますが、フィルターを使用したより適切なソリューションがあると確信しています。

誰かが私を正しい方向に向けることができれば、それは大歓迎です。

あなたが提供できる助けを前もって感謝します。

:wq
familymangreg

マイ コンペティション フォーム

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

私の競合フィールドセット

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

マイリーグフィールドセット

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

}
4

1 に答える 1