Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich den Originalpreis auf der OpenCart-Produktseite ändern?

OK, um Ihnen die richtige Richtung zu zeigen, würde ich das so machen:

1. Hidden input render
Wie Sie vielleicht wissen, in einer catalog/view/theme/default/template/product/product.php Es gibt eine AJAX-Anfrage zum Hinzufügen eines Produkts in den Warenkorb:

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

Wenn Sie sich die data ansehen Parameter Sie werden sehen, dass alle Eingaben, Auswahlen, Textbereiche usw. in einer .product-info vorhanden sind div werden ausgefüllt und an PHP gesendet.

Daher würde ich die versteckte Eingabe mit benutzerdefiniertem Preiswert in diese .product-info rendern div, um die AJAX-Anforderung überhaupt nicht ändern zu müssen. Nehmen wir an, der Name dieser Eingabe lautet custom_price .

2. Der checkout/cart/add
Öffnen Sie catalog/controller/checkout/cart.php und suchen Sie nach add Methode. Hier sollte die ganze Magie getan werden. Nach diesem Teil des Codes:

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

Ich würde dies hinzufügen:

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

Implementieren Sie isCustomPriceValid() Methode, um Ihre Anforderungen zu erfüllen ... und fahren Sie hier mit der letzten Bearbeitung fort - ändern Sie diese Zeile:

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

zu:

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

3. Der Einkaufswagen
Öffnen Sie nun diese Datei:system/library/cart.php und suchen Sie erneut nach add Methode. Sie müssten die Definition der Methode in diese ändern:

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

Fügen Sie vor der letzten Codezeile innerhalb dieser Methode eine weitere hinzu:
(dieser Code wurde aufgrund des Kommentars vom OP bearbeitet)

    // ...

    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
}

Die letzte Bearbeitung sollte innerhalb der Methode getProducts() erfolgen da dieser alle Daten aus der DB lädt und zur Anzeige an andere Steuerungen weiterleitet.

Jetzt weiß ich nicht, ob Ihr benutzerdefinierter Preis den Preis + Optionspreis oder nur den Preis überschreiben soll, daher wird der Optionspreis hinzugefügt, also würde ich bei der zweiten Wahl bleiben, da sie aussagekräftiger ist und die erste Wahl könnte leicht aus meinem Beispiel abgeleitet werden.

Suchen Sie nach der Zeile

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

und direkt nach add

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

Jetzt sollte der Preis mit dem benutzerdefinierten überschrieben werden. Überprüfen Sie weiter, ob der Preis für das Produkt später wie folgt festgelegt wird:

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

Wenn Sie also den gesamten Preis mit dem benutzerdefinierten überschreiben möchten, fügen Sie diese Bedingung wie folgt direkt nach diesem Array hinzu (anstatt nach $price = ...; ):

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

Das sollte es sein. Ich habe den Code nicht getestet, er kann mit geringfügigen Änderungen funktionieren oder nicht. Ich arbeitete mit OC 1.5.5.1. Dies sollte Sie nur in die richtige Richtung weisen (während Sie glauben, dass das Ziel nicht so weit entfernt ist).

Viel Spaß!