Популярные товары Shopaholic

Также как и с простым плагином поиска товаров захотелось повторить Popularity For Shopaholic. И опять же, это элементарный плагин популярных товаров в Shopaholic.

Если Вы интересуетесь данной статьёй, то скорее всего Вам будет интересно почитать как сделать простой плагин поиска товаров для Shopaholic.

Шаг 1. Страница с настройками (необязательный)

Создаем страницу с настройками где выведем в форму 3 поля (здесь дублировать это действие не буду, переходите по ссылке):

fields:
    offer_view:
        label: Просмотр оффера
        comment: Сколько баллов получит популярности товар при просмотре торгового предложения
        type: number
        step: 1
        min: 1
        max: 10
        span: left
        default: 1
    offer_add_to_cart:
        label: Добавление оффера в корзину
        comment: Сколько баллов получит популярности товар при добавлении торгового предложения
        type: number
        step: 1
        min: 0
        max: 10
        span: left
        default: 2
    offer_zakaz:
        label: Добавление оффера в корзину
        comment: Сколько баллов получит популярности товар при покупке торгового предложения
        type: number
        step: 1
        min: 0
        max: 10
        span: left
        default: 3

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

Шаг 2. Добавляем в базу поле popularity

Как расширить товар отлично и подробно расписано в документации к плагину Shopaholic.

Шаг 3. Создаем Event'ы (события)

Задача: на 3 события: просмотр товара, добавление в корзину и оформление заказа повесить действие увеличение рейтинга популярности.

Просмотр товара

В плагине создадим событие просмотра товара, который в поле рейтинга популярности будет добавлять число с настроек (1 этап). Либо можете написать любое число, например 1, вместо Settings::get('offer_view').

use Lovata\Shopaholic\Models\Product;
==
// Событие при просмотре товара
Event::listen('site21.shopaholicpopularoffers.productShow', function($id) {
    $product = Product::find($id);
    $product->popularity += Settings::get('offer_view');
    $product->save();
});

В страницу товара пишем:

function onEnd() {
    $obProductItem = $this->ProductPage->get();
    $is_admin = \BackendAuth::check();
    // Проверяем товарная ли это страница и не админ ли это
    if($obProductItem && !$is_admin) {
        Event::fire('site21.shopaholicpopularoffers.productShow', [$obProductItem->id]);
    }
}

P.S.: У шопаголика оказывается есть событие shopaholic.product.open, но это не точно, в документации не указано.

Оформление заказа

// Событие оформления заказа
Event::listen(\Lovata\OrdersShopaholic\Classes\Processor\OrderProcessor::EVENT_ORDER_CREATED, function($obOrder) {
    $is_admin = \BackendAuth::check();
    // Проверяем кто оформил заказ, если админ ничего не делаем
    if(!is_admin) {
        // Получаем оформленные товары
        $obOrderPositionList = $obOrder->order_position;
        foreach($obOrderPositionList as $obOrderPosition) {
            // Получаем оффер
            $obOffer = $obOrderPosition->offer;
            // Получаем его товар
            $obProduct = $obOffer->product;
            
            // Редактируем товар и добавляем рейтинг
            $product = Product::find($obProduct->id);
            $product->popularity += Settings::get('offer_zakaz');
            $product->save();
        }
    }
});

Добавление в корзину

Для того чтобы поймать добавление товара повесим ajax действие при клике на кнопку. Не забываем добавить компонент и передать offer_id. Или сразу id товара, но тогда чуть редактируем код в onAddToCarе ниже.

data-request="ShopaholicPopularOffer::onAddToCart" data-request-data="id: {{ offer_id }}"

Для этого в плагин добавим компонент с кодом:

use Lovata\Shopaholic\Classes\Item\OfferItem;
==
function onAddToCart()
{
    $offer = OfferItem::make(post('id'));
    $product = $offer->product;
    Event::fire('site21.shopaholicpopularoffers.productAddToCart', [$product->id]);
}

и в boot плагина:

Event::listen('site21.shopaholicpopularoffers.productAddToCart', function($id) {
    $product = Product::find($id);
    $product->popularity += Settings::get('offer_add_to_cart');
    $product->save();
});

Шаг 4. Добавляем кастомную сортировку для Shopaholic.

Этот шаг необходим чтобы добавить свою пользовательскую сортировку по полю "popularity".

В boot плагина пишем:

Event::listen('shopaholic.sorting.get.list', function($sSorting) {
    if ($sSorting != 'popularity|desc') {
        return null;
    }
    
    // Получите массив со списком id товаров для кастомной сортировки по полурности
    $arElementIDList = (array) Product::orderBy('popularity', 'desc')->lists('id');
    
    return $arElementIDList;
});

Теперь мы можем выводить популярные товары с помощью конструкции:

use Lovata\Shopaholic\Classes\Collection\ProductCollection;
==
$obProductList = ProductCollection::make()->sort('popularity|desc');

Profit!

Для того чтобы все работало верно лучше добавлять рейтинг офферу, нежели товару. Но это все индивидуально.


Напоминание

Если использовать готовый плагин (в приложении), то не забудьте:

  1. добавить в код страницы:
function onEnd() {
    $obProductItem = $this->ProductPage->get();
    if($obProductItem) {
        Event::fire('site21.shopaholicpopularoffers.productShow', [$obProductItem->id]);
    }
}
  1. добавить компонент Shopaholic Popular Offer
  2. добавить кнопке добалвение в корзину код:
data-request="ShopaholicPopularOffer::onAddToCart" data-request-data="id: {{ offer_id }}"
  1. отредактировать настройки страницы "Популярные товары" в настройках под себя.

Выводим на сайте

В код страницы добавляем:

$this['popular'] = $this->ShopaholicPopularOffer->get();

А в разметке страницы конструкцию такого типа (разумеется меняем под себя):

{% if popular is not empty %}
    <ul>
        {% for obProduct in popular %}
            <li>
                {% partial 'product/product-card/product-card' obProduct=obProduct obActiveCategory=obActiveCategory %}
            </li>
        {% endfor %}
    </ul>
{% endif %}

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

site21_shopaholicpopularoffers.zip

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

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

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