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의이 대답에 따라 - /programming/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-플러그인으로 해냈습니다. u 자세한 내용은 아래의 답변을 참조하십시오.
Reena Parekh

내가 시도했지만 도움을 기쁘게 할 수 할 수 없어 당신은 내가 뭘하려 보는 바와 같이 나는이 같은 문제를 가지고 어떻게했는지 : magento.stackexchange.com/questions/111231/...을 하지만 일을하지 않았다
mcoder

난, 난 이틀 동안 붙어있다가 아약스 추가 카트 URL로 리디렉션 한 아래 시도 google.com과 같은 외부 URL로 리디렉션 할 수 있지만 :( 그것을 할 수 없었다 내가 도움을 당신을 위해 기부하려고합니다.
mcoder

어떻게 솔루션을 얻을 수 있습니까? 모든 파일 whith 코드를 줄 수 있습니까? 같은 문제가 있습니다
Jigs Parmar

답변:


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에 플러그인을 작성 하십시오.

제품을 추가하지 않으려면 원하는 메시지와 함께 예외를 throw하십시오. 당신은 여기에 플러그인을 만드는 좋은 튜토리얼을 찾을 수 있습니다 : 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

1
예, jut는 다른 솔루션을 추가했습니다. var에 / 생성 폴더와 이러한 변경을 적용해야하는 구성 캐시를 청소해야합니다
데이비드 Verholen

첫 번째 방법을 사용했지만 오류 메시지를 얻을 수 없습니다. 두 번째 방법에서 반환 URL과 메시지를 어떻게 설정합니까?
Amit Singh

1
여기서 사용자 정의 옵션 값을 얻는 방법을 알 수 있습니까?
anujeet

+1 절대적으로 훌륭합니다! 완벽한 솔루션 (업데이트). 2.1.5에서 작동합니다.
Dave

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

제품이 장바구니에 추가되지 않도록 요구 사항에 따라 조건을 설정할 수 있습니다.


이것은 나를 위해 일했습니다.
Hassan Al-Jeshi

0

마지막 세 줄 코드를 제거하십시오.

그리고이 한 줄을 추가하십시오 : return false; 그리고 제품 매개 변수의 값을 설정하십시오 : false 그러면 오류 메시지가 표시되고 로더가 숨겨집니다 ... 감사합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.