一个实体存在订单与属性的产品。
表单已创建订单类型,允许产品被添加到订单。
这工作,但它不是很有趣。
而不是显示一个简单的产品下拉的,它应该是一个自动完成。
然而选择一个自动完成值产生额外的一些领域应与有关产品的信息进行填充时。
从自动完成选择一个产品应该填充价格和代码的两个附加字段。
控制器方法返回的数据已位于被创建和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');
}
}
更新我已经更新订单类型有以下几点:
$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更新的价值?