OK, per indicarti la giusta direzione, ecco come lo farei:
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
.
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);
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!