Простой поиск товаров Shopaholic

Для Shopaholic есть плагин поиска Search for Shopaholic, но он платный. Сделать элементарную функцию поиска по названию товара можно и самому.

Шаг 1. Создаем плагин

Для начала в консоли перейдем в папку с проектом и создадим плагин

php artisan create:plugin Site21.Search

Шаг 2. Расширяем плагин Shopaholic

Далее по официальной документации Shopaholic расширяем ProductCollection. В этом разделе мы продублируем все необходимые шаги, которые вам нужно выполнить, чтобы добавить свой пользовательский фильтр по любому полю товара в класс ProductCollection.

Файл: plugins/site21/search/classes/event/product/ExtendProductCollection.php

Здесь мы создаём класс события для расширения класса ProductCollection. То есть если

<?php namespace Site21\Search\Classes\Event\Product;

use Lovata\Shopaholic\Models\Product;
use Lovata\Shopaholic\Classes\Collection\ProductCollection;

class ExtendProductCollection
{
    public function subscribe()
    {
        ProductCollection::extend(function ($obProductList) {
            $this->poisk($obProductList);
        });
    }

    protected function poisk($obProductList)
    {
        
        $obProductList->addDynamicMethod('poisk', function ($value) use ($obProductList) {
            
            $arResultIDList = (array) Product::where('name', 'like', '%'.$value.'%')->lists('id');

            return $obProductList->intersect($arResultIDList);
        });
    }
}

Файл: plugins/site21/search/Plugin.php

Добавим прослушиватель событий в файл Plugin.php.

<?php namespace Site21\Search;

use Event;

//...
use Site21\Search\Classes\Event\Product\ExtendProductCollection;
//...

public function boot()
{
    //...
    Event::subscribe(ExtendProductCollection::class);
}

Шаг 3. Выводим результаты

Создадим страницу /search "Поиск товаров" и в коде пишем:

use Input;

function onInit() {
    $this['q'] = Input::get('q');
}

Теперь мы можем использовать такой механизм:

use Lovata\Shopaholic\Classes\Collection\ProductCollection;

$obProductList = ProductCollection::make()->poisk($q);

где выйдут товары с совпадением по LIKE %товар%.

Пример на теме bootstrap.

Если использовать тему Bootstrap theme for Shopaholic то можем отредактировать в шаблоне partial product/catalog-product-list/catalog-product-list и после

{% set obProductList = ProductList.make().category(obActiveCategory.id) %}

добавить:

{% if q %}
    {% set obProductList = ProductList.make().poisk(q) %}
{% endif %}

В разметку страницы выводим (не забываем добавить компонент "Список товаров"):

{% partial 'product/catalog-product-list/catalog-product-list' q=q %}

Использование этого чанка позволит нам использовать имеющуюся верстку темы bootstrap.

Шаг 4. Partial поиска

Шаг чисто символический, для новичков. На данный момент если перейти по адресу сайт.ру/search?q=запрос выведутся товары с использованием поиска. Создадим partial для примера:

<form class="form-inline" action="/search">
    <div class="form-group input-group mx-sm-3 mb-2">
        <input type="text" name="q" class="form-control form-control-sm" id="q" placeholder="Поиск товара">
        <button type="submit" class="btn btn-primary btn-sm input-group-append">Искать</button>
    </div>
</form>

Главное чтобы action формы вел на новую страницу с результатами.


В итоге получился простой поиск товаров простейший поиск товаров в Shopaholic. Можно искать и по другим полям если мы на 2 шаге заменим поле name (название товара).

Пример готового плагина

oc-search.zip

Опубликовано 2 марта 2021 г. в категориях: October CMS Shopaholic

Если Вам необходимо внедрить данную разработку на свой проект, свяжитесь со мной, обсудим цену и срок.

Связаться со мной Fill 1