ठीक है, आपको सही दिशा देने के लिए मैं यह कैसे करूँगा:
<मजबूत>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
को देखते हैं पैरामीटर आप देखेंगे कि सभी इनपुट, चयन, टेक्स्ट क्षेत्र आदि एक .product-info
में मौजूद हैं div को पॉप्युलेट किया जाता है और 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) {
इस पद्धति के भीतर कोड की अंतिम पंक्ति से पहले, एक और जोड़ें:
(यह कोड ओपी की टिप्पणी के कारण संपादित किया गया था)
// ...
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];
}
यही होना चाहिए। मैंने कोड का परीक्षण नहीं किया, यह मामूली संशोधनों के साथ काम कर भी सकता है और नहीं भी। मैं ओसी 1.5.5.1 के साथ काम कर रहा था। यह आपको केवल सही दिशा की ओर इशारा करना चाहिए (जबकि यह विश्वास करना कि अंत इतना दूर नहीं है)।
आनंद लें!