Utiliser l'ORM de Magento pour insérer un champ d'identification spécifique

14

Existe-t-il un moyen d'utiliser l'ORM simple de Magento ( Mage_Core_Model_Abstractet 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_websitetableau. 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 _useIsObjectNewest codé en dur sur faux, ma demande de sauvegarde est toujours acheminée vers le insertchemin.

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.

Alan Storm
la source
Pourquoi essayez-vous d'attribuer un ID à un champ d'auto-incrémentation? S'il s'agit d'une dépendance en aval, ne devez-vous pas simplement créer l'enregistrement, puis récupérer le PK généré automatiquement?
Ralph Tice
@RalphTice Oui, ce serait probablement la bonne chose à faire pour une utilisation quotidienne.
Alan Storm

Réponses:

5

Donc voilà. ( modifier :) L'astuce consiste à utiliser une Mage_Core_Model_Abstractsous - classe qui n'a pas le champ id que le modèle de ressource attend:

$evil = Mage::getModel('core/store'); // that's a store object, baby!
$evil->setData(
    array (
        'website_id' => 99,
        'code' => 'foo',
        'name' => 'Main Website9',
        'sort_order' => 0,
        'default_group_id' => 1,
        'is_default' => 1,
    )
);

Mage::getResourceModel('core/website')->forsedSave($evil);

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 suivre

Mage::getModel('core/website')->setData($evil->getData())->afterCommitCallback();

De toute façon, j'ai besoin d'une douche.

Benmarks
la source
1
Une fois que vous êtes propre - je ne suis pas sûr de le suivre - il y a une vérification d'identité similaire dans forsedSave gist.github.com/astorm/5219357 . Est-ce que cela a fonctionné pour vous ou était-ce juste une théorie?
Alan Storm
Modifié ma réponse pour la rendre plus évidente.
benmarks
... et cela a fonctionné pour moi.
benmarks
Ah ha, c'est ce que j'obtiens en tapant mon propre code au lieu de copier et coller. En utilisant cela comme point de départ, pouvez-vous voir une raison de ne pas utiliser une Varien_Objectau lieu de la classe de modèle différente, puis d'appeler la saveméthode non dépréciée de la ressource ?
Alan Storm
Et répondre à ma propre question ci-dessus, c'est parce que la méthode de sauvegarde de la ressource générique a Mage_Core_Model_Abstractun indice de type pour le tableau de données.
Alan Storm