0

我必须更改使用不同类型生成表单的网络。Bundle/Form/ 文件夹中有 2 个文件:

  • 产品类型.php
  • ProductEditType.php

它工作正常,第一个用于生成新产品表单,第二个用于编辑它。

几乎 95% 的两个文件是相同的,所以我想它必须以任何方式使用一种类型来生成多个表单。

我一直在阅读有关如何使用表单事件修改表单的信息,但我还没有清楚地找到关于它的一般良好做法。

非常感谢。

更新

我写了一个事件订阅者如下。

<?php
namespace Project\MyBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Description of ProductTypeOptionsSubscriber
 *
 * @author Javi
 */
class ProductTypeOptionsSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents() {
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
}

public function preSetData(FormEvent $event){

    $data = $event->getData();
    $form = $event->getForm();

    if( !$data || !$data->getId() ){
        // No ID, it's a new product
        //.... some code for other options .....
        $form->add('submit','submit',
            array(
                'label' => 'New Produtc',
                'attr'  => array('class' => 'btn btn-primary')
                ));
    }else{
        // ID exists, generating edit options .....
        $form->add('submit','submit',
            array(
                'label' => 'Update Product',
                'attr'  => array('class' => 'btn btn-primary')
                ));
    }

}
}

在 ProductType 中,在 buildForm 中:

$builder->addEventSubscriber(new ProductTypeOptionsSubscriber());

就是这样,它很容易编写并且运行良好。

4

1 回答 1

0

你可以阅读这个食谱事件订阅者,第一个场景可以为你做。

回到文档的例子..

以这种方式添加您希望它们修改的字段:

$builder->addEventSubscriber(new AddNameFieldSubscriber());

然后通过输入您的逻辑创建事件事件订阅者:

// src/Acme/DemoBundle/Form/EventListener/AddNameFieldSubscriber.php
namespace Acme\DemoBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AddNameFieldSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // Tells the dispatcher that you want to listen on the form.pre_set_data
        // event and that the preSetData method should be called.
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        // check if the product object is "new"
        // If you didn't pass any data to the form, the data is "null".
        // This should be considered a new "Product"
        if (!$data || !$data->getId()) {
            $form->add('name', 'text');
            ....
            ..... // other fields
        }
    }
}
于 2013-10-07T20:01:07.333 回答