Symfony2的自定义窗体类型或扩展(Symfony2 Custom Form Type or E

2019-10-30 06:16发布

一个实体存在订单与属性的产品。

表单已创建订单类型,允许产品被添加到订单。

这工作,但它不是很有趣。

而不是显示一个简单的产品下拉的,它应该是一个自动完成。

然而选择一个自动完成值产生额外的一些领域应与有关产品的信息进行填充时。

从自动完成选择一个产品应该填充价格和代码的两个附加字段。

控制器方法返回的数据已位于被创建和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更新的价值?

Answer 1:

你应该附上FormEvent处理该POST_SUBMIT在窗体上的事件。 有一个完整的例子(包括jQuery的AJAX行为。)这里的教程:
http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

这将需要添加动态字段您的护理FormType 。 您可以创建一个EventListener ,如果你正在寻找以后重新使用它,或者你可以通过附加的事件Closures构建您的自定义表单类型时。

更新:

首先尝试下面的代码来查看,并检查PRE_SET_DATA事件正确地踢。请注意,你不能注入$builder进入这个Closure 。 (你可以,但不会工作)只需使用$form对象和->add在田间Closure这样的:

$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));
    }
    );


文章来源: Symfony2 Custom Form Type or Extension