Belirli Bir Kimlik Alanı Eklemek için Magento'nun ORM'sini Kullanma


14

Belirli bir birincil anahtarla model satırları eklemek için Magento'nun basit ORM'sini ( Mage_Core_Model_Abstractve Mage_Core_Model_Resource_Abstract) kullanmanın bir yolu var mı ?

Örneğin, aşağıdakileri boş bir Magento sistemine karşı çalıştırırsam

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_websiteTabloda yeni bir giriş beklerdim . Ancak, Magento sessizce burada hiçbir şey yapmaz.

Kaynağa girerken, veritabanı kaynak sınıfında bundan düşüyorum gibi görünüyor

#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
}

Modelin bir kimliği olduğu için (yani belirli bir kimlik ekliyorum) ve _useIsObjectNewsabit olarak false değerine kodlandığından, kaydetme isteğim her zaman yola yönlendirilir insert.

Bir ucu varsayılan Magento modelleriyle zorlamanın bir yolu var mı? (yeniden yazma / sınıf değiştirme olmadan).

Evet, ham SQL bir seçenektir ancak olay işlevselliği kaybolur.


Neden bir otomatik görüntüleme alanına bir kimlik atamaya çalışıyorsunuz? Bu bir aşağı akım bağımlılığıysa, yalnızca kaydı oluşturup otomatik olarak oluşturulmuş PK'yi almamalısınız?
Ralph Tice

@RalphTice Evet, muhtemelen günlük kullanım için yapılacak doğru şey budur.
Alan Storm

Yanıtlar:


5

Yani evet. ( edit :) Hile, Mage_Core_Model_Abstractkaynak modelinin beklediği kimlik alanına sahip olmayan bir alt sınıf kullanmaktır :

$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', [...])özünde tüketildiğini gördüğüm tek olay. Aşağıdaki gibi basit olabilir

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

Her halükarda, duşa ihtiyacım var.


1
Temizlendikten sonra - bunu takip ettiğimden emin değilim - forsedSave gist.github.com/astorm/5219357'de benzer bir kimlik kontrolü var . Bu senin için işe yaradı mı yoksa sadece bir teori miydi?
Alan Storm

Cevabımı daha açık hale getirmek için düzenledi.
benmarks

... ve benim için işe yaradı.
benmarks

Ah ha, kopyalayıp yapıştırmak yerine kendi kodumu yazmak için aldım. Bunu bir başlangıç ​​noktası olarak kullandığınızda Varien_Object, farklı model sınıfı yerine kullanılmaması ve daha sonra kaynağın amortismana tabi tutulmamış saveyöntemini çağırmak için herhangi bir neden görebiliyor musunuz?
Alan Storm

Ve yukarıdaki kendi soruma cevap vermek, bunun nedeni, genel kaynağın kaydetme yönteminin Mage_Core_Model_Abstractveri dizisi için tür ipucu içermesidir.
Alan Storm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.