Alışveriş sepetinde yalnızca bir ürüne nasıl izin verilir?


18

Bir müşterinin sepete bir kerede yalnızca bir ürün eklemesine izin verileceği bir gereksinimimiz var. Ancak o ürünün herhangi bir miktarını ekleyebilir.

Sepetinizde zaten bir ürün varsa, bir ürünün sepete eklemesini nasıl önleyebilirim?

Bazıları bu konuda yardımcı olabilir mi?


1
İhtiyacınız olanın bu olduğunu düşünüyorum: crearegroup-ecommerce.co.uk/blog/magento-tips/… Diğer seçenek, bir ürün eklemek için eylemi yeniden yazmak ve checkout_cart_product_add_before orada özel bir etkinlik başlatmaktır
08/27

@enenen: bu harika, ama ürünün bu gözlemcide sepete eklenmesini nasıl durdurabilirim?
Shathish

Yanıtlar:


20

Olaylar catalog_product_type_prepare_full_optionsve catalog_product_type_prepare_lite_optionsarkadaşlarınız

<?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>

Sonra Observer sınıfınızda

<?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_optionsbenim için bir ilk! güzel yapılmış.
philwinkle

4
@ philwinkle, sepete eklemeden hemen önce her şey için çok kullanışlı geliyor. Ben normal bir grep sadece Mage :: dispatchEvent ($ eventName, önceki satırı eksik $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof

iyi bir cazibe gibi çalıştı.
Deepanshu Goyal

Fooman, bu bana grts
Amit Bera

8

Bir denetleyiciyi yeniden yazmak yerine (lütfen oh lütfen bunu yapmayın), bunun yerine, addProductsınırı hesaba katmak için yöntemi yeniden yazın :

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

Süslü olmak istiyorsanız, 1yukarıdakileri değiştirin Mage::getStoreConfig('checkout/options/max_cart_qty)ve modülünüzün config.xml dosyasını ayarlayın:

<default>
    <checkout>
        <options>
            <max_cart_qty>1</max_cart_qty>
        </options>
    </checkout>
</default>

Bu değer artık XML değeri üzerinden kontrol ediliyor. Gerçekten, gerçekten süslü olmak istiyorsanız , bunu yeni modülünüzün system.xml dosyasına ekleyin:

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

<depends>Mage_Checkout</depends>Önceden tanımlanmış sistem yapılandırmasını geri almak için modülünüze bir ayar yapmanız gerektiğini unutmayın .


Çok teşekkürler, cevabınız "gerçekten süslü", ancak Fooman'ın cevabı zaten denediğim şeye uygun, bu yüzden cevap olarak kabul etti. Ama eğer gözlemcileri kullanmaya başlamasaydım, yöntemini kullanırdım :).
Shathish

1
Elbette! @fooman haklıydı - bu benim için de
eğiticiydi

2

Olası bir yol Mage_Checkout_CartController addAction'ı yeniden yazmaktır.

Bu nedenle, alışveriş sepetinizde zaten bir ürün olup olmadığını kontrol edin ve evet ise uygun bir hata mesajı gösterin. Değilse, tam ekleme işlemini yapan üst yöntemi çağırabilirsiniz:

    if (count($this->_getCart()->getProductIds()) > 0) {
        $this->_goBack();
    } else {
        parent::addAction();
    }

Üzgünüm, $this->_goBack();çalışmıyor! Eğer if durumuna giriyorum ama ürün hala ekleniyor.
Shathish

Tam olarak ne olup bittiğini ayıklamak için o noktadan çıkarsanız ne olur, çünkü tüm addAction işlemi yürütülmemelidir
Tobias

o noktada çıkış vermek bana boş bir ekran veren yürütme çıkar
Shathish

ama ürünü ekliyor mu?
Tobias

3
lütfen oh lütfen kontrolörleri yeniden
yazmayın

1

Ben bir gözlemci kullanabilirsiniz düşünüyorum ve aşağıdaki olaylar ne istediğinizi kontrol etmek için yararlı olacaktır. (Belki de bazı olaylar kullandığınız Magento sürümünde olmayabilir).

checkout_cart_save_before

checkout_cart_product_add_after

checkout_cart_update_items_before

checkout_cart_update_items_after

checkout_cart_save_after

Zaten checkout_cart_product_add_afteretkinlikle deniyorum , soru ürünün sepete eklenmesini nasıl önleyebilirim?
Shathish

veya zaten eklenmişse, nasıl kaldırılır?
Shathish

1

Belki biraz sol alan fikri ama catalog_product_is_salable_afterolayı kullanmaya ne dersiniz ?

Burada yapabileceğiniz şey, ürünün sepette olup olmadığını veya sepette başka bir ürün olup olmadığını kontrol etmektir. Alışveriş sepeti güncellemesinde başka bir ürün olduğunda, 'salable' nesnesinin 'is_salable' özniteliği, gözlemciye false olarak iletilir.

NOT Bu test edilmiş ve sadece bir düşüncedir edilmediğini. $product->isSaleable()Düğmeyi görüntülemeden önceşablonunuz kontrol etmezse başarısız olur. Ayrıca kullanıcı yalnızca URL'yi tahmin edebildiyse yalnızca düğmeyi kaldırır ve ekleme işlemini durdurmaz.


1

Bu konunun eski bir şey olduğunu biliyorum, ama benzer bir sorunum vardı. Sepet içinde sadece bir ürün istiyorum ve müşteri yenisini eklerse, eskisini yenisiyle değiştirmek istiyorum. Yani addAction geçersiz kılındı ​​( burada şöyle açıklanır :

public function addAction(){
    $items = $this->_getCart()->getItems();
            foreach ($items as $item)
                    {
                            $itemId = $item->getItemId();
                            $this->_getCart()->removeItem($itemId);
                    }
    parent::addAction();

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.