【发布时间】: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();
}
希望这将有助于其他尝试实现相同功能的人。
【问题讨论】: