Динамическое изменение цены в карточке товара VirtueMart при выборе его атрибутов. Печать
11.05.2011

Профессионально написанный скрипт для Вмртуемарт. Никаких Ajax, ни каких jquery, ни какой дополнительной нагрузки.

Очень часто бывает так, что цена на товар меняется в зависимости от его атрибутов, например, размера или веса. Покупатель выбирает необходимый ему вид товара, выбирает подходящие параметры, добавляет в корзину. При этом в программе vitruemart цена товара на странице одна, а в корзину попадает товар уже с другой ценой. Это вводит покупателей в недоумение.

Рассмотрим ситуацию на конкретном примере. Допустим, у нас интернет-магазин по продаже ювелирных украшений. Товар — золотое кольцо с бриллиантами стоимостью 20452 рубля. Выбираем 16 размер — добавляется еще 4 тысячи рублей, 750 пробу — еще 2 тысячи, добавляем товар в корзину — цена 27952. А на странице осталась прежняя.

Мы предлагаем сделать такое изменение цены virtuemart, чтобы изменения сразу отображались на странице товара. Суммарная итоговая цена будет в таком случае показываться уже при загрузке страницы, если текущая особенность не нулевая. Мы также не будем вносить никаких изменений в код самого магазина, а ограничимся одним js файлом.

Собственно, что должно получиться (базовая цена 21 952,00 руб.):

Кольцо золотое с бриллиантами

Кольцо золотое с бриллиантами

Цена за шт. (шт.): 21 952,00 руб.
Кольцо золотое с бриллиантами из розового золота 585 пробы. Кольцо украшено 3 бриллиантами весом 0,36 карат с характеристиками не менее 4/5. Средний вес кольца 4,70 грамма.
:
:







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

 
<script type="text/javascript">
//@author: http://bigemot.ru
window.addEvent('domready', function() {
  var vmStr= $('vmMainPage').getElement('.productPrice'); 
  var Box=$$('.vmAttribChildDetail select');
  var vmPrice= vmStr.innerHTML; 
  sumBox();
  Box.addEvent('change', function() {
    sumBox();
    });
 
  function strNum(x) {
     var r = ""; 
    for(var n=0; n<x.length; n++) {
      var base= x.charAt(n);
      if (base!=' '&&isNaN(base)==false||base==',')
      r = r + base;
    }
    return parseFloat(r.replace(/,/g,"."));
  }
  function strPrice(x) {
    x = x.toString();
    var y = x.charAt(0);
    for(var n=1; n<x.length; n++) {
      if (Math.ceil((x.length-n)/3) == (x.length-n)/3) y = y + " ";
      y = y + x.charAt(n);
    }
     return y; 
  }
  function adPrice(x) {
    var add=x.options[x.selectedIndex].innerHTML;
    var n=add.lastIndexOf("(");
    var operand=add.slice(n+1,n+2);
    return operand+strNum(add.slice(n));
  }
  function sumBox() {
    var price=strNum(vmPrice);
    for(var n=0; n<Box.length; n++) {
      price=eval(price+adPrice(Box[n]));
    }
    vmStr.innerHTML=vmPrice.replace(strPrice(strNum(vmPrice)), strPrice(price));
  }
});
</script>
 


Теперь когда мы выбираем 16 размер колечка 750 пробы, мы сразу видим изменение цены virtuemart – 27952 рубля.

Конечно, перед применением скрипта в магазине его прийдется доработать. Нужно как минимум учесть целый ряд деталей, в частности, работу при отсутствии добавочной стоимости или при ее присвоении (=20 000,00 руб.), учитывать скидки на товар, сделать его кроссплатформенным, работающем на любом сайте и еще очень много тонкостей. Большинство таких моментов уже было учтено при разработке плагина VM DynamicPrice (plug_VirtueMart_dynamic_price).

Плагин предлагается на коммерческой основе.

Приобрести можно через раздел "Контакты". Стоимость 28 дол. Или скачать за Webmoney:


Скачать плагин VM DynamicPrice-1.1.6 (28 WMZ):




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

Для тех, кто использует компонент Attribute Manager, который выводит атрибуты картинками, мы можем предложить адаптированную модификацию плагина.

Какие возможности вы получаете за эту цену?
  • Плагин устанавливается как обычный плагин Джумла. Никаких изменений (хаков) в код VirtueMart не вносится. В настройках можно указать область видимости плагина, т.е. его можно подгружать только на странице с карточкой товара и не грузить скрипт на других страницах,
  • Можно включать динамическое изменение цены при увеличении (уменьшении) количества выбранных товаров, не только при изменении атрибутов,
  • Есть возможность скрыть добавочную стоимость (+2000,00 руб.), то что указывается в скобках, в принципе, становится больше не важным,
  • Если в магазине используется перечеркнутая цена, то она так же меняется,
  • Если товару назначена скидка, то все расчеты выполняются с учетом скидки,
  • VM DynamicPrice работает так же на странице категории, в модулях, считая для каждого товара,
  • Плагин работает корректно, ели для опции товара в атрибуте не указана добавочная цена, а так же, если цена товару присваивается (=20 000,00 руб.),
  • Плагин не вмешивается в работу функций корзины и других функций VirtueMart, работает со всеми версиями магазина и Джумла 1.5. Сделан по принципу "установил и все работает".


Настройки:



Еще статьи:

Компонент Джумла для организации продаж скачиваемых товаров (скачать за плату)
Доработка VirtueMart: в разных городах разные цены.