Тюнинг корзины virtuemart 1.1.x. Гибкая система скидок. Часть 1.

Всем привет, давненько я не брал виртуальное перо в руки. Сегодня речь пойдет о доработке системы joomla 1.5 + virtuemart 1.1.9. Будем тюнинговать скидочную систему. В прошлый раз я допиливал корзину виртуемарта, вопрос добавления нескольких товаров в корзину успешно решен.

Как известно, в стандартной комплектации виртумарта версии 1.1.9 имеется своя система скидок. Она проста и не обеспечивает должной гибкости. Иногда нужно предоставить клиенту скидку в зависимости от того сколько штук товара он купил, виртуемарт не предоставляет такой возможности.

Например, вы торгуете оптом черенками для лопат и собственно самими лопатами, и прочим садово-огородным инвентарем. Вы можете дать скидку на черенок в 40% при условии, что клиент возьмет сразу 100 черенков. Как это сделать? Если у вас нет в магазине корзины и системы оплаты, магазин служит витриной, а все заказы делаются через менеджера по телефону, тогда можно просто написать на сайте скидочные условия. А если хочется автоматизировать процесс, чтобы корзина формировалась с учетом всех скидок, которые зависят от кол-ва товара, придется доработать движок virtuemart-а.

head

Постановка задачи. Исходные данные на тюнинг корзины.


Пришел очередной заказ на магазин на связке joomla 1.5 + virtuemart 1.1.9. Система несколько старовата, но шаблон у заказчика уже есть и он под joomla 1.5. На одном из магазинов на битриксе было подмечено, то как ловко придумана и реализована скидочная система. Скидка формируется по каждой позиции в зависимости от количества товаров оной.

Когда происходит добавление в корзину в карточке товаров цена товара динамически меняется в зависимости от количества, а рядом присутствует ссылка на таблицу скидок. В самой корзине для каждой позиции под ценой указывается действующая скидка.

Видимо битрикс изначально комплектуется подобными модулями, система дорогая и там как говориться, любой каприз за ваши деньги. А у нас суровые реалии бесплатного движка joomla и компонента virtuemart. Тут уж придется попотеть самому, конечно не бесплатно, но все же это дешевле для заказчика чем битрикс.

Корзина должна выглядеть следующим образом.

05.044
Под ценой отображается скидка по конкретной позиции, которая пересчитывается при смене количества товаров данной позиции.

Реализация системы скидок для virtuemart

правим ps_cart.php
И так, в первую очередь нужно внести правки в файл \administrator\components\com_virtuemart\classes\ps_cart.php
Примерно в 90ой строке после окончания функции initCart() добавляем новую, не замысловатую функцию get_discount($qnt), которая на вход принимает количество товара и возвращает величину скидки.


function get_discount($qnt){ 
        if ($qnt<3)
            return 0;
        if ($qnt>=3 && $qnt<=10)
            return 5; 
        if ($qnt>=10 && $qnt<25)
            return 10;  
        if ($qnt>=25 && $qnt<50)
            return 15;   
        if ($qnt>=50 && $qnt<100)
            return 20; 
        if ($qnt>=100 && $qnt<500)
            return 30;   
        if ($qnt>=500)
            return 40;                     
    }

Данная функция возвращает размер скидки в соответствии с конкретной таблицей скидок, ваша таблица скидок может отличаться и нужно внести соответствующие правки.

Далее нужно внести правки в код функции "add", примерно после 267 строки

// added for the advanced attribute modification
$_SESSION['cart'][$k]["description"] = $e["description"];

добавляем новое поле в сессионный массив $_SESSION['cart'][$k]

$_SESSION['cart'][$k]['discount'] = $this->get_discount($quantity);

Тут все просто, созданная нами функция get_discount($qnt) добавляет новое поле скидки в массив $_SESSION['cart'][$k].

Отлично, теперь при добавлении товара в корзину в массиве $_SESSION['cart'][$k] будет указанна скидка по данному товару. Но при обновлении кол-ва товаров из корзины скидка не будет меняться, поправим это дело. Для этого нужно внести правки в функцию "update". После строк, примерно 423

$_SESSION['cart'][$i]["quantity"] = $quantity;

