在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();
}
希望这有助于其他人尝试实现相同的功能。
答案 0 :(得分:1)
这个问题在过去一直是我的问题。
当我查看您的代码时,我看到的第一件事是属性类型不正确:creditmemo_item
。如果你查看eav_entity_type
表,你会发现它不存在。 sales/order_creditmemo_item
不是eav实体。您无需为其创建属性。相反,您创建的列就足够了。
我期待Magento缓存是你的问题。完全清除所有缓存(系统&gt;缓存管理&gt;刷新缓存存储)。不幸的是,我花了几个小时进行故障排除,都发现Magento正在使用缓存来确定表结构(用于速度优化),因此不会查找更新的列。