1

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

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

1 回答 1

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

于 2013-07-12T14:28:44.200 回答