Magento2 - Bir ürünün programa sepete eklenmesini nasıl durdurabilirim?


13

Ne yapmak istiyorum benim özel özniteliği teklif ayarlanırsa o zaman herhangi bir ürün sepete eklenmesini istemiyorum. Özel özelliğim doğru ayarlanmış.

Ürünün sepete eklenmesini durdurmak için bu etkinliği gözlemleyen bir Gözlemci yazdım controller_action_predispatch_checkout_cart_add

Gözlemci dosya kodum:

public function execute(\Magento\Framework\Event\Observer $observer) {
    $addedItemId = $observer->getRequest()->getParam('product');
    $quote       = $this->_cart->getQuote();

    if(!empty($quote)) {
        $customAttribute = $quote->getData('custom_attribute');

        if(!empty($customAttribute)) {
             $controller = $observer->getControllerAction();
             $storeId     = $this->_objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore()->getId();
             $product    = $this->_productRepository->getById($addedItemId, false, $storeId);
             $observer->getRequest()->setParam('product', null);

             $this->_messageManager->addError(__('This product cannot be added to your cart.'));
             echo false;            

             $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
             $this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');          
        }
    }       
}

Bu kod ile, sepete ekle işlemini durduramıyorum.

Magento1'in bu cevabına göre - /programming/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento . Değiştirmeyi denedim

$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), 'checkout/cart/index');  

ile (Bu yapmanın en iyi yolu değildir. Daha iyi bir yol varsa, lütfen önerin)

header("Location: " . $product->getProductUrl());
die();

Bu sonuçta sepete ekle işlemini durdurur, ancak sepete ekle düğmesi "Ekleme" yi göstermeye devam eder . Sepete ekle düğmesinin önceki durumuna dönmesi ve ürünün de sepete eklenmemesi için bunu nasıl doğru şekilde yapabilirim?

resim açıklamasını buraya girin


merhaba @reena bunu nasıl yaptığını bana yardımcı olabilir
mcoder

@mcoder - Bir eklenti ile yaptım. daha fazla bilgi için aşağıdaki kabul edilen cevaba başvurabilirsiniz.
Reena Parekh

denedim ama yapamam nasıl bana ne denedim gördüğünüz gibi aynı sorunu var nasıl yardımcı olabilir: magento.stackexchange.com/questions/111231/… ama işe yaramadı
mcoder

i google.com gibi harici url yönlendirmek istiyorum ben ajax sepeti url eklemek için yönlendirmek, ben iki gün sıkışmış ama yapamadım :(. ben yardım için bağış yapmaya çalışacağız
mcoder

Nasıl çözüm alabilirsiniz ?? bana tüm dosyayı nereye kod verebilir misiniz? aynı sorunum var
Jigs Parmar

Yanıtlar:


23

ürün parametresini false olarak ayarlayıp sonra return_url parametresini ayarlayabilirsiniz:

$observer->getRequest()->setParam('product', false);
$observer->getRequest()->setParam('return_url', $this->_redirect->getRefererUrl());
$this->_messageManager->addError(__('This product cannot be added to your cart.'));

Alışveriş sepeti denetleyicisi, ürün parametresinin burada ayarlanıp ayarlanmadığını kontrol eder: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99

değilse, goBack'i çağırır. goBack yöntemi, bir ajax isteğinde bulunup bulunmadığınızı (yaptığınızı düşünüyorum) denetler ve ajax yanıtında ek bir param backUrl döndürür.

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L165

GetBackUrl yöntemi daha sonra return_url parametresini döndürür:

https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart.php#L113

=== GÜNCELLEME ===

Tamam, mesaj ekleme burada çalışmadığından, başka bir yol denemelisiniz (ayrıca daha basit)

Bu işlevden önce Intercetp'e bir Eklenti oluşturun: https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341

Ürününüzün eklenmesini istemiyorsanız, istediğiniz Mesaj ile bir İstisna atın. Burada eklentiler oluşturmak için güzel bir öğretici bulabilirsiniz: http://alanstorm.com/magento_2_object_manager_plugin_system

Ürün ekleme işlemi yarıda kesilmeli ve İstisna, https://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137 mesajı olarak işlenmelidir.

modüllerinize etc / frontend / di.xml aşağıdaki türü ekleyin

<type name="Magento\Checkout\Model\Cart">
    <plugin name="interceptAddingProductToCart"
            type="Vendor\Module\Model\Checkout\Cart\Plugin"
            sortOrder="10"
            disabled="false"/>
</type>

O zaman sınıf şöyle Vendor/Module/Model/Checkout/Cart/Plugingörünmelidir:

<?php
namespace Vendor\Module\Model\Checkout\Cart;

use Magento\Framework\Exception\LocalizedException;

class Plugin
{
    /**
     * @var \Magento\Quote\Model\Quote
     */
    protected $quote;

    /**
     * Plugin constructor.
     *
     * @param \Magento\Checkout\Model\Session $checkoutSession
     */
    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession
    ) {
        $this->quote = $checkoutSession->getQuote();
    }

    /**
     * beforeAddProduct
     *
     * @param      $subject
     * @param      $productInfo
     * @param null $requestInfo
     *
     * @return array
     * @throws LocalizedException
     */
    public function beforeAddProduct($subject, $productInfo, $requestInfo = null)
    {
        if ($this->quote->hasData('custom_attribute')) {
            throw new LocalizedException(__('Could not add Product to Cart'));
        }

        return [$productInfo, $requestInfo];
    }
}

