OK, aby wskazać Ci właściwy kierunek, tak bym to zrobił:
1. ukryte renderowanie danych wejściowych
Jak być może wiesz, w catalog/view/theme/default/template/product/product.php
jest prośba AJAX o dodanie produktu do koszyka:
$('#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',
// ...
});
});
Jeśli spojrzysz na data
parametr Zobaczysz, że wszystkie dane wejściowe, selekcje, obszary tekstowe itp. są obecne w .product-info
div są wypełniane i wysyłane do PHP.
Dlatego wyrenderowałbym ukryte dane wejściowe z niestandardową wartością ceny do tego .product-info
div, aby w ogóle nie musiał modyfikować żądania AJAX. Załóżmy, że nazwa tego wejścia to custom_price
.
2. checkout/cart/add
Otwórz catalog/controller/checkout/cart.php
i wyszukaj add
metoda. Tutaj cała magia powinna być wykonana. Po tej części kodu:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Dodałbym to:
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;
}
Zaimplementuj isCustomPriceValid()
sposób na spełnienie Twoich wymagań... i przejdź do ostatniej edycji tutaj - zmień tę linię:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
do:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Wózek
Teraz otwórz ten plik:system/library/cart.php
i ponownie wyszukaj add
metoda. Musisz zmienić definicję metody na następującą:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Przed ostatnim wierszem kodu w tej metodzie dodaj kolejny:
(ten kod został zmieniony ze względu na komentarz 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
}
Ostatnia zmiana powinna znajdować się w metodzie getProducts()
ponieważ ten ładuje wszystkie dane z bazy danych i przekazuje je do innych kontrolerów w celu wyświetlenia.
Teraz nie wiem, czy Twoja niestandardowa cena powinna zastąpić cenę + cenę opcji, czy tylko cenę, dlatego zostanie do niej dodana cena opcji, więc zostanę przy drugim wyborze, ponieważ jest bardziej opisowy, a pierwszy wybór mógłby łatwo wyprowadzić z mojego przykładu.
Wyszukaj linię
$price = $product_query->row['price'];
i zaraz po dodaniu
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Teraz należy nadpisać cenę niestandardową. Sprawdź dalej, czy cena produktu została później ustawiona jako:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Więc jeśli chcesz nadpisać całą cenę niestandardową, dodaj ten warunek zaraz po tej tablicy w ten sposób (zamiast po $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
To powinno być to. Nie testowałem kodu, może działać lub nie z niewielkimi modyfikacjami. Pracowałem z OC 1.5.5.1. Powinno to jedynie wskazać Ci właściwy kierunek (chociaż wierząc, że meta nie jest tak daleko).
Ciesz się!