sql >> データベース >  >> RDS >> Mysql

OpenCart製品ページの元の価格を変更するにはどうすればよいですか?

    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で作業していました。これはあなたを正しい方向に向けるだけです(フィニッシュはそれほど遠くないと信じていますが)。

    お楽しみください!



    1. MySQLはすべてのトリガーを無効にします

    2. ORACLEのselectステートメントのフィールドのデータ型を取得します

    3. NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT、またはNOT EXISTSを使用する必要がありますか?

    4. SQLServerのカーソルタイプ-KEYSETカーソル| SQLServerチュートリアル/TSQLチュートリアル