2015-04-23 93 views
1

我有一個搜索表單與一些選擇框。我使用ebedded控制器在每個頁面的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

嘿Aitch,感謝您詳細的解答和代碼示例!我做了像你說的一切,並在我的基礎模板上渲染'pageAction'。 現在我得到這個錯誤: 變量「形式」不存在於ControllerViews/Renders/form.html.twig第1行 – user264593

+0

,您可以從'formAction'看到我們在'render()'中傳遞'form'並且你可以在form.html.twig中使用它。在'pageAction'中的'your.html.twig'中,您傳遞了HTML格式的'form_response',您可以在樹枝中使用它。請仔細檢查'your.html.twig'中是否有'form'變量,並試着瞭解控制器操作中發生了什麼以找出問題。 – 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