Обновите значение атрибута продукта в сценарии установки
Я пытаюсь обновить значение атрибута для всех товаров во всех магазинах в своем сценарии обновления следующим образом:
$installer = $this;
$installer->startSetup();
$products = Mage::getModel("catalog/product")->getCollection()->addAttributeToSelect('*');
foreach($products as $product) {
$product->setUpRoundingMode(0);
$product->setUpTargetValue(0);
$product->save();
}
$installer->endSetup();
Но я получаю эту ошибку:
Fatal error: Call to a member function getStoreIds() on a non-object in app\code\core\Mage\Catalog\Model\Resource\Abstract.php on line 257
Я использую Magento 1.9. Есть идеи, как это сделать правильно?
4 answers
Я нахожу ответы здесь немного бесполезными, так что вот мои два цента после того, как я столкнулся с этой проблемой.
Если вы используете сценарий настройки для сохранения данных с использованием модели Magento, вы, вероятно, делаете это неправильно. Вместо этого вы должны использовать скрипт данных. Как объясняет Винай в этой жемчужине статьи, разница заключается в следующем:
Детали сценария настройки данных заслуживают отдельного раздела или публикации. В целом, они работают в очень аналогично сценариям настройки схемы. В двух словах, ключевые отличия заключаются в том, что они...
- Находятся под данными/каталогом
- Имеют префикс данных перед именем файла
- Выполняются после настройки среды приложения, непосредственно перед отправкой фронт-контроллера.
Поэтому, если вы используете сценарий установки, например:
app/code/local/You/Module/sql/your_setup_name/mysql4-upgrade-0.1.2-0.1.3.php
Затем вам следует переместить его в другую папку, например:
app/code/local/You/Module/data/your_setup_name/data-upgrade-0.1.2-0.1.3.php
Краткое резюме полезных заметок:
Используйте сценарии установки для:
- Создание таблиц в базе данных
- Вставка данных в базу данных с помощью Zend (или низкоуровневого Magento) ORM (
insert
,delete
и т.д.) - Добавление новых атрибутов
- Изменение существующих атрибутов
Используйте сценарии данных для:
- Обработка данных с помощью моделей Magento
Вы не вызываете функцию нигде в предоставленном вами коде. Я считаю, что ваша ошибка связана с вашим сценарием установки. Что-то запускает функцию getStoreIds() какие-нибудь мысли?
Мое решение состояло в том, чтобы использовать api обновления данных от magento. Учебник можно найти здесь: http://inchoo.net/magento/magento-install-install-upgrade-data-and-data-upgrade-scripts/
У меня была та же проблема, я проследил ее до атрибута msrp_enabled
, сохранить его не удается
Однако я переключился на простое сохранение атрибута, который я на самом деле хочу изменить в настройках, вместо всего продукта, я предполагаю, что это ошибка в magento, или вы не должны сохранять все продукты в настройках
$product->getResource()->saveAttribute($product, 'my_updated_attribute');