OK, um Ihnen die richtige Richtung zu zeigen, würde ich das so machen:
1. Hidden input render
Wie Sie vielleicht wissen, in einer catalog/view/theme/default/template/product/product.php
Es gibt eine AJAX-Anfrage zum Hinzufügen eines Produkts in den Warenkorb:
$('#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',
// ...
});
});
Wenn Sie sich die data
ansehen Parameter Sie werden sehen, dass alle Eingaben, Auswahlen, Textbereiche usw. in einer .product-info
vorhanden sind div werden ausgefüllt und an PHP gesendet.
Daher würde ich die versteckte Eingabe mit benutzerdefiniertem Preiswert in diese .product-info
rendern div, um die AJAX-Anforderung überhaupt nicht ändern zu müssen. Nehmen wir an, der Name dieser Eingabe lautet custom_price
.
2. Der checkout/cart/add
Öffnen Sie catalog/controller/checkout/cart.php
und suchen Sie nach add
Methode. Hier sollte die ganze Magie getan werden. Nach diesem Teil des Codes:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Ich würde dies hinzufügen:
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;
}
Implementieren Sie isCustomPriceValid()
Methode, um Ihre Anforderungen zu erfüllen ... und fahren Sie hier mit der letzten Bearbeitung fort - ändern Sie diese Zeile:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
zu:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Der Einkaufswagen
Öffnen Sie nun diese Datei:system/library/cart.php
und suchen Sie erneut nach add
Methode. Sie müssten die Definition der Methode in diese ändern:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Fügen Sie vor der letzten Codezeile innerhalb dieser Methode eine weitere hinzu:
(dieser Code wurde aufgrund des Kommentars vom OP bearbeitet)
// ...
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
}
Die letzte Bearbeitung sollte innerhalb der Methode getProducts()
erfolgen da dieser alle Daten aus der DB lädt und zur Anzeige an andere Steuerungen weiterleitet.
Jetzt weiß ich nicht, ob Ihr benutzerdefinierter Preis den Preis + Optionspreis oder nur den Preis überschreiben soll, daher wird der Optionspreis hinzugefügt, also würde ich bei der zweiten Wahl bleiben, da sie aussagekräftiger ist und die erste Wahl könnte leicht aus meinem Beispiel abgeleitet werden.
Suchen Sie nach der Zeile
$price = $product_query->row['price'];
und direkt nach add
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Jetzt sollte der Preis mit dem benutzerdefinierten überschrieben werden. Überprüfen Sie weiter, ob der Preis für das Produkt später wie folgt festgelegt wird:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Wenn Sie also den gesamten Preis mit dem benutzerdefinierten überschreiben möchten, fügen Sie diese Bedingung wie folgt direkt nach diesem Array hinzu (anstatt nach $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Das sollte es sein. Ich habe den Code nicht getestet, er kann mit geringfügigen Änderungen funktionieren oder nicht. Ich arbeitete mit OC 1.5.5.1. Dies sollte Sie nur in die richtige Richtung weisen (während Sie glauben, dass das Ziel nicht so weit entfernt ist).
Viel Spaß!