在magento中创建模块时出错

时间:2013-07-12 12:46:44

标签: php magento

我想在第一时间在magento中创建自定义模块,但我有一些错误。     我在这里提到了我所有的模块代码,它让我感到非常恐怖     “致命错误:在/var/www/magentotest/app/code/local/Mycustommodule/Helloworld/Block/Monblock.php中的非对象上调用成员函数setOrder()”

pls help me.


(A) directory structure
===============================================================
1. in app/code/local
Mycustommodule/Helloworld/etc/config.xml
Mycustommodule/Helloworld/controllers/IndexController.php
Mycustommodule/Helloworld/Model/Helloworld.php
Mycustommodule/Helloworld/Model/Mysql4/Helloworld.php
Mycustommodule/Helloworld/Model/Mysql4/Helloworld/Collection.php
Mycustommodule/Helloworld/Block/Monblock.php

2. in design 

app/design/frontend/default/default/template/helloworld/view.phtml
app/design/frontend/default/default/layout/helloworld.xml

3. my table is 
id_mycustommodule_helloworld    nom     prenom  telephone
1                               abc     s1      435355353
2                               fgh     s2      55555

===================================================================

(B) now my code
===============================================================

1. config.xml
**************

<?xml version="1.0" ?>
<config>
    <modules>
        <Mycustommodule_Helloworld>
            <version>0.0.1</version>
        </Mycustommodule_Helloworld>
    </modules>

    <frontend>
        <routers>
            <helloworld>
                <use>standard</use>
                <args>
                    <module>Mycustommodule_Helloworld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>

        <!-- This node contains module layout configuration -->
        <layout>
            <updates>
                <!-- module alias -->
                <helloworld>
                    <!-- File for loading -->
                    <file>helloworld.xml</file>
                </helloworld>
            </updates>
        </layout>
    </frontend>
    <global>

        <models>
            <helloworld>
                 <class>Mycustommodule_Helloworld_Model</class>
                 <resourceModel>helloworld_mysql4</resourceModel>
             </helloworld>
             <helloworld_mysql4>
                 <class>Mycustommodule_Helloworld_Model_Mysql4</class>
                 <entities>
                     <helloworld>
                       <table>mycustommodule_helloworld</table>
                     </helloworld>
                  </entities>
            </helloworld_mysql4> 
        </models>

        <resources>

            <helloworld_setup>
                <setup>
                  <module>Mycustommodule_Helloworld</module>
                </setup>
                <connection>
                  <use>core_setup</use>
                </connection>
            </helloworld_setup>

            <helloworld_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </helloworld_write>

            <helloworld_read>
              <connection>
                 <use>core_read</use>
              </connection>
            </helloworld_read>
        </resources>
        <blocks>
             <helloworld>
                  <class>Mycustommodule_Helloworld_Block</class>
             </helloworld>
        </blocks>
  </global>
</config>


2. IndexController.php
***********************

<?php
class Mycustommodule_Helloworld_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $this->loadLayout();
        $this->renderLayout();
    }
    public function methodAction()
    {
          echo "block called";
    }
}
?>

3. Mycustommodule/Helloworld/Model/Helloworld.php
**************************************************
<?php
class Mycustommodule_Helloworld_Model_Helloworld extends Mage_Core_Model_Abstract
{
     public function _construct()
     {
         parent::_construct();
         $this->_init('helloworld/helloworld');
     }
}
?>

4. Mycustommodule/Helloworld/Model/Mysql4/Helloworld.php
**************************************************
<?php
class Mycustommodule_Helloworld_Model_Mysql4_Helloworld extends Mage_Core_Model_Mysql4_Abstract
{
     public function _construct()
     {
         $this->_init('helloworld/helloworld', 'id_MyCustomModule_helloworld');
     }
}
?>

5. Mycustommodule/Helloworld/Model/Mysql4/Helloworld/Collection.php
********************************************************************
<?php
class Mycustommodule_Helloworld_Model_Mysql4_Helloworld_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
 {
     public function _construct()
     {
         parent::_construct();
         $this->_init('helloworld/helloworld');
     }
}
?>

6. Mycustommodule/Helloworld/Block/Monblock.php
********************************************************************
<?php
class Mycustommodule_Helloworld_Block_Monblock extends Mage_Core_Block_Template
{
     public function methodblock()
     {

        $retour='';
        $collection = Mage::getModel('helloworld/helloworld')->getCollection()
                                 ->setOrder('id_mycustommodule_helloworld','asc');

        foreach($collection as $data)
        {
             $retour .= $data->getData('nom').' '.$data->getData('prenom')
                     .' '.$data->getData('telephone').'<br />';
        }
        Mage::getSingleton('adminhtml/session')->addSuccess('Cool Ca marche !!');
        return $retour;
    }
}
?>


7. app/design/frontend/default/default/template/helloworld/view.phtml
********************************************************************

<p>Hello World!</p>

<?php 
 echo $this->methodblock();
?>


8. app/design/frontend/default/default/layout/helloworld.xml
****************************************************************
<?xml version="1.0" ?>
<layout version="0.1.0">

    <helloworld_index_index>
        <reference name="content">
            <block type="helloworld/monblock" name="helloworld" template="helloworld/view.phtml"></block>
        </reference>
    </helloworld_index_index>
</layout>

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

    $collection = Mage::getModel('helloworld/helloworld')->getCollection()
                             ->setOrder('id_mycustommodule_helloworld','asc');

getCollection()未返回集合,很可能是因为没有与新模块关联的资源类。

This article对资源类有一个很好的解释。

我没有对此进行测试,但我认为解决方案就是这样......

您希望在Mycustommodule/Helloworld/Resource/Helloworld/Collection.php中创建类似于

的类
class Mycustomermodule_HelloWorld_Resource_Helloworld_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
    // not the same as PHP's __construct()
    function _construct() {
        $this->_init("helloworld/helloworld", "id_MyCustomModule_helloworld");
    }
}

除了将此节点的值添加到config.xml文件config/global/resources/helloworld/class => Mycustommodule_Helloworld_Resource

之外