Czy istnieje sposób użycia prostego ORM Magento ( Mage_Core_Model_Abstract
i Mage_Core_Model_Resource_Abstract
) do wstawienia wierszy modelu za pomocą określonego klucza głównego?
Na przykład, jeśli uruchomiłem poniższe polecenie na pustym systemie Magento
Mage::getModel('core/website')->setData(array (
'website_id' => 2,
'code' => 'foo',
'name' => 'Main Website',
'sort_order' => 0,
'default_group_id' => 1,
'is_default' => 1,
));
Spodziewałbym się nowego wpisu w core_website
tabeli. Jednak Magento po cichu nic tu nie robi.
Zagłębiając się w zasób, wygląda na to, że popadam w błąd w klasie zasobów bazy danych
#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
}
Ponieważ model ma identyfikator (tzn. Wstawiam konkretny identyfikator), a ponieważ _useIsObjectNew
jest zakodowany na fałsz, moje żądanie zapisu jest zawsze kierowane do insert
ścieżki.
Czy istnieje sposób, aby wymusić wstawienie przy użyciu domyślnych modeli Magento? (bez przepisywania / zastępowania klas).
Tak, surowy SQL jest opcją, ale wtedy funkcjonalność zdarzenia zostaje utracona.
Odpowiedzi:
Więc tak. ( edycja :) Sztuczka polega na użyciu
Mage_Core_Model_Abstract
podklasy, która nie ma pola identyfikatora oczekiwanego przez model zasobów:Mage::dispatchEvent('website_save_commit_after', [...])
to tylko wydarzenie, które widzę, że jest konsumowane w rdzeniu Może to być tak proste, jak wykonanieW każdym razie potrzebuję prysznica.
źródło
forsedSave
gist.github.com/astorm/5219357 jest podobny identyfikator . Czy to zadziałało dla ciebie, czy była to tylko teoria?Varien_Object
zamiast innej klasy modelu, a następnie wywołujeszsave
metodę amortyzacji zasobu ?Mage_Core_Model_Abstract
podpowiedzi typu dla tablicy danych.