Как реализовать функцию поиска с автозаполнением в Laravel

Как реализовать функцию поиска с автозаполнением в Laravel

Laravel - это популярный PHP-фреймворк с открытым исходным кодом, который широко используется для создания веб-приложений. Он предоставляет множество возможностей и функций, которые делают веб-разработку проще и быстрее. Одной из таких функций является поиск Typeahead, также известный как автозаполнение.

Авто заполняемый поиск — это функция, которая помогает пользователям найти нужный контент, предлагая возможные варианты по мере ввода текста. Это полезный инструмент, который может сделать процесс поиска более интуитивным и удобным для пользователей. В этой статье мы рассмотрим, как реализовать поиск Typeahead в Laravel.

Требования:

Прежде чем мы начнем, убедитесь, что у вас установлен проект Laravel. Если у вас его нет, вы можете следовать руководству по установке Laravel. Вам также необходимо иметь базовые знания HTML, CSS, JavaScript и PHP.

Реализация поиска Typeahead в Laravel

Чтобы реализовать поиск Typeahead в Laravel, нам нужно создать форму поиска и контроллер для обработки поисковых запросов. Мы также будем использовать библиотеку Typeahead для отображения поисковых предложений.

Шаг 1: Установка библиотеки Typeahead

Чтобы установить библиотеку Typeahead, мы можем воспользоваться менеджером пакетов, например npm. Откройте терминал и перейдите в каталог проекта Laravel. Выполните следующую команду для установки плагина jQuery Typeahead:

npm install jquery-typeahead

Шаг 2: Создание формы поиска

Для создания формы поиска мы будем использовать элемент формы HTML. Откройте файл resources/views/welcome.blade.php и добавьте следующий код:

<head>
    //......

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-typeahead/2.11.2/jquery.typeahead.css"
        integrity="sha512-zPDjm5fHC6JUi5jEnhJetvp1zLvc1Dd5TuMFQQtqRH0KpOzrng4vHiFu2Eva+Xgu7umz0lqGHkmGjUYdeSW54w=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-typeahead/2.11.2/jquery.typeahead.js"
        integrity="sha512-8+3AF+qMeZ3HSeKKru1YD5pFbXnIxUvMH1UsK8sKbHwbj5ZixBtDP+8oMMkBeaZc8TIIOjHnxN++zCPhHWCrMQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
  // .....

  <form action="{{ url('search') }}" method="GET">
     <div class="typeahead__container">
          <div class="typeahead__field">
               <div class="typeahead__query">
                    <input class="typeahead"
                                 name="query"
                                 autocomplete="off">
                </div>
                <div class="typeahead__button">
                     <button type="submit">
                             <span class="typeahead__search-icon"></span>
                     </button>
                </div>
           </div>
     </div>
  </form>

  //....

  @vite(['resources/js/app.js'])

</body>

В приведенном выше коде мы создали форму с полем ввода текста и кнопкой отправки. Поле ввода имеет класс typeahead, который мы будем использовать в следующем шаге для инициализации библиотеки Typeahead.

Шаг 3: Инициализация библиотеки Typeahead

Для инициализации библиотеки Typeahead мы будем использовать код JavaScript. Откройте файл public/js/app.js и добавьте следующий код:

import $ from "jquery";
import "jquery-typeahead";

$(function () {
    $.typeahead({
        input: ".typeahead",
        hint:true,
        minLength:2,// default
        source: {
            groupName: {
                // Ajax Request
                ajax:  function (query) {
                    return {
                        type: "GET",
                        url: "/search/suggestions",
                        data: {
                            query: "{{query}}"
                        },
                        callback: {
                            done: function (data) {
                                return data;
                            }
                        }
                    }
                }
            }
        }
    });
});

В приведенном выше коде мы использовали функцию jQuery $(function () {}), чтобы убедиться, что библиотека Typeahead инициализируется после загрузки страницы. Мы также использовали функцию $.typeahead() для инициализации библиотеки Typeahead на поле ввода текста с классом typeahead.В функцию typeahead мы также передали объект с некоторыми опциями конфигурации. Опции следующие:

