OK, chỉ cho Bạn hướng đi đúng, đây là cách tôi sẽ làm điều này:
1. kết xuất đầu vào ẩn
Như bạn có thể biết, trong catalog/view/theme/default/template/product/product.php
AJAX yêu cầu thêm sản phẩm vào giỏ hàng:
$('#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',
// ...
});
});
Nếu bạn nhìn vào data
Tham số Bạn sẽ thấy rằng tất cả các đầu vào, các lựa chọn, các vùng văn bản, v.v. đều có trong một .product-info
div được điền và đăng lên PHP.
Do đó, tôi muốn hiển thị đầu vào ẩn với giá trị giá tùy chỉnh vào .product-info
đó div để không phải sửa đổi yêu cầu AJAX. Giả sử tên của đầu vào đó sẽ là custom_price
.
2. checkout/cart/add
Mở catalog/controller/checkout/cart.php
và tìm kiếm add
phương pháp. Ở đây tất cả các phép thuật sẽ được thực hiện. Sau phần mã này:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Tôi muốn thêm cái này:
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;
}
Triển khai isCustomPriceValid()
để đáp ứng yêu cầu của Bạn ... và chuyển sang lần chỉnh sửa cuối cùng tại đây - thay đổi dòng này:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
tới:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Giỏ hàng
Bây giờ, hãy mở tệp này:system/library/cart.php
và tìm kiếm lại add
phương pháp. Bạn sẽ phải thay đổi định nghĩa của phương thức thành định nghĩa này:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Trước dòng mã cuối cùng trong phương pháp này, hãy thêm một dòng khác:
(mã này đã được chỉnh sửa do nhận xét từ 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
}
Chỉnh sửa cuối cùng phải nằm trong phương thức getProducts()
vì cái này đang tải tất cả dữ liệu từ DB và chuyển tiếp chúng tới các bộ điều khiển khác để hiển thị.
Bây giờ tôi không biết liệu Giá tùy chỉnh của bạn nên ghi đè giá + giá tùy chọn hay chỉ giá, do đó giá tùy chọn sẽ được thêm vào đó, vì vậy tôi sẽ gắn bó với lựa chọn thứ hai vì nó mang tính mô tả hơn và lựa chọn đầu tiên có thể dễ dàng bắt nguồn từ ví dụ của tôi.
Tìm kiếm dòng
$price = $product_query->row['price'];
và ngay sau khi thêm
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Bây giờ giá sẽ được ghi đè bằng giá tùy chỉnh. Kiểm tra thêm để đảm bảo rằng giá của sản phẩm sau này được đặt là:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Vì vậy, nếu Bạn muốn ghi đè toàn bộ giá bằng giá tùy chỉnh, hãy thêm điều kiện đó ngay sau mảng đó như thế này (thay vì sau $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Điều này nên được nó. Tôi đã không kiểm tra mã, Nó có thể hoạt động hoặc có thể không hoạt động với các sửa đổi nhỏ. Tôi đã làm việc với OC 1.5.5.1. Điều này sẽ chỉ cho bạn đúng hướng (trong khi tin rằng kết thúc không quá xa).
Hãy tận hưởng!