致命错误:在非对象上调用成员函数setTemplate()

时间:2013-11-12 20:38:40

标签: magento layout module magento-1.7 block

我在自定义模块中创建了一个块,但它无效。我的模块工作正常,但当我从footer.phtml文件中调用我的块时,我的块无效。它显示'致命错误:在非对象上调用成员函数setTemplate()'。实际上我想在我的前端使用我的自定义块显示一些消息。我已经提到了我的代码

本地/ Monojit /自定义/控制器/ IndexController.php

<?php
class Monojit_Custom_IndexController extends Mage_Core_Controller_Front_Action
{
   public function indexAction()
    {   

        $this->loadLayout();    

        $block = $this->getLayout()->createBlock(
            'Mage_Core_Block_Template',
            'my_block_name_here',
            array('template' => 'custom/test.phtml')
        );

        $this->getLayout()->getBlock('content')->append($block);
        $this->renderLayout();
    }

}
?>

本地/ Monojit /自定义/砌块/ Mycustomblock.php

<?php
class Monojit_Custom_Block_Mycustomblock extends Mage_Core_Block_Template

{
//public function _prepareLayout()
//    {
//      return parent::_prepareLayout();
//    }

    public function _construct() {     
        parent::_construct(); 
        $this->setTemplate('custom/test.phtml');     
    }
    public function getmessage()
     {
       $msg = "showing my custom block";       
       return $msg;
     }   
} 
?>

本地/ Monojit /自定义的/ etc / config.xml中     

<config>

<global>

<modules>

<monojit_custom>

<version>0.1.0</version>

</monojit_custom>

</modules>

<blocks>

<custom>

<rewrite>

<custom>Monojit_Custom_Block_Mycustomblock</custom>

</rewrite>

</custom>

</blocks>
<helpers>
  <custom>
      <class>Monojit_Custom_Helper</class>
  </custom>
</helpers>
</global>

<frontend>

<routers>

<custom>

<use>standard</use>

<args>

<module>Monojit_Custom</module>

<frontName>custom</frontName>

</args>

</custom>

</routers>

<layout>

<updates>

<custom>

<file>custom.xml</file>

</custom>

</updates>

</layout>

</frontend>

</config>

我在frontend / default / monojit中创建了一个主题(复制的现代主题)更改了管理设计配置,并在skin内创建了必要的文件夹.screenshot pic enter image description here

设计/前端/默认/ monojit /模板/自定义/ test.phtml

//want to fetch data from my block 
<p>This is your custom block called programatically.</p>

localhost / magento / index.php / custom页面正确显示我的消息,但是当我从footer.phtml页面调用我的块时

<?php echo $this->getLayout()->createBlock('custom/mycustomblock')->setTemplate('custom/test.phtml')->toHtml(); ?>

它显示'致命错误:在非对象上调用成员函数setTemplate()'我是否需要创建任何layout.xml文件?请帮助我如何解决我的问题。谢谢

2 个答案:

答案 0 :(得分:1)

您的块未创建,createBlock返回非对象值。这是因为您没有指定自定义命名空间类前缀。 XML配置中的块节点应该类似于

<blocks>
    <custom>
        <class>Monojit_Custom_Block</class>
    </custom>
</blocks>

这意味着自定义命名空间下的所有内容都将使用Monojit_Custom_Block前缀创建,因此custom / mycustomblock =&gt; Monojit_Custom_Block_Mycustomblock。

但是使用createBlock通常是不好的做法,最好使用布局文件:

答案 1 :(得分:0)

尝试:

在layout / page.xml中设置块,例如:

<block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml">
    <block type="my_module/block_links" name="my_block_name" as="my_block_name" template="page/template/links.phtml"/>          
</block> 

在您的phtml文件中使用以下代码

<?php echo $this->getChildHtml('my_block_name') ?>