Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Индикация цен опций товара заменена на абсолютную величину (вместо разницы +X руб, -Y руб)

Просмотров: 17648 RSS 11
Howto » OpenCart

Рецепт ниже.

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

commit 92114e01f55e00e4f1882302e5e7f6b7b1d638e5
Author: Ruslan Brest <rb@labtodo.com>
Date:   Fri Sep 2 17:55:44 2011 +0300
    re #725: Индикация цен опций товара заменена на абсолютную величину (вместо дельты: +X руб, -Y руб)
diff --git a/public_html/catalog/controller/product/product.php b/public_html/catalog/controller/product/product.php
index 5e4bba7..deb52e0 100644
--- a/public_html/catalog/controller/product/product.php
+++ b/public_html/catalog/controller/product/product.php
@@ -252,12 +252,28 @@ class ControllerProductProduct extends Controller {
 					
 					foreach ($option['option_value'] as $option_value) {
 						if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
+							if( $product_info['price'] )
+							{
+								$option_value['price_full'] = $product_info['price'];
+								if( $option_value['price_prefix'] == "+" )
+									$option_value['price_full'] = $product_info['price'] + $option_value['price'];
+								if( $option_value['price_prefix'] == "-" )
+									$option_value['price_full'] = $product_info['price'] - $option_value['price'];
+
+								$option_value['price_full'] = $this->currency->format(
+									$this->tax->calculate(
+										$option_value['price_full'],
+										$product_info['tax_class_id'],
+										$this->config->get('config_tax')
+										));
+							}
 							$option_value_data[] = array(
 								'product_option_value_id' => $option_value['product_option_value_id'],
 								'option_value_id'         => $option_value['option_value_id'],
 								'name'                    => $option_value['name'],
 								'price'                   => (float)$option_value['price'] ? $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax'))) : false,
-								'price_prefix'            => $option_value['price_prefix']
+								'price_prefix'            => $option_value['price_prefix'],
+								'price_full'              => $option_value['price_full'],
 							);
 						}
 					}
