2014-08-14 2 views
0

В представлении у меня есть форма Symfony2 (с использованием GET, а не POST), а также некоторые ранее существовавшие параметры запроса.Symfony2 Form overwrites 'Параметры запроса GET'

Если я отправлю форму, существующие параметры запроса будут перезаписаны.

Есть ли способ объединить новое с существующими параметрами?

Edit:

Я на самом деле не думаю, что код будет работать здесь, как это, кажется, поведение по умолчанию.

Давайте предположим, что у меня есть следующий URL:

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

У меня есть форма (Строим с Symfony Formbuilder). когда я отправить форму у меня есть следующий URL:

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

Но я хочу URL быть похожим:

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

Не могли бы вы предоставить свой контроллер/код формы здесь? Трудно догадаться, в чем твоя проблема. – kix

+0

@kix Спасибо за ваш комментарий. Я редактировал мой пост выше. Надеюсь, теперь это понятно? – Robin

ответ

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; 
} 

Надеется, что это помогает следующему человеку, который пытается сделать то же самое.

1

Если сортировка, страницы и направления параметры не являются поля вашей формы, вы можете сделайте это внутри своего контроллера:

$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(
    ) 
); 
+0

Привет, Тьяго, спасибо за ваш ответ, однако ни один из описанных вами способов не работал для меня ... Ваш первый способ, казалось, добавил параметры к действию, однако при отправке формы параметры исчезли ... – Robin

Смежные вопросы