动态表单根据所选字段而变化

时间:2013-07-03 16:22:01

标签: jquery forms symfony

我正在Symfony2中创建一个表单。我想在其上做一些有趣的事情。

假设用户选择某个类别,然后根据他的选择,显示下一个列表,其中包含所选类别的子类别。然后在选择子类别后,将显示其产品的下一个列表,然后显示与产品等相关的更多选择....如何实现此目标,我该如何开始?我不知道因为symfony2中的所有内容都是为服务器端操作定制的。单独表单可能没用,因为我需要一次验证所有内容(处理handleRequest将是一场噩梦)并以某种方式将数据存储在数据库中。

任何建议,想法,文章等?

2 个答案:

答案 0 :(得分:0)

您可以发送一个带有{{path}}的AJAX请求作为URL,由symfony2处理,并使用与活动类别相关的选项呈现json或数组。我希望这很有用。

答案 1 :(得分:0)

您可以在此处根据需要修改表单。

第一个表单包含一个类别,当用户选择一个类别时,表单发送(Ajax)和pre_bind上的事件检查是否设置了类别,如果设置了类别,则为子类别添加另一个字段

例如:

class CategoryEventSubscriber implements EventSubscriberInterface
{
    protected $factory;

    public function __construct(FormFactory $factory)
    {
        $this->factory = $factory;
    }

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

        $levelOne = isset($data['categoryLevelOne']) ? $data['categoryLevelOne'] : null;

        if (!empty($levelOne)) {
            $form->add($this->factory->createNamed('categoryLevelTwo'));
        }

        // level n+1 ...    
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }
}

在您的表单中添加活动订阅者

$builder->addEventSubscriber(new CategoryEventSubscriber($builder->getFormFactory()));