今天我再次与Magento战斗:)我找到了
之间的区别$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);
和
$product = Mage::getModel('catalog/product')->load($product_id);
任何人都可以在这两种方法之间取得进展吗?我发现当我通过sku加载产品时,当我尝试用更改的数据重新保存它时,我得到错误异常'Varien_Exception',消息'无效方法Varien_Object ::保存在app \ code \ core \ Mage \ CatalogInventory \ Model \ Observer.php(153):Varien_Object-> __ call('save',Array)这是真的,因为一旦你尝试通过sku加载,那么另一个观察者将产品的库存项目设置为Varien_Object,这看起来像陷阱或我只是不明白它,但
我每天从它的开始做Magento开发,所以我对系统了解很多,这对我来说是新的。在此先感谢Jaro。
答案 0 :(得分:17)
有趣。虽然这两种方法都会为您提供一个具有满载EAV数据的单个产品模型实例(如果loadByAttribute()
的第三个参数未通过或者是*
),则添加库存相关数据的观察者会因此而异。产品与产品集合,但两个库存信息对象都添加到产品数据键“stock_item”。这是有争议的,但这感觉就像一个错误。我认为Mage_CatalogInventory_Model_Observer::saveInventoryData()
或Mage_CatalogInventory_Model_Observer::_prepareItemForSave()
可以解决此问题。
您可以使用stock_item
对象在产品实例上完全设置产品库存项来解决此问题。
答案 1 :(得分:1)
loadByAttribute
是一个严重的误称,因为它实际上不会触发load()
;而是使用getResourceCollection()
:
public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
$collection = $this->getResourceCollection()
->addAttributeToSelect($additionalAttributes)
->addAttributeToFilter($attribute, $value)
->setPage(1,1);
因为它不会触发与load()
关联的观察者事件,所以它意味着结果产品对象不包含您可能需要的全部产品数据。就我而言,我需要“描述”属性,但不包含该属性。
有几种解决方法:
使用其他方法通过SKU加载:
$product = Mage::getModel("catalog/product");
$product->load($product->getIdBySku("whatever"));
通过访问Magento Admin > Catalog > Attributes > Edit attribute > "Used in Product Listing" = "Yes"
,然后重新编制索引,将所需的属性数据强制包含在默认产品资源数据中。然后,您应该能够使用loadByAttribute()
使用属性数据(至少在前端)。