Oke, untuk mengarahkan Anda ke arah yang benar, inilah cara saya melakukan ini:
1. render masukan tersembunyi
Seperti yang Anda ketahui, dalam catalog/view/theme/default/template/product/product.php
ada permintaan AJAX untuk menambahkan produk ke keranjang:
$('#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',
// ...
});
});
Jika Anda melihat pada data
parameter Anda akan melihat bahwa semua input, pemilihan, area teks, dll. ada dalam .product-info
div diisi dan diposting ke PHP.
Oleh karena itu saya akan merender input tersembunyi dengan nilai harga khusus ke dalam .product-info
itu div agar tidak perlu mengubah permintaan AJAX sama sekali. Katakanlah nama input itu adalah custom_price
.
2. checkout/cart/add
Buka catalog/controller/checkout/cart.php
dan cari add
metode. Di sini semua keajaiban harus dilakukan. Setelah bagian kode ini:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Saya akan menambahkan ini:
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;
}
Terapkan isCustomPriceValid()
metode untuk memenuhi kebutuhan Anda...dan lanjutkan ke pengeditan terakhir di sini - ubah baris ini:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
ke:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Kereta
Sekarang buka file ini:system/library/cart.php
dan cari lagi add
metode. Anda harus mengubah definisi metode menjadi yang ini:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Sebelum baris kode terakhir dalam metode ini, tambahkan satu lagi:
(kode ini diedit karena komentar dari 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
}
Pengeditan terakhir harus dalam metode getProducts()
karena yang satu ini memuat semua data dari DB dan meneruskannya ke pengontrol lain untuk tujuan tampilan.
Sekarang saya tidak tahu apakah harga khusus Anda harus menimpa harga + harga opsi atau hanya harga, sehingga harga opsi akan ditambahkan ke dalamnya, jadi saya akan tetap menggunakan pilihan kedua karena lebih deskriptif dan pilihan pertama bisa dengan mudah diturunkan dari contoh saya.
Cari baris
$price = $product_query->row['price'];
dan tepat setelah menambahkan
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Sekarang harganya harus ditimpa dengan yang custom. Periksa lebih lanjut bahwa harga produk kemudian ditetapkan sebagai:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Jadi jika Anda ingin menimpa seluruh harga dengan harga khusus, tambahkan kondisi itu tepat setelah larik seperti ini (bukan setelah $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Ini harusnya. Saya tidak menguji kodenya, Ini mungkin berfungsi atau tidak dengan sedikit modifikasi. Saya bekerja dengan OC 1.5.5.1. Ini seharusnya hanya mengarahkan Anda ke arah yang benar (sambil percaya bahwa finishnya tidak terlalu jauh).
Selamat menikmati!