sql >> Database >  >> RDS >> Mysql

Hoe kan ik de oorspronkelijke prijs op de OpenCart-productpagina wijzigen?

OK, om u de juiste richting te wijzen, dit is hoe ik dit zou doen:

1. verborgen invoerweergave
Zoals u wellicht weet, in een catalog/view/theme/default/template/product/product.php er is een AJAX-verzoek om een ​​product aan de winkelwagen toe te voegen:

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

Als je kijkt naar de data parameter U zult zien dat alle invoer, selecties, tekstgebieden enz. aanwezig zijn in een .product-info div worden ingevuld en naar PHP gepost.

Daarom zou ik de verborgen invoer met aangepaste prijswaarde weergeven in die .product-info div om het AJAX-verzoek helemaal niet te hoeven wijzigen. Laten we zeggen dat de naam van die invoer custom_price is .

2. De checkout/cart/add
Open catalog/controller/checkout/cart.php en zoek naar add methode. Hier moet alle magie worden gedaan. Na dit deel van de code:

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

Ik zou dit toevoegen:

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

Implementeer de isCustomPriceValid() methode om aan uw eisen te voldoen...en ga hier door naar de laatste bewerking - wijzig deze regel:

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

naar:

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

3. De winkelwagen
Open nu dit bestand:system/library/cart.php en zoek opnieuw naar de add methode. Je zou de definitie van de methode in deze moeten veranderen:

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

Voeg vóór de laatste regel code binnen deze methode nog een toe:
(deze code is aangepast vanwege de opmerking van de 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
}

De laatste bewerking moet binnen de methode getProducts() vallen omdat deze alle gegevens uit de DB laadt en deze doorstuurt naar andere controllers voor weergavedoeleinden.

Nu weet ik niet of uw aangepaste prijs de prijs + optieprijs of alleen de prijs moet overschrijven, dus de optieprijs wordt eraan toegevoegd, dus ik zou bij de tweede keuze blijven omdat deze meer beschrijvend is en de eerste keuze zou kunnen gemakkelijk worden afgeleid uit mijn voorbeeld.

Zoek de regel

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

en direct na toevoegen

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

Nu moet de prijs worden overschreven met de aangepaste prijs. Controleer verder of de prijs voor het product later wordt ingesteld als:

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

Dus als u de hele prijs wilt overschrijven met de aangepaste prijs, voeg die voorwaarde dan direct na die array toe, zoals deze (in plaats van na $price = ...; ):

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

Dit zou het moeten zijn. Ik heb de code niet getest, het kan wel of niet werken met kleine aanpassingen. Ik werkte met OC 1.5.5.1. Dit zou je alleen in de goede richting moeten wijzen (hoewel je denkt dat de finish niet zo ver is).

Geniet ervan!



  1. Bestanden opslaan in SQL Database met behulp van FILESTREAM - Deel 2

  2. SQL, lege cellen afhandelen

  3. Waarom wordt casten van float naar varchar afgerond in SQL Server?

  4. Kan geen verbinding maken met database (000webhost)