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 个名字,你就可以开始了。