Как получить строку запроса из поискового ввода в Symfony2

Как только пользователь отправляет свой текст поиска из поля ввода, цель состоит в том, чтобы показать результаты поиска в URL-адресе, подобном этому:

www.foo.com/search/<query_string>

Вот HTML-код из шаблона ветки:

<form
class="navbar-form"method="get"action="{{ path('path_id', {'searchTerm': app.request.query.get('search-term')}) }}"role="search">
<div class="input-group">
<input type="search" class="form-control" placeholder="Search" name="search-term" id="search-term" required>
<div class="input-group-btn">
<button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
</div>
</div>
</form>

Вот маршрут, который я создал в контроллере:

/**
* @Route("/search/{searchTerm}", defaults={"searchTerm" = null})
* @Template()
*/
public function searchAction($searchTerm)
{
return array('searchTerm' => $searchTerm);
}

Я установил для поискового запроса значение по умолчанию, равное нулю, потому что, если я этого не сделаю, он выдаст сообщение об ошибке, так как app.request.query.get в шаблоне ветки это не установлено, если пользователь еще не выполнил поиск.

Проблема с этим подходом заключается в том, что $searchTerm всегда приходит ноль в searchAction, даже когда пользователь выполняет поиск, и я не знаю точно, почему это так.

Любые идеи, как это исправить?

Если это вообще неправильный подход к показу результатов поиска, я был бы благодарен, если бы кто-то мог указать мне на лучшее решение. Имейте в виду, что я не могу использовать доктрину в этом проекте, потому что я должен использовать облачную базу данных, поэтому я не думаю, что в этом случае будет работать комплект поисковых машин.

0

Решение

К сожалению, отправив форму, используя GET Вы эффективно отправляете браузер на:

/search/?search-term=my%20search%20string

Маршрутизатор Symfony не принимает POST или же GET переменные в качестве параметров маршрута при использовании /route/{parameter} формат, и вы должны либо:

Принять GET параметр в контроллере

/**
* @Route("/search")
* @Template()
*/
public function searchAction(Request $request)
{
$searchTerm = $request->query->get('search-term');
return array('searchTerm' => $searchTerm);
}

или же

Перенаправить запрос формы на полученный маршрут

/**
* @Route("/searchSubmit")
*/
public function searchSubmitAction(Request $request)
{
$searchTerm = $request->query->get('search-term');
return $this->redirect($this->generateUrl('bundle_controller_search', array(
'searchTerm' => $searchTerm,
)));
}

Вам также может понадобиться изменить форму поиска, чтобы использовать action="{{ path('path_id') }}" без какого-либо инициализированного параметра (я не уверен, почему вы хотите передать существующие значения в действие, когда вы можете просто вставить его в value="" из input тег.)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]