Mamy wymaganie, aby klient mógł dodawać tylko jeden produkt do koszyka na raz. Może jednak dodać dowolną ilość tego produktu.
Jak mogę zapobiec dodaniu produktu do koszyka, jeśli w koszyku jest już produkt?
Czy ktoś może w tym pomóc?
Mamy wymaganie, aby klient mógł dodawać tylko jeden produkt do koszyka na raz. Może jednak dodać dowolną ilość tego produktu.
Jak mogę zapobiec dodaniu produktu do koszyka, jeśli w koszyku jest już produkt?
Czy ktoś może w tym pomóc?
Odpowiedzi:
Wydarzenia catalog_product_type_prepare_full_options
i catalog_product_type_prepare_lite_options
są twoimi przyjaciółmi
<?xml version="1.0"?>
<config>
<modules>
<Fooman_Example>
<version>0.1.0</version>
</Fooman_Example>
</modules>
<global>
<models>
<fooman_example>
<class>Fooman_Example_Model</class>
</fooman_example>
</models>
<helpers>
<fooman_example>
<class>Fooman_Example_Helper</class>
</fooman_example>
</helpers>
</global>
<frontend>
<events>
<catalog_product_type_prepare_full_options>
<observers>
<fooman_example_catalog_product_type_prepare>
<class>Fooman_Example_Model_Observer</class>
<method>catalogProductTypePrepare</method>
</fooman_example_catalog_product_type_prepare>
</observers>
</catalog_product_type_prepare_full_options>
</events>
</frontend>
</config>
Następnie w klasie Observer
<?php
class Fooman_Example_Model_Observer
{
public function catalogProductTypePrepare($observer)
{
$quote = Mage::getSingleton('checkout/session')->getQuote();
if($quote->getItemsCount()>=1){
Mage::throwException('You can only buy one product at a time.');
}
}
}
catalog_product_type_prepare_lite_options
jest dla mnie pierwszy! ładnie wykonane.
Zamiast przepisać kontroler (proszę, nie rób tego), zamiast tego przepisz addProduct
metodę, aby uwzględnić limit:
class YourCompany_YourModule_Model_Cart extends Mage_Checkout_Model_Cart
{
public function addProduct($productInfo, $requestInfo=null){
if($this->getItemsCount()>1){
Mage::throwException(Mage::helper('checkout')->__('Cannot add item - cart quantity would exceed checkout the limit of %s per person.', 1));
}
parent::addProduct($productInfo, $requestInfo);
}
}
Jeśli chcesz się podobać, zamień 1
powyższe na Mage::getStoreConfig('checkout/options/max_cart_qty)
i ustaw następujące config.xml modułu:
<default>
<checkout>
<options>
<max_cart_qty>1</max_cart_qty>
</options>
</checkout>
</default>
Ta wartość jest teraz kontrolowana za pomocą wartości XML. Jeśli chcesz się naprawdę bardzo spodobać , dodaj to do pliku system.xml nowego modułu:
<config>
<sections>
<checkout>
<groups>
<options>
<fields>
<max_cart_qty translate="label">
<label>Maximum Quantity Allowed in Cart (total qty)</label>
<frontend_type>text</frontend_type>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
</max_cart_qty>
</fields>
</options>
</groups>
</checkout>
</sections>
</config>
Pamiętaj, że musisz ustawić a <depends>Mage_Checkout</depends>
dla swojego modułu, aby móc korzystać z jego predefiniowanej konfiguracji systemu.
Możliwym sposobem jest przepisanie addAction Mage_Checkout_CartController.
Sprawdź, czy w koszyku jest już produkt, a jeśli tak, pokaż odpowiedni komunikat o błędzie. Jeśli nie, możesz wywołać metodę nadrzędną, która wykonuje cały proces dodawania:
if (count($this->_getCart()->getProductIds()) > 0) {
$this->_goBack();
} else {
parent::addAction();
}
$this->_goBack();
nie działa! Wchodzę w warunek if, ale produkt wciąż się dodaje.
Myślę, że możesz użyć obserwatora, a następujące wydarzenia przydadzą się do sprawdzenia warunków, które chcesz. (Być może niektóre z wydarzeń mogą nie występować w używanej wersji Magento).
checkout_cart_save_before
checkout_cart_product_add_after
checkout_cart_update_items_before
checkout_cart_update_items_after
checkout_cart_save_after
checkout_cart_product_add_after
zdarzeniem, pytanie brzmi: jak mogę zapobiec dodaniu produktu do koszyka?
Może trochę pomysł na lewe pole, ale co powiesz na wykorzystanie catalog_product_is_salable_after
wydarzenia?
Tutaj możesz sprawdzić, czy produkt znajduje się w koszyku lub czy w koszyku jest inny produkt. Gdy w aktualizacji koszyka znajduje się inny produkt, atrybut „is_salable” obiektu „nadającego się do sprzedaży” jest przekazywany obserwatorowi na false.
UWAGA: nie zostało to przetestowane i jest jedynie pomysłem. Nie powiedzie się, jeśli Twój szablon nie sprawdzi się$product->isSaleable()
przed wyświetleniem przycisku. Spowoduje to również usunięcie przycisku i nie zatrzyma procesu dodawania, jeśli użytkownik będzie w stanie odgadnąć adres URL.
Wiem, że ten temat jest czymś starym, ale miałem podobny problem. Chcę tylko jeden produkt w koszyku, a jeśli klient doda nowy, chcę wymienić stary na nowy. Zastępuję więc addAction (opisane tutaj tak:
public function addAction(){
$items = $this->_getCart()->getItems();
foreach ($items as $item)
{
$itemId = $item->getItemId();
$this->_getCart()->removeItem($itemId);
}
parent::addAction();
}
checkout_cart_product_add_before
, np. Markshust.com/2012/