通过symfony表单传递当前的查询字符串参数

时间:2013-08-29 09:39:36

标签: forms symfony

我们的应用程序使用多个webforms,其中一些只应在查询字符串中添加或更改多个参数。例如,有一个过滤器表单和一个列表顺序的表单(只是一个下拉列表)。

两者都是独立的,但是如果我改变一个,我必须使用新请求传递当前的查询字符串参数。我该如何管理?

2 个答案:

答案 0 :(得分:0)

这只是可能的解决方案之一,它将取决于您的实施,如果它可以帮助您。

<?php
$allowedQueryParams = array('param1', 'param2', 'param3');
// I'll fake a request here
$request = new Request(array('param2' => 'foo', 'param3' => 'bar', 'param4' => 'dummy'));

$formFactory = Forms::createFormFactoryBuilder()->getFormFactory();

$formBuilder = $formFactory->createBuilder();
$formBuilder->add('param1', 'text');

$data = array();
foreach ($allowedQueryParams as $param) {
    if ($request->query->has($param)) {
        // Add the query param as hidden field to you form
        $formBuilder->add($param, 'hidden');
        $data[$param] = $request->query->get($param);
    }
}

$formBuilder->setData($data);

$form = $formBuilder->getForm();

所以基本上你用当前查询参数添加隐藏字段。

编辑: 但是,如果您有多种表单,则可能需要使用EventSubscriber

执行此操作

答案 1 :(得分:0)

另一种方法是将两种形式合并为一种主形式。

来自您的控制器:

$formData = array(
    'filterParams'    => array(), // Default filter parameters
    'listOrderParams' => array(), // Default list order parameters
);
$form = $this->createFormBuilder($task)
    ->add('filterParams',    new FilterFormType())
    ->add('listOrderParams', new ListOrderFormType())
    ->add('update', 'submit')
    ->getForm();

$form->handleRequest($request);

if ($form->isValid()) {

    $formData = $form->getData();