Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso modificare il prezzo originale sulla pagina del prodotto OpenCart?

OK, per indicarti la giusta direzione, ecco come lo farei:

1. rendering dell'input nascosto
Come forse saprai, in un catalog/view/theme/default/template/product/product.php c'è una richiesta AJAX per aggiungere il prodotto al carrello:

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

Se guardi i data parametro Vedrai che tutti gli input, select, textareas ecc. sono presenti in un .product-info div vengono compilati e inviati a PHP.

Quindi renderei l'input nascosto con il valore del prezzo personalizzato in quel .product-info div per non dover modificare affatto la richiesta AJAX. Diciamo che il nome di quell'input sarà custom_price .

2. Il checkout/cart/add
Apri catalog/controller/checkout/cart.php e cerca add metodo. Qui tutta la magia dovrebbe essere fatta. Dopo questa parte di codice:

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

Aggiungerei questo:

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

Implementare isCustomPriceValid() metodo per soddisfare le tue esigenze... e passare all'ultima modifica qui - cambia questa riga:

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

a:

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

3. Il carrello
Ora apri questo file:system/library/cart.php e di nuovo cerca il add metodo. Dovresti cambiare la definizione del metodo in questo:

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

Prima dell'ultima riga di codice all'interno di questo metodo, aggiungine un'altra:
(questo codice è stato modificato a causa del commento dell'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
}

L'ultima modifica dovrebbe essere all'interno del metodo getProducts() in quanto questo sta caricando tutti i dati dal DB e li inoltra ad altri controller per scopi di visualizzazione.

Ora non so se il tuo prezzo personalizzato debba sovrascrivere il prezzo + il prezzo delle opzioni o solo il prezzo, quindi il prezzo delle opzioni verrà aggiunto ad esso, quindi rimarrei con la seconda scelta poiché è più descrittiva e la prima scelta potrebbe essere facilmente derivato dal mio esempio.

Cerca la linea

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

e subito dopo aggiungi

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

Ora il prezzo dovrebbe essere sovrascritto con quello personalizzato. Verifica inoltre che il prezzo del prodotto venga successivamente impostato come:

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

Quindi, se desideri sovrascrivere l'intero prezzo con quello personalizzato, aggiungi quella condizione subito dopo quell'array in questo modo (invece che dopo $price = ...; ):

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

Dovrebbe essere questo. Non ho testato il codice, potrebbe funzionare o meno con lievi modifiche. Stavo lavorando con OC 1.5.5.1. Questo dovrebbe solo indirizzarti nella giusta direzione (pur credendo che il traguardo non sia così lontano).

Divertiti!