¿Hay alguna manera de usar el ORM simple de Magento ( Mage_Core_Model_Abstract
y Mage_Core_Model_Resource_Abstract
) para insertar filas de modelo con una clave primaria específica?
Por ejemplo, si ejecuté lo siguiente contra un sistema Magento vacío
Mage::getModel('core/website')->setData(array (
'website_id' => 2,
'code' => 'foo',
'name' => 'Main Website',
'sort_order' => 0,
'default_group_id' => 1,
'is_default' => 1,
));
Esperaría una nueva entrada en la core_website
tabla. Sin embargo, Magento silenciosamente no hace nada aquí.
Excavando en el recurso, parece que estoy cayendo en conflicto con esto en la clase de recurso de base de datos
#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
}
Debido a que el modelo tiene una identificación (es decir, estoy insertando una identificación específica), y debido a que _useIsObjectNew
está codificado como falso, mi solicitud de guardar siempre se enruta a la insert
ruta.
¿Hay alguna forma de forzar una inserción con los modelos Magento predeterminados? (sin una reescritura / reemplazo de clase).
Sí, el SQL sin formato es una opción, pero luego se pierde la funcionalidad del evento.
Respuestas:
Así que sí. ( editar :) El truco consiste en utilizar una
Mage_Core_Model_Abstract
subclase que no tenga el campo id que el modelo de recurso espera:Mage::dispatchEvent('website_save_commit_after', [...])
es el único evento que veo que se consume en el núcleo Podría ser tan simple como seguir conEn cualquier caso, necesito una ducha.
fuente
forsedSave
gist.github.com/astorm/5219357 . ¿Funcionó esto para usted o fue solo una teoría?Varien_Object
clase de modelo en lugar de otra diferente y luego llamar alsave
método no depreciado del recurso ?Mage_Core_Model_Abstract
sugerencias de tipo para la matriz de datos.