通过 Magento2.3 中的“catalog_product_save_after”事件更新观察者中的 IsInStock 属性

Posted

技术标签:

【中文标题】通过 Magento2.3 中的“catalog_product_save_after”事件更新观察者中的 IsInStock 属性【英文标题】:Update IsInStock attribute in observer by 'catalog_product_save_after' event in Magento2.3 【发布时间】:2022-01-20 09:53:20 【问题描述】:

我已在 Magento 2.3.4 中尝试过此代码

    在 Dapl\Shortdurability\etc\adminhtml 中创建了 events.xml

2.在 Dapl\Shortdurability\Observer 中创建 Productsaveafter.php

<?php
namespace Dapl\Shortdurability\Observer;

    use Magento\Framework\Event\ObserverInterface;
    use Magento\Catalog\Model\ResourceModel\Product\Action;
    use Magento\CatalogInventory\Model\Stock\StockItemRepository;

class Productsaveafter implements ObserverInterface
        
    private $action;
    private $stockItemRepository;
   
    public function __construct(
        StockItemRepository $stockItemRepository,
        Action $action
    )
    
        $this->action = $action;
        $this->stockItemRepository = $stockItemRepository;
     
    
    public function execute(\Magento\Framework\Event\Observer $observer)
    
        $_product = $observer->getProduct(); 
        $_id = $_product->getId(); // for Id
        $_shortdurability = $_product->getShortdurability();
        $_visibility = $_product->getVisibility();
        $_qty = $this->stockItemRepository->get($_id);
        $quantity = $_qty->getQty();
        if(($_shortdurability == 1) && ($quantity == 0))
        
            $this->action->updateAttributes([$_id], ['visibility' => 1], 0);
            
         else 
            $this->action->updateAttributes([$_id], ['visibility' => 4], 0);
            //$this->action->updateAttributes([$_id], ['quantity_and_stock_status' => ['is_in_stock' => 1]], 1);
        
       

嗨。我不能使用 save 方法来设置 IsInStock 属性值。因为,它会无限循环。最后我已经尝试了每一种方法。但是库存状况没有改变。 我也试过 updateStockItemBySku($sku, $stockItem), updateAttributes([$_id], ['quantity_and_stock_status' => ['is_in_stock' => 1]], 1)。 请帮我。我已经从谷歌搜索了它,但我仍然无法在 Magento 2.3.4 中更新产品的 IsInStock 属性。

【问题讨论】:

【参考方案1】:

这是因为您使用的是 catalog_product_save_after。因此,在产品保存时,您将再次保存,并且再次发生此称为瓶颈的事件。我建议使用不同的事件。或者使用 catalog_product_save_before 事件并设置$_product-&gt;setSku("testNew1");并且不保存 $product 对象。

【讨论】:

是的。这是对的。我已经尝试过了。但我想更新库存状态(IsInStock)属性。请帮我解决这个问题。【参考方案2】:
$product = $observer->getProduct();
$product->setStockData(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $yourQty, 'is_in_stock' => 1]);

【讨论】:

以上是关于通过 Magento2.3 中的“catalog_product_save_after”事件更新观察者中的 IsInStock 属性的主要内容,如果未能解决你的问题,请参考以下文章

升级后,Magento 2.4.2 显示空白结帐表

Magento 2.3.2 PayPal Payflow 付款失败

在 Windows 10 上安装 Magento 2.3 后的空白管理页面

magento 2.3安装测试数据

Magento 2.3 发货

从sql数据库中删除列后如何更新模型