Opencart: Цена опции как цена товара

Ликбез об опциях в opencart

В Opencart 2 в стандартной сборке движка очень слабая поддержка опций. Опциями называются варианты товара, которые посетитель может выбрать на странице товара и добавить его в корзину. В этой заметке речь пойдет о ценообразовании в опциях. По дефолту вам нужно сначала задать базовую цену, а в опциях задать наценку к каждой опции. Делается это используя + или – от базовой цены, например если базовая цена 100р, а вы хотите задать варианту 120р, то в поле цены опции мы ставим +20. Согласитесь это неудобно, особенно если вы заливаете товары не по одному, а сразу таблицей сотнями.

Вторая “неудобность” дефолтного ценообразования – то как оно выглядит на карточке товара. На каждой опции будет написано все также + или – сумма по отношению к базовой цене. И цена конечно визуально меняться не будет при выборе опции, таким образом мы заставляем посетителей сидеть с калькуляторами и пересчитывать цену.

Все вышеперечисленное также касается и веса опций.

Улучшаем функционал и юзабилити опций

Итак, задачи:

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

Для решения первой задачи, нам нужно понять где варится каша ценообразования в Opencart. Происходит это здесь /system/library/cart.php. Нам нужно внести 2 изменения.

  1. Примерно на 56 строке идет проверка на тип опций таких как select, radio или картинка, если у вас такой тип опций то ниже идет как раз формирование цен, веса и другого в опциях, все что нужно сделать это убрать плюс и минус.

Было так:

if ($option_value_query->row['price_prefix'] == '+') { $option_price += $option_value_query->row['price']; } elseif ($option_value_query->row['price_prefix'] == '-') { $option_price -= $option_value_query->row['price']; }
Code language: PHP (php)

стало так:

if ($option_value_query->row['price_prefix'] == '+') { $option_price = $option_value_query->row['price']; } elseif ($option_value_query->row['price_prefix'] == '-') { $option_price = $option_value_query->row['price']; }
Code language: PHP (php)

2. Примерно на 250 строке сделать так:

$this->data[$key] = array( 'key' => $key, 'product_id' => $product_query->row['product_id'], 'name' => $product_query->row['name'], 'model' => $product_query->row['model'], 'shipping' => $product_query->row['shipping'], 'image' => $product_query->row['image'], 'option' => $option_data, 'download' => $download_data, 'quantity' => $quantity, 'minimum' => $product_query->row['minimum'], 'subtract' => $product_query->row['subtract'], 'stock' => $stock, // 'price' => ($price + $option_price), // 'total' => ($price + $option_price) * $quantity, 'price' => ($option_price), 'total' => $option_price * $quantity, 'reward' => $reward * $quantity, 'points' => ($product_query->row['points'] ? ($product_query->row['points'] + $option_points) * $quantity : 0), 'tax_class_id' => $product_query->row['tax_class_id'], // 'weight' => ($product_query->row['weight'] + $option_weight) * $quantity, 'weight' => $option_weight * $quantity, 'weight_class_id' => $product_query->row['weight_class_id'], 'length' => $product_query->row['length'], 'width' => $product_query->row['width'], 'height' => $product_query->row['height'], 'length_class_id' => $product_query->row['length_class_id'], 'recurring' => $recurring );
Code language: PHP (php)

Вместо закоменнтированных строк вставляем выделенные. Это нужно для правильного подсчета.

Теперь цена опции не зависит от базовой цены. Тоже самое можно сделать и для веса например. Итак, попадая в корзину будет именно сумма опции, ну а если опций нету у товара то останется базовая цена. Всё! Теперь можно смело импортировать таблицей через любой плагин импорта указывая полную стоимость опции.

Теперь займемся второй задачей – уберем префиксы (+ и -) из карточки товара. Для этого идем в шаблон карточки товара по пути /catalog/view/theme/default/template/product/product.tpl

Удаляем или комментируем везде где встречается выражение $option_value[‘price_prefix’]

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

P.S. проверено только на Opencart 2.0 и 2.1

Like this post? Please share to your friends:
Leave a Reply

84 + = 85

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: