Ликбез об опциях в opencart
В Opencart 2 в стандартной сборке движка очень слабая поддержка опций. Опциями называются варианты товара, которые посетитель может выбрать на странице товара и добавить его в корзину. В этой заметке речь пойдет о ценообразовании в опциях. По дефолту вам нужно сначала задать базовую цену, а в опциях задать наценку к каждой опции. Делается это используя + или – от базовой цены, например если базовая цена 100р, а вы хотите задать варианту 120р, то в поле цены опции мы ставим +20. Согласитесь это неудобно, особенно если вы заливаете товары не по одному, а сразу таблицей сотнями.
Вторая “неудобность” дефолтного ценообразования – то как оно выглядит на карточке товара. На каждой опции будет написано все также + или – сумма по отношению к базовой цене. И цена конечно визуально меняться не будет при выборе опции, таким образом мы заставляем посетителей сидеть с калькуляторами и пересчитывать цену.
Все вышеперечисленное также касается и веса опций.
Улучшаем функционал и юзабилити опций
Итак, задачи:
- Сделать так, чтобы в админке задавалась полная цена опции, без плюсов и минусов и правильно понималась движком.
- Сделать так, чтобы в карточке товара шаблон понимал цену опции и показывал ее без плюсов и минусов
Для решения первой задачи, нам нужно понять где варится каша ценообразования в Opencart. Происходит это здесь /system/library/cart.php. Нам нужно внести 2 изменения.
- Примерно на 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