4

このトピックに関するドキュメントはやや薄いので、行き止まりになりました。

Job と JobAttribute の 2 つのモデルがあります。Job には多くの JobAttributes があり、JobAttribute には 1 つの Job があります。

class Job {
    /**
     * @ORM\OneToMany(targetEntity="JobAttribute", mappedBy="job_attributes")
     *
     * @var ArrayCollection
     */
    private $attributes;
}

class JobAttribute {
    /**
    * @ORM\Column(name="type", type="string", length=50)
    * 
    * @var string
    */
    private $type;

    /**
    * @ORM\ManyToOne(targetEntity="Job", inversedBy="jobs")
    */
    private $job;

今、私は次の FormClass を持っています:

class JobType extends AbstractType {
    public function buildForm(FormBuilder $f, array $options) {
        $f->add('name', 'text');
        $f->add('attributes', 'collection', array('type' => new JobAttributeType()));
    }

    public function getName() {
        return 'job';
    }
}

class JobAttributeType extends AbstractType {
    public function buildForm(FormBuilder $f, array $options) {
        $attribute = $options['data'];
        $f->add('value', $attribute->getType());
    }

    public function getDefaultOptions(array $options) {
        return array('data_class' => 'JWF\WorkflowBundle\Entity\JobAttribute');
    }

    public function getName() {
        return 'job_attribute';
    }
}

はい、確かに、JobAttribute の type プロパティには Form フィールド タイプが含まれています。文章。

したがって、コントローラーの JobType で FormBuilder を呼び出すと、$options['data'] に JobType 内の Job-Object が正しく取り込まれます。しかし、ネストされた JobAttributeType の $options['data'] は JobAttribute オブジェクトを指していません。ヌルです。

どうしたの?協会はどこで失われますか?ネストされたフォームで $options['data'] = NULL になるのはなぜですか? ネストされた形式で (Doctrine から) 動的フィールド タイプを取得するための回避策はありますか?

前もって感謝します!

4

1 に答える 1

3

$options['data']データは作成後にいつでも変更できる (そして変更される) ため、フォームの作成時に依存することはできません。代わりにイベント リスナーを使用する必要があります。

$formFactory = $builder->getFormFactory();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) {
    $form = $event->getForm();
    $data = $event->getData();

    if ($data instanceof JobAttribute) {
        $form->add($formFactory->createNamed('value', $data->getType());
    }
});

これに関するドキュメントはクックブックにあります。

于 2012-07-26T06:05:07.620 に答える