[УПУЩЕННОЕ] Настраиваем расчёт скидки в minishop2 версии 2.7.0 и выше
Приветствую, как-то так случилось, что я упустил вот этот релиз, и тут понадобилось мне сделать возможность устанавливать скидку на каждый товар, начал я писать плагин и увидел в объекте корзине два ранее не встречавшихся ключа discount_price и discount_cost, связался с @Иван Бочкарев, он меня и просветил, что расчёт скидки уже внедрён, надо только указать старую цену и всё посчитается. Это круто, но зачастую удобнее указать скидку в % от цены или просто числом, поэтому я написал небольшой плагин, который при сохранении товара рассчитывает новую цену, а старую записывает в поле old_price, если же скидка равна 0 или не указана и поле old_price заполнено, то его содержимое переносится в price, а old_price обнуляем. Уверен, что многие сами могут такой плагин написать, но кому-то возможно захочется сэкономить 5 минут, код под катом.
<?php
switch ($modx->event->name) {
case 'OnDocFormSave':
if($resource->get('class_key') == 'msProduct'){
$product = $modx->getObject('msProduct', $id);
$discount = $product->get('discount');
$price = $product->get('price');
$old_price = $product->get('old_price');
if($discount && !$old_price){
if(preg_match('/.*%.*/', $discount)){
$sale = (int)$discount;
$new_price = $price - $price * $sale / 100;
}
else{
$sale = (int)$discount;
$new_price = $price - $sale;
}
$old_price = $price;
$price = $new_price;
}
elseif (!$discount && $old_price){
$price = $old_price;
$old_price = 0;
}
else{
$sale = (int)$discount;
$new_price = $old_price - $old_price * $sale / 100;
if($new_price != $price){
$price = $new_price;
}
}
$product->set('price', $price);
$product->set('old_price', $old_price);
$product->set('discount', $discount);
$product->save();
}
break;
}
Поблагодарить автора
Отправить деньги