Existe-t-il un moyen d'utiliser l'ORM simple de Magento ( Mage_Core_Model_Abstract
et Mage_Core_Model_Resource_Abstract
) pour insérer des lignes de modèle avec une clé primaire spécifique?
Par exemple, si j'ai exécuté ce qui suit sur un système Magento vide
Mage::getModel('core/website')->setData(array (
'website_id' => 2,
'code' => 'foo',
'name' => 'Main Website',
'sort_order' => 0,
'default_group_id' => 1,
'is_default' => 1,
));
Je m'attendrais à une nouvelle entrée dans le core_website
tableau. Cependant, Magento ne fait rien en silence ici.
En creusant dans la ressource, il semble que je tombe dans la classe de ressources de base de données
#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
}
Parce que le modèle a un identifiant (c'est-à-dire que j'insère un identifiant spécifique), et parce qu'il _useIsObjectNew
est codé en dur sur faux, ma demande de sauvegarde est toujours acheminée vers le insert
chemin.
Existe-t-il un moyen de forcer une insertion avec les modèles Magento par défaut? (sans réécriture / remplacement de classe).
Oui, le SQL brut est une option, mais la fonctionnalité d'événement est alors perdue.
Réponses:
Donc voilà. ( modifier :) L'astuce consiste à utiliser une
Mage_Core_Model_Abstract
sous - classe qui n'a pas le champ id que le modèle de ressource attend:Mage::dispatchEvent('website_save_commit_after', [...])
est le seul événement que je vois être consommé dans le noyau. Cela pourrait être aussi simple que de suivreDe toute façon, j'ai besoin d'une douche.
la source
forsedSave
gist.github.com/astorm/5219357 . Est-ce que cela a fonctionné pour vous ou était-ce juste une théorie?Varien_Object
au lieu de la classe de modèle différente, puis d'appeler lasave
méthode non dépréciée de la ressource ?Mage_Core_Model_Abstract
un indice de type pour le tableau de données.