С помощью данного плагина сможем держать цены актуальными с помощью парсинга партнерских цен.
Как правило у поставщика имеется РРЦ (рекомендательная розничная цена). Но часто бывает что эти цены меняются, не хочется чтобы Ваша цена отличалась от других, поэтому разработаем плагин который будет по клику мышки обновлять цены и ставить как у партнеров. А при желании ставить цену ниже остальных.
Создадим плагин, назовем его partners_prices
php artisan create:plugin Site21.PartnersPrices
Далее создаем поле в оффер под названием partner_link. Туда мы будем вставлять ссылку на страницу товара партнера. Пользуемся инструкцией как добавить поле в торговое предложение на сайте Shopaholic.
После того как добавили поле, заполняем ссылки на партнеров в существующих офферах.
Для парсинга воспользуемся библиотекой для Laravel huasituo/laravel-phpquery. Как использовать пакеты Laravel в OctoberCMS я уже описывал. Переходим, испортируем.
Я подключаю эту библиотеку, но Вы можете подобрать любой другой пакет, так как этот на момент написания статья не работает с версией php > 7.4
По нашей задумке цены должны парситься при нажатии на кнопку "Обновить цены партнеров". Добавим ее на страницу с товарами в копронент 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;
}
С помощью данного плагина мы обновляем цены. И конечно можем обновлять другие данные, например отзывы, кодичество остатков и т.п.
Опубликовано 20 апреля 2021 г. в категориях: October CMS Shopaholic
Если Вам необходимо внедрить данную разработку на свой проект, свяжитесь со мной, обсудим цену и срок.