sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg ændre den oprindelige pris på OpenCart-produktsiden?

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!



  1. Opret forbindelse til MySQL med JDBC over netværk

  2. VÆLG DISTINCT-værdier efter en JOIN

  3. Sammenkædning af django- og mysql-containere ved hjælp af docker-compose

  4. DBA - Sådan dræber du alle databaseprocesser på SQL Server