$ product = Mage :: getModel(' catalog / product') - > load($ this-> getProductId());
load()将在load()函数内部进入Mage_Core_Model_Abstract,
public function load($id, $field=null)
{
$this->_beforeLoad($id, $field);
$this->_getResource()->load($this, $id, $field);
$this->_afterLoad();
$this->setOrigData();
$this->_hasDataChanges = false;
return $this;
}
现在这应该去抽象类Mage_Catalog_Model_Resource_Abstract扩展Mage_Eav_Model_Entity_Abstract,其中定义了加载过程:
public function load($object, $entityId, $attributes = array())
{
Varien_Profiler::start('__EAV_LOAD_MODEL__');
/**
* Load object base row data
*/
$select = $this->_getLoadRowSelect($object, $entityId);
$row = $this->_getReadAdapter()->fetchRow($select);
...
if (empty($attributes)) {
$this->loadAllAttributes($object);
} else {
foreach ($attributes as $attrCode) {
$this->getAttribute($attrCode);
}
}
$this->_loadModelAttributes($object);
...
}
但我无法理解
$this->_getResource()->load($this, $id, $field); in Mage_Core_Model_Abstract
连接到抽象类Mage_Catalog_Model_Resource_Abstract ???
因为load($this, $id, $field)
将转到abstract class Mage_Core_Model_Resource_Db_Abstract extends Mage_Core_Model_Resource_Abstract
:
public function load(Mage_Core_Model_Abstract $object, $value, $field = null)
{
if (is_null($field)) {
$field = $this->getIdFieldName();
}
$read = $this->_getReadAdapter();
if ($read && !is_null($value)) {
$select = $this->_getLoadSelect($field, $value, $object);
$data = $read->fetchRow($select);
if ($data) {
$object->setData($data);
}
}
$this->unserializeFields($object);
请帮帮我。
答案 0 :(得分:2)
产品型号(目录/产品)中有_construct方法。创建对象时会触发此方法。它显示了要使用的资源模型:
$this->_init('catalog/product');
接下来,在load方法的Mage_Core_Model_Abstract中,有一个表达式$ this-> _getResource()。它可以带回类的对象 Mage_Catalog_Model_Resource_Product(继而来自Mage_Catalog_Model_Resource_Abstract)。
基本上,每个模型都可以拥有自己的资源模型和自己的类。