Magento自定义模块 - 无法从模板调用块方法

时间:2014-05-19 19:20:48

标签: magento templates

我正在使用自定义模块来显示CMS内容。我有一个自定义前端控制器,按预期工作。我可以从控制器调用各种前端动作。我正在使用现有的模板,它也正在显示它应该。我还加载了一个布局更新xml文件,从中我可以删除我不需要的产品菜单,并为我的自定义块的模板文件添加一个参考块。 / p>

我知道正在加载正确的模板覆盖文件,因为我正在测试以下内容:

<?php echo __FILE__ . " loaded <br>"; ?>

回显正确的文件名。

但是,当我从同一模板文件中调用自定义块方法时,我什么都没得到。

我的模块命名空间/模块是Cmpreshn / Projects。以下是我到目前为止:

配置文件 应用程序/代码/本地/ Cmpreshn /项目的/ etc / config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Cmpreshn_Projects>
            <version>0.1.0</version>
        </Cmpreshn_Projects>
    </modules>
    <frontend>
        <routers>
            <projects>
                <use>standard</use>
                <args>
                    <module>Cmpreshn_Projects</module>
                    <frontName>education</frontName>
                </args>
            </projects>
        </routers>
    <layout>
        <updates>
            <projects>
                <file>projects.xml</file>
            </projects>
        </updates>
    </layout>
    </frontend>
    <global>
        <blocks>
            <projects>
                <class>Projects_Block_List</class>
            </projects> 
        </blocks>
    </global>
</config>

前置控制器 应用程序/代码/本地/ Cmpreshn /项目/控制器/ ProjectsController.php

<?php

    class Cmpreshn_Projects_ProjectsController extends Mage_Core_Controller_Front_Action {

        public function indexAction(){
            $this->listAction();
        }

        public function listAction(){

            echo "list action called<br>";

            /* get request and save params to object */
            $this->request = Mage::app()->getRequest();

            /* layout overrides for this module in app/design/frontend/default/pmc1/layout/projects.xml */
            $this->loadLayout();

            /* use the education template */
            $this->getLayout()->getBlock("root")->setTemplate("page/pmc_education.phtml");

            /* render the layout */
            $this->renderLayout();

        }

    }

XML中的更新 应用程序/设计/前端/默认/ PMC1 /布局/ projects.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
    <projects_projects_list>
        <remove name="top.menu"/>
        <reference name="content">
            <block type="page/html" name="page" template="cmpreshn/projects/list.phtml" />
        </reference>
    </projects_projects_list>
</layout>

模板覆盖并调用自定义块 应用程序/设计/前端/默认/ PMC1 /模板/ cmpreshn /项目/ list.phtml

<?php echo __FILE__ . " loaded <br>"; ?>
<?php echo $this->getProjectsList(); ?>

最后但并非最不重要的是,我的自定义块类 应用程序/代码/本地/ Cmpreshn / Proejcts /砌块/ list.php的

<?php

    class Cmpreshn_Projects_Block_List extends Mage_Core_Block_Template {

        public function _construct() {
            parent::__construct();
            echo "projects list block constructor called<br>";
        } // end constructor

        public function getProjectsList() {
            echo "getProjectsList called <br>";
            return("getProjectsList called");
        }

    } // end class

正如我之前提到的,我从list.phtml模板文件的第一行获取输出,但是没有来自我的自定义块方法的输出,也没有指示我的块正在加载(没有来自块_construct()的输出方法或者)

感谢任何帮助。我准备好把眼睛拉出来......

2 个答案:

答案 0 :(得分:2)

我刚刚观察了您的代码并发现了以下错误:

  • 注册模块文件中的块注册(config.xml)似乎错误。

    <global>
        <blocks>
            <projects>
                <class>Cmpreshn_Projects_Block</class>  <!-- Not Projects_Block_List -->
            </projects> 
        </blocks> 
    </global>
    
  • 布局文件(projects.xml)的Block元素中的type属性错误。您不应该致电page/html,而应致电projects/list

可能会有更多错别字。但我只能找到上面两个。我希望这能解决你的问题。

答案 1 :(得分:1)

将items.XML文件中的块类型更改为projects/list,如下所示

<?xml version="1.0" encoding="UTF-8"?> 
<layout version="0.1.0"> 
   <projects_projects_list> 
      <remove name="top.menu"/> 
      <reference name="content"> 
         <block type="projects/list" name="page" template="cmpreshn/projects/list.phtml/>
      </reference> 
   </projects_projects_list> 
</layout>

你现在可以得到输出。