2015-04-23 6 views
1

У меня есть форма поиска с некоторыми полями выбора. Я обрабатываю его в headnavi на каждой странице с помощью встроенных контроллеров. (http://symfony.com/doc/current/book/templating.html#embedding-controllers) Я хочу использовать вывод формы для перенаправления на мою страницу Список ракурса, как это:Symfony встроенный контроллер формы

/list-view/{city}/{category}?q=searchQuery

Моя форма и запрос работает хорошо, когда я звоню контроллер через маршрут, но, к сожалению, когда я встроить контроллер, я стоплю из-за двух проблем. Как я читал здесь (Symfony 2 - Layout embed "no entity/class form" validation isn't working) мой запрос не обрабатывается моей формой из-за подзапроса. В ответе есть решение, но оно не очень подробное. Другая проблема, после исправления первой, будет заключаться в том, что я не могу выполнить перенаправление с встроенного контроллера (Redirect from embedded controller). Возможно, у кого-то есть более легкое решение для того, чтобы иметь форму на каждой странице, которая позволяет мне перенаправлять свои данные?

Большое спасибо и привет Рафаэль

ответ

1

Ответ Symfony 2 - Layout embed "no entity/class form" validation isn't working является 100% правильно, но мы используем контексты и изолировать их, таким образом действие, которое всегда использует запрос мастер будет нарушать правила. У вас есть все запросы (один мастер и ноль или более подзапросов) в request_stack. Инъекция Request $request в действие вашего контроллера - это текущий запрос, который является подзапросом только с max=3 (ввод значения Request сейчас не рекомендуется). Таким образом, вы должны использовать «правильный» запрос.

Выполнение перенаправления может быть выполнено разными способами, например, вернуть код сценария JS для перенаправления (что довольно уродливо imho). Я бы не использовал подзапросы из ветки, потому что слишком поздно, чтобы начать перенаправление, но сделайте подзапрос в действии. Я не тестировал код, но он должен работать. Controller::forward - ваш друг, так как он дублирует текущий запрос на выполнение подзапроса.

Controller.php (просто чтобы увидеть реализацию).

/** 
* Forwards the request to another controller. 
* 
* @param string $controller The controller name (a string like BlogBundle:Post:index) 
* @param array $path  An array of path parameters 
* @param array $query  An array of query parameters 
* 
* @return Response A Response instance 
*/ 
protected function forward($controller, array $path = array(), array $query = array()) 
{ 
    $path['_controller'] = $controller; 
    $subRequest = $this->container->get('request_stack')->getCurrentRequest()->duplicate($query, null, $path); 
    return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST); 
} 

YourController.php

public function pageAction() { 
    $formResponse = $this->forward('...:...:form'); // e.g. formAction() 
    if($formResponse->isRedirection()) { 
    return $formResponse; // just the redirection, no content 
    } 
    $this->render('...:...:your.html.twig', [ 
    'form_response' => $formResponse 
    ]); 
} 

public function formAction() { 
    $requestStack = $this->get('request_stack'); 
    /* @var $requestStack RequestStack */ 

    $masterRequest = $requestStack->getCurrentRequest(); 
    \assert(!\is_null($masterRequest)); 

    $form = ...; 
    $form->handleRequest($masterRequest); 

    if($form->isValid()) { 
    return $this->redirect(...); // success 
    } 

    return $this->render('...:...:form.html.twig', [ 
    'form' => $form->createView() 
    ]); 
} 

your.html.twig

{{ form_response.content | raw }} 
+0

Эй крестцовой, спасибо за ваш подробный ответ и пример кода! Я сделал все, как вы сказали, и отрисовал 'pageAction' на моем базовом шаблоне. Теперь im получает эту ошибку: Переменная «форма» не существует в ControllerViews/Renders/form.html.twig в строке 1 – user264593

+0

, как вы можете видеть из 'formAction', мы передаем' form' в 'render()' и вы можете использовать его в 'form.html.twig'. В 'your.html.twig' в' pageAction' вы передаете 'form_response', который является HTML, и вы можете просто использовать его в twig. Пожалуйста, дважды проверьте, нет ли переменной 'form' в' your.html.twig' и просто попытайтесь понять, что происходит в действиях контроллера, чтобы найти проблему. – Aitch

+0

Хорошо, я нашел проблему. В pageAction я отобразил form.html.twig вместо your.html.twig. Теперь я получаю форму, но она все еще не работает. Я думаю, что это все еще проблема с запросом, потому что после отправки формы URL-адрес изменяется следующим образом:>? Form [search] = Test & form [category] = & form [type] = & form [location] = & form [send] = & form [_token] = nQCbivIi7IppDpaWtmEesLOOVEoPL7njJCPpXPlxxPg – user264593

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