sql >> Databáze >  >> RDS >> Mysql

Jak mohu změnit původní cenu na stránce produktu OpenCart?

OK, abych vám ukázal správný směr, udělal bych to takto:

1. vykreslení skrytého vstupu
Jak možná víte, v catalog/view/theme/default/template/product/product.php existuje požadavek AJAX na přidání produktu do košíku:

$('#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',
                // ...
        });
});

Pokud se podíváte na data parametr Uvidíte, že všechny vstupy, výběry, textové oblasti atd. přítomné v .product-info div jsou vyplněny a odeslány do PHP.

Proto bych skrytý vstup s vlastní hodnotou ceny vykreslil do tohoto .product-info div, abyste nemuseli požadavek AJAX vůbec upravovat. Řekněme, že název tohoto vstupu bude custom_price .

2. checkout/cart/add
Otevřete catalog/controller/checkout/cart.php a vyhledejte add metoda. Tady by se měla dělat všechna kouzla. Po této části kódu:

            if (isset($this->request->post['option'])) {
                $option = array_filter($this->request->post['option']);
            } else {
                $option = array();  
            }

Doplnil bych toto:

            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;
            }

Implementujte isCustomPriceValid() způsob, jak splnit vaše požadavky...a přejděte k poslední úpravě zde - změňte tento řádek:

$this->cart->add($this->request->post['product_id'], $quantity, $option);

komu:

$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);

3. Vozík
Nyní otevřete tento soubor:system/library/cart.php a znovu vyhledejte add metoda. Museli byste změnit definici metody na tuto:

public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {

Před poslední řádek kódu v rámci této metody přidejte další:
(tento kód byl upraven kvůli komentáři z 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
}

Poslední úprava by měla být v rámci metody getProducts() protože tento načítá všechna data z DB a předává je dalším kontrolérům pro účely zobrazení.

Nyní nevím, zda má Vaše vlastní cena přepsat cenu + cenu opcí nebo pouze cenu, takže k ní bude přičtena cena opcí, takže bych zůstal u druhé volby, protože je popisnější a první volba by mohla lze snadno odvodit z mého příkladu.

Vyhledejte řádek

$price = $product_query->row['price'];

a hned po přidání

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $price = $this->session->data['cart']['custom_price'][$key];
}

Nyní by měla být cena přepsána vlastní. Dále zkontrolujte, zda je cena za produkt později nastavena jako:

$this->data[$key] = array(
    // ...
    'price'           => ($price + $option_price),
    // ...              
);

Pokud tedy chcete přepsat celou cenu vlastní cenou, přidejte tuto podmínku hned za pole takto (místo za $price = ...; ):

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}

Tohle by mělo být ono. Netestoval jsem kód, může nebo nemusí fungovat s malými úpravami. Pracoval jsem s OC 1.5.5.1. To by vás mělo pouze nasměrovat správným směrem (a přitom věřit, že cíl není tak daleko).

Užijte si to!



  1. Jak vyvinout offline první nativní aplikaci pro Android

  2. MySQL – příkaz optimalizace případu

  3. Jak napsat aplikaci .Net, která funguje se SqlServerem i Oracle (nyní, když je System.Data.OracleClient zastaralý)

  4. Existuje způsob, jak vygenerovat diagram tříd UML z existující databáze MySQL?