在Magento中使用布局

正如我所看到的每个模板文件都存在一个连接特定模块块的布局。 我努力去理解Magento中的每件作品,让我解释我做了什么,

考虑模板appdesignfrontendbasedefaulttemplatecatalogcategoryview.phtml

我们有$_category = $this->getCurrentCategory();

这个功能属于Block appcodecoreMageCatalogBlockCategoryview.php

Magento的模板做的是,它搜索布局而不是块文件,

即内部布局文件, appdesignfrontendbasedefaultlayoutcatalog.xml

我们有<block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">

在这个布局定义中, type属性定义了块文件,即通过布局文件模板从Block获取getCurrentCategory()函数的值。

此外,我们还有<reference name="content">, <reference name="left"> ,它决定在哪里追加模板。

我的问题是,

  • 为什么Templates无法直接从Block获取值而不参考Layout

  • 为什么Magento不允许我们这样做?

  • 在考虑这些3块,布局和模板时,布局有什么用处?


  • 1 - 为什么模板无法直接从块中获取值而不参考布局?

    他们能。 使用你的例子:

    <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">
    

    这可以写成:

    <block type="catalog/category_view" name="category.products">
    

    并且在实际的块内( app/code/core/Mage/Catalog/Block/Category/View.php ):

    ...
    public function _construct()
    {
        parent::_construct();
        // set the template here instead
        $this->setTemplate('catalog/category/view.phtml');
    }
    ...
    

    2 - 为什么Magento不允许我们这样做?

    Magento确实允许你这样做。 Magento的布局系统非常强大,尽管最初很难理解它。

    3 - 在考虑这些3块,布局和模板时,布局的用途是什么?

    我会用这个问题来澄清你的一些误解。 如前所述,Magento布局非常强大,并且具有很大的灵活性,但乍一看这并不明显。 我会尽力解释我可以。

    想象一下,你在Magento中创建了自己的模块,布局不存在 - 一切都在“控制器”内进行控制。 您需要重写/扩展/破解核心Magento代码才能按照您的想法获取内容。 如果您想在类别视图页面上添加一个小部件,您需要重写一个控制器方法,或者添加您自己的控制器。

    Magento Layout通过创建一个全局布局文件克服了这个问题,您可以在不影响核心基础架构的情况下进行扩展。

    让我们拿你的榜样。

    在类别视图页面上,如果我们想要将上面的模板catalog/category/view.phtml改为别的,请说my/category/view.phtml ,我们可以这样做:

    <!-- this is the controller handle -->
    <catalog_category_view>
        <!--
            by referencing, we are actually referring to a 
            block which has already been instantiated. the
            name is the unique name within the layout.
    
            generally all blocks should have a name and it
            must be unique. however there can also be
            anonymous blocks but thats out of scope of this
            answer
        -->
        <reference name="category.products">
            <!--
                the layout allows us to fire methods within
                the blocks. in this instance we are actually
                firing the setTemplate method on the block
                and providing a "template" argument.
    
                this is the same as calling:
    
                $this->setTemplate('my/category/view.phtml');
    
                within the block.
            -->
            <action method="setTemplate">
                <template>my/category/view.phtml</template>
            </action>
        </reference>
    </catalog_category_view>
    

    只是重申一下:

    此外,我们还有<reference name="content">, <reference name="left"> ,它决定在哪里追加模板。

    这是不正确的。 “参考”标签允许您引用已经实例化的块。 为了完整起见,下面的例子展示了如何引用另一个块并在其中放置一个块:

    <!--
        the default layout handle which is call on nearly all
        pages within magento
    -->
    <default>
        <!--
            we are not referencing the "left" block
    
            we could if we wanted reference "right",
            "content" or any other blocks however 
            these are the most common
        -->
        <reference name="left">
            <!--
                add a block
    
                in this example we are going to reference
                "core/template" which translates to:
    
                Mage_Core_Block_Template
    
                which exists at:
    
                app/code/core/Mage/Core/Block/Template.php
            -->
            <block type="core/template" name="my.unique.name.for.this.block" template="this/is/my/view.phtml" />
        </reference>
    </default>
    

    进一步阅读:介绍Magento布局


    要回答你的问题,你需要挖掘Magento的MVC方法,

    一个网页在逻辑上被分成几个部分,例如页眉,正文,页脚等,这使得页面布局有条理且易于调整。 Magento通过布局XML文件提供了这种灵活性。 Magento处理这些布局文件并将其渲染到网页中。

    布局文件作为应用程序的详细说明,介绍如何构建页面,构建它的内容以及每个构建块的行为。

    布局文件按照模块分开,每个模块带有自己的布局文件。系统以这种方式构建,以便无缝地添加和移除模块,而不影响系统中的其他模块。

    在Magento中,Model,View,Controller的View组件直接引用系统模型来获取它需要显示的信息。

    视图已分为块和模板。 是PHP对象,模板是包含HTML和PHP混合的“原始”PHP文件。 每个块都绑定到一个单独的模板文件。 在phtml文件中,PHP的$ this关键字将包含对模板的Block对象的引用。

    布局文件包含映射到MVC控制器的<handlers> ,所以期待您的处理程序

    用于adminhtml/example/index controller页面的<adminhtml_example_index>

    <reference name="content">表示这些块内的块或其他引用将在主题模板上的内容块中可用。

    Magento中的每个页面请求都会生成几个独特的句柄。 Magento MVC模式实现的' 视图 '分为两部分: 布局和模板 。 模板代表一个HTML块,而布局则定义了网页上块的位置。

    在Magento的MVC方法中,控制器不是为View设置变量(in Magento's case, the view is Layout and Blocks)控制器模型上设置值,然后从这些模型中读取块。

    你的控制器的工作是对模型做某些事情,然后告诉系统它是布局渲染时间。 这是您的布局/块作业根据系统模型的状态以某种方式显示HTML页面。

    在Magento中,当一个URL被触发时,

  • 它决定了控制器和操作
  • 操作方法操作模型
  • 操作加载布局并开始渲染
  • 模板,通过模块读取,通过块
  • 块和子块呈现为HTML
  • 链接地址: http://www.djcxy.com/p/59487.html

    上一篇: Use of layout in Magento

    下一篇: Magento extension adding and positioning new blocks in existing/core pages