Как только пользователь отправляет свой текст поиска из поля ввода, цель состоит в том, чтобы показать результаты поиска в 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
, даже когда пользователь выполняет поиск, и я не знаю точно, почему это так.
Любые идеи, как это исправить?
Если это вообще неправильный подход к показу результатов поиска, я был бы благодарен, если бы кто-то мог указать мне на лучшее решение. Имейте в виду, что я не могу использовать доктрину в этом проекте, потому что я должен использовать облачную базу данных, поэтому я не думаю, что в этом случае будет работать комплект поисковых машин.
К сожалению, отправив форму, используя 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
тег.)
Других решений пока нет …