Как изменить логику формирование цены в OpenCart

a_longing_that_i_ve_never_known 

Небольшое оглавление  поста

Какая логика формирование цены на товар в OpenCart и зачем её менять?

Если есть такие возможности, то зачем что-то менять?

Как изменить логику формирования стоимости товара?

Что в итоге?

 

 

 

Какая логика формирование цены на товар в OpenCart и зачем её менять?

 

Отвечу на первый вопрос…, логика очень простая, к товару вы добавляете различные опции, будь то select (выбор), image (выбор с картинкой), checkbox (флажок), radio (радио кнопка). К каждой опции вы можете добавить её стоимость, например для опции «Комплектация» типа checkbox, я добавил стоимость к каждой опции: 10, 20 и 25 рублей:

 

option_price_1

 

Это означает, если покупатель выберет данную опцию, то к стоимости товара прибавляется стоимость данной опции. В панели адмнистратора, вы можете выбрать вместо «+» знак ««, тогда при выборе опции от стоимости товара будет отниматься стоимость опции. В интернете существует модули для OpenCart, позволяющие добавить знак «*» и «/», т.е. результирующая стоимость будет получается путем умножением или делением стоимости товара к стоимости опции.

 

 

Если есть такие возможности, то зачем что-то менять?

 

Я тоже так думал, но однажды, выполняя заказ на мебельный интернет-магазин для OpenCart. Заказчик попросил меня сделать следующие: «Я хочу, что-бы у каждого товара, был выбор комплектации, выбор габарита и выбор материала.»

Поясню для наглядности с помощью картинки:

 

example_new_option

 

Синия  стрелка — это выбор габаритов, т.е. опция radio, красная стрелка — это выбор материалов, т.е. опция image и зеленая — это выбор комплектации, т.е. checkbox.

При выборе габаритов устанавливается  стилизованная зеленая галка, при выборе комплектации устанавливается стандартный флажок в квадрат. При выборе «Основной материал» снизу выдвигался каталог материалов, т.е. просто показываются опции image, аналогично при выборе «Материал компаньон». Все просто и сделать это не трудно, достаточно немного по колдовать с CSS.

Теперь как формируется цена. При выборе габарита, к цене товара прибавлялась надбавка, с этим справляется стандартная логика формирования цены OpenCart, просто указываем напротив каждой опции его стоимость как на первом рисунке. Также и с комплектацией, при выборе «вешалок» и «штанга для вещей» к стоимости товара прибавлялась стоимость данных опций, тут все стандартно и просто.

 

Проблемы возникли, когда заказчик захотел: «пусть при выборе материалов к стоимости товара прибавляется не каждый а максимальный по стоимости«. Т.е. если пользователь выбрал материал из «Основных материалов» за 200 рублей, а из «Материалов компаньона» выбрал материал за 500 рублей, то к стоимости товара должно прибавится не +700 рублей как обычно,  а +500 рублей (т.е. прибавляется максимальная выбранная опция).

 

Это стандартный механизм формирование стоимости OpenCart сделать не мог, а заказ нужно было выполнять…

Как бы просто это не казалось, ответ не лежит на поверхности.

Поиски в интернете результата не давали, модулей решение данной проблемы вы тоже не найдете, на форумах вам возможно подскажут сменить CMS как не годную. Я решил данную проблему и хочу подсказать её вам, давайте разберемся где в OpenCart находится логика формирование стоимости товара и как её изменять

 

 

Как изменить логику формирования стоимости товара?

 

Стоимость товара формируется в системном файле движка

\system\library\cart.php

 

За прибавление к стоимости товара стоимость выбранных опций на странице отвечает большой цикл:

 

 

В нем находятся IF-ы, для каждого типа опций, т.е. для selectimagecheckbox и т.д. В каждом IF-е, есть кусок кода, отвечающий как раз за логику формирование цены, т.е. если мы выбрали «+» в настройках опции (см. первый рисунок) то к текущей стоимости прибавится стоимость опции, если минус, то от текущей отнимется:

 

 

Вот эту логику можно изменять, для каждого типа опции.

 

