Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę zmienić oryginalną cenę na stronie produktu OpenCart?

OK, aby wskazać Ci właściwy kierunek, tak bym to zrobił:

1. ukryte renderowanie danych wejściowych
Jak być może wiesz, w catalog/view/theme/default/template/product/product.php jest prośba AJAX o dodanie produktu do koszyka:

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

Jeśli spojrzysz na data parametr Zobaczysz, że wszystkie dane wejściowe, selekcje, obszary tekstowe itp. są obecne w .product-info div są wypełniane i wysyłane do PHP.

Dlatego wyrenderowałbym ukryte dane wejściowe z niestandardową wartością ceny do tego .product-info div, aby w ogóle nie musiał modyfikować żądania AJAX. Załóżmy, że nazwa tego wejścia to custom_price .

2. checkout/cart/add
Otwórz catalog/controller/checkout/cart.php i wyszukaj add metoda. Tutaj cała magia powinna być wykonana. Po tej części kodu:

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

Dodałbym to:

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

Zaimplementuj isCustomPriceValid() sposób na spełnienie Twoich wymagań... i przejdź do ostatniej edycji tutaj - zmień tę linię:

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

do:

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

3. Wózek
Teraz otwórz ten plik:system/library/cart.php i ponownie wyszukaj add metoda. Musisz zmienić definicję metody na następującą:

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

Przed ostatnim wierszem kodu w tej metodzie dodaj kolejny:
(ten kod został zmieniony ze względu na komentarz 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
}

Ostatnia zmiana powinna znajdować się w metodzie getProducts() ponieważ ten ładuje wszystkie dane z bazy danych i przekazuje je do innych kontrolerów w celu wyświetlenia.

Teraz nie wiem, czy Twoja niestandardowa cena powinna zastąpić cenę + cenę opcji, czy tylko cenę, dlatego zostanie do niej dodana cena opcji, więc zostanę przy drugim wyborze, ponieważ jest bardziej opisowy, a pierwszy wybór mógłby łatwo wyprowadzić z mojego przykładu.

Wyszukaj linię

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

i zaraz po dodaniu

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

Teraz należy nadpisać cenę niestandardową. Sprawdź dalej, czy cena produktu została później ustawiona jako:

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

Więc jeśli chcesz nadpisać całą cenę niestandardową, dodaj ten warunek zaraz po tej tablicy w ten sposób (zamiast po $price = ...; ):

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

To powinno być to. Nie testowałem kodu, może działać lub nie z niewielkimi modyfikacjami. Pracowałem z OC 1.5.5.1. Powinno to jedynie wskazać Ci właściwy kierunek (chociaż wierząc, że meta nie jest tak daleko).

Ciesz się!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL A lub B, ale NIE oba

  2. Sequel Pro z Mysql w Docker

  3. Resque Mysql2::Error:Użytkownik przekroczył zasób „max_user_connections” (bieżąca wartość:10)

  4. Ochrona przed wstrzyknięciem SQL — pojedyncze cudzysłowy

  5. Prześlij wiele plików na serwer, a php nie przesyła na serwer wszystkich plików