在主题中渲染块和子块

时间:2013-07-18 13:58:16

标签: magento block

我目前正在努力更好地了解Magento中块的工作原理。我已经查看了一些文件以获得更好的想法并且它有一点帮助,但是对于我目前有限的技能来说它们太复杂了我仍然没有正确理解正在发生的事情以及如何将它们实施到我的网站中。我意识到他们理解与Magento合作是必不可少的,所以我想我会设置一系列要尝试和实现的东西:

  1. 显示一个块(已完成)

  2. 显示一个块和子块

  3. 在magento布局中显示一个块

  4. 在magento布局的页面上放置一个块

  5. 了解最常用的“类型”属性以及何时使用它们

  6. 到目前为止,我已经整理好了 _index_index 命名空间/模块的/ etc / config.xml中

    <frontend>
        ....
        <layout>
            <updates>
                <learningblocks>
                    <file>Namespace/Module/childblocks.xml</file>
                    <file>Namespace/Module/blocks.xml</file>
                </learningblocks>
            </updates>
        </layout>
    </frontend>
    

    命名空间/模块/控制器/ IndexController.php

    class Namespace_Module_IndexController
        extends Mage_Core_Controller_Front_Action
    {
        public function indexAction()
        {
            $this->loadLayout('learningblocks')->renderLayout();
        }
    
        public function blocksAction()
        {
            $this->loadLayout('blocknode')->renderLayout();
        }
    }
    

    前端/碱/默认/布局/命名空间/模块/ blocks.xml

    <layout>
        <blocknode>
            <block type="core/text" name="blocktest" output="toHtml" >
                <action method="setText">
                    <args>some text to display on screen</args>
                </action>
            </block>
        </blocknode>
    </layout>
    

    以上工作正常,并在白页上显示字符串'在屏幕上显示的一些文字'。但这就是我所能做到的,我不能让子块渲染到屏幕上,我无法在主题中显示任何内容,更不用说尝试在主题内移动它了

    以下是我似乎无法开始工作的尝试之一。为什么这不起作用?

    前端/碱/默认/布局/命名空间/模块/ childblocks.xml

    <layout>
        <abcde>
            <block type="core/template" name="childblocks" output="toHtml" template="namespace/module/childblocks.phtml">
                <block type="core/text" name="anyname">
                    <action method="setText">
                        <args>Some text to add to this page</args>
                    </action>
                </block>
            </block>
        </abcde>
    
        <learningblocks_index_index>
            <update handle="abcde" />
        </learningblocks_index_index>
    </layout>
    

    前端/碱/默认/模板/命名空间/模块/ childblocks.phtml

    <p>from the childblock.phtml page</p><?php $this->getChildHtml(); ?>
    

    注意:我已将命名空间和模块名称更改为更通用,希望它更容易阅读(它们没有很好的选择名称)。

1 个答案:

答案 0 :(得分:1)

我知道这不是一个完整的答案,但它可能会帮助那些努力解决同样问题的人。我没有深入研究,如果你想要寻找答案,你已经阅读了THIS ARTICLE并且涵盖了所有这些,我认为你有同样的问题,即我对你学到的东西的误解从本教程开始。

在阅读此答案时请注意我对Magento很新,并且可能会有一些不准确之处,如果有,我相信有人会纠正我并进行相应的编辑。

首先这是错误的

public function indexAction()
{
    $this->loadLayout('learningblocks')->renderLayout();
}

应该是这个

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

然后你必须将布局xml中的learningblocks节点映射到该动作module_controller_action。这样做会在主题中显示页面中的块。

所以渲染一个子块

在layout.xml

中添加类似的内容
<module_controller_action>
    <reference name="content">
        <block type="module/blockname" name="unique_name" output="toHtml" template="path/toyou/template.phtml" >  
            <block type="module/blockname" name="another_unique_name" output="toHtml" template="path/toyou/template.phtml" />
        </block>
    </reference>
</module_controller_action>  

然后在模板文件中回显

$this->getChildHtml('another_unique_name')

如果要从页面中删除块,请使用删除节点,例如

<remove name="right"/>
<remove name="left"/>

This page will offer a list of attributes that can be used说实话,我发现通过magento文件查看的内容超过了该页面