我们的应用程序使用了几个 web 表单,其中一些只应在查询字符串中添加或更改几个参数。例如,有一个过滤器表单和一个用于列表顺序的表单(只是一个下拉菜单)。
两者都是独立的,但如果我更改一个,我必须将当前的查询字符串参数与新请求一起传递。我该如何管理它?
另一种方法是将这两种形式组合成一个主形式。
从您的控制器:
$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();
这只是可能的解决方案之一,它是否对您有帮助取决于您的实施。
<?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