@@ -568,4 +584,4 @@ class ControllerProductProduct extends Controller {
 		$this->response->setOutput(Json::encode($json));		
 	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/public_html/catalog/view/theme/default/template/product/product.tpl b/public_html/catalog/view/theme/default/template/product/product.tpl
index e7cbf6a..b28db8e 100644
--- a/public_html/catalog/view/theme/default/template/product/product.tpl
+++ b/public_html/catalog/view/theme/default/template/product/product.tpl
@@ -69,7 +69,8 @@
             <?php foreach ($option['option_value'] as $option_value) { ?>
             <option value="<?php echo $option_value['product_option_value_id']; ?>"><?php echo $option_value['name']; ?>
             <?php if ($option_value['price']) { ?>
-            (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)
+            <!-- (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>) -->
+            (<?php echo $option_value['price_full']; ?>)
             <?php } ?>
             </option>
             <?php } ?>
@@ -87,7 +88,8 @@
           <input type="radio" name="option[<?php echo $option['product_option_id']; ?>]" value="<?php echo $option_value['product_option_value_id']; ?>" id="option-value-<?php echo $option_value['product_option_value_id']; ?>" />
           <label for="option-value-<?php echo $option_value['product_option_value_id']; ?>"><?php echo $option_value['name']; ?>
             <?php if ($option_value['price']) { ?>
-            (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)
+            <!-- (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>) -->
+            (<?php echo $option_value['price_full']; ?>)
             <?php } ?>
           </label>
           
@@ -105,7 +107,8 @@
           <input type="checkbox" name="option[<?php echo $option['product_option_id']; ?>][]" value="<?php echo $option_value['product_option_value_id']; ?>" id="option-value-<?php echo $option_value['product_option_value_id']; ?>" />
           <label for="option-value-<?php echo $option_value['product_option_value_id']; ?>"> <?php echo $option_value['name']; ?>
             <?php if ($option_value['price']) { ?>
-            (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)
+            <!-- (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>) -->
+            (<?php echo $option_value['price_full']; ?>)
             <?php } ?>
           </label>
           
@@ -433,4 +436,4 @@ $('.datetime').datetimepicker({
 });
 $('.time').timepicker({timeFormat: 'h:m'});
 //--></script> 
-<?php echo $footer; ?>
\ No newline at end of file
+<?php echo $footer; ?>
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 11
  1. А я ставлю цену самого продукта 0, в "+" сразу полную цену.

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

    Пришлось добавить доп. колонку в БД "описания" опций, а сами "значения" опций просто "1, 2, 3" для сортировки.

  2. 2012-03-14 в 07:28:46 | Ruslan Brest

    Можно и в ноль, но тогда придётся менять отображение категорий, потому что светящиеся по всему магазину 0.00 оставляют удручающее впечатление.

    Ещё одна причина держать минимальную цену + наценка на опции -- та же цена в категориях. Дополнительная причина привлечь покупателя на страницу товара. Если я, допустим, покупаю регулярно корм животным и, просматривая сайт, вижу вдруг раза в полтора-два меньшую цену, я зайду и поинтересуюсь -- что за дела? Может действительно ниже. Может всё в пределах нормы и это просто цена за пол-кило, а я обычно покупаю килограмм. Может ещё что. НО Я ЗАИНТЕРЕСУЮСЬ. И может что-то там ещё увижу и куплю. А это важно.

  3. В моём случае все товары имеют опции с разными значениями. Фактически, сам продукт - нечто вроде категории (опции типа input-radio). И самих товаров что-то около тысячи, тут уже не до маркетинговых ходов.

    Да, файлов многовато менять пришлось... :-(

  4. О, спасибо. Пригодится.

    Еще бы скрипт, который меняет цену "на лету", сразу после выбора опции. Где-то раньше видел решение, сейчас не могу найти.

  5. 2012-03-15 в 05:11:19 | Ruslan Brest

    На днях как раз спрашивали - я вот этот нашёл. Там видео есть, симпатично всё происходит:

    Option Price Update (Redux) - $10 http://www.opencart.com/index.php?route=extension/extension/info&extension_id=1458

    Нашлось с пол-пинка, но по-моему были и другие варианты - я просто дал результаты, меня этот первый с видео вполне устроил. Может и бесплатные решения есть. В реализации ничего сложного нет, я думаю. Но повозиться с кодом и отладкой придётся. И мне по времени это заметно дороже 10 уе вышло бы в итоге, так что я бы вряд ли стал возиться со своей реализацией, если бы понадобилось.

  6. Нашел бесплатный вариант. http://loco.ru/materials/205-opencart-auto-update-price-option-selection

    Дата публикации - 14 марта. Google оперативно работает :)

  7. 2012-03-15 в 07:28:08 | Ruslan Brest

    :)

    Спасибо за наводку.

  8. 2012-04-28 в 06:39:56 | Евгений

    Нашел бесплатный вариант. http://loco.ru/materials/205-opencart-auto-update-price-option-selection

    --------------------------

    Все бы ничего, но к сожалению не работает на iPad.

  9. Здравствуйте,подскажите как сделать чтобы в опции товара "выпадающий список"выводилась не +10р а просто новая цена на аналогичный товар?

    масло синтетическое 1л-40грн

    масло синтетическое 4л-160грн

    сейчас основная цена товара 40грн если покупаешь 1л то в корзину падает 40+40=80грн

    если покупаешь 4л то в корзину падает 40+160=200грн

    Очень нужно подскажите кто знает где править???

    дополню дальше в админке товаров если ставишь в опциях 1л "0" то в выпадающем списке видно -1л и при этом основная цена на сайте (та что жирным отражаестя) тоже 0,00грн, но при покупке 1л в корзину падает правильно 40грн. т.е. плюсует основную цену из вкладки "Данные"

    2,Соответственно и с 4л -120 (ставлю в админке) на сайте тоже в выпадающем списке видно 120 ( а должо быть 160) и в корзину добавляет 160грн.

    Помогите не знаю что дальше делать

  10. 2014-01-15 в 01:28:05 | Вероника

    Спасибо большое с Вашей помощью избавилась от + и - в цене! Отличный код.

  11. 2016-03-14 в 00:46:12 | Максим

    А как убрать из карточки товара (где отображаются опции) надпись (+Цена)

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

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

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)