Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

popup window when searching posts laravel

I’m making a functionality to search for records

controller

public function search(Request $request)
    {
        $textSearch = $request->get('blog-search');
        $articleSearch = Article::where('title', 'LIKE', '%'.$textSearch.'%')->get();

        return view('blog.search-list', compact('articleSearch'));
    }

route

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Route::get('/search', 'App\Http\Controllers\BlogController@search');

search.blade.php

<div class="blog-search">
    <form id="search" action="/blog/" method="get" role="search">
        <input type="text" id="blog-search" name="blog-search" autocomplete="off">
        <div class="blog-search-result" id="blog-search-result"></div>
    </form>
</div>

search-list.blade.php

<?php if ($articleSearch) { ?>
    <div class="list block-shadow">
        <?php foreach ($articleSearch as $article) { ?>
            <a href="<?= $article->getUrl() ?>"><?= $article->title ?></a>
        <?php } ?>
    </div>
<?php } ?>

js

$(document).on('keyup', '[name="blog-search"]', function () {
  let data = $(this).closest('form').serialize();
  let searchResult = $('#blog-search-result');

  searchResult.html('');

  if ($(this).val().length < 2) {
      return;
  }

  $.ajax({
      url: '/search',
      data: data,
      method: 'get',
      success: function (result) {
          searchResult.html(result.html);
      }
  });
});

As a result, the search works and in the network I get this piece of code

enter image description here

But the problem is that this piece of code should appear in this block <div class="blog-search-result" id="blog-search-result"></div>

And I still can’t figure out where to do it

>Solution :

You’ve got the right idea, but you can’t return a view() like that if you’re expecting to inject it into the DOM as HTML. Use this approach instead:

public function search(Request $request) {
  $textSearch = $request->get('blog-search');
  $articleSearch = Article::where('title', 'LIKE', '%'.$textSearch.'%')->get();

  $html = view('blog.search-list', compact('articleSearch'))->render();

  return response()->json(['html' => $html], 200);
}

The render() method converts the view to a string, which you then pass back as JSON via response()->json(). Your AJAX handler is correct; searchResult.html(result.html);

Sidenote, if you’re using .blade.php, you don’t need raw PHP:

@if($articleSearch)
  <div class="list block-shadow">
    @foreach($articleSearch as $article)
      <a href="{{ $article->getUrl() }}"><{{ $article->title }}></a>
    @endforeach
  </div>
@endif

@if() can replace your <?php if (...) { ?>, and @foreach() can replace <?php foreach(...) } ?> (along with @endif and @endforeach)

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading