Связанные формы в Symfony2 и Опция & quot; виджет & quot; не существует

У меня есть две сущности профиля и автомобили. Профиль имеет много автомобилей. Когда я пытаюсь встроить CarsFormType в ProfileFOrmType, я получаю эту ошибку:

The form's view data is expected to be an instance of class Acme\UserBundle\Entity\Car, but is an instance of class Doctrine\Common\Collections\ArrayCollection.

Я пытался найти решения, но я не увидел никаких полезных результатов. Я просто хочу не создавать одну машину при создании профиля.

Код моей модели:

Профиль:

/**
* @ORM\OneToMany(targetEntity="Car", mappedBy="profile", cascade={"persist"})
*/
private $cars;

ProfileFormType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('fio', null, array('label' => 'ФИО'));
$builder->add('birthDate', null, array('label' => 'Дата рождения', 'widget' => 'single_text'));
$builder->add('file', 'file', array('label' => 'Фото', 'required' => false));
$builder->add('telephone', null, array('label' => 'Телефон'));
$builder->add('contactMail', null, array('label' => 'Контактная почта'));
/* $builder->add('category', 'choice', array(
'label' => 'Категория прав',
'choices' => array('B' => 'Категория B', 'C' => 'Категория C',),
'expanded' => true,
'multiple' => true,
));*/
$builder->add('driverLicence', null, array('label' => 'Лицензия', 'widget' => 'single_text', 'required' => false));
$builder->add('yearOnRoad', null, array('label' => 'Год за рулем', 'required' => false));
$builder->add('cars', new CarType(), array('label' => 'Авто', 'required' => false));
//        $builder->add('cars', 'entity', array('label' => 'Авто', 'required' => false,      'class' => 'VputiUserBundle:Car'));
//        $builder->add('cars', 'collection', array('label' => 'Авто', 'required' =>     false, 'type' => new CarType()));
$builder->add('submit', 'submit');
}

/**
* {@inheritDoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class'         => 'Vputi\UserBundle\Entity\Profile',
'cascade_validation' => true,
));
}

/**
* {@inheritDoc}
*/
public function getName()
{
return 'profile_driver';
}

Когда в автомобилях типа я набираю это:

 public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\Car',
'cascade_validation' => true,
));
}

к этому:

 public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => null,
'cascade_validation' => true,
));
}

Я получаю новую ошибку:

The option "widget" does not exist. Known options are: "action", "attr", "auto_initialize", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_provider", "csrf_token_id", "csrf_token_manager", "data", "data_class", "disabled",

и т.д. Где моя проблема?

0

Решение

Я могу только предположить, что отношения между профилем и автомобилем однозначные, что означает, что в вашей форме вам нужно будет использовать коллекцию CarTypes а не один для вашего cars поле. Это означает, что при формировании запроса cars переменная становится и ArrayCollection из Car объект, а не один Car что форма ожидает.

Изменить..

$builder->add('cars', new CarType(), array('label' => 'Авто', 'required' => false));

Для того, чтобы ..

$builder->add('cars', 'collection', array(
'label'    => 'Авто',
'required' => false,
'type'     => new CarType(),
));

Вы можете прочитать немного больше о встраивание коллекций в документы и фактические варианты для тип коллекции здесь.

1

Другие решения

То, что вы пытаетесь достичь, это иметь Коллекция форм

Я думаю, что правильно настроить это, чтобы использовать этот подход:

 $buider->add('cars', 'collection', array(
'type' => new carType(),
'allow_add' => true,
'allow_delete' => true,
)
);

Вы не устанавливаете массив с полями формы там. Поля, которые вам нужны в авто, должны быть указаны в carType.
Об ошибке:
Symfony ожидает, что Acme \ UserBundle \ Entity \ Car Entity будет соответствовать соответствующему типу, и вместо этого он получает другую вещь. Вот почему я пытаюсь указать вам правильное направление.

Пожалуйста, посмотрите на этот пример Пример формы «один ко многим» с их сущностями здесь.

Сразу после нажатия кнопки «Сохранить» я увидел Qoop, который полностью соответствует моему ответу 🙂 Так что просто спросите, не можете ли вы запустить его.

0

По вопросам рекламы [email protected]