WedX - журнал о программировании и компьютерных науках

Значение атрибута сохранения Magento программно вызывает ошибку SQL

Может ли кто-нибудь помочь?

В 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 обновляет уровни цен? Я делаю что-то не так? Должен ли я сначала обновить связанные продукты (у них тот же атрибут, но с неустановленным значением)? Вернее, что мне делать правильно? Кто-нибудь может помочь, пожалуйста?


  • Обычный способ написания сеттеров в Magento — это верблюжий регистр, для x_pos это должно быть setXPos(123). Эта педантичность не отвечает на ваш вопрос, но может помочь будущим разработчикам, которые проверят ваш код. 01.08.2011

Ответы:


1

Переместите эту строку над командой загрузки;

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

Или, если вас не интересуют значения для конкретного магазина, удалите его вообще.

01.08.2011
  • большое спасибо! Это перемещение setCurrentStore каким-то образом решило мою проблему. На данный момент меня не волнуют несколько магазинов, но я думаю, что видел код либо на StackOverflow, либо в Magento, как работать с несколькими магазинами. Не могли бы вы подсказать, почему это помогло - я хотел бы больше понять, что происходит. Еще раз спасибо, VladJ 02.08.2011
  • Ключ проблемы UNQ_CATALOG_PRODUCT_TIER_PRICE определен в таблице catalog_product_entity_tier_price, это индекс нескольких столбцов, включая website_id. Когда вы меняете текущее хранилище между загрузкой и сохранением объекта, оно рассматривается как новая, альтернативная версия объекта... Но website_id, похоже, не обновляется для соответствия, поэтому оно конфликтует с существующей версией, которая нарушение вышеупомянутого уникального ключа. Это не интуитивно понятно и, вероятно, является ошибкой, хотя ее легко обойти. Я думаю об этом как о чем-то неожиданном, что приводит к сбоям. 02.08.2011

  • 2

    в моем случае, когда я помещаю следующий код чуть выше загрузки продукта, ошибка исчезает, но браузеру требуется так много времени, чтобы остановиться. Наконец, атрибут также не обновляется.

    Есть идеи, что происходит с кодом?

    $productId = Mage::getModel('catalog/product')->getIdBySku('68366');
    $product =  Mage::getModel('catalog/product')->load($productId);
    $product->setMyAttribute('test')
        ->save();
    
    04.01.2012
  • Вы нашли ответ? У меня та же проблема: установка значения пользовательского атрибута, а затем save() не обновляет значение. 18.12.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]