Есть ли способ использовать простой ORM ( Mage_Core_Model_Abstract
и Mage_Core_Model_Resource_Abstract
) Magento для вставки строк модели с определенным первичным ключом?
Например, если я запустил следующее против пустой системы Magento
Mage::getModel('core/website')->setData(array (
'website_id' => 2,
'code' => 'foo',
'name' => 'Main Website',
'sort_order' => 0,
'default_group_id' => 1,
'is_default' => 1,
));
Я ожидаю новую запись в core_website
таблице. Тем не менее, Magento молча ничего не делает здесь.
Копаясь в ресурсе, похоже, что я не согласен с этим в классе ресурсов базы данных
#File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php
if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) {
//update stuff here
}
else
{
//insert stuff here
}
Поскольку модель имеет идентификатор (т. Е. Я вставляю конкретный идентификатор), и поскольку _useIsObjectNew
она жестко запрограммирована на false, мой запрос на сохранение всегда направляется в insert
путь.
Есть ли способ принудительной вставки с моделями по умолчанию Magento? (без переписывания / замены класса).
Да, необработанный SQL - вариант, но тогда функциональность событий теряется.
Ответы:
Так что да. ( edit :) Хитрость заключается в использовании
Mage_Core_Model_Abstract
подкласса, который не имеет поля id, которого ожидает модель ресурса:Mage::dispatchEvent('website_save_commit_after', [...])
это единственное событие, которое я вижу в ядре. Это может быть так же просто, как следовать сВ любом случае мне нужен душ.
источник
forsedSave
gist.github.com/astorm/5219357 . Это сработало для вас, или это была просто теория?Varien_Object
вместо другого класса модели, а затем вызывать метод, который не является устаревшимsave
?Mage_Core_Model_Abstract
подсказку типа для массива данных.