sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo cambiar el precio original en la página del producto OpenCart?

OK, para indicarte la dirección correcta, así es como yo haría esto:

1. representación de entrada oculta
Como sabrá, en un catalog/view/theme/default/template/product/product.php hay una solicitud de AJAX para agregar productos al carrito:

$('#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',
                // ...
        });
});

Si miras los data parámetro Verá que todas las entradas, selecciones, áreas de texto, etc. presentes en un .product-info div se rellenan y publican en PHP.

Por lo tanto, representaría la entrada oculta con un valor de precio personalizado en ese .product-info div para no tener que modificar la solicitud de AJAX en absoluto. Digamos que el nombre de esa entrada será custom_price .

2. El checkout/cart/add
Abra catalog/controller/checkout/cart.php y busque add método. Aquí se debe hacer toda la magia. Después de esta parte del código:

            if (isset($this->request->post['option'])) {
                $option = array_filter($this->request->post['option']);
            } else {
                $option = array();  
            }

Agregaría esto:

            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;
            }

Implementar isCustomPriceValid() método para cumplir con sus requisitos... y avance a la última edición aquí:cambie esta línea:

$this->cart->add($this->request->post['product_id'], $quantity, $option);

a:

$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);

3. El carro
Ahora abre este archivo:system/library/cart.php y nuevamente busque el add método. Tendrías que cambiar la definición del método a esta:

public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {

Antes de la última línea de código dentro de este método, agregue otra:
(este código fue editado debido al comentario del 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
}

La última edición debe estar dentro del método getProducts() ya que este está cargando todos los datos de la base de datos y los reenvía a otros controladores para fines de visualización.

Ahora no sé si su precio personalizado debe sobrescribir el precio + el precio de las opciones o solo el precio, por lo tanto, se le agregará el precio de las opciones, por lo que me quedaría con la segunda opción, ya que es más descriptiva y la primera opción podría derivarse fácilmente de mi ejemplo.

Busca la línea

$price = $product_query->row['price'];

y justo después de agregar

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $price = $this->session->data['cart']['custom_price'][$key];
}

Ahora el precio debe sobrescribirse con el personalizado. Compruebe además que el precio del producto se establece más tarde como:

$this->data[$key] = array(
    // ...
    'price'           => ($price + $option_price),
    // ...              
);

Entonces, si desea sobrescribir el precio completo con el personalizado, agregue esa condición justo después de esa matriz como esta (en lugar de después de $price = ...; ):

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}

Esto debería ser. No probé el código, puede o no funcionar con ligeras modificaciones. Estaba trabajando con OC 1.5.5.1. Esto solo debería indicarte la dirección correcta (mientras creas que el final no está tan lejos).

¡Disfrútalo!