1

在 Magento 中创建贷项通知单时,您可以选择退还购买的产品并自动将其添加回库存。但是,一旦创建了贷项凭证,它只显示产品是否已退款,而不会显示是否已退回库存。我正在尝试修改此行为并显示它。

我为此编写了一个自定义扩展。它通过安装脚本向 Magento creditmemo_item 添加了一个自定义的“returned_to_stock”属性,如下所示:

<?php

 $installer = $this;
 $installer->startSetup();

 $installer->addAttribute('creditmemo_item', 
                          'returned_to_stock', 
                           array('type' => 'int', 
                                 'grid' => true, 
                                 'source' => 'adminhtml/system_config_source_yesno'
                                 )
                         );
 $installer->getConnection()->addColumn($installer->getTable('sales/creditmemo_item'), 'returned_to_stock', 'TINYINT(1) unsigned DEFAULT 0');

 $installer->endSetup();

然后我设置了一个观察者来触发'sales_order_creditmemo_save_after'事件:

   <events>
        <sales_order_creditmemo_save_after>
            <observers>
                ....
            </observers>
        </sales_order_creditmemo_save_after>
    </events> 

在观察者中,我有以下公共函数,它是默认 Magento 退款OrderInventory 函数的略微修改版本:

<?php

public function refundOrderInventory($observer)
{
    $creditmemo = $observer->getEvent()->getCreditmemo();
    $items = array();
    foreach ($creditmemo->getAllItems() as $item) {
        $return = false;
        if ($item->hasBackToStock()) {
            if ($item->getBackToStock() && $item->getQty()) {
                $return = true;
            }
        } elseif (Mage::helper('cataloginventory')->isAutoReturnEnabled()) {
            $return = true;
        }
        if ($return) {
            $item->setReturnedToStock(1); // This doesn't work
        }
    }
} 

这个想法是,当观察者被触发并执行此函数时,它应该将 sales_flat_creditmemo_item Magento 表中自定义属性“returned_to_stock”的值设置为 1。但是,由于某种原因,该值没有被保存(如前所述在上面的代码中)。我尝试了许多变体,例如:

        if ($return) {
            // None of these work either
            $item->setReturnedToStock(1)->save();
            $item->setData('returned_to_stock', 1);
            $item['returned_to_stock'] = 1;
            $item->save();
        }    

但这些都不起作用。

我知道观察者被正确地解雇了,因为我已经在 Magento 日志中做了一个条目。只是属性存储被破坏了。

我知道这与这个问题几乎相同我的代码主要基于那里的答案,但如上所述,前一个问题的答案并不完全有效(因此,请不要t 将其标记为重复;我尝试在原始问题下发布,但我的帖子已被删除)。

我花了几个小时试图让它工作,我觉得我非常接近让它工作。我将不胜感激任何帮助。

非常感谢您提前。

更新(已解决)

好的,我最终设法弄清楚了。要将“returned_to_stock”属性的值存储在数据库中,请修改观察者函数的最后一位,如下所示:

        if ($return) {
            $item->setData('returned_to_stock', 1);
            $item->save();
        }

希望这将有助于其他人尝试实现相同的功能。

4

1 回答 1

1

这个问题在过去对我来说一直是个问题。

当我查看您的代码时,我看到的第一件事是不正确的属性类型:creditmemo_item. 如果您查看eav_entity_type表格,您会发现这不存在。sales/order_creditmemo_item不是一个 eav 实体。您无需为其创建属性。相反,您创建的列就足够了。

我期待 Magento 缓存是您的问题。完全清除所有缓存(系统 > 缓存管理 > 刷新缓存存储)。不幸的是,我花了几个小时进行故障排除,全部发现 Magento 正在使用缓存来确定表结构(用于速度优化),因此不查找更新的列。

于 2013-09-17T15:36:09.477 回答