我如何使用Magento的集合对象

时间:2012-03-28 11:09:06

标签: php magento

我正在研究magento的自定义管理模块,并尝试同时学习magento方法=)。我目前正在使用CE 1.6版本。

我已经阅读了几篇教程和文章并设法设置了一个自定义数据库表,我认为我管理了make collection类。 (我应该说我是Zend Framework / Magento的新手和初学者熟练的程序员)。至少下面的代码得到了正确的结果:

$department_collection = Mage::getModel('custom/systemconfig')->getCollection()
                            ->addFilter('name','departments');

当我用$department_collection->getData() var_dump时,我得到一个包含来自我的数据库的过滤行的数组。

现在,当我尝试这样做时:

foreach ($department_collection as $department) {
        $department->delete();
    }

我从Magento得到一个例外:

-Warning:include(Mage \ Upperfield \ Model \ Systemconfig.php)[function.include]:无法打开流:D:\ wamp \ www \ magento \ lib \ Varien \ Autoload中没有此类文件或目录。第93行的PHP

问题是,我想我的目录结构设置错误,但只是不明白它是什么。跟踪并没有多大帮助,因为它是串联的,只显示相关的信息。

我的目录结构如下所示:

+app
  +code
     +local
       +Namespace
         +Module
           +Model
             +Mysql4
                +Systemconfig
                   Collection.php
                Systemconfig.php
             Systemconfig.php

我已经加载了我的模型:

//file: ../Mysql4/Systemconfig.php
class Namespace_Module_Model_Mysql4_Systemconfig extends Mage_Core_Model_Mysql4_Abstract{
    protected function _construct()
    {
        $this->_init('module/systemconfig', 'systemconfig_id');
    }
}



// file: ../Mysql4/Systemconfig/Collection.php
class Namespace_Module_Model_Mysql4_Systemconfig_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract {
    protected function _construct()
    {
        $this->_init('namespace/systemconfig');
    }
}

我的config.xml目前看起来像这样(摘录):

<models>
  <module>
        <class>Namespace_Module_Model</class>
    <resourceModel>module_mysql4</resourceModel>
</module>

<module_mysql4>
    <class>Namespace_Module_Model_Mysql4</class>
    <entities>
        <systemconfig>
            <table>module_systemconfig</table>
        </systemconfig>
    </entities>
</module_mysql4>

我的猜测是: 我用错误的结构设置了集合类,或者 我很想念如何使用集合对象。

那里有什么可以向我解释这里发生了什么? 感谢任何帮助。

祝你好运 ADDE

2 个答案:

答案 0 :(得分:2)

您得到的错误来自不正确的xml定义或类命名/文件结构 - 这应该是相同的。当Autoloader读取你的config.xml并查看你在config.xml中告诉它的位置时,它没有找到它正在寻找的文件。

关于集合及其父模型的一些信息,如果它有帮助:

如果您直接使用集合,则应使用:

$_collection = Mage::getResourceModel('namespace/model_collection');

如果你正在使用一个获取集合数据的模型,并修改数据(例如总结,添加额外数据,删除等等),你应该像这样调用模型:

$_collection = Mage::getModel('namespace/model')->getCollection();

无论哪种方式,在config.xml中,您需要定义您正在使用资源模型以及应该使用哪些表(如果您有自定义表)。您永远不必编写新的集合来与默认的Magento表交互,因为已经有可以调用或扩展的集合(不推荐,您应该使用Observers)。

以下是config.xml中正确的集合定义的示例:

<models>
    <modulename>
        <resourceModel>modulename_mysql4</resourceModel>
    </modulename>
    <modulename_mysql4>
        <class>Namespace_ModuleName_Model_Mysql4</class>
        <entities>
            <modulename>
                <table>modulename_custom</table>
            </modulename>
        </entities>
    </modulename_mysql4>
</models>
<resources>
    <modulename_setup>
        <setup>
            <module>Namespace_ModuleName</module>
        </setup>
        <connection>
            <use>core_setup</use>
        </connection>
    </modulename_setup>
    <modulename_write>
        <connection>
            <use>core_write</use>
        </connection>
    </modulename_write>
    <modulename_read>
        <connection>
            <use>core_read</use>
        </connection>
    </modulename_read>
</resources>

在这个文件中,我写的内联定义和节点必须这样写,你不能有一个返回,它必须是同一行。这是Magento自动加载器工作方式的一个小缺点。

希望这有帮助!

答案 1 :(得分:1)