Использовать существующее отношение или создать новое - PullRequest
3 голосов
/ 14 сентября 2011

У меня есть эта форма, которая относится к объекту класса Film, который имеет отношение режиссера, и я хотел бы иметь выбор между выбором существующего режиссера или созданием нового.Первый вариант прост:

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 Ответ

1 голос
/ 17 сентября 2011
// 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();
        }

        //...

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...