在Magento错误中更新属性

时间:2013-05-29 16:51:41

标签: php magento attributes

我正在使用来自外部服务器的json请求来更新Magento中的产品(请不要问为什么我们不只是使用api的...)而我现在正在尝试更新属性信息,似乎是资源摘要中的_uniqueCheck()方法失败了。问题是我不知道如何解决它。以下代码

$attribute_model = Mage::getModel('eav/entity_attribute');
$attributeId = $attribute_model->getIdByCode('catalog_product', $attribute_code);
$attribute = $attribute_model->load($attributeId);

$attribute->setData($data)->save();

导致以下错误:

[29-May-2013 16:32:00 UTC] PHP Fatal error:  Uncaught exception 'Mage_Core_Exception' with message 'Attribute with the same code already exists.' in .../app/Mage.php:594
Stack trace:
#0 .../app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(676): Mage::throwException('Attribute with ...')
#1 .../app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(424): Mage_Core_Model_Resource_Db_Abstract->_checkUnique(Object(Mage_Eav_Model_Entity_Attribute))
#2 .../app/code/core/Mage/Core/Model/Abstract.php(318): Mage_Core_Model_Resource_Db_Abstract->save(Object(Mage_Eav_Model_Entity_Attribute))
#3 .../app/code/local/Valoran/Import/Model/Attribute.php(25): Mage_Core_Model_Abstract->save()
#4 .../app/code/local/Valoran/Harmony/Model/Messaging/Attributeset.php(115): Valoran_Import_Model_Attribute->_create(Array)
#5 .../app/code/local/Valoran/Harmony/Model/Messaging/Attributeset.php(23): Valoran_Harmony_Model_Messaging_Attribut in .../app/Mage.php on line 594

这对我来说很令人沮丧,因为我知道所有代码都已存在,我正在尝试进行更新,这就是我调用的原因 - > load($ id)....

有没有人对我在这里缺少的东西有任何想法?我现在正在探索使用Mage_Eav_Model_Entity_Setup :: updateAttribute方法来完成此任务,但到目前为止我遇到了同样的错误。

1 个答案:

答案 0 :(得分:1)

我看到发生这种情况的两个可能原因。它们都与setData()方法的使用有关。当您使用数组作为参数调用它时,它将只替换模型的受保护属性$_data。此属性包含加载/保存到数据库的所有信息。

我怀疑您的$data变量中没有entity_attribute_id密钥。如果调用setData()时就是这种情况,则删除已加载属性的id。您可能正在使用已由系统中其他属性使用的attribute_code。 无论如何,当您保存属性magento检查entity_attribute_id时,如果它是空的,magento假定您要创建新属性,以便它对新属性执行验证。这导致找到具有相同代码的属性是非法的并且抛出错误。此属性可能是您加载的属性,但您删除了entity_attribute_id属性或其他具有相同attribute_code

的属性

如果您不想使用Mage_Eav_Model_Entity_Setup::updateAttribute,可以尝试拨打

$attribute = $attribute_model->load($attributeId);
$data['entity_attribute_id'] = $attribute->getEntityAttributeId();
$attribute->setData($data)->save();