Use of layout in Magento

As I have seen for each Template file there exists a layout which connect blocks of particular Module. I struggled to understood each pieces in Magento, let me explain what I had done,

Consider a Template appdesignfrontendbasedefaulttemplatecatalogcategoryview.phtml

we have, $_category = $this->getCurrentCategory();

this function belongs to Block appcodecoreMageCatalogBlockCategoryview.php

What Magento's Template does is, it search for Layout instead of Block file,

ie, Inside Layout file, appdesignfrontendbasedefaultlayoutcatalog.xml

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

In this layout definition, the type attribute defines the block file, ie, Through layout file the Template gets the value of getCurrentCategory() function from Block.

Also we have <reference name="content">, <reference name="left"> which decides where to append the template.

My Question is,

  • Why can't Templates get the Value directly from Block without referring Layout ?

  • Why Magento is not allowing us to do so?

  • What is the use of Layout while considering these 3 Block,Layout and Template?


  • 1 - Why can't Templates get the Value directly from Block without referring Layout?

    They can. Using your example:

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

    This can be written as:

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

    And within the actual block ( 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 - Why Magento is not allowing us to do so?

    Magento does allow you to do so. The Magento layout system is very powerful, albeit very difficult to understand it initially.

    3 - What is the use of Layout while considering these 3 Block,Layout and Template?

    I will use this question to clear some of your misconceptions. As stated the Magento layout is very powerful and allows a lot of flexibility but at first glance this is not obvious. I will try explain best I can.

    Imagine you created your own module within Magento and the Layout did not exist - everything was controlled within the 'controllers'. You would need to rewrite/extend/hack core Magento code to get things the way you wanted. If you wanted an extra widget on the category view page, you would need to override a controller method, or add your own controller.

    The Magento Layout overcomes this by creating a global layout file which you can extend without messing with the core infrastructure.

    Lets take your example.

    On a category view page, if we wanted to change the above template, catalog/category/view.phtml , to something else, say my/category/view.phtml , we could do this:

    <!-- 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>
    

    Just to reiterate:

    Also we have <reference name="content">, <reference name="left"> which decides where to append the template.

    This is incorrect. The "reference" tag allows you to reference blocks that are already instantiated. Just for completeness - the following example shows you how you can reference another block and place a block within it:

    <!--
        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>
    

    Further reading: Introducing The Magento Layout


    To answer your question, you need to dig down Magento's MVC approach,

    A webpage is divided into several parts logically, for example, header, body, footer, etc., making the page layout organized and easy to adjust. Magento provides such flexibility through Layout XML files. Magento processes those layout files and render them into web pages.

    Layout files act as detailed instructions to the application on how to build a page, what to build it with and the behavior of each building block.

    Layout files are separated on a per-module basis, every module bringing with it its own layout file .The system is built this way in order to allow seamless addition and removal of modules without effecting other modules in the system.

    In Magento, the View component of Model, View, Controller directly references system models to get the information it needs for display.

    The View has been separated into Blocks and Templates. Blocks are PHP objects, Templates are "raw" PHP files that contain a mix of HTML and PHP. Each Block is tied to a single Template file. Inside a phtml file, PHP's $this keyword will contain a reference to the Template's Block object.

    Layout files contains <handlers> which are mapped to MVC controller, so expect your handler

    <adminhtml_example_index> to be used in adminhtml/example/index controller page

    and

    <reference name="content"> means that the blocks or other references inside those blocks will be available in content block on your theme templates.

    Each page request in Magento will generate several unique Handles. The ' View ' of Magento's MVC pattern implementation is divided in two parts: Layout and Template . The template represents a HTML block while layout defines the location of the block on a web page.

    In Magento's MVC approach, it's not the responsibility of the controller to set variables for the View (in Magento's case, the view is Layout and Blocks) . Controllers set values on Models , and then Blocks read from those same models.

    Your controller's job is to do certain things to Models , and then tell the system it's layout rendering time. It's your Layout/Blocks job to display an HTML page in a certain way depending on the state of the system's Models.

    In Magento, when a URL is triggered,

  • It determines Controller and action
  • Action Method manipulates Models
  • Action loads layout and starts rendering
  • Template, read from Models, via Blocks
  • Block and child blocks render into HTML
  • 链接地址: http://www.djcxy.com/p/59488.html

    上一篇: Magento结构块,内容块和phtml模板

    下一篇: 在Magento中使用布局