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