OK、あなたに正しい方向を示すために、これは私がこれを行う方法です:
1。非表示の入力レンダリング
ご存知かもしれませんが、catalog/view/theme/default/template/product/product.php
カートに商品を追加するためのAJAXリクエストがあります:
$('#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',
// ...
});
});
data
を見れば パラメータ.product-info
にすべての入力、選択、テキストエリアなどが存在することがわかります。 divが入力され、PHPに投稿されます。
したがって、カスタム価格値を使用して非表示の入力をその.product-info
にレンダリングします。 divは、AJAXリクエストをまったく変更する必要がありません。 その入力の名前がcustom_price
であるとしましょう 。
2。 checkout/cart/add
catalog/controller/checkout/cart.php
を開きます add
を検索します 方法。ここですべての魔法を実行する必要があります。コードのこの部分の後:
if (isset($this->request->post['option'])) {
$option = array_filter($this->request->post['option']);
} else {
$option = array();
}
これを追加します:
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;
}
isCustomPriceValid()
を実装します 要件を満たす方法...そしてここで最後の編集に進みます-この行を変更します:
$this->cart->add($this->request->post['product_id'], $quantity, $option);
宛先:
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
3。カート
次に、このファイルを開きます:system/library/cart.php
もう一度add
を検索します 方法。メソッドの定義を次のように変更する必要があります:
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
このメソッド内のコードの最後の行の前に、別のコードを追加します:
(このコードは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
}
最後の編集は、メソッドgetProducts()
内で行う必要があります これはDBからすべてのデータをロードし、表示目的で他のコントローラーに転送するためです。
カスタム価格が価格+オプション価格を上書きするのか、それとも価格のみを上書きするのかわからないため、オプション価格が追加されるので、より説明的で最初の選択肢が可能であるため、2番目の選択肢を使用します。私の例から簡単に導き出すことができます。
行を検索
$price = $product_query->row['price'];
追加直後
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
これで、価格をカスタム価格で上書きする必要があります。さらに、製品の価格が後で次のように設定されていることを確認します。
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
したがって、価格全体をカスタム価格で上書きする場合は、このように配列の直後にその条件を追加します($price = ...;
の後ではありません)。 ):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
これはそれであるはずです。私はコードをテストしませんでした、それはわずかな変更で動作するかもしれないし、動作しないかもしれません。私はOC1.5.5.1で作業していました。これはあなたを正しい方向に向けるだけです(フィニッシュはそれほど遠くないと信じていますが)。
お楽しみください!