0

我正在尝试扩展集合表单以使用自己的模板呈现它...

class ContactFieldType extends AbstractType
{
  public function setDefaultOptions(OptionsResolverInterface $resolver)
  {
    $resolver->setDefaults(array(
      'collection' => array('type' => new ContactType())
    ));
  }

  public function getParent()
  {
    return 'collection';
  }

  public function getName()
  {
    return 'contactField';
  }
}

我以这种方式使用这种类型:

$builder->add('contacts',new ContactFieldType(), array(
  'label_attr' => array('class' => 'contacts')
));

我收到以下错误:

表单的视图数据应为标量、数组或\ArrayAccess 的实例类型,但它是MyApp\MainBundle\Entity\Contact 类的实例。您可以通过将“data_class”选项设置为“MyApp\MainBundle\Entity\Contact”或添加将 MyApp\MainBundle\Entity\Contact 类的实例转换为标量、数组或 \ 的实例的视图转换器来避免此错误数组访问。

如果我使用这个:

$builder->add('contacts','collection', array(
  'type' => new ContactType(),
  'label_attr' => array('class' => 'contacts')
));

它工作正常。

我不想按照建议实现这个 data_class ...我想扩展集合小部件

4

1 回答 1

1

您的表单定义似乎很好,不需要更多的修补。你的问题在于实例化。

从我所见,我相信您或多或少地以这种方式实例化您的形式:

$model = new ParentClass();
$model->setContacts(new Contact());

$form = $this->createForm(new ParentFormType(), $model));

但是,集合表单类型不使用Contact()实例,而是使用此类实例的数组。

使用 Contact() 实例而不是此类对象的数组来提供您的实例化后,您的代码将失败。你需要做的是:

$model = new ParentClass();
$model->setContacts(array(new Contact()));

$form = $this->createForm(new ParentFormType(), $model));

尽管这是我相信您所做的,但您尚未提交实例化代码,因此很难判断我是否正确。如果您的问题仍然存在,我建议您提供它。

于 2013-12-10T16:28:20.737 回答