Bagaimana mengizinkan hanya satu produk dalam satu troli?

18

Kami memiliki persyaratan, di mana pelanggan akan diizinkan untuk menambahkan hanya satu produk ke keranjang sekaligus. Namun dia dapat menambahkan jumlah produk itu.

Bagaimana saya bisa mencegah suatu produk menambah keranjang jika sudah ada produk dalam keranjang?

Bisakah seseorang membantu dalam hal ini?

Shathish
sumber
1
Saya pikir inilah yang Anda butuhkan: crearegroup-ecommerce.co.uk/blog/magento-tips/... Opsi lainnya adalah menulis ulang tindakan untuk menambahkan produk dan memecat acara khusus di checkout_cart_product_add_before sana, mis. Markshust.com/2012/
08/27
@enenen: itu keren, tapi bagaimana saya bisa menghentikan produk agar tidak ditambahkan ke troli di pengamat itu?
Shathish

Jawaban:

20

Peristiwa catalog_product_type_prepare_full_optionsdan catalog_product_type_prepare_lite_optionsadalah teman Anda

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

Kemudian di kelas Observer Anda

<?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.');
        }
    }
}
Kristof di Fooman
sumber
catalog_product_type_prepare_lite_optionsadalah yang pertama bagi saya! dilakukan dengan baik.
philwinkle
4
@ philwinkle sangat berguna untuk apa pun sebelum menambahkan ke keranjang. Saya pikir itu akan terlewatkan dari banyak cheatsheets karena grep normal hanya menghasilkan Mage :: dispatchEvent ($ eventName, melewatkan baris sebelumnya $ eventName = sprintf ('catalog_product_type_prepare_% s_options', $ processMode);
Kristof at Fooman
baik itu bekerja seperti pesona.
Deepanshu Goyal
Fooman, ini milikku
Amit Bera
8

Alih-alih menulis ulang controller (tolong oh jangan lakukan itu), alih-alih, tulis ulang addProductmetode untuk memperhitungkan batas:

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

Jika Anda ingin menjadi mewah, ganti yang di 1atas dengan Mage::getStoreConfig('checkout/options/max_cart_qty)dan atur config.xml berikut modul Anda:

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

Nilai itu sekarang dikendalikan melalui nilai XML. Jika Anda ingin benar-benar mewah , tambahkan ini ke system.xml dari modul baru Anda:

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

Ingatlah bahwa Anda perlu mengatur a <depends>Mage_Checkout</depends>ke modul Anda untuk mendukung konfigurasi sistem yang sudah ditentukan sebelumnya.

Philwinkle
sumber
Terima kasih banyak, jawaban Anda "sangat mewah", tetapi jawaban Fooman sesuai dengan apa yang sudah saya coba, jadi terima itu sebagai jawabannya. Tetapi jika saya belum mulai menggunakan pengamat, saya akan menggunakan metode Anda :).
Shathish
1
Tentu saja! @fooman benar - ini juga mendidik bagi saya :)
philwinkle
2

Cara yang mungkin adalah menulis ulang addAction dari Mage_Checkout_CartController.

Jadi periksa apakah sudah ada produk dalam keranjang dan jika ya tunjukkan pesan kesalahan yang sesuai. Jika tidak, Anda dapat memanggil metode induk yang sedang melakukan proses add-lengkap:

    if (count($this->_getCart()->getProductIds()) > 0) {
        $this->_goBack();
    } else {
        parent::addAction();
    }
Tobias
sumber
Maaf, $this->_goBack();tidak berfungsi! Saya masuk ke kondisi if tetapi produk masih ditambahkan.
Shathish
Apa yang terjadi jika Anda baru saja keluar pada saat itu, hanya untuk men-debug apa yang sebenarnya terjadi, karena seluruh proses addAction tidak boleh dijalankan
Tobias
memberi jalan keluar pada saat itu keluar dari eksekusi memberi saya layar kosong
Shathish
tetapi apakah itu menambah produk?
Tobias
3
tolong oh tolong jangan menulis ulang pengontrol
philwinkle
1

Saya pikir Anda dapat menggunakan pengamat dan acara berikut akan berguna untuk memeriksa kondisi yang Anda inginkan. (Mungkin beberapa acara mungkin tidak dalam versi Magento yang Anda gunakan).

checkout_cart_save_before

checkout_cart_product_add_after

checkout_cart_update_items_before

checkout_cart_update_items_after

checkout_cart_save_after
Sukeshini
sumber
Saya sudah mencoba dengan checkout_cart_product_add_afteracara, pertanyaannya adalah bagaimana saya bisa mencegah produk agar tidak ditambahkan ke troli?
Shathish
atau jika sudah ditambahkan, bagaimana cara menghapusnya?
Shathish
1

Mungkin sedikit ide lapangan kiri tapi bagaimana kalau menggunakan catalog_product_is_salable_afteracara?

Apa yang dapat Anda lakukan di sini adalah memeriksa untuk melihat apakah produk ada di dalam kereta atau jika ada produk lain di dalam kereta. Ketika ada produk lain dalam kereta memperbarui atribut 'is_salable' dari objek 'laku' yang diteruskan ke pengamat ke false.

Perhatikan bahwa ini belum diuji dan hanya sebuah gagasan. Ini akan gagal jika template Anda tidak memeriksa$product->isSaleable()sebelum menampilkan tombol. Itu juga hanya akan menghapus tombol dan tidak benar-benar menghentikan proses add jika pengguna dapat menebak url.

David Manners
sumber
1

Saya tahu topik ini adalah sesuatu yang lama, tetapi saya memiliki masalah yang sama. Saya hanya ingin satu item dalam keranjang dan jika pelanggan menambahkan yang baru, saya ingin mengganti yang lama dengan yang baru. Jadi saya mengganti addAction (dijelaskan di sini seperti ini:

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

}

www.abo-killer.de
sumber