Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để thay đổi giá gốc trên trang sản phẩm OpenCart?

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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận Giá trị Cập nhật trong MySQL thay vì các hàng bị ảnh hưởng

  2. Glassfish 4 &MySQL &JSTL

  3. Cách sao lưu cơ sở dữ liệu MySQL từ dòng lệnh trong Linux

  4. Có thể cho ứng dụng PHP được xây dựng trên bộ mã hóa để kết nối với cơ sở dữ liệu MySQL VÀ mongoDB cùng một lúc không?

  5. SQL để kiểm tra xem cơ sở dữ liệu có trống không (không có bảng)