我想在第一时间在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>
答案 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