Opencart: как изменить цену товара при добавлении в корзину

Я пытаюсь реализовать функциональность в opencart, где можно будет ввести пользовательскую цену на странице продукта через текстовую область, и когда товар будет добавлен в корзину, если введена пользовательская цена, будет применена цена, указанная в поле пользовательской цены. Аналогичный вопрос был задан здесь кто-то любезно предоставил хорошее решение, применимое к OpenCart 1.5.x. Однако я безуспешно пытался следовать этому подходу на OpenCart 2. Я проверял все снова и снова в течение последних нескольких дней, но, похоже, я не могу заставить это работать, поскольку я новичок в мире программирования. Мне интересно, может ли кто-нибудь указать мне правильное направление к тому, что я могу быть отсутствующий. У меня есть поиск в Интернете, но я не могу найти никакой соответствующей информации

Я проверил и заметил, что запрос AJAX изменен на #product div в 2.x, поэтому я ввел свою цену в этом div под количеством.

<input name="custom_price" id="custom_price"  value=""  title="custom_price" class="input-text custom_price" type="textarea">

Затем я перешел к контроллеру checkout/cart/add в методе Add(). Я добавил этот код

if(isset($this->request->post['custom_price'])) {
            $custom_price = $this->request->post['custom_price'];
        } else {
            $custom_price = false;
        }

Далее я изменил эту строку

$this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option, $recurring_id);

to:

$this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option, $custom_price, $recurring_id);

Затем в system/library/cart.php я изменил определение метода Add() на следующее

public function add($product_id, $qty = 1, $option = array(), $recurring_id = 0, $custom_price = false) {

Перед окончанием метода Add() я добавил следующее

if($custom_price) {
        if(!isset($this->session->data['cart']['custom_price'])) {
            $this->session->data['cart']['custom_price'] = array();
        }

        $this->session->data['cart']['custom_price'][$key] = $custom_price;
    }

В GetProduct() я добавил эти строки

if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];

}

сразу после этой строки:

$price = $product_query->row['price'];

Наконец, после массива, где цена продукта установлена ​​​​как цена + цена опциона

'price'           => ($price + $option_price),   

Я добавил следующее

if(isset($this->session->data['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['custom_price'][$key];
}

person msd79    schedule 15.02.2015    source источник
comment
то, чего мне может не хватать - определенно навыки программирования. С ними можно было взять код, работающий для 1.5.x, и применить его с правильными изменениями для 2.x. Без них ты пропал.   -  person shadyyx    schedule 16.02.2015
comment
Я полностью согласен с тобой. Я работаю над своими навыками программирования, но в то же время я понимаю, что не смогу совершить гигантский скачок за неделю. С моими текущими знаниями я пытался, и я считаю, что я очень близок, но не могу понять, в чем проблема. Это, конечно, не означает, что я перестану пытаться, но любая помощь будет очень кстати.   -  person msd79    schedule 16.02.2015
comment
^^ С уважением. Был бы очень признателен. Если вы что-то пробовали, но потерпели неудачу, почему бы не предоставить нам код? Я надеюсь, вы понимаете различия/изменения между 1.5.x и 2.x и что вы начали модифицировать старый код, чтобы он соответствовал новой ОС. Затем предоставьте нам код, который вы пытаетесь внедрить, и какие ошибки он выдает. Нет лучшего способа самообучения, чем «попытка-неудача-понимание проблемы-попытка-успех».   -  person shadyyx    schedule 16.02.2015
comment
Правильно, нет лучшего способа учиться, чем пытаться чего-то добиться самостоятельно. Я безуспешно пытался найти ссылку на различия между 1.5 и 2.x в отношении соответствующих функций в Интернете, поэтому я не мог предпринять никаких попыток адаптировать код к версии 2.x, чтобы сказать вам правду. Сегодня я проведу сравнение, визуально проанализировав функции в старой и новой версиях, и предприму еще одну попытку заставить это работать таким образом. Если я не добьюсь успеха, я вернусь с подробной ошибкой и т. Д.   -  person msd79    schedule 17.02.2015
comment
Честно говоря, больше всего изменений было сделано в шаблонах — HTML совершенно новый, так как сейчас они используют Twitter Bootstrap 3. Контроллеры и модели не сильно изменились. Может быть, основные классы библиотеки немного. Вы можете легко понять, что было изменено, установив этот модуль для 1.5.x под свою 2.x и попытавшись исправить каждую ошибку.   -  person shadyyx    schedule 17.02.2015
comment
Единственное существенное отличие, которое я заметил, заключается в том, что запрос AJAX был изменен на #product div, я принял это во внимание, но все еще не смог заставить его работать. Я проверил это с помощью Firebug, и сообщения об ошибках не возвращаются, просто пользовательская цена не применяется. И это так, даже если я жестко запрограммирую переменную $custom_price на значение (т.е. 20) в методе Add в checkout/cart/add   -  person msd79    schedule 18.02.2015
comment
Я думаю, у вас здесь опечатка: $this >isCustomPriceValid($this->request->post['custom_price'])) - должно быть $this->isCustomPriceValid($this->request->post['custom_price'])) - обратите внимание на $this стрелку isCustomPriceValid(...).   -  person shadyyx    schedule 18.02.2015
comment
Также обратите внимание, что то, что вы отправляете в Cart::ad(), находится в следующем порядке: 1. product_id, 2. количество, 3. вариант, 4. custom_price, 5. recurring_id, а то, что Cart::add() ожидает, должно идти в следующем порядке: 1. product_id, 2. количество, 3. вариант, 4. recurring_id, 5. custom_price. Вы видите разницу?   -  person shadyyx    schedule 18.02.2015
comment
Я временно удалил оттуда проверку работоспособности, поэтому теперь она выглядит так if(isset($this->request->post['custom_price'])) { $custom_price = $this->request->post['custom_price']; } else { $custom_price = false; } и изменил порядок, как показано ниже, но не уверен, почему он ожидает их в этом порядке, потому что $custom_price реализуется после опции и до $recurring_id $this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option, $recurring_id, $custom_price); , однако все еще не я не работаю   -  person msd79    schedule 18.02.2015
comment
Я считаю, что если приведенное выше условие возвращает false, как я могу проверить это наверняка?   -  person msd79    schedule 18.02.2015
comment
Вставьте немного echo 'true'; в часть if и/или echo 'false'; в часть else или используйте var_dump($some_object_or_array), чтобы увидеть содержимое переменной. Иногда полезно использовать var_dump() даже для строк или логических значений, потому что в случае пустой строки или false PHP ничего не печатает в браузере. Если это запрос AJAX, это будет напечатано в ответе, из-за которого запрос не будет выполнен, поэтому проверьте вкладку Console или Net в FireBug.   -  person shadyyx    schedule 18.02.2015
comment
Я использовал var_dump($custom_price); и получил bool(false), что, как мне кажется, подтверждает мои подозрения. На данный момент я предполагаю, что что-то не так с тем, как я настраиваю вещи в product.tpl, и product_price не публикуется.   -  person msd79    schedule 18.02.2015
comment
Мне удалось передать $custom_price в checkeout/cart/add, он проходит как строковый тип, и теперь я получаю эту ошибку. Я безуспешно пытался обойти это unserialize(): Error at offset 0 of 8 bytes in system\library\cart.php line 179 Undefined index: product_id system\library\cart.php in line 181 Есть идеи по этому поводу?   -  person msd79    schedule 19.02.2015
comment
Эта ошибка возвращается только в том случае, если я ввожу значение в текстовое поле пользовательской цены.   -  person msd79    schedule 19.02.2015