hint: Этот параметр имеет значение true, поэтому если в списке результатов есть элемент, начинающийся с запроса пользователя, появится текст с предложением, а нажатие стрелки вправо в конце текста ввода поиска приведет к автозаполнению запроса с предложенной подсказкой.

Выделение: Этот параметр устанавливается в true, чтобы выделить совпадающую часть предложения.

minLength: Этот параметр задает минимальное количество символов, которое необходимо набрать, прежде чем начнут появляться предложения.

source : Опция source соответствует набору(ам) данных, которые Typeahead будет просматривать для поиска совпадений со строкой запроса пользователя. Внутри source вы можете иметь несколько списков данных (групп). Вы можете настроить source.group:

ajax : Эта функция выполняет AJAX-запрос к конечной точке /search/suggestions с запросом для получения предложений.

Шаг 4: Создание контроллера

Для обработки поисковых запросов нам необходимо создать контроллер. Выполните следующую команду для создания контроллера:

php artisan make:controller SearchController

Эта команда создаст класс SearchController в каталоге app/Http/Controllers. Откройте файл app/Http/Controllers/SearchController.php и добавьте следующий код:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;

class SearchController extends Controller
{
    public function index(Request $request)
    {
        $query = $request->input('query');
        $products = Product::where('name', 'like', "%$query%")->get();

        return view('search', compact('products'));
    }

    public function suggestions(Request $request)
    {
        $query = $request->input('query');
        $suggestions = Product::where('name', 'like', "%$query%")->pluck('name');

        return response()->json($suggestions);
    }
}

Мы рассматриваем модель Product (использованную в предыдущем блоге). Вы можете использовать любую другую модель по своему усмотрению.

В приведенном выше коде мы создали два метода в классе SearchController. Метод index обрабатывает поисковые запросы и извлекает продукты с названиями, которые соответствуют запросу. Метод suggestions возвращает предложения для поиска Typeahead.

Шаг 5: Создание маршрутов

Чтобы связать форму поиска с классом SearchController, нам нужно создать маршруты. Откройте файл routes/web.php и добавьте следующий код:

Route::get("https://dev.to/", function () {
    return view('welcome');
});
Route::get('search', [SearchController::class,'index']);
Route::get('search/suggestions', [SearchController::class,'suggestions']);

В приведенном выше коде мы создали два маршрута. Первый маршрут привязывает конечную точку / к главному представлению. Второй маршрут связывает конечную точку поиска с методом index класса SearchController. Третий маршрут связывает конечную точку поиска/предложений с методом suggestions класса SearchController.

Шаг 6: Создание представления

Для отображения результатов поиска нам необходимо создать представление. Создайте новый файл resources/views/search.blade.php и добавьте в него следующий код:

<table class="table">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>
        @foreach ($products as $product)
            <tr>
                <td>{{ $product->id }}</td>
                <td>{{ $product->name }}</td>
                <td>{{ $product->price }}</td>
            </tr>
        @endforeach
    </tbody>
</table>

В приведенном выше коде мы создали таблицу для отображения результатов поиска. Переменная $products содержит результаты поиска, которые передаются из класса SearchController. Цикл @foreach итерирует массив $products и отображает информацию о продукте в таблице.

Шаг 7: Тестирование приложения

Наконец, мы готовы протестировать приложение. Запустите сервер разработки, выполнив следующую команду:

php artisan serve

Откройте веб-браузер и перейдите на сайт http://localhost:8000. Вы увидите форму поиска Typeahead. Начните вводить текст в форму поиска, и вы увидите предложения, которые появятся под полем ввода. Выберите предложение, и вы будете перенаправлены на страницу результатов поиска, где будут показаны подходящие товары.

Заключение

В этом руководстве мы узнали, как реализовать функцию поиска Typeahead в Laravel. Мы использовали плагин jQuery Typeahead и создали форму поиска, контроллер, маршруты и представление для обработки поисковых запросов и отображения результатов. Следуя шагам этого руководства, вы сможете реализовать функцию поиска Typeahead в своих приложениях Laravel.