Magento - 显示项目是否已退回到信用备忘录库存

时间:2013-09-17 15:14:09

标签: php magento

在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 refundOrderInventory函数的略微修改版本:

<?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日志中输入后会被正确触发。它只是存储破坏的属性。

我知道这与this one几乎是同一个问题,我在很大程度上将我的代码建立在那里的答案上,但如上所述,前一个问题的答案并未完全奏效(因此,请不要将其标记为重复;我已尝试在原始问题下发帖但我的帖子已被删除)。

我花了好几个小时试图让它工作,我觉得我非常接近使它工作。我非常感谢任何帮助。

非常感谢您提前。

更新(已解决)

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

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

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

1 个答案:

答案 0 :(得分:1)

这个问题在过去一直是我的问题。

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

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