【问题标题】:Magento - Show Whether Item Has Been Returned to Stock on Credit MemoMagento - 在贷项凭证上显示项目是否已退回库存
【发布时间】:2013-09-22 02:41:16
【问题描述】:

在 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();
        }

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

【问题讨论】:

    标签: php magento


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的建议,SwiftOtter。不幸的是,这与缓存无关——我已经刷新了缓存并手动删除了 /var/cache 的内容,但“returned_to_stock”属性的值仍然没有保存。关于属性 - creditmemo_item 在 eav_entity_type 表中;我不确定我是否遗漏了什么?
    • 好的,我设法弄明白了!这很好地保存了 'returned_to_stock' 属性: if ($return) { $item->setData('returned_to_stock', 1); $项目->保存(); } 我也要更新原来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多