在 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();
}
希望这将有助于其他人尝试实现相同的功能。