sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag ändra det ursprungliga priset på OpenCart produktsida?

OK, för att peka dig i rätt riktning så skulle jag göra det här:

1. dold input render
Som du kanske vet, i en catalog/view/theme/default/template/product/product.php det finns en AJAX-begäran för att lägga till produkten i varukorgen:

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

Om du tittar på data parameter Du kommer att se att alla ingångar, markeringar, textområden etc. finns i en .product-info div fylls i och skickas till PHP.

Därför skulle jag återge den dolda inmatningen med anpassat prisvärde till den .product-info div för att inte behöva ändra AJAX-förfrågan alls. Låt oss säga att namnet på den ingången kommer att vara custom_price .

2. checkout/cart/add
Öppna catalog/controller/checkout/cart.php och sök efter add metod. Här ska all magi göras. Efter denna del av koden:

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

Jag skulle lägga till detta:

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

Implementera isCustomPriceValid() metod för att uppfylla dina krav...och gå vidare till den senaste redigeringen här - ändra denna rad:

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

till:

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

3. Vagnen
Öppna nu denna fil:system/library/cart.php och sök igen efter add metod. Du måste ändra definitionen av metoden till denna:

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

Före den sista kodraden inom denna metod, lägg till en till:
(denna kod redigerades på grund av kommentaren från 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 senaste redigeringen bör vara inom metoden getProducts() eftersom den här laddar all data från DB och vidarebefordrar dem till andra kontrollanter för visningsändamål.

Nu vet jag inte om ditt anpassade pris ska skriva över priset + optionspriset eller bara priset, så alternativpriset kommer att läggas till det, så jag skulle hålla mig till det andra valet eftersom det är mer beskrivande och det första valet kan lätt härledas från mitt exempel.

Sök efter raden

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

och direkt efter add

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

Nu ska priset skrivas över med det anpassade. Kontrollera vidare att priset för produkten senare sätts som:

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

Så om du vill skriva över hela priset med det anpassade, lägg till det villkoret direkt efter den matrisen så här (istället för efter $price = ...; ):

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

Det här borde vara det. Jag testade inte koden, den kanske fungerar eller inte fungerar med små modifieringar. Jag arbetade med OC 1.5.5.1. Detta bör bara peka dig i rätt riktning (medan du tror att målet inte är så långt).

Njut!



  1. pip installera mysqlclient på amazon linux

  2. SQLException:Före start av resultatuppsättning

  3. Välj distinkta aviseringar och förbered ett tydligare meddelande

  4. Mysql-servern på MAMP startar inte