【问题标题】:Dynamic form changes depending on chosen fields动态表单根据所选字段而变化
【发布时间】:2013-07-03 16:22:00
【问题描述】:

我正在 Symfony2 中创建一个表单。我想在上面做一些动态的东西。

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

有什么建议、想法、文章等?

【问题讨论】:

标签: jquery forms symfony


【解决方案1】:

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

【讨论】:

  • 抱歉,我不确定这会有什么用。 Symfony 自己生成所有选项,我想动态地做。我当然可以清除表格中的所有选项,但这会非常愚蠢。是否所有数据都根据类别加载完全相同的数据(其中一部分)?
  • 第一次请求,你会得到:包含所有选项的类别 (combo1) 和与所选类别相关的元素 (combo2)。在更改 $(category) 时,您使用 AJAX 发送所选类别的 id,并准备一个 Action 将与所选实际类别相关的元素发回给您,并用 js 填充 combo2
【解决方案2】:

您可以在需要时修改表单。

第一个表单包含一个类别,当用户选择一个类别时,表单被发送(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()));

【讨论】:

  • 很好的例子,感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多