Например для нашего случая, нам нужно изменить логику формирования цены для опций типа «image» (выбор материалов). Нужно сделать так, что-бы цена копилась в неком массиве, а после «большого цикла» foreach добавить к стоимости товара максимум из этого массива.

 

Реализуется это так, перед «большим циклом»  foreach ($options as $product_option_id => $option_value) { 

добавляем объявление массива и переменную счетчик, т.е должно получится так:

 

 

А в IF отвечающий за тип image  

if ($option_query->row[‘type’] == ‘select’ || $option_query->row[‘type’] == ‘radio’ || $option_query->row[‘type’] == ‘image’) {

 

нужно вместо стандартного if-а

 

написать модернезированный для нашего случая

 

Добавим после «большого цикла» foreach ($options as $product_option_id => $option_value) {

следующий код:

 

 

 Что в итоге?

 

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

К сожалению есть и минусы, измененный системный файл «\system\library\cart.php» при обновление OpenCart скорее всего будут заменены более свежими, поэтому данные изменения придется делать заново. Но для данной CMS это единственный способ.




Буду признателен если вы поделитесь данным постом

Комментарии
  1. Андрей пишет:

    Здравствуй, Инженер.
    Очень хороший блог, и все понятно.
    Я сисадмин, но меня заставляют заниматься сайтом.
    Сначала я упирался, но потом понял, что для меня это будет полезно. Вообщем, сайт который я указал переделывал сам.
    В HTML и CSS как-то разобрался, а PHP сложновато, тем более опыта по программированию у меня не было.
    Теперь о деле.
    Стоит задача – сделать группу пользователей со-скидкой, и это я сделал прикрутив модуль “Групповая скидка”, но теперь поставили задачу, что-бы, если в карточке товара стояла “Акция” – скидка на этот товар не распространялась.
    Алгоритм я понимаю. Нужно делать скидку не на сумму, а на каждый товар в отдельности. И сделать проверку на “Акцию”. Но как это реализовать? Опыта не хватает.
    Буду очень признателен за помощь.
    Спасибо.

  2. Дмитрий пишет:

    Добрый день! очень полезная статья! Подскажите пожалуйста где найти модули для OpenCart, позволяющие добавить знак “*” и “/”, ?

  3. admin пишет:

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

  4. Mike пишет:

    Добрый день!
    Подскажите, как можно изменить логику чтобы добавить к опциям кроме «+» и «-» еще и опцию «=»
    Т.к. есть товары в серии различающиеся по размеру, но клиенту удобно видеть итоговую цену без + и —

  5. admin пишет:

    Добрый день Mike, не понял вас.

    Вы можете в tpl файле просто не выводить опции, которые могут стоимость товара.

  6. Роман пишет:

    Добрый день. Скажите, как написать логику вычислений, если мне нужно прибавить фиксированную сумму +150 руб. к стоимости одного товара или к сумме при заказе 2-х 3-х… товаров.
    Спасибо.

  7. admin пишет:

    Добрый день Роман!

    Вы можете использовать опции в OpenCart. Это чекбоксы, при нажатие на которые, к стоимости добавляется настроенная стоимость в панели управления.
    С помощью javascript, чекбокс можно установить при загрузке страницы, а с помощью css скрыть из виду.

    Если будут проблемы, вы можете связаться со мной на странице услуги

  8. Алексей пишет:

    Здравствуйте!
    Отличная статья, особенно понравился оборот «логика образования цены».
    Вопрос: Использую Opencart для кафе: аккаунтов пользователя нет (корзины нет). Opencart интересен как движок, даже для такого усеченного решения. Как программным путем (без модулей) сделать, чтобы на странице товара (блюда) отражалась и цена основного товара и опции. Пример: кофе эспрессо одинарный стоит 1 руб, а надо на этой же странице рядом с ценой одинарного показать и цену двойного: 2 руб. Не х+1, а именно 2 руб (это важно и для конверсии, и для визуального понимания, сколько же стоит двойной). В PHP — неуч, не подскажите, как это можно реализовать?

  9. admin пишет:

    Добрый день Алексей!

    Как я понимаю опции работают корректно, вопрос только в визуализации?
    Алексей я написал вам на почту.



Ваш комментарий


Ответ в цифрах

 
© s-engineer.ru, 2012-2017 | Все права защищены