繁体   English   中英

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

[英]Magento custom module - unable to call block method from template

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

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

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

这回显了正确的文件名。

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

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

app / code / local / Cmpreshn / Projects / 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>

app / code / local / Cmpreshn / Projects / controllers / 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();

        }

    }

app / design / frontend / default / pmc1 / layout / projects.xml中的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>

模板覆盖并调用app / design / frontend / default / pmc1 / template / cmpreshn / project / list.phtml中的自定义块

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

最后但并非最不重要的一点是,我在app / code / local / Cmpreshn / Proejcts / Block / 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()方法的输出)

任何帮助表示赞赏。 我已经准备好对此展开关注...

我只是观察您的代码,发现以下错误:

  • 在注册模块文件(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

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

将块类型更改为projects.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>

您现在可能会得到输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM