如何解决Magento 2:如何在观察者中获取报价产品ID?
产品ID未显示,并通过此错误** {“ 0”:“警告:为foreach()提供的参数无效**,请帮我解决这个问题。
如果属性代码不等于5431,我想在这里返回。
那怎么可能。
<?php
namespace Softadroit\Prescription\Observer;
use Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Event\Observer as EventObserver;
use Psr\Log\LoggerInterface;
class Orderplaceafter implements ObserverInterface
{
protected $_responseFactory;
protected $_url;
public function __construct(
\Magento\Framework\App\ResponseFactory $responseFactory,\Magento\Framework\UrlInterface $url
) {
$this->_responseFactory = $responseFactory;
$this->_url = $url;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$event = $observer->getEvent();
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$_checkoutSession = $objectManager->create('\Magento\Checkout\Model\Session');
$_quoteFactory = $objectManager->create('\Magento\Quote\Model\QuoteFactory');
//$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('Magento\Catalog\Model\Product')->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();
}
}
}
我们非常感谢您的帮助
预先感谢!
下一步
这是我更新的代码,我在这里获取产品ID,现在我想如果产品属性选项ID不等于5431,然后重定向到成功页面,即(订单成功),并且如果oroduct选项ID等于5431,然后重定向到下面定义的网址(处方/索引)
<?php
namespace Softadroit\Prescription\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Controller\ResultFactory;
use \Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\App\ObjectManager;
use Psr\Log\LoggerInterface;
class Orderplaceafter implements ObserverInterface
{
protected $_responseFactory;
protected $_url;
protected $_order;
public function __construct(
\Magento\Framework\App\ResponseFactory $responseFactory,\Magento\Framework\UrlInterface $url,\Magento\Sales\Api\Data\OrderInterface $order
) {
$this->_responseFactory = $responseFactory;
$this->_url = $url;
$this->_order = $order;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$event = $observer->getEvent();
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$_checkoutSession = $objectManager->create('\Magento\Checkout\Model\Session');
$_quoteFactory = $objectManager->create('\Magento\Quote\Model\QuoteFactory');
$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();
}
}
}
解决方法
如果您正在观察事件checkout_onepage_controller_success_action
,则没有直接访问报价的权限。只给订单。而且您也无法从Checkout会话实例中获取它,因为在调度事件之前,已从会话中删除了报价。
但是您可以通过订单获取报价。
您将需要首先添加报价存储库作为对观察者的依赖
private $quoteRepository;
public function __construct(
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,....
) {
$this->quoteRepository = $quoteRepository;
....
}
然后,在execute
方法中,您可以执行此操作
$order = $observer->getOrder();
$quoteId = $order->getQuoteId();
$quote = $this->qupteRepository->get($quoteId);
if ($quote && $quote->getId()) {
$items = $quote->getAllItems();
//loop through items ....
}
这将为您提供尝试要做的事情。
但是我认为一个更好的主意是不要使用报价和产品来获得所需的东西。
将产品属性值添加到购物车后,应将其保存在报价单上,然后将其转换为通过报价单创建的订单项。
这样,在观察者中,您可以执行$order = $observer->getOrder()
,然后遍历订单项$order->getAllItems()
并检查所需内容。
请尝试以下操作:
<?php
namespace Softadroit\Prescription\Observer;
use Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Event\Observer as EventObserver;
use Psr\Log\LoggerInterface;
class Orderplaceafter implements ObserverInterface
{
protected $_responseFactory;
protected $_url;
public function __construct(
\Magento\Framework\App\ResponseFactory $responseFactory,\Magento\Framework\UrlInterface $url,\Magento\Quote\Model\QuoteRepository $quoteRepository,\Magento\Sales\Model\OrderFactory $orderFactory,\Magento\Checkout\Model\Session $checkoutSession
) {
$this->_responseFactory = $responseFactory;
$this->_url = $url;
$this->quoteRepository = $quoteRepository;
$this->orderFactory = $orderFactory;
$this->checkoutSession = $checkoutSession;
}
public function execute(\Magento\Framework\Event\Observer $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 != "" && $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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。