Как изменить первоначальную цену на странице продукта OpenCart?

Без использования панели администратора. Я хочу иметь возможность изменить цену товара в 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]; } 

Еще раз спасибо, и я надеюсь, что кто-нибудь найдет это полезным.