【问题标题】:live search in symfony4 using ajax+js使用 ajax+js 在 symfony4 中进行实时搜索
【发布时间】:2018-10-26 23:30:07
【问题描述】:

我想在 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.log(response);
                 },
        error: function (response) {
               console.log(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 ajax symfony doctrine-orm symfony4


    【解决方案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.htmlsearch.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 %}
    

    【讨论】:

    • 嘿 adambean 非常感谢您的帮助,但仍然存在问题:
    • (1/4) ResourceNotFoundException (2/4) NotFoundHttpException No route found for "GET /search" (3/4) Error Class 'App\Controller\ExceptionController' not found (4/4) InvalidArgumentException 控制器“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 社区讨论的精神。请保持开放以供公众辩论和贡献。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2017-02-13
    • 2017-09-13
    • 2015-06-12
    相关资源
    最近更新 更多