Symfony2表格覆盖' GET请求参数'

时间:2014-08-14 08:15:37

标签: forms symfony

在视图中,我有一个Symfony2表单(使用GET,而不是POST)以及一些预先存在的请求参数。

如果我提交表格,则会覆盖预先存在的请求参数。

有没有办法将new与现有参数合并?

修改

我实际上认为代码不会在这里工作,因为这似乎是默认行为。

我们假设我有以下网址:

localProject/app_dev.php/products/index?sort=id&direction=asc&page=1

我有一个表单(使用Symfony Formbuilder构建)。当我提交表格时,我有以下网址:

localProject/app_dev.php/products/index?formField1=someThing

但我希望网址如下:

localProject/app_dev.php/products/index?sort=id&direction=asc&page=1&formField1=someThing

2 个答案:

答案 0 :(得分:1)

如果sort,page和direction参数不是表单的字段,则可以在控制器中执行此操作:

$data = array();
$form = $this->createForm(
    new MyFormType(), 
    $data,
    array(
        'method' => 'GET',
        'action' => $this->generateUrl(
        'this_route_name', 
            array('sort' => 'id', 'direction' => 'asc', 'page' => 1)
        )
    )
);

另一种方法是将这些参数添加为表单字段。这样,您可以在控制器中执行此操作:

$defaultData = array(
    'page' => 1,
    'direction' => 'asc',
    'sort' => 'id',
);

// $defaultData are used as default values by form. They are overridden by values received in request, if sent.

$form = $this->createForm(
    new MyFormType(), 
    $defaultData, 
    array(
    )
);

答案 1 :(得分:1)

@Thiago Rodrigues的回答让我朝着正确的方向前进。以下是我解决它的方法。

我将sortdirection字段作为隐藏字段添加到表单中。

class AttributeFilterType extends AbstractType
{


    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        if ($request->get('sort')) {
            $builder->add('sort', 'hidden', array(
                'data' => $request->get('sort'),
            ));
            $builder->add('direction', 'hidden', array(
                'data' => $request->get('direction'),
            ));
        }
    }
}

确保表单的旧值不会被表单的旧值覆盖。我对请求进行了更改,如下所示(注意:attributeFilter是我的表单的名称):

/**
 * This function will analyze the given request.
 *
 * It will correct and set the settings of the given sort Values
 *
 * If the request contains sort and attributeFilter, always take the sort and overwrite the attributeFilter
 * If only the attributeFilter is given, set the sort=Attributefilter
 *
 * @param Request $request
 */
protected function manipulateParameterBag(Request $request)
{
    $parameterBag = $request->query;

    $sort = $parameterBag->get('sort');
    $direction = $parameterBag->get('direction');
    $attributeFilter = $parameterBag->get('attributeFilter');
    if ($sort && $direction) {
        if ($attributeFilter) {
            $attributeFilter['sort'] = $sort;
            $attributeFilter['direction'] = $direction;
            $parameterBag->set('attributeFilter', $attributeFilter);
        }
    } elseif ($attributeFilter) {
        $parameterBag->set('sort', $attributeFilter['sort']);
        $parameterBag->set('direction', $attributeFilter['direction']);
    }

    $request->query = $parameterBag;
    return $request;
}

希望这有助于下一个尝试完成同样目标的人。