Бесплатная доставка по критерию производителя.
Всем привет.
У меня появилась задачка, суть в следующем, некоторые вендоры спонсируют бесплатную доставку, а не которые нет. Поэтому кретерий бесплатная доставка или платная является производитель. Как это сделать в МS2?
1) Первый шаг. Это сделать дополнительное поле в настройках. Я уже описывал как это сделать в отдельной статье "Добавить поле в опции MS вкладка «Производитель товара» msVendor"
2) Делаем кастомный класс и подсматривая как работает msСart на основе формируем класс создаем файл в директории core/components/minishop2/custom/delivery/mscustomdeliveryhandler.class.php
И получаем результат:
Получается можно сделать бесплатную доставку по любому критерию. Ставим лайки, а я пишу большое UPD где делаю примеры бесплатная доставки для определенного продукта или категории.
У меня появилась задачка, суть в следующем, некоторые вендоры спонсируют бесплатную доставку, а не которые нет. Поэтому кретерий бесплатная доставка или платная является производитель. Как это сделать в МS2?
1) Первый шаг. Это сделать дополнительное поле в настройках. Я уже описывал как это сделать в отдельной статье "Добавить поле в опции MS вкладка «Производитель товара» msVendor"
2) Делаем кастомный класс и подсматривая как работает msСart на основе формируем класс создаем файл в директории core/components/minishop2/custom/delivery/mscustomdeliveryhandler.class.php
<?php
if (!class_exists('msDeliveryInterface')) {
require_once MODX_CORE_PATH . 'components/minishop2/model/minishop2/msdeliveryhandler.class.php';
}
//Важно: при изменении названия файла, вот в этом месте также нужно изменить класс
class mscustomdeliveryhandler extends msDeliveryHandler implements msDeliveryInterface {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
if (empty($this->ms2)) {
$this->ms2 = $this->modx->getService('miniShop2');
}
if (empty($this->ms2->cart)) {
$this->ms2->loadServices($this->ms2->config['ctx']);
}
if (!$this->modx->loadClass
('pdofetch', MODX_CORE_PATH .'components/pdotools/model/pdotools/', false, true)) {
return false;
}
$cart = $this->ms2->cart->status();
$product = $this->ms2->cart->get();
$weight_price = $delivery->get('weight_price');
$where = array(
'msProduct.id:IN' => array(),
);
foreach ($product as $entry) {
$where['msProduct.id:IN'][] = $entry['id'];
}
$where['msProduct.id:IN'] = array_unique($where['msProduct.id:IN']);
$pdoFetch = new pdoFetch($this->modx);
$leftJoin = array(
'Data' => array(
'class' => 'msProductData',
),
'Vendor' => array(
'class' => 'msVendor',
'on' => 'Data.vendor = Vendor.id',
),
);
$select = array(
'msProduct' => 'id',
'Vendor' => 'vendor.dtls_shipping',
);
$default = array(
'class' => 'msProduct',
'leftJoin' => $leftJoin,
'where' => $where,
'select' => $select,
'sortby' => 'msProduct.id',
'groupby' => 'msProduct.id',
'limit' => 0,
'return' => 'data',
);
$pdoFetch->setConfig(array_merge($default));
$tmp = $pdoFetch->run();
$output = array();
foreach ($tmp as $key => $item) {
$output[] = $item['dtls_shipping'];
}
$cart_weight = $cart['total_weight'];
$cost += $weight_price * $cart_weight;
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost / 100 * $add_price;
}
if(in_array(1, $output)){
return $cost;
}
else {
$cost += $add_price;
return $cost;
}
}
}
Все регистрируем наш класс и устанавливаем в настройках в доставки.И получаем результат:
Получается можно сделать бесплатную доставку по любому критерию. Ставим лайки, а я пишу большое UPD где делаю примеры бесплатная доставки для определенного продукта или категории.
Поблагодарить автора
Отправить деньги