Forms Symfony2自定义表单类型或扩展名

Forms Symfony2自定义表单类型或扩展名,forms,symfony,autocomplete,Forms,Symfony,Autocomplete,实体订单与属性产品一起存在 已创建一个表单OrderType,该表单允许将产品添加到订单中 这是可行的,但不是很有趣 与其显示简单的产品下拉列表,不如显示自动完成 但是,在选择自动完成值时,应使用有关产品的信息填充一些附加字段 从“自动完成”中选择产品应使用价格和代码填充另外两个字段 返回数据的控制器方法已经创建,jquery有一些方便的自动完成功能可用 我知道如何将解决方案直接破解到表单模板中,但我想制作一个可重用的组件 问题是如何使用这种行为创建自定义表单或扩展 class Order {

实体订单与属性产品一起存在

已创建一个表单OrderType,该表单允许将产品添加到订单中

这是可行的,但不是很有趣

与其显示简单的产品下拉列表,不如显示自动完成

但是,在选择自动完成值时,应使用有关产品的信息填充一些附加字段

从“自动完成”中选择产品应使用价格和代码填充另外两个字段

返回数据的控制器方法已经创建,jquery有一些方便的自动完成功能可用

我知道如何将解决方案直接破解到表单模板中,但我想制作一个可重用的组件

问题是如何使用这种行为创建自定义表单或扩展

class Order {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="orders", cascade={"persist"})
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    protected $product;  

    protected $quantity;
}

class Product {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="product")
     */
    protected $orders;

    protected $name;
    protected $price;
    protected $code;
}

class OrderType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('quantity')
            ->add('product');    
    }
}
更新 我已使用以下内容更新了OrderType:

    $builder
        ->add('ppprice', 'text', array('mapped' => false, 'data' => 2));

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA, function (FormEvent $event) use($builder) {
        $form = $event->getForm();
        $order = $event->getData();
        $builder
            ->add('ppprice', 'text', array('mapped' => false, 'data' => 21));
        $builder
            ->add('test', 'text', array('mapped' => false, 'data' => 21));
    }
    );
正在调用PRE_SET_数据,但从未添加新的表单字段测试,且ppprice未使用新值更新


如何获取预设置数据以更新值?

您应该附加一个
FormEvent
来处理表单上的
POST\u SUBMIT
事件。 这里有一个包含完整示例(包括jquery ajax行为)的教程:

这将负责将动态字段添加到
FormType
。如果希望以后重新使用,可以创建一个
EventListener
,也可以在生成自定义表单类型时通过
Closures
附加事件

更新:

首先尝试以下代码,查看并检查PRE_SET_数据事件是否正确启动。请注意,您不能将
$builder
注入此
闭包
。(您可以但不会工作)只需使用
$form
对象和
->add
字段,如下图所示:

$builder->addEventListener(
        FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $form = $event->getForm();
        $order = $event->getData();

        $form->add('ppprice', 'text', array('mapped' => false, 'data' => 21));
        $form->add('test', 'text', array('mapped' => false, 'data' => 21));
    }
    );

所以对于价格和代码,我将添加$builder->add('price',array('mapped'=>false));但如果他们正在编辑订单,我将如何使用FormEvents::PRE_SET_数据以值填充价格和代码?添加
映射的
false
取决于您的基础实体。如果您不希望将其保存到数据库中,那么它应该是
false
。关于编辑期间价格和代码的动态填充,您需要在表单中使用
POST\u SUBMIT
事件。cookbook链接有一个这样的例子。主持人:我已经看过Sport POST_SUBMIT示例,但没有看到如何在我的示例中使用它,我已经用新代码更新了这个问题。谢谢你,这很有效,这是最好的方法吗?这是建议的方法,因为它是可重用的。这将防止表单中出现额外的表单字段(被
Symfony
form
组件禁止)