【问题标题】:Magento does not load config.xml properly and getResourceModel returns falseMagento 没有正确加载 config.xml 并且 getResourceModel 返回 false
【发布时间】:2015-07-19 12:32:09
【问题描述】:

请!!!我被这个问题困扰了大约一个月。

我原来的问题是 Mage::getResourceModel() 返回 false。我尝试了一切,但无法成功。

然后我开始追踪与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>

谢谢。

【问题讨论】:

    标签: magento magento-1.5 magento-1.6


    【解决方案1】:

    config.xml中没有module_resource NODE

        </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>
    

    节点

    【讨论】:

    • 您好,感谢您的回答,在我修复了 xml 后,它通过了前一个断点,然后遇到了新错误“致命错误:调用非对象中的成员函数 getConnection() ' ...当我跟踪代码时,它位于第 323 行的 Resource/DB/Abstract.php 中的这一行 '$this->_resources->getConnection($connectionName);' ...似乎 _resources 为空...这个问题的可能性有多大?设置任何特殊配置以使其正常工作?我指的是核心模块,没有任何额外的东西就可以工作了......筋疲力尽...... :(
    【解决方案2】:

    要获取 Collection,您还需要通过模型配置对其进行定义。简单地说你需要 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 个类名,你就可以走了。

    【讨论】:

    • 您好,感谢您的回复,我拥有所有这些文件但没有工作...我目前正在做的只是创建一个模型,设置一些值并保存到数据库...这就是全部 '$_tran = Mage::getModel('mymodule/mymodel'); ...分配一些值... $_tran->save();'
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多