Без использования панели администратора. Я хочу иметь возможность изменить цену товара в OpenCart на странице продукта.
В основном у меня есть опция под названием Bespoke/Custom:
это текстовое поле. Если клиент вводит что-либо здесь, я хочу изменить цену, которую я уже делаю через jQuery, а затем я хочу, чтобы это новое скрытое поле с ценой, чтобы переопределить цену товара для этого заказа клиента
Это возможно? Есть ли расширение, где я могу позволить клиенту ввести свою цену, тогда я мог бы скрыть это поле и обновить через jQuery и т. Д.
Это ссылка на некоторые другие сообщения. Использование альтернативного поля цены в OpenCart, а также об этой ссылке модели http://forum.opencart.com/viewtopic.php?t=36052, где показано, где основные функции oop, но довольно обширны сделать это
ОК, чтобы указать, что вы в правильном направлении, я бы сделал это:
1. скрытый ввод
Как вы знаете, в catalog/view/theme/default/template/product/product.php
есть запрос AJAX для добавления продукта в корзину:
$('#button-cart').bind('click', function() { $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'), dataType: 'json', // ... }); });
Если вы посмотрите на параметр data
вы увидите, что все входы, выделения, текстовые поля и т. Д., Присутствующие в div .product-info
, заполняются и отправляются на PHP.
Поэтому я бы превратил скрытый ввод с пользовательским ценовым значением в этот .product-info
div, чтобы не изменять запрос AJAX вообще. Предположим, что имя этого ввода будет custom_price
.
2. checkout/cart/add
Откройте catalog/controller/checkout/cart.php
и найдите метод add
. Здесь все волшебство должно быть сделано. После этой части кода:
if (isset($this->request->post['option'])) { $option = array_filter($this->request->post['option']); } else { $option = array(); }
Я бы добавил:
if(isset($this->request->post['custom_price']) && $this->isCustomPriceValid($this->request->post['custom_price'])) { $custom_price = $this->request->post['custom_price']; } else { $custom_price = false; }
Внедрите метод isCustomPriceValid()
для удовлетворения ваших требований … и перейдите к последнему править здесь – измените эту строку:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
чтобы:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Тележка
Теперь откройте этот файл: system/library/cart.php
и снова найдите метод add
. Вам нужно будет изменить определение метода на это:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Перед последней строкой кода в этом методе добавьте еще один:
(этот код был отредактирован из-за комментария от OP)
// ... 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; } $this->data = array(); // <- last line }
Последнее редактирование должно быть в методе getProducts()
поскольку он загружает все данные из БД и пересылает их другим контроллерам для отображения целей.
Теперь я не знаю, будет ли ваша пользовательская цена перезаписывать цену + варианты или только цену, поэтому цена опциона будет добавлена к ней, поэтому я бы придерживался второго выбора, поскольку она более описательна, и первый выбор может легко получить из моего примера.
Поиск линии
$price = $product_query->row['price'];
и сразу после добавления
if(isset($this->session->data['cart']['custom_price'][$key])) { $price = $this->session->data['cart']['custom_price'][$key]; }
Теперь цена должна быть перезаписана обычным. Проверьте далее, что цена продукта позже устанавливается как:
$this->data[$key] = array( // ... 'price' => ($price + $option_price), // ... );
Поэтому, если вы хотите переписать всю цену с помощью пользовательской, добавьте это условие сразу после этого массива, как это (вместо после $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) { $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key]; }
Это должно быть. Я не тестировал код, он может или не может работать с небольшими изменениями. Я работал с OC 1.5.5.1. Это должно указывать только на правильное направление (хотя полагать, что финиш не так уж и далеко).
Наслаждайтесь!
– «Это должно указывать только на правильное направление (считая, что финиш не так уж и далеко) через @shadyyx"
Спасибо @shadyyx – за правильный подход … Мне удалось заставить его работать, и вот как это сделать:
if(isset($this->session->data['cart']['custom_price'][$key])) { $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key]; }
должно быть :
if(isset($this->session->data['custom_price'][$key])) { $this->data[$key]['price'] = $this->session->data['custom_price'][$key]; }
Еще раз спасибо, и я надеюсь, что кто-нибудь найдет это полезным.