Gibt es eine Möglichkeit, mit Magentos einfachem ORM ( Mage_Core_Model_Abstract
und Mage_Core_Model_Resource_Abstract
) Modellzeilen mit einem bestimmten Primärschlüssel einzufügen?
Zum Beispiel, wenn ich folgendes gegen ein leeres Magento-System ausgeführt habe
Mage::getModel('core/website')->setData(array (
'website_id' => 2,
'code' => 'foo',
'name' => 'Main Website',
'sort_order' => 0,
'default_group_id' => 1,
'is_default' => 1,
));
Ich würde einen neuen Eintrag in der core_website
Tabelle erwarten . Magento tut hier jedoch nichts.
Es sieht so aus, als würde ich in der Datenbank-Ressourcenklasse in die Quere kommen
#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
}
Da das Modell eine ID hat (dh, ich gebe eine bestimmte ID ein) und _useIsObjectNew
fest auf false codiert ist, wird meine Speicheranforderung immer an den insert
Pfad weitergeleitet.
Gibt es eine Möglichkeit, eine Einfügung mit den Standard-Magento-Modellen zu erzwingen? (ohne ein Umschreiben / Klassenersatz).
Ja, Raw SQL ist eine Option, aber dann geht die Ereignisfunktionalität verloren.
Antworten:
Also ja. ( edit:) Der Trick besteht darin, eine
Mage_Core_Model_Abstract
Unterklasse zu verwenden, die nicht das ID-Feld hat, das das Ressourcenmodell erwartet:Mage::dispatchEvent('website_save_commit_after', [...])
Dies ist das einzige Ereignis, bei dem ich sehe, dass es im Kern verbraucht wird. Es könnte so einfach sein, wie mit zu folgenAuf jeden Fall brauche ich eine Dusche.
quelle
forsedSave
gist.github.com/astorm/5219357 . Hat das für Sie funktioniert oder war es nur eine Theorie?Varien_Object
statt der anderen Modellklasse eine zu verwenden und dann die nicht abgeschriebenesave
Methode der Ressource aufzurufen ?Mage_Core_Model_Abstract
Tipp für das Datenarray enthält.