【发布时间】:2014-06-06 10:08:27
【问题描述】:
存在具有属性 Product 的实体订单。
已创建一个表单 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_DATA,但从未添加新的表单字段测试,并且未使用新值更新 ppprice。
如何获取 PRE_SET_DATA 来更新值?
【问题讨论】:
标签: forms symfony autocomplete