Magento 2: Как получить идентификатор продукта предложения в observer?

#magento #magento2 #observers

#magento #magento2 #наблюдатели

Вопрос:

Идентификатор продукта не отображается и из-за этой ошибки **{«0»: «Предупреждение: неверный аргумент, предоставленный для foreach () ** пожалуйста, помогите мне выйти из этого.

Здесь я хочу вернуть, если код атрибута не равен 5431.

Итак, как это возможно.

 <?php

namespace SoftadroitPrescriptionObserver;

use MagentoFrameworkEventObserverInterface;
use MagentoFrameworkEventObserver as EventObserver;
use PsrLogLoggerInterface;

class Orderplaceafter implements ObserverInterface
{
    protected $_responseFactory;
    protected $_url;

    public function __construct(
        MagentoFrameworkAppResponseFactory $responseFactory,
        MagentoFrameworkUrlInterface $url
    ) {
        $this->_responseFactory = $responseFactory;
        $this->_url = $url;
    }
    
    public function execute(MagentoFrameworkEventObserver $observer)
    {       
        $event = $observer->getEvent();
        $objectManager = MagentoFrameworkAppObjectManager::getInstance();
        $_checkoutSession = $objectManager->create('MagentoCheckoutModelSession');
        $_quoteFactory = $objectManager->create('MagentoQuoteModelQuoteFactory');
        
        //$quote = $block->getQuoteData();
        /* $quote= $observer->getEvent()->getQuote();
        $item = $quote->getAllVisibleItems();
        foreach($item  as $_item){
        echo $_item->getProduct()->getId(); */
        
        $event = $observer->getEvent();
        //$item = $event->getQuoteItem();
        foreach($event->getQuoteItem()  as $_item){
        $product = $objectManager->create('MagentoCatalogModelProduct')->load($_item->getProductId());
                
        $is_priscription = $product->getData('prescription');
        if($is_priscription != '5431'){
                return;
            }
        }
        
        if ($quote->getId()) {
            $quote->setIsActive(1)->setReservedOrderId(null)->save();
            $_checkoutSession->replaceQuote($quote);
            $url = $this->_url->getUrl('prescription/index'); //('[ModuleName]/[ModuleName]/[[Action]');
            $this->_responseFactory->create()->setRedirect($url)->sendResponse();
            die();
        }
    }
}

  

Любая помощь действительно ценится

Заранее спасибо!

Следующий шаг

Это мой обновленный код, я получаю идентификатор продукта здесь, теперь я хочу, чтобы, если идентификатор параметра атрибута продукта не равен 5431, то перенаправлять на страницу успеха, то есть (order-success), и если идентификатор параметра orroduct равен 5431, то перенаправлять на URL, определенный ниже (рецепт / индекс)

 <?php

namespace SoftadroitPrescriptionObserver;

use MagentoFrameworkEventObserverInterface;
use MagentoFrameworkControllerResultFactory;
use MagentoFrameworkEventObserver as EventObserver;
use MagentoFrameworkAppObjectManager;
use PsrLogLoggerInterface;

class Orderplaceafter implements ObserverInterface
{
    protected $_responseFactory;
    protected $_url;
    protected $_order;

    public function __construct(
        MagentoFrameworkAppResponseFactory $responseFactory,
        MagentoFrameworkUrlInterface $url,
        MagentoSalesApiDataOrderInterface $order
    ) {
        $this->_responseFactory = $responseFactory;
        $this->_url = $url;
        $this->_order = $order;
    }
    
    public function execute(MagentoFrameworkEventObserver $observer)
    {       
        $event = $observer->getEvent();
        $objectManager = MagentoFrameworkAppObjectManager::getInstance();
        $_checkoutSession = $objectManager->create('MagentoCheckoutModelSession');
        $_quoteFactory = $objectManager->create('MagentoQuoteModelQuoteFactory');
                    
        $orderid = $observer->getEvent()->getOrderIds();
        $order = $this->_order->load($orderid);
        
        foreach($order->getItemsCollection() as $_item){        
        $product = $_item->getProductId();  
        
        //echo $_item->getName(); die();
        
        $is_priscription =  $_item->getProduct()->getMyCustomAttribute('prescription'); 
        
        
        if($is_priscription != '5431'){
        
            $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
            $resultRedirect->setPath('order-success');
            return $resultRedirect;
            }
        }
        
        $order = $_checkoutSession->getLastRealOrder();
        $quote = $_quoteFactory->create()->loadByIdWithoutStore($order->getQuoteId());
        
        if ($quote->getId()) {
            $quote->setIsActive(1)->setReservedOrderId(null)->save();
            $_checkoutSession->replaceQuote($quote);
            $url = $this->_url->getUrl('prescription/index'); //('[ModuleName]/[ModuleName]/[[Action]');
            $this->_responseFactory->create()->setRedirect($url)->sendResponse();
            die();
        }
    }
}
  

Комментарии:

1. Как называется событие observer

2. имя наблюдателя: softadroit_order_success и имя события: checkout_onepage_controller_success_action

Ответ №1:

Если вы наблюдаете событие checkout_onepage_controller_success_action , у вас нет прямого доступа к предложению. Только для заказа. И вы также не можете получить его из экземпляра сеанса проверки, потому что предложение удаляется из сеанса до отправки события.
Но вы можете получить предложение через заказ.

сначала вам понадобится добавить репозиторий предложений в качестве зависимости к вашему observer

 private $quoteRepository;
public function __construct(
    MagentoQuoteApiCartRepositoryInterface $quoteRepository,
    ....
) {
    $this->quoteRepository = $quoteRepository;
    ....
}
  

Затем в execute методе вы можете сделать это

 $order = $observer->getOrder();
$quoteId = $order->getQuoteId();
$quote = $this->qupteRepository->get($quoteId);
if ($quote amp;amp; $quote->getId()) {
    $items = $quote->getAllItems();
    //loop through items ....
}
  

Это даст вам то, что вы пытаетесь сделать.

Но я думаю, что лучшей идеей было бы не использовать предложение и продукты, чтобы получить то, что вам нужно.
Вы должны сохранить значение атрибута товара в предложении при его добавлении в корзину, а затем перенести его в элемент заказа, созданный на основе элемента с предложением.
Таким образом, в вашем observer вы можете выполнить, $order = $observer->getOrder() а затем перебрать элементы заказа $order->getAllItems() и проверить, что вам нужно.

Комментарии:

1. if ($quote amp;amp; $quote->getId()) { $items = $quote->getAllItems(); //перебирать элементы …. } здесь, если мне нужно обновить имя элемента, то что я должен сделать. пожалуйста, помогите.

Ответ №2:

Пожалуйста, попробуйте это ниже:

 <?php

namespace SoftadroitPrescriptionObserver;

use MagentoFrameworkEventObserverInterface;
use MagentoFrameworkEventObserver as EventObserver;
use PsrLogLoggerInterface;

class Orderplaceafter implements ObserverInterface
{
    protected $_responseFactory;
    protected $_url;

    public function __construct(
        MagentoFrameworkAppResponseFactory $responseFactory,
        MagentoFrameworkUrlInterface $url,
        MagentoQuoteModelQuoteRepository $quoteRepository,
        MagentoSalesModelOrderFactory $orderFactory,
        MagentoCheckoutModelSession $checkoutSession
    ) {
        $this->_responseFactory = $responseFactory;
        $this->_url = $url;
        $this->quoteRepository = $quoteRepository;
        $this->orderFactory = $orderFactory;
        $this->checkoutSession = $checkoutSession;
    }
    
    public function execute(MagentoFrameworkEventObserver $observer)
    {       
        $event = $observer->getEvent();

        $orderIds = $observer->getEvent()->getOrderIds();
        $order = $this->orderFactory->create()->load($orderIds[0]);

        $quote = $this->quoteRepository->get($order->getQuoteId());
        
        $item = $quote->getAllItems();

        foreach($item  as $_item){
        $product = $_item->getProduct();
                
        $is_priscription = $product->getData('prescription');
        if($is_priscription != "" amp;amp; $is_priscription == '5431'){
                return;
            }
        }
        
        if ($quote->getId()) {
            $quote->setIsActive(1)->setReservedOrderId(null)->save();
            $this->checkoutSession->replaceQuote($quote);
            $url = $this->_url->getUrl('prescription/index'); 
            $this->_responseFactory->create()->setRedirect($url)->sendResponse();
            die();
        }
    }
}
  

После этого, пожалуйста, запустите php bin / magento setup:upgrade

Комментарии:

1. {«0»: «Произошла ошибка типа при создании объекта: Softadroit \ Prescription \ Observer \Orderplaceater»,»1″ Из-за этой ошибки

2. пожалуйста, запустите php bin / magento setup:upgrade

3. Опять оба перенаправляют на одну и ту же страницу

4. $is_priscription = $_item->getProduct()->getMyCustomAttribute('prescription'); Это не получает никакого значения в echo, я думаю, вот в чем проблема, не могли бы вы, пожалуйста, проверить это

5. Вы можете получить эти данные следующим образом: $is_priscription = $_item->getProduct()-> getData(‘рецепт’); ИЛИ $is_priscription = $_item->getProduct()-> getPrescription();