1
Teşekkürler David. Çözümünüz çalışıyor, benden oy verin. Ancak, hata iletisi görüntülenmez. Bu satır nedeniyle varsayıyorum: github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/… ? Bunu nasıl çözebilirim?
Reena Parekh

1
evet, jut başka bir çözüm ekledi. Bu değişikliklerin geçerli olması için var / generation klasörünü ve yapılandırma önbelleğini temizlediğinizden emin olun
David Verholen

1. yönteminizi kullandınız, ancak 2. yönteminizde dönüş URL'sini ve iletiyi nasıl ayarlayabilirim?
Amit Singh

1
Burada özel seçenek değerlerini nasıl alabilirim?
anujeet

+1 Kesinlikle mükemmel! Mükemmel çözüm (güncelleme). 2.1.5 ile çalışır.
Dave,

2

Ürünün sepete eklenmesini durdurmak ve gözlemci kullanarak hata mesajı görüntülemek için kodum aşağıdadır.

<?php
use Magento\Framework\Event\ObserverInterface;

class ProductAddCartBefore implements ObserverInterface
{

    protected $_request;
    protected $_checkoutSession;
    protected $_messageManager;

    public function __construct(
        \Magento\Framework\App\RequestInterface $request,  
        \Magento\Framework\Message\ManagerInterface $messageManager,
        \Magento\Checkout\Model\SessionFactory $checkoutSession
    )
    {
        $this->_request = $request;
        $this->_messageManager = $messageManager;
        $this->_checkoutSession = $checkoutSession;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $productId = $observer->getRequest()->getParam('product');

        $quote = $this->_checkoutSession->create()->getQuote();

        $itemsCount = $quote->getItemsSummaryQty();

        if($itemsCount > 0 && $productId != 1949)
        {
            if($quote->hasProductId(1949)) 
            {   
                $observer->getRequest()->setParam('product', false);
                $observer->getRequest()->setParam('return_url', false);
                $this->_messageManager->addErrorMessage(__('To proceed please remove other items from the cart.'));
            }
        }
    }
}

ürünün sepete eklenmesini önlemek için koşulları gereksinimlerinize göre ayarlayabilirsiniz.


Bu benim için çalıştı.
Hassan Al-Jeshi

0

Son üç satır kodunu kaldırın

Ve bu bir satırı ekleyin: return false; Ve ürün param değerini ayarlayın: yanlış Sonra hata mesajı alırsınız ve yükleyici gizlenir ... Teşekkürler

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.