Также как и с простым плагином поиска товаров захотелось повторить Popularity For Shopaholic. И опять же, это элементарный плагин популярных товаров в Shopaholic.
Если Вы интересуетесь данной статьёй, то скорее всего Вам будет интересно почитать как сделать простой плагин поиска товаров для Shopaholic.
Создаем страницу с настройками где выведем в форму 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
Этот шаг необязательный, так как Вы можете просто указать в коде вручную числа на сколько увеличивать поле популярности оффера.
Как расширить товар отлично и подробно расписано в документации к плагину Shopaholic.
Задача: на 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();
});
Этот шаг необходим чтобы добавить свою пользовательскую сортировку по полю "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');
Для того чтобы все работало верно лучше добавлять рейтинг офферу, нежели товару. Но это все индивидуально.
Если использовать готовый плагин (в приложении), то не забудьте:
function onEnd() {
$obProductItem = $this->ProductPage->get();
if($obProductItem) {
Event::fire('site21.shopaholicpopularoffers.productShow', [$obProductItem->id]);
}
}
data-request="ShopaholicPopularOffer::onAddToCart" data-request-data="id: {{ offer_id }}"
В код страницы добавляем:
$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 %}
Опубликовано 22 марта 2021 г. в категориях: October CMS Shopaholic
Если Вам необходимо внедрить данную разработку на свой проект, свяжитесь со мной, обсудим цену и срок.