【问题标题】:Use existing relation or create a new one使用现有关系或创建新关系
【发布时间】:2011-09-14 09:14:56
【问题描述】:

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

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 的新类,例如,但这似乎有点太多了。没有更简单的方法吗?

我想要实现的样机:

【问题讨论】:

  • @hakre:抱歉,我打错了,我指的是导演,而不是目录。
  • @gregOire:我是这么想的,但也打错了。
  • 请问您要做什么? (简单来说)创建新董事或重新使用现有董事的实际决定是什么?
  • 用户必须在这两种解决方案之间进行选择,我将很快添加一个模型以便清楚。
  • @gregOire:然后让用户决定并采取行动。你有什么问题?可能只有一个。

标签: php forms symfony


【解决方案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();
        }

        //...

    }
}

【讨论】:

  • 听起来不错!很长一段时间我都无法测试你的解决方案,但如果它有效,我会接受你的回答。谢谢和 +1。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多