Может ли кто-нибудь помочь?
В Magento 1.5.0.1 я пытаюсь сохранить значение атрибута для настраиваемого продукта. Я добавил свой атрибут к соответствующим продуктам с помощью Admin.
Я посмотрел на Автоматическое изменение атрибута с помощью magento и Программно изменить атрибут продукта на уровне просмотра магазина, поэтому удалось придумать, казалось бы, простой код, который, к сожалению, работает только иногда, а именно для настраиваемых продуктов без цен уровня...
Вот фрагмент кода:
$id = 126; # id of existing product
$product = Mage::getModel('catalog/product')->load($id);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$product->setx_pos(123);
// tried this too, does not make a difference: $product->setData('x_pos', 123);
$product->save();
Это работает отлично, ЕСЛИ настраиваемый продукт не имеет продуктов с ценами уровня. У него могут быть многоуровневые продукты без многоуровневых цен, в этом случае сохранение работает. Если у многоуровневых продуктов есть многоуровневые цены, я получаю исключение:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '126-1-0-5.0000-0' for key 'UNQ_CATALOG_PRODUCT_TIER_PRICE'
Trace:
#0 C:\magento\app\code\core\Mage\Eav\Model\Entity\Abstract.php(1513): Mage_Eav_Model_Entity_Abstract->walkAttributes('backend/afterSa...', Array)
#1 C:\magento\app\code\core\Mage\Catalog\Model\Resource\Eav\Mysql4\Product.php(142): Mage_Eav_Model_Entity_Abstract->_afterSave(Object(Mage_Catalog_Model_Product))
#2 C:\magento\app\code\core\Mage\Eav\Model\Entity\Abstract.php(1013): Mage_Catalog_Model_Resource_Eav_Mysql4_Product->_afterSave(Object (Mage_Catalog_Model_Product))
#3 C:\magento\app\code\core\Mage\Core\Model\Abstract.php(318): Mage_Eav_Model_Entity_Abstract->save(Object(Mage_Catalog_Model_Product))
#4 C:\magento\app\design\frontend\default\OneOffFit\template\page\data.phtml(90): Mage_Core_Model_Abstract->save()
Я погуглил об этой ошибке - единственная ссылка - вопрос без ответа.
Почему в этом случае Magento обновляет уровни цен? Я делаю что-то не так? Должен ли я сначала обновить связанные продукты (у них тот же атрибут, но с неустановленным значением)? Вернее, что мне делать правильно? Кто-нибудь может помочь, пожалуйста?
UNQ_CATALOG_PRODUCT_TIER_PRICE
определен в таблицеcatalog_product_entity_tier_price
, это индекс нескольких столбцов, включаяwebsite_id
. Когда вы меняете текущее хранилище между загрузкой и сохранением объекта, оно рассматривается как новая, альтернативная версия объекта... Ноwebsite_id
, похоже, не обновляется для соответствия, поэтому оно конфликтует с существующей версией, которая нарушение вышеупомянутого уникального ключа. Это не интуитивно понятно и, вероятно, является ошибкой, хотя ее легко обойти. Я думаю об этом как о чем-то неожиданном, что приводит к сбоям. 02.08.2011