在视图中,我有一个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
答案 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)
我将sort
和direction
字段作为隐藏字段添加到表单中。
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;
}
希望这有助于下一个尝试完成同样目标的人。