使用现有关系或创建新关系

时间:2011-09-14 09:14:57

标签: php forms symfony

我有这个表格涉及电影类的对象,它有导演关系,我想在选择现有导演或创建新导演之间做出选择。 第一个选择很简单:

class FilmType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('director');
    }
}

第二种选择也很简单:

class FilmType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('director', new DirectorType());
    }
}

但我无法弄清楚如何调和这两种解决方案。 我试过这个:

class FilmType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    { 
        $builder->add('director')->add('director2', new DirectorType());
    }
}

但当然,它不起作用,因为我的实体没有相应的字段,我收到以下错误:

  

既不是属性“director_2”也不是方法“getDirector2()”也不是方法   “isDirector2()”存在于“Uc \ LegalBundle \ Entity \ Film”类中

我想我应该创建一个名为DirectorChoiceType的新类,但是这似乎有点太多了。是不是有更简单的方法?

我想要实现的目标: enter image description here

1 个答案:

答案 0 :(得分:1)

// form
class FilmType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    { 
        $builder
            ->add('new_director_fn')
            ->add('new_director_ln')
            ->add('director', null, array(
                'empty_value' => 'Choose an option',
                'required' => false
            ));
    }
}

// entity
class Film
{

    // not mapped
    private $new_director_fn;

    // not mapped
    private $new_director_ln;

    // orm relation
    private $director;
    }
}


// controller
class FilmController
{

    public function createAction()
    {

        //...

        if ($form->isValid()) {
            if ( $film->director === null && ($film->new_director_fn && $film->new_director_ln) )
            {
                $director = new Director();
                $director->setFirstName($film->new_director_fn);
                $director->setLastName($film->new_director_ln);
                $em->persist($director);
                $film->setDirector($director);
            }
            $em->persist($film);
            $em->flush();
        }

        //...

    }
}