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

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