Magento 未正确加载 config.xml 并且 getResourceModel returns 错误
Magento does not load config.xml properly and getResourceModel returns false
拜托!!!我被这个问题困扰了大约一个月。
我原来的问题是Mage::getResourceModel()
returns错误。我什么都试过了,还是没成功。
然后我开始追踪与getResourceModel()
函数相关的核心类。
我在 Config.php _getResourceModelFactoryClassName()
函数中结束,它从 $this->_xml->global->models object
.
读取 XML
我var_dump那个XML,发现其他模块有_resource
属性,但我的模块没有。
["weee"]=>
object(Mage_Core_Model_Config_Element)#143 (2) {
["class"]=>
string(15) "Mage_Weee_Model"
["resourceModel"]=>
string(13) "weee_resource"
}
["weee_resource"]=>
object(Mage_Core_Model_Config_Element)#144 (3) {
["class"]=>
string(24) "Mage_Weee_Model_Resource"
["deprecatedNode"]=>
string(11) "weee_mysql4"
["entities"]=>
object(Mage_Core_Model_Config_Element)#150 (2) {
["tax"]=>
object(Mage_Core_Model_Config_Element)#175 (1) {
["table"]=>
string(8) "weee_tax"
}
["discount"]=>
object(Mage_Core_Model_Config_Element)#172 (1) {
["table"]=>
string(13) "weee_discount"
}
}
}
["module"]=>
object(Mage_Core_Model_Config_Element)#146 (2) {
["class"]=>
string(12) "Namespace_Module_Model"
["resourceModel"]=>
string(11) "module_resource"
}
在上面的代码中 ["module"] 是我的自定义模块,它没有像 ["weee_resource"]
这样的资源
<global>
<models>
<module>
<class>Namespace_Module_Model</class>
<resourceModel>module_resource</resourceModel>
</module>
</models>
<module_resource>
<class>Namespace_Module_Model_Resource</class>
<deprecatedNode>cb_mysql4</deprecatedNode>
<entities>
<payment>
<table>acs_transaction</table>
</payment>
</entities>
</module_resource>
谢谢。
config.xml
中没有module_resource节点
</models>
<module_resource>
这个声明是错误的
您的 modules_resource 需要进入模型节点
<global>
<models>
<your_module>
<class>Namespace_Module_Model</class>
<resourceModel>your_module_resource</resourceModel>
</your_module>
<your_module_resource >
<class>Namespace_Module_Model_Resource</class>
<deprecatedNode>cb_mysql4</deprecatedNode>
<entities>
<payment>
<table>acs_transaction</table>
</payment>
</entities>
</your_module_resource >
</models>
之后您可以在
中定义资源和数据库表
<global>
<resources>
节点
要获取集合,您还需要通过模型配置定义它。简单地说你需要 3 个文件:
Mynamespace/Mymodule/Model/Mymodel.php
Mynamespace/Mymodule/Model/Resource/MyModel.php
Mynamespace/Mymodule/Model/Resource/MyModel/Collection.php
Mynamespace/Mymodule/Model/Mymodel.php 需要实现 _init() 方法并指向正确的资源模型;
class Mynamespace_Mymodule_Model_MyModel
extends Mage_Core_Model_Abstract {
public function _construct() {
$this->_init('mymodule/mymodel');
}
}
然后在 Mynamespace/Mymodule/Model/Resource/Mymodel.php 中需要指向正确的资源(table 或 eav)
class Mynamespace_Mymodule_Model_Resource_Mymodel
extends Mage_Core_Model_Resource_Db_Abstract
{
public function _construct() {
$this->_init('mymodule/mymodel', 'entity_id'); // entity_id - autoincrement column
}
}
您需要的最后一个文件是
Mynamespace/Mymodule/Model/Resource/Mymodel/Collection.php 文件
class Mynamespace_Mymodule_Model_Resource_Mymodel_Collection
extends Mage_Core_Model_Resource_Db_Collection_Abstract
{
public function _construct() {
$this->_init('mymodule/mymodel');
}
}
如果您想测试它,只需创建一个 test.php 文件和 运行
var_dump(get_class(Mage::getModel('mymodule/mymodel'));
var_dump(get_class(Mage::getResourceModel('mymodule/mymodel'));
var_dump(get_class(Mage::getModel('mymodule/mymodel')->getCollection());
如果你得到 3 个 class 个名字,你就可以开始了。
拜托!!!我被这个问题困扰了大约一个月。
我原来的问题是Mage::getResourceModel()
returns错误。我什么都试过了,还是没成功。
然后我开始追踪与getResourceModel()
函数相关的核心类。
我在 Config.php _getResourceModelFactoryClassName()
函数中结束,它从 $this->_xml->global->models object
.
我var_dump那个XML,发现其他模块有_resource
属性,但我的模块没有。
["weee"]=>
object(Mage_Core_Model_Config_Element)#143 (2) {
["class"]=>
string(15) "Mage_Weee_Model"
["resourceModel"]=>
string(13) "weee_resource"
}
["weee_resource"]=>
object(Mage_Core_Model_Config_Element)#144 (3) {
["class"]=>
string(24) "Mage_Weee_Model_Resource"
["deprecatedNode"]=>
string(11) "weee_mysql4"
["entities"]=>
object(Mage_Core_Model_Config_Element)#150 (2) {
["tax"]=>
object(Mage_Core_Model_Config_Element)#175 (1) {
["table"]=>
string(8) "weee_tax"
}
["discount"]=>
object(Mage_Core_Model_Config_Element)#172 (1) {
["table"]=>
string(13) "weee_discount"
}
}
}
["module"]=>
object(Mage_Core_Model_Config_Element)#146 (2) {
["class"]=>
string(12) "Namespace_Module_Model"
["resourceModel"]=>
string(11) "module_resource"
}
在上面的代码中 ["module"] 是我的自定义模块,它没有像 ["weee_resource"]
这样的资源<global>
<models>
<module>
<class>Namespace_Module_Model</class>
<resourceModel>module_resource</resourceModel>
</module>
</models>
<module_resource>
<class>Namespace_Module_Model_Resource</class>
<deprecatedNode>cb_mysql4</deprecatedNode>
<entities>
<payment>
<table>acs_transaction</table>
</payment>
</entities>
</module_resource>
谢谢。
config.xml
中没有module_resource节点 </models>
<module_resource>
这个声明是错误的 您的 modules_resource 需要进入模型节点
<global>
<models>
<your_module>
<class>Namespace_Module_Model</class>
<resourceModel>your_module_resource</resourceModel>
</your_module>
<your_module_resource >
<class>Namespace_Module_Model_Resource</class>
<deprecatedNode>cb_mysql4</deprecatedNode>
<entities>
<payment>
<table>acs_transaction</table>
</payment>
</entities>
</your_module_resource >
</models>
之后您可以在
中定义资源和数据库表<global>
<resources>
节点
要获取集合,您还需要通过模型配置定义它。简单地说你需要 3 个文件:
Mynamespace/Mymodule/Model/Mymodel.php
Mynamespace/Mymodule/Model/Resource/MyModel.php
Mynamespace/Mymodule/Model/Resource/MyModel/Collection.php
Mynamespace/Mymodule/Model/Mymodel.php 需要实现 _init() 方法并指向正确的资源模型;
class Mynamespace_Mymodule_Model_MyModel
extends Mage_Core_Model_Abstract {
public function _construct() {
$this->_init('mymodule/mymodel');
}
}
然后在 Mynamespace/Mymodule/Model/Resource/Mymodel.php 中需要指向正确的资源(table 或 eav)
class Mynamespace_Mymodule_Model_Resource_Mymodel
extends Mage_Core_Model_Resource_Db_Abstract
{
public function _construct() {
$this->_init('mymodule/mymodel', 'entity_id'); // entity_id - autoincrement column
}
}
您需要的最后一个文件是
Mynamespace/Mymodule/Model/Resource/Mymodel/Collection.php 文件
class Mynamespace_Mymodule_Model_Resource_Mymodel_Collection
extends Mage_Core_Model_Resource_Db_Collection_Abstract
{
public function _construct() {
$this->_init('mymodule/mymodel');
}
}
如果您想测试它,只需创建一个 test.php 文件和 运行
var_dump(get_class(Mage::getModel('mymodule/mymodel'));
var_dump(get_class(Mage::getResourceModel('mymodule/mymodel'));
var_dump(get_class(Mage::getModel('mymodule/mymodel')->getCollection());
如果你得到 3 个 class 个名字,你就可以开始了。