добавляем

$_SESSION['cart'][$i]['discount'] = $this->get_discount($quantity);

правим basket.php
Файл находится по адресу \administrator\components\com_virtuemart\html\basket.php

примерно после строк

if( $auth["show_price_including_tax"] == 1 ) {
   $product_price = $price["product_price"] * ($my_taxrate+1);
} else {
   $product_price = $price["product_price"];
}

ориентировочно в 112 строке, дописываем следующий код

$product_discount = $cart[$i]["discount"]; // передаем в шаблон величину скидки
$product_price = $product_price*(1-$product_discount/100); // меняем цену товара
$product_rows[$i]['product_discount'] = $product_discount; // доступ к скидке в шаблоне корзины

добавляем в шаблон basket_b2c.html.php скидку по позиции

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

<td align="right">
   <?php echo $product['product_price'] /*выводим цену*/ ?><br />
   <small> с учетом скидки <?php echo $product['product_discount'] /*выводим скидку*/ ?>%</small>
</td>

Все правки внесены, скидки функционируют.

Подведем итоги


Не стоит забывать, что правки файлов компонента не лучшее решение и в народе прозваны хаками ядра. При обновлении компонента все изменения затрутся и их нужно будет вносить по новой.

В карточке товара цена при смене количества цена остается прежней, ее можно менять простейшим код на jQuery.

Таблица скидок задается жестко в php коде это не удобно, особенно если человек далекий от программирования решит изменить скидки, добавить новые и т.д. Стало быть нужна возможность правки скидок из админки joomla.

В следующей части поговорим о том как облагородить данную систему скидок, попытаемся уйти от необходимости хакать ядро virtuemart-a, создадим возможность работы со скидками через админку.

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



Похожие статьи:
↑ Наверх ↑
  • Комментарии
  • Владимир (10/04/2013 - 14:34):

    Добрый день! Очень интересно!
    1. Я все сделал в точности, как описали, но у меня не выводится само число процент (5 или 20)скидки.
    2. Когда будет вторая часть, чтоб процент назначать из админки?
    3. А можно ли сделать так, чтоб скидку назначить отдельному товару, а не всем сразу? И чтоб выскакивала подсказка, типа, при покупке от 4 единиц цена такая-то (как тут реализовано в корзине: muravied.com)

    Спасибо большое!

  • TakProstoTak.ru (10/04/2013 - 15:20):

    @Владимир, #1:
    1. А просто добавленный текст в шаблон корзины выводится? Если нет, значит не там правите. Может тема у виртуемарта другая? У меня \themes\default\, у вас может быть другая тема.

    2. На подходе…

    3. Идею уловил, буду думать в этом направлении.

    P.S. Кстати если еще у кого есть идеи как улучшить эту систему, прелагайте.

  • Владимир (10/04/2013 - 15:41):

    @TakProstoTak.ru, #2:

    А просто добавленный текст в шаблон корзины выводится? Если нет, значит не там правите. Может тема у виртуемарта другая? У меня \themes\default\, у вас может быть другая тема.

    У меня такая же тема… когда вводится N-товаров, то надпись под ценой выглядит так “С учетом скидки %” без значения!

  • TakProstoTak.ru (11/04/2013 - 10:12):

    @Владимир, #3:
    Ошибка у меня в файле basket.php. Пропустил одну строку, поправил в статье.

  • Catherine (16/06/2013 - 11:06):

    Здравствуйте!

    А нельзя ли сделать так, чтобы скидка считалась не от количества товара определенного артикула, но от количества любых товаров в корзине? Например, один товар в корзине – по 100% цене, более двух РАЗНЫХ товаров – скидка 10%. У меня магаз одежды и вряд ли кто-то будет покупать несколько одинаковых платьев :) Надо сделать так, чтобы скидка считалась, если человек берет, например, платье и туфли, костюм и сумку, то есть любой товар, а не один определенный артикул. Можно ли так сделать?

  • TakProstoTak.ru (19/06/2013 - 11:50):

    @Catherine, #5: Да, это возможно. В одной из следующих статей опишу как это сделать на VM 2.0

Прокомментировать

Подписаться, не комментируя