Shopaholic обновляем партнерские цены

С помощью данного плагина сможем держать цены актуальными с помощью парсинга партнерских цен.

Как правило у поставщика имеется РРЦ (рекомендательная розничная цена). Но часто бывает что эти цены меняются, не хочется чтобы Ваша цена отличалась от других, поэтому разработаем плагин который будет по клику мышки обновлять цены и ставить как у партнеров. А при желании ставить цену ниже остальных.

Шаг 1. Создаем плагин, добавляем поле в базу

Создадим плагин, назовем его partners_prices

php artisan create:plugin Site21.PartnersPrices

Далее создаем поле в оффер под названием partner_link. Туда мы будем вставлять ссылку на страницу товара партнера. Пользуемся инструкцией как добавить поле в торговое предложение на сайте Shopaholic.

После того как добавили поле, заполняем ссылки на партнеров в существующих офферах.

Шаг 2. Импортируем phpQuery

Для парсинга воспользуемся библиотекой для Laravel huasituo/laravel-phpquery. Как использовать пакеты Laravel в OctoberCMS я уже описывал. Переходим, испортируем.

Я подключаю эту библиотеку, но Вы можете подобрать любой другой пакет, так как этот на момент написания статья не работает с версией php > 7.4

Шаг 3. Добавим кнопку в контроллер

По нашей задумке цены должны парситься при нажатии на кнопку "Обновить цены партнеров". Добавим ее на страницу с товарами в копронент Shopaholic. Как добавлять кнопку в админку OctoberCMS яуже писал.

Кнопка будет иметь следующий вид (/partials/_extended_toolbar.htm):

<button
        class="btn btn-primary oc-icon-download"
        data-request="onImportPricesFromPartners"
        data-request-confirm="Это займет пару минут. Не закрывайте вкладку до окончания парсинга. О завершении будет сообщено."
        data-stripe-load-indicator>
  Обновить цены партнёров
</button>

Теперь нужно с Shopaholic добавить метод onImportPricesFromPartners в шапку нашего плагина подключаем:

use Event;
use System\Classes\PluginBase;
use Site21\PartnersPrices\Classes\Event\Offer\ExtendOfferFieldsHandler;
use Site21\PartnersPrices\Classes\Event\Offer\ExtendOfferModel;
use Site21\PartnersPrices\Classes\Event\Offer\ExtendOfferCollection;
use Config;
use Illuminate\Foundation\AliasLoader;
use phpQuery;
use Lovata\Shopaholic\Models\Offer;
use Flash;
use Lovata\Shopaholic\Controllers\Products;
use Lovata\Shopaholic\Classes\Collection\OfferCollection;
use Artisan;

и в boot сам метод:

Products::extend(function($controller){
    $controller->addDynamicMethod('onImportPricesFromPartners', function () {
        $offers = OfferCollection::make()->withPartnerLink();
        foreach($offers as $offer) {
            if($offer->partner_link) {
                $html  = file_get_contents($offer->partner_link);
                if($html) {
                    $doc = phpQuery::newDocumentHTML($html);
                    if(strpos($offer->partner_link, 'adgm.ru')) {
                        $price = $doc->find('#price .product-card__current-price')->text();
                    } else {
                        return;
                    }
                    
                    $model = Offer::find($offer->id);
                    $model->price = $price;
                    $model->save();
                }
            }
        }
        Flash::info('Цены успешно обновились.');
    });
});

Если у вас установлен плагин Yandex Market for Shopaholic, то Вы можете перед Flash вызвать обновление xml для яндекс маркета с новыми ценами:

Artisan::call('shopaholic:catalog_export.yandex_market');

Что получается

Вставляем в поле partner_link какую-нибудь ссылку на партнера, например

https://adgm.ru/svetodiodnye-moduli/prism/prism-2-1vt/km-p2-w

В методе мы указывали что если в значении присутствует adgm.ru, то цену берем с класса #price .product-card__current-price

Если поставщиков несколько, то в условии добавляем новый домен, например:

if(strpos($offer->partner_link, 'site21.ru')) {
    $price = $doc->find('#product .price_wrapper .price span.rub')->text();
} else if(strpos($offer->partner_link, 'seotitle.ru')) {
    $price = $doc->find('.bx_item_detail .item_current_price:not(.ratio_price_notavailable_block)')->text();
} else {
    return;
}

С помощью данного плагина мы обновляем цены. И конечно можем обновлять другие данные, например отзывы, кодичество остатков и т.п.

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

oc-partnerprices.zip

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

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

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