OK, om u de juiste richting te wijzen, dit is hoe ik dit zou doen:
Zoals u wellicht weet, in een catalog/view/theme/default/template/product/product.php
er is een AJAX-verzoek om een product aan de winkelwagen toe te voegen:
$('#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',
// ...
});
});
Als je kijkt naar de data
parameter U zult zien dat alle invoer, selecties, tekstgebieden enz. aanwezig zijn in een .product-info
div worden ingevuld en naar PHP gepost.
Daarom zou ik de verborgen invoer met aangepaste prijswaarde weergeven in die .product-info
div om het AJAX-verzoek helemaal niet te hoeven wijzigen. Laten we zeggen dat de naam van die invoer custom_price
is .
checkout/cart/add
Open catalog/controller/checkout/cart.php
en zoek naar add
methode. Hier moet alle magie worden gedaan. Na dit deel van de code:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Ik zou dit toevoegen:
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;
}
Implementeer de isCustomPriceValid()
methode om aan uw eisen te voldoen...en ga hier door naar de laatste bewerking - wijzig deze regel:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
naar:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
Open nu dit bestand:system/library/cart.php
en zoek opnieuw naar de add
methode. Je zou de definitie van de methode in deze moeten veranderen:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Voeg vóór de laatste regel code binnen deze methode nog een toe:
(deze code is aangepast vanwege de opmerking van de 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
}
De laatste bewerking moet binnen de methode getProducts()
vallen omdat deze alle gegevens uit de DB laadt en deze doorstuurt naar andere controllers voor weergavedoeleinden.
Nu weet ik niet of uw aangepaste prijs de prijs + optieprijs of alleen de prijs moet overschrijven, dus de optieprijs wordt eraan toegevoegd, dus ik zou bij de tweede keuze blijven omdat deze meer beschrijvend is en de eerste keuze zou kunnen gemakkelijk worden afgeleid uit mijn voorbeeld.
Zoek de regel
$price = $product_query->row['price'];
en direct na toevoegen
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Nu moet de prijs worden overschreven met de aangepaste prijs. Controleer verder of de prijs voor het product later wordt ingesteld als:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Dus als u de hele prijs wilt overschrijven met de aangepaste prijs, voeg die voorwaarde dan direct na die array toe, zoals deze (in plaats van na $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Dit zou het moeten zijn. Ik heb de code niet getest, het kan wel of niet werken met kleine aanpassingen. Ik werkte met OC 1.5.5.1. Dit zou je alleen in de goede richting moeten wijzen (hoewel je denkt dat de finish niet zo ver is).
Geniet ervan!