OK, for at pege dig i den rigtige retning, er det sådan, jeg ville gøre dette:
1. skjult input render
Som du måske ved, i et catalog/view/theme/default/template/product/product.php
der er en AJAX-anmodning om at tilføje et produkt i indkøbskurven:
$('#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',
// ...
});
});
Hvis du ser på data
parameter Du vil se, at alle input, markeringer, tekstområder osv. findes i en .product-info
div udfyldes og sendes til PHP.
Derfor ville jeg gengive det skjulte input med tilpasset prisværdi til den .product-info
div for slet ikke at skulle ændre AJAX-anmodningen. Lad os sige, at navnet på det input vil være custom_price
.
2. checkout/cart/add
Åbn catalog/controller/checkout/cart.php
og søg efter add
metode. Her skal al magien gøres. Efter denne del af koden:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
Jeg vil tilføje dette:
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;
}
Implementer isCustomPriceValid()
metode til at opfylde dine krav...og gå videre til den sidste redigering her - skift denne linje:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
til:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3. Vognen
Åbn nu denne fil:system/library/cart.php
og søg igen efter add
metode. Du bliver nødt til at ændre definitionen af metoden til denne:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Før den sidste kodelinje i denne metode, tilføje en anden:
(denne kode blev redigeret på grund af kommentaren fra 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
}
Den sidste redigering skal være inden for metoden getProducts()
da denne indlæser alle data fra databasen og videresender dem til andre controllere til visningsformål.
Nu ved jeg ikke, om din brugerdefinerede pris skal overskrive prisen + optionsprisen eller kun prisen, så optionsprisen vil blive tilføjet til den, så jeg ville holde mig til det andet valg, da det er mere beskrivende, og det første valg kunne let udledes af mit eksempel.
Søg efter linjen
$price = $product_query->row['price'];
og lige efter tilføjelse
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Nu skulle prisen overskrives med den brugerdefinerede. Tjek yderligere, at prisen for produktet senere er sat som:
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Så hvis du gerne vil overskrive hele prisen med den brugerdefinerede, skal du tilføje den betingelse lige efter det array som denne (i stedet for efter $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Dette burde være det. Jeg testede ikke koden, den virker muligvis ikke med små ændringer. Jeg arbejdede med OC 1.5.5.1. Dette bør kun pege dig i den rigtige retning (mens du tror, at finishen ikke er så langt).
God fornøjelse!