Symfony2中的相关表单和选项"小部件"不存在

时间:2014-10-27 07:50:46

标签: php forms symfony widget one-to-many

我有两个实体个人资料和汽车。简介有很多车。当我尝试将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",

等。我的问题在哪里?

2 个答案:

答案 0 :(得分:1)

我只能假设个人资料和汽车之间的关系是oneToMany,这意味着在您的表单中,您需要使用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(),
));

您可以在embedding collections in the docs以及collection type are here的实际选项上阅读更多内容。

答案 1 :(得分:0)

您要实现的目标是拥有Collection of forms

我认为正确的设置方法是使用这种方法:

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

您没有使用表单字段设置数组。 auto中需要的字段需要使用carType。 关于错误: Symfony期望Acme \ UserBundle \ Entity \ Car Entity匹配相应的类型,而是接收另一个东西。这就是我试图指出你正确方向的原因。

请在此处查看此One to Many form example及其实体的示例。

在点击保存之后,我看到Qoop与我的答案完全相同:)所以只要问你是否无法运行它。