Задача: в Виртумарте 2.0 в настраиваемых полях для корзины было выявлено, что знак = (равно), указывающий, что необходимо применить новую цену, не срабатывает, а вот знаки +\- (плюс\минус) работают, как и прежде, прибавляя или отнимая от базовой стоимости товара соответствующую сумму. Необходимо исправить этот недочет.
Решение:
1) Открыть скрипт: \administrator\components\com_virtuemart\helpers\calculationh.php
2) Перейти к: function getProductPrices
найти: $basePriceShopCurrency = $basePriceShopCurrency + doubleval($variant);
заменить на этот код:
$x=(!is_int($variant[0])) ? doubleval(substr($variant, 1)) : doubleval($variant);
if($variant[0]=='=') $basePriceShopCurrency = $x;
elseif($variant[0]=='-') $basePriceShopCurrency = $basePriceShopCurrency - $x;
elseif($variant[0]=='*') $basePriceShopCurrency = $basePriceShopCurrency * $x;
else $basePriceShopCurrency = $basePriceShopCurrency + $x;if($variant[0]!='=') $basePriceShopCurrency = $basePriceShopCurrency + doubleval($variant);
else $basePriceShopCurrency= doubleval(substr($variant, 1));
3) Перейти к: function calculateModificators
найти: $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
заменить на:
if($productCustomsPrice->custom_price[0]=='=' || $productCustomsPrice->custom_price[0]=='*')
$modificatorSum = $productCustomsPrice->custom_price[0].($modificatorSum + substr($productCustomsPrice->custom_price, 1));
else $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
4) Открыть /administrator/components/com_virtuemart/models/customfields.php
найти строку $price = ($customPrice === '') ? '' : JText::_ ('COM_VIRTUEMART_CART_PRICE_FREE');
заменить на
$price = ($customPrice === '' || preg_match('#^[\+\-\*=]#', $customPrice)) ? '' : JText::_ ('COM_VIRTUEMART_CART_PRICE_FREE');
5) Выполнить SQL-запрос:
ALTER TABLE `ПРЕФИКС-ДЖУМЛЫ_virtuemart_product_customfields` CHANGE `custom_price` `custom_price` VARCHAR( 20 ) NULL DEFAULT NULL COMMENT 'price';
И заоднем, исправим недочет при обновлении суммы, с учетом количества товара, передаваемую по AJAX.
1) Открыть скрипт: \components\com_virtuemart\controllers\productdetails.php
2) Перейти к: function recalculate(){
3) После строки: $prices = $product_model->getPrice($virtuemart_product_id,$customPrices,$quantity);
вставить это: $prices['salesPrice']*=$quantity;
Изменения: 2013-08 -21
Специалист по сайтам
8 (3452) 58 93 85 (Анатолий)
mail@2v3.su
Специалист по видео
8 (929) 264 1523 (Константин)
cashara@bk.ru
Специалист по фото
8 (929) 261 3062 (Дмитрий)
Мультимедиа-студия «Два в кубе» © 2011 - 2015
Комментарии
1) проверить, точно ли внесены все изменения, которые указаны в статье
2) = 50 нужно вписывать без пробела =50
3) это не тестировал, но попробуйте:
Открыть скрипт: \administrator\components\com_virtuemart\models\customfields.php
везде где найдете следующий код
} else {
$price = ($productCustom->custom_price === '') ? '' : $free;
}
перед ним добавить
} elseif($productCustom->custom_price[0]=="=") {
$price=strip_tags ($currency->priceDisplay( substr($productCustom->custom_price, 1) ));
В базу = (равно) не сохраняется, оно учитывается только на уровне кода, при расчете в функции getProductPrices.
Цитата Артем
Способ решения, конечно же, не один, главное чтоб работал.
Хм.. не совсем понимаю. Чтобы там не учитывалось при обработке кода, но в базу в результате записываются нули и значения не сохраняются и, соответственно впоследствии, выводится надпись "без наценки" (или что-то в этом роде, точно не помню текст) при выводе настраиваемых полей.
только сейчас глянул новую таблицу виртумарта virtuemart_product_customfields, поле custom_price decimal(15,5) - можно ведь обратно на char сменить..
Да, я тоже думал об этом, но ничем это не чревато? В общем меня нынешняя ситуация устраивает, когда цена полностью заменяется, но если кому-то нужно, чтобы учитывались + - =, то этого тоже можно добиться покопавшись в коде. Тем более, что я встречал там обработчик знака %, который тоже в этих ячейках не может храниться, а значит и со знаком = решение есть. Спасибо вам за указанный путь!
В принципе, нет, но нужно все тестировать, поскольку в коде могут быть места, которые при запросе ожидают цифру, а вернется строка с доп. символом в начале.
Обновите виртумарт. Тут речь шла о другом недочете.
Как я его обновлю, если это последняя версия? ;)
Обновите до VM 2.0.16. Или мы можем исправить конкретную ошибку за плату, на данный момент, с подобной ошибкой ВМ, я не сталкивался, иначе бы ответил по решению.
Тут вам просто нужно определиться с вариантом написания цены в дополнительных полях, или вы применяете только фиксированную сумму (знак равно), либо относительную (знак плюс). Иначе на ровном месте возникает объем работ, смысл которого пока не пойму, и почему нельзя обойтись стандартным расчетом.
Поясню по-понятнее на примере. Карточка товара - Кровать. Одна и та же модель есть разных размеров по ширине, и с ящиком или нет. Первое настраиваемое поле - Ширина с фиксированной ценой. А второе настраиваемое поле - Ящик, если он есть, плюс какаято сумма к стоимости кровати. А стоимость будет зависить от выбранной ширины. А теперь в цифрах. Стоимость стандартной кровати шириной 80 стоит 5000руб - это основная цена в карточке товара. Внутри покупатель выбирает другую ширину через настраиваемое поле, допустим Ширина 120 - цена становится 7500 - это фиксированное значение настраиваемого поля. Затем покупатель может выбрать опцию брать ящик или нет, это уже +1500руб к выбранной ширине кровати. И таких примеров много, по крайней мере в моем магазине. Если поможете, буду признателен. В качестве алгоритма могу предложить следующее. Если поле установленно как '=сумма', то чтобы не менять алгоритм расчета всего виртумарта, эту сумму надо преобразовать как в 'разницу' между фикс. суммой и основной ценой. И дальше будет идти внутренний расчет как с наценкой.
Я предполагал примерную ситуацию, потому и написал, определитесь с одним из вариантов расчета.
Допустим, основная цена кровати: 5000
Ширина 100 = 6500: +1500
Ширина 120 = 7500: +2500
Ящик: +1500
Проблема возникает, если цена на ящик зависит от ширины кровати, но если разница не велика, то цену можно сделать фиксированной, 1500.
При таком варианте:
Основная цена 5000
Ширина 100 = +1500
Ширина 120 = +2500
Ящик: +1500
все работает замечательно
А при таком варианте:
Основная цена 5000
Ширина 100 = 6500
Ширина 120 = 7500
Ящик: +1500
Наценка ящика добавляется только к основной цене, даже когда выбрана Ширина 120.
Хотелось бы чтобы при выборе Ширина 120 и ящик
было бы так: =7500+1500
А сейчас работает так: 5000+1500 игнорируя выбранное выше настраиваемое поле Ширина
Тогда сделать все через равно (разные варианты цен в доп. полях, с ящиком и без):
Ширина 100: =6500
Ширина 100 + ящик: =8000
Ширина 120: =7500
Ширина 120 + ящик: =9000
дешево и стандартно все.
Попробуйте сделать это:
1) Открыть скрипт: \administrator\components\com_virtuemart\helpers\calculationh.php
2) Перейти к: function getProductPrices
найти: $basePriceShopCurrency = $basePriceShopCurrency + doubleval($variant);
заменить на этот код:
$x=(!is_int($variant[0])) ? doubleval(substr($variant, 1)) : doubleval($variant);
if($variant[0]=='=') $basePriceShopCurrency = $x;
elseif($variant[0]=='-') $basePriceShopCurrency = $basePriceShopCurrency - $x;
elseif($variant[0]=='*') $basePriceShopCurrency = $basePriceShopCurrency * $x;
else $basePriceShopCurrency = $basePriceShopCurrency + $x;
3) Перейти к: function calculateModificators
найти: $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
заменить на:
if($productCustomsPrice->custom_price[0]=='=' || $productCustomsPrice->custom_price[0]=='*')
$modificatorSum = $productCustomsPrice->custom_price[0].($modificatorSum + substr($productCustomsPrice->custom_price, 1));
else $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
Большое спасибо за помощь. Но почему то считает не совсем корректно:
Базовая цена, например 100 руб, если:
*25 = считает все правильно = 2500;
-25 = считает его как будто плюс = 125;
+25 = считает непонятно, прибавляет 5 = 105;
*умножение работает как надо;
- вычитание, работает как сложение;
+ сложение, складывает только те числа, которые идут с 2 цифры, т.е например
+5 - считать не будет
+59 - прибавит только 9
+596 - прибавит только 96, причем вместо первой цифры может быть любая цифра, кроме нуля, ноль не видит.
сделайте так:
$sign=substr($variant, 0, 1);
$x=(!is_numeric($sign)) ? doubleval(substr($variant, 1)) : doubleval($variant);
if($sign=='=') $basePriceShopCurrency = $x;
elseif($sign=='-') $basePriceShopCurrency = $basePriceShopCurrency - $x;
elseif($sign=='*') $basePriceShopCurrency = $basePriceShopCurrency * $x;
else $basePriceShopCurrency = $basePriceShopCurrency + $x;
ОГРОМНОЕ СПАСИБО!! Все работает!!!!
Вы очень помогли!!!!
Ваш код считает правильно, но если к товару добавить два настраиваемого поля: атрибут корзины
первое - высота
350мм;
500мм;
второе - секции
1 секц
2секц
3секц
4секц
И настроить след образом:
Основная цена: 314 руб
500 мм: 0
350 мм : -14
1 секц : 0
2 секц :*2
3 секц: *3
4 секц: *4
Перемножает секции только если выбрать высоту 500мм, при выборе 300 мм - не перемножает...
я пишу не тестируя, тестируете вы, так что можете сами менять варианты кода и смотреть результат.
Перейти к: function calculateModificators
найти: $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
заменить
$sign=substr($productCustomsPrice->custom_price[0], 0, 1);
if($sign=='=') $modificatorSum = $sign.($modificatorSum + substr($productCustomsPrice->custom_price, 1));
elseif($sign=='*') $modificatorSum = $sign.($modificatorSum * substr($productCustomsPrice->custom_price, 1));
else $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price;
Ошибся в строке, исправьте
$sign=substr($productCustomsPrice->custom_price, 0, 1);
и эту можно заменить
elseif($sign=='*') $modificatorSum = $sign.(($modificatorSum>0) ? ($modificatorSum * substr($productCustomsPrice->custom_price, 1)) : substr($productCustomsPrice->custom_price, 1));
Спасибо большое!! Вы и так очень помогли.
Не могли бы Вы подсказать, как исправить ошибку сортировки настраиваемых полей в админке (virtuemart 2.0.4). Созданные поля совсем не сортируются, ни по порядку, ни по ID?
Можно глянуть в виртумарте, Настройки - Настройки сортировки, стоят ли там галочки на доступных методах сортировки. А лучше, обновить виртумарт.
Не могли бы помочь за умеренную плату с умножением в настраив. полях. Доступ к ftp предоставлю и оплату гарантирую.
Написал вам на почту, уточнить задачу.
Ооочень нужно это сделать.
Прошу Вашей помощи...
Отблагодарю материально, только помогите!!!!!!!!!!
Написал вам на почту.
Когда у товара есть скидка и к размеру добавляется сума в настраиваемых полях (например +10$), то в корзине и в карточке товара эти 10$ плюсуються к скидке почему-то, а не к цене товара
Например: Цена: $20.00, скидка -2.50$, Размер 50 +10$
А выдает:
Цена: $20.00
Цена без скидки: $32.50
Скидка: $12.50
Размер 50 +10$
если скидку убираешь, то все нормально +10$ плюсуются к цене.
Заранее спасибо.
Сделайте скриншот страницы (в админке), где вы ставите скидку. И укажите версию виртумарта.
Работать начинает только почему то первый символ он убирает. Например хочется цену 2630, а на сайте выводит 630
Посмотрите текст статьи, внес корректировки.
вот скриншоты скаидки, настраев.полей, карточка товара
http://s019.radikal.ru/i643/1308/2d/17a17927c0f2.jpg
http://s002.radikal.ru/i197/1308/cf/b8667449639e.jpg
http://s005.radikal.ru/i212/1308/9f/2cfc592a1764.jpg
Установленная версия 2.0.18a
Цитата Энжел
Виртумарт рассчитывает верно, скидка, в данном случае, это новая цена на товар.
нет, вы не правы. Если цена 160, скидка 10 и наценка 10, то окончательная цена должна быть 160. А тут http://s005.radikal.ru/i212/1308/9f/2cfc592a1764.jpg , сами посмотрите- одна цена 150, другая 170, а скидка 10+10, вообще не понятно с какого перепугу
Даже если предположить, что перепутан перевод, то все-равно ни че не стыкуется.
Вот если без наценки за размер, то все верно получается
http://s001.radikal.ru/i194/1308/a8/92123da3ca74.jpg
вот этот товар
http://s018.radikal.ru/i521/1308/a5/4e5cbee310d6.jpg
Такова логика виртумарта, обратите внимание на скрин http://s019.radikal.ru/i643/1308/2d/17a17927c0f2.jpg и надпись "Переписать окончательно", это и есть конечная (новая) цена товара. Скидка высчитывается как разница между "новой" ценой и суммой основной и дополнительной.
Например, если:
Основная цена: 160
Новая цена: 150
Дополнительная цена: 10
Тогда: 150-(160+10)=-20 (это и есть скидка)
Почему именно так, наверное, лучше узнать у разработчиков виртумарта.
Для этого есть специальный функционал:
Виртумарт > Товары > Налоги и правила расчета > Создать. Вид расчета: Наценка. Выбрать нужную операцию и выставить значение. Выбрать категорию. Опубликовать. Затем в карточке товара, напротив основной цены, выбрать только что созданную скидку\наценку.
хотя сумма добавляется
разобралась с этим, убирается галочка с Показать цены комбинации с налогом в Формирование цен. может кому пригодиться.
Спасибо за помощь, хоть поняла, что других вариантов нет кроме как наценку создавать, ни на одном форуме ни кто не ответил
Например, есть два поля А и Б. Есть базовая цена Х. Когда я выбираю значение поля А, оно умножает это значение на Х. Далее я выбираю значение поля Б, оно его тоже умножает на Х и в итоге выводит сумму перемноженных значений: (А*Х+Б*Х)
Так вот, можно ли, чтобы оно выводило не сумму, а произведение перемноженных значений: (А*Х*Б*Х) ?
Нет, с такой задачей не сталкивался, а значит, тут только платно возьмусь, и то чуть позже, поскольку, сейчас занят.
Желательно исправить ошибки в JavaScript, в Опере нажмите Ctrl+Shift+O (консоль ошибок). Возможно, из-за них не обновляется сумма.
Хм.. а фаербаг ничего не показывает.. ща поставлю оперу гляну. Отпишусь.
Единственное, что при увеличении количества товара, не увеличивается сумма скидки.
К примеру,
товар = 2000 руб.
Скидка 10% = 200.
Цена со скидкой = 1800 руб.
Так вот, если я увеличиваю кол-во товаров до 2-х, то все значения обновляются корректно, кроме скидки. Она не увеличивается до 400.
Помогите решить багу..
После $prices['salesPrice']*=$quantity;
вставьте $prices['taxAmount']*=$quantity;
Все равно скидка не увеличивается. Может, я не правильно описал то, что мне нужно.
Товар: = 1000 руб., скидка 10%. В итоге в карточке товара получаю:
Старая цена = 1000 руб.
Цена со скидкой = 800 руб.
Скидка = 200 руб.
Так вот при увеличении кол-ва товара, к примеру до двух:
Старая цена = 2000 руб.
Цена со скидкой = 1600 рцб.
Скидка = 200 руб. - а должно быть 400 руб.
Ошибся, скидка 20%!
Попробуйте так: $prices['discountAmount']*=$quantity;
Спасибо! Работает!
Вот только старая цена правда не обновляется.
Попробуйте это:
$prices['priceWithoutTax']*=$quantity;
Все равно старая цена не изменяется.
Старая цена у меня выводится через "Цена с НДС, но без скидки", я просто переименовал.
Вот ключи с которыми можно поэкспериментировать.
$prices['ключ']*=$quantity;
array (
'costPrice' => '2000.00000',
'basePrice' => 2000,
'basePriceVariant' => 2000,
'basePriceWithTax' => 0,
'discountedPriceWithoutTax' => 0,
'priceBeforeTax' => 2000,
'salesPrice' => 3600,
'taxAmount' => 0,
'salesPriceWithDiscount' => 0,
'salesPriceTemp' => 2000,
'unitPrice' => 0,
'discountAmount' => 400,
'priceWithoutTax' => 2000,
'variantModification' => 0,
);
Все работает, нужно указать:
$prices['basePriceWithTax']*=$quantity;
Спасибо, за помощь!!!!
Все работает отлично! Спасибо!
Но есть одна проблема, теперь он не пересчитывает курс валют на дополнительные цены
Пожалуйста, подскажите как это исправить?
Спасибо!
Цитата Дмитрий
К сожалению, про курс валют ничего подсказать не могу, нужно наживую смотреть. Тоже самое со знаком равно, возможно, в новой версии что-то изменилось, добавился промежуточный этап расчета. В силу загруженности, всегда подсказываю то, что уже знаю, остальное платно.
Уточните в чем загвоздка у вас, там уже посмотрю, может что-то подскажу.
Уже собирался писать о своем решении, как наткнулся на ваше.
Если сделать все правильно - отлично работает!
Возможно, вы уже исправили, но сейчас все нормально. И без необходимости не обновляйте виртумарт, что-нибудь да слетает.
Сорри, но сейчас некогда с виртумартом разбираться, даже за деньги, загружен заказами. Статья написана еще для старых версий, в новых, возможно, уже по-другому нужно делать.