Magento2-プログラムで製品がカートに追加されないようにする方法


13

私がしたいのは、カスタム属性が引用で設定されている場合、カートに商品を追加したくないです。カスタム属性が正しく設定されています。

製品がカートに追加されないようにするために、このイベントを監視するオブザーバーを作成しました controller_action_predispatch_checkout_cart_add

私のオブザーバーファイルコード:

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

このコードでは、カートへの追加プロセスを停止できません。

したがって、Magento1のこの回答に従って-https : //stackoverflow.com/questions/14190358/stop-add-to-cart-and-supply-message-to-user-in-magento 。交換してみました

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

(これはそれを行う最良の方法ではありません。より良い方法がある場合は、提案してください)

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

これにより、最終的にカートに追加プロセスが停止しますが、カートに追加ボタンは引き続き「追加中」を表示し続けます。カートに追加ボタンが以前の状態に戻り、製品もカートに追加されないようにするには、これを正しく実行するにはどうすればよいですか?

ここに画像の説明を入力してください


こんにちは@reenaあなたがそれをどうやってやったのか私を助けてくれますか
mcoder '18

@mcoder-プラグインでやった。詳細については、以下の承認済み回答を参照してください。
Reena Parekh

私が試みたが、行うことはできません、あなたが、私が試したものを見ると、私は同じ問題を持っていることをどうやっ助け私を喜ばせることができます。magento.stackexchange.com/questions/111231/...を 、それは働いていなかった
mcoder

私はそれが私が2日間立ち往生していますが、それを行うことができませんでした:(、AJAX追加カートのURLへのリダイレクト1未満にしようとしたgoogle.comのような外部のURLにリダイレクトしたい私はあなたのための助けを寄付しようとします。
mcoder

どうすれば解決策を得ることができますか?すべてのファイルのコードを教えていただけますか?私は同じ問題を抱えています
Jigs Parmar 2018年

回答:


22

製品パラメーターをfalseに設定してから、return_urlパラメーターを設定してみてください。

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

カートコントローラーは、製品パラメーターがここで設定されているかどうかを確認します。https//github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L99

そうでない場合は、goBackを呼び出します。goBackメソッドは、あなたがajaxリクエストを行ったかどうかを確認し(そうしたと思います)、ajaxレスポンスで追加のパラメーターbackUrlを返します。

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

次に、getBackUrlメソッドがreturn_urlパラメータを返します。

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

===更新===

ここではメッセージの追加が機能しないので、別の方法を試してください(これもより簡単です)。

この関数の前にIntercetpへのプラグインを作成します。https//github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Model/Cart.php#L341

製品を追加したくない場合は、目的のメッセージで例外をスローするだけです。ここにプラグインを作成するための素晴らしいチュートリアルがあります:http : //alanstorm.com/magento_2_object_manager_plugin_system

製品の追加を中断し、例外をメッセージとしてレンダリングする必要がありますhttps://github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/Controller/Cart/Add.php#L137

次のタイプをモジュールに追加しますetc / frontend / di.xml

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

その後、クラスVendor/Module/Model/Checkout/Cart/Pluginは次のようになります。

<?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
デビッドありがとう。あなたの解決策は機能し、私から賛成です。ただし、エラーメッセージは表示されません。私はこの行のために仮定しています:github.com/magento/magento2/blob/2.0/app/code/Magento/Checkout/…?どうすれば解決できますか?
Reena Parekh 2016

1
はい、jutは別のソリューションを追加しました。これらの変更を適用するには、必ずvar / generationフォルダーと構成キャッシュをクリーンアップしてください
David Verholen

1つ目の方法を使用しましたが、エラーメッセージを取得できませんでした。2つ目の方法で戻りURLとメッセージを設定するにはどうすればよいですか。
Amit Singh

1
ここでカスタムオプションの値を取得するにはどうすればよいですか。
anujeet 2017

+1絶対に素晴らしい!完璧なソリューション(更新)。2.1.5で動作します。
デイブ

2

以下は、カートへの製品の追加を停止し、オブザーバーを使用してエラーメッセージを表示するための私のコードです。

<?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.'));
            }
        }
    }
}

商品がカートに追加されないように、要件に従って条件を設定できます。


これでうまくいきました。
ハッサンアルジェシ

0

最後の3行のコードを削除する

そして、次の1行を追加します。falseを返します。そして、製品パラメーターの値を設定します:falseエラーメッセージが表示され、ローダーが非表示になります...ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.