在Symfony2中扩展表单类型(也称为创建新表单小部件)

时间:2013-06-15 21:44:25

标签: symfony widget

我正在尝试在Symfony2中创建/展开表单类型,我想要的是类似选择器,如下图所示。为此,我正在阅读symfony2 doc,章节:“如何创建自定义字段类型”(http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html

Category widget 此表的数据库具有以下方面......

enter image description here 我假装它在Symfony中扩展隐藏的表单类型小部件来创建我自己的类型,我在symfony的文档中找不到如何从自定义类型访问实体数据,以及如何调用custo类型对象方法在小部件的twig文件中。 (在示例中,twig文件是src / Acme / DemoBundle / Resources / views / Form / fields.html.twig)


我知道我必须做一些ajax调用来每次有人触摸类别时自动加载子类别,我在控制器中完成了这个,但首先我想知道如何做我写的。希望这个小部件可以重用于所有人:)。

非常感谢你们!

1 个答案:

答案 0 :(得分:3)

您应该将新类型声明为服务并将实体管理器注入其中:

namespace Your\Bundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Doctrine\ORM\EntityManager;

class NewExampleType extends AbstractType
{

    protected $em;

    public function __construct(EntityManager $entityManager)
    {
        $this->em = $entityManager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //your code
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        //your code
    }

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

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

然后,在services.yml中声明新服务

services:
  example.type:
    class:  Your\Bundle\Form\Type\NewExampleType
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: form.type, alias: "example_widget" }

来源:http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service

然后,你应该看看这里:http://symfony.com/doc/current/cookbook/form/data_transformers.html