2

我正在使用来自外部服务器的 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 方法来完成此操作,但到目前为止我遇到了同样的错误。

4

1 回答 1

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();
于 2013-05-29T20:59:05.290 回答