Я хочу реализовать живой поиск под Symfony 4, но я застрял. я надеюсь, что вы поможете друзьям.
мой контроллер
/**
* @Route("/search", name = "search")
*/
public function searchAction(Request $request){
$user = new User();
$searchTerm = $request->query->get('search');
$em = $this->getDoctrine()->getManager();
$results = $em->getRepository(User::class)->findOneBy(['email' => $searchTerm]);
//$results = $query->getResult();
$content = $this->renderView('search.html.twig', [
'res' => $results,
'val' => $searchTerm
]);
$response = new JsonResponse();
$response->setData(array('list' => $content));
return $response;
}
мой скрипт ajax это мой сценарий ajax
$.ajax({
type: "GET",
url: "{{ path('search') }}",
dataType: "json",
data: {search: input},
cache: false,
success: function (response) {
$('.example-wrapper').replaceWith(response);
//$('.example-wrapper').load("{{ path('search') }}?search = "+ $search.val());
console.info(response);
},
error: function (response) {
console.info(response);
}
});
search.html.twig
<form class = "example-wrapper" role = "search" method = "post" action = "{{ path('search') }}">
<div>
<input type = "text" class = "form-control" name = "search" value = "{{ val }}">
<button type = "submit" class = "btn btn-success" name = "sub">search</button>
</div>
</form>
<div class = "example-wrapper">
{% for result in res %}
<p style = "display:inline-block;width:200px;">{{ result.fullname }}</p>
<p style = "display:inline-block;width:100px;">{{ result.username }}</p>
<p style = "display:inline-block;width:300px;">{{ result.email }}</p>
<p style = "display:inline-block;width:120px;">{{ result.roles[0] }}</p>
{% endfor %}
</div>
страница поиска выглядит так, что я не вижу форму, если не сниму скрипт ajax



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы близки. :) Лично я бы сделал что-то подобное.
Функция действия:
/**
* Search action.
* @Route("/search/{search}", name = "search")
* @param Request $request Request instance
* @param string $search Search term
* @return Response|JsonResponse Response instance
*/
public function searchAction(Request $request, string $search)
{
if (!$request->isXmlHttpRequest()) {
return $this->render("search.html.twig");
}
if (!$searchTerm = trim($request->query->get("search", $search))) {
return new JsonResponse(["error" => "Search term not specified."], Response::HTTP_BAD_REQUEST);
}
$em = $this->getDoctrine()->getManager();
if (!($results = $em->getRepository(User::class)->findOneByEmail($searchTerm))) {
return new JsonResponse(["error" => "No results found."], Response::HTTP_NOT_FOUND);
}
return new JsonResponse([
"html" => $this->renderView("search.ajax.twig", ["results" => $results]),
]);
}
Ваш search.html.twig не должен содержать цикл for с результатами, вместо этого должен быть просто this вместо цикла for:
<form id = "search-form" class = "example-wrapper" role = "search" method = "get" action = "{{ path('search') }}">
<div>
<input type = "text" class = "form-control" name = "search">
<button type = "submit" class = "btn btn-success" name = "sub">search</button>
</div>
</form>
<div id = "search-results" class = "example-wrapper"></div>
<script type = "text/javascript"><!--
jQuery(document).ready(function($){
$('#search-form').submit(function(e){
e.preventDefault();
$('#search-results').html("");
$.get("{{ path('search') }}/" + input, function(data, textStatus, xhr){
if ("object" !== typeof data || null === data) {
alert("Unexpected response from server.");
return;
}
if (!data.hasOwnProperty("html") || typeof data.html != "string" || (data.html = data.html.trim()).length < 1) {
alert("Empty response from server.");
return;
}
$('#search-results').html(data.html);
}).fail(function(xhr, textStatus, errorThrown){
var error = "Unknown error occurred.";
if ("object" === typeof xhr && null !== xhr && xhr.hasOwnProperty("responseJSON") && "object" === typeof xhr.responseJSON && xhr.responseJSON.hasOwnProperty("error") && "string" === typeof xhr.responseJSON.error && xhr.responseJSON.error.trim().length >= 1) {
error = xhr.responseJSON.error.trim();
} else if ("string" === typeof errorThrown && errorThrown.trim().length >= 1) {
error = errorThrown.trim();
}
alert(error);
});
});
});
--></script>
Затем у вас должен быть search.ajax.html в той же папке, что и search.html.twig, чтобы содержать цикл результатов. Это должно состоять только из этого:
{% if results is defined and results is iterable and results|length >= 1 %}
{% for result in results %}
<p style = "display:inline-block;width:200px;">{{ result.fullname }}</p>
<p style = "display:inline-block;width:100px;">{{ result.username }}</p>
<p style = "display:inline-block;width:300px;">{{ result.email }}</p>
<p style = "display:inline-block;width:120px;">{{ result.roles[0] }}</p>
{% endfor %}
{% endif %}
(1/4) ResourceNotFoundException (2/4) NotFoundHttpException Не найден маршрут для «GET / search» (3/4) Класс ошибки «App \ Controller \ ExceptionController» не найден (4/4) InvalidArgumentException Controller «App \ Controller \ ExceptionController "не существует ни в качестве услуги, ни в качестве класса, пожалуйста, если у вас есть какие-либо идеи, дайте мне знать, иначе пришлите мне свой адрес электронной почты, я хочу спросить вас?
ResourceNotFoundException: это происходит из-за отсутствия файла search.html.twig или search.ajax.twig.
NotFoundHttpException: изменить public function searchAction(Request $request, string $search) на public function searchAction(Request $request, string $search = null)
Мне нужны номера строк для двух других вопросов.
Нет, это противоречит духу обсуждения в сообществе Stack Exchange. Пожалуйста, оставьте это открытым для публичного обсуждения и внесения вклада.
Позвольте нам продолжить обсуждение в чате.
эй, да, я сделал, как вы видите на скриншоте выше, есть все мои страницы и ошибки тоже
эй, адамбиан, большое спасибо за помощь, но проблемы все еще есть: