Живой поиск в symfony4 с использованием ajax + js

Я хочу реализовать живой поиск под 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

Живой поиск в symfony4 с использованием ajax + js

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 213
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы близки. :) Лично я бы сделал что-то подобное.

Функция действия:

/**
 * 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 %}

эй, адамбиан, большое спасибо за помощь, но проблемы все еще есть:

Younes Oulkaid 27.10.2018 16:10

(1/4) ResourceNotFoundException (2/4) NotFoundHttpException Не найден маршрут для «GET / search» (3/4) Класс ошибки «App \ Controller \ ExceptionController» не найден (4/4) InvalidArgumentException Controller «App \ Controller \ ExceptionController "не существует ни в качестве услуги, ни в качестве класса, пожалуйста, если у вас есть какие-либо идеи, дайте мне знать, иначе пришлите мне свой адрес электронной почты, я хочу спросить вас?

Younes Oulkaid 27.10.2018 16:32

ResourceNotFoundException: это происходит из-за отсутствия файла search.html.twig или search.ajax.twig.

Adambean 27.10.2018 20:51

NotFoundHttpException: изменить public function searchAction(Request $request, string $search) на public function searchAction(Request $request, string $search = null)

Adambean 27.10.2018 20:52

Мне нужны номера строк для двух других вопросов.

Adambean 27.10.2018 20:53

Нет, это противоречит духу обсуждения в сообществе Stack Exchange. Пожалуйста, оставьте это открытым для публичного обсуждения и внесения вклада.

Adambean 27.10.2018 21:44

Позвольте нам продолжить обсуждение в чате.

Younes Oulkaid 27.10.2018 21:48

эй, да, я сделал, как вы видите на скриншоте выше, есть все мои страницы и ошибки тоже

Younes Oulkaid 28.10.2018 13:54

Другие вопросы по теме