Understanding Magento Block and Block Type
I just want to understand the meaning of
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">
I got many references from Google and understood many things about it but I am still unable to understand the formation of type="page/html"
how to form a type for my custom module.
Please explain
type="A/B"
Let me know where this A and B come from?
Solution 1:
For understanding more about magento block types following are some built-in block types which are widely used in layout.
-
core/template
: This block renders a template defined by itstemplate
attribute. The majority of blocks defined in the layout are of type or subtype ofcore/template
. -
page/html
: This is a subtype ofcore/template
and defines the root block. All other blocks are child blocks of this block. -
page/html_head
: Defines the HTML head section of the page which contains elements for including JavaScript, CSS etc. -
page/html_header
: Defines the header part of the page which contains the site logo, top links, etc. -
page/template_links
: This block is used to create a list of links. Links visible in the footer and header area use this block type. -
core/text_list
: Some blocks likecontent
,left
,right
etc. are of typecore/text_list
. When these blocks are rendered, all their child blocks are rendered automatically without the need to call thegetChildHtml()
method. -
page/html_wrapper
: This block is used to create a wrapper block which renders its child blocks inside an HTML tag set by the actionsetHtmlTagName
. The default tag is<div>
if no element is set. -
page/html_breadcrumbs
: This block defines breadcrumbs on the page. -
page/html_footer
: Defines footer area of page which contains footer links, copyright message etc. -
core/messages
: This block renders error/success/notice messages. -
page/switch
: This block can be used for the language or store switcher.
This is a list of only commonly used block types. There are many other block types which are used in advanced theme implementations.
Solution 2:
The A
is a module's alias. In this case page
is short for Mage_Page_Block
(it is defined in app/code/core/Mage/Page/etc/config.xml
if you want to see).
The B
is the class name relative to the alias, initial letters of each word are capitalised. In this case html
becomes Html
and is appended to the resolved alias, so it is Mage_Page_Block_Html
. This is probably found in the file app/code/core/Mage/Page/Block/Html.php
because class names translate directly to locations in Magento.
Were you using a model alias instead of a block alias then page
would be Mage_Page_Model
instead. The same thing happens for resource models and helpers too. Your own module will need to define these in it's config if it is to have blocks, models and helpers.
Solution 3:
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">
page is a FrontendName defined in etc/config.xml
file
html is a block class name
more details:
in this line type(type="page/html")
define block class name related to your template(template="example/view.phtml">)
and name is the unique for each block.
first see folder structure
app>local>namespace>modulename>etc>config.xml
we set FrontendName = 'mymodule'
app>local>namespace>modulename>Block>hello.php
in hello.php you created a function
class namespace_modulename_Block_Data extends Mage_Core_Block_Template
{
public function mydata()
{
$data = "Block is called";
return $data;
}
}
and now come to your layout xml page:
<block type="mymodule/data" name="xyz" template="example/view.phtml">
here mydata is frontend name
and now come to your template's
template/example/view.phtml page
here you can call directly mydata() function
like
<div>
<?php echo $this->mydata(); ?>
</div>
now you can get your output in browser "Block is called"
Solution 4:
i don't know about "B" type, but "A" refer to your module name tag in config.xml example in config.xml:
<A><!-- script --></A>
No, you're not wrong. But the "<!-- script -->"
may be confusing. Let's clarify: as the above answers stated, this is an alias, which consisted of two parts, the first part ("A") itself is the alias you define to your module's classes in your module's config.xml
, the second is a path relative to the node's value. These together ("A" + capitalized "B") will be translated to a class name, using the first part (the "A" node's value) exactly as you define it (watch for upper/lowercase if you don't want hours of suffering) and the second part is capitalized after each underscore. So, start with the A/B example with a block and this config:
<config>
...
<global>
<blocks>
<A>Vendor_Module_Block</A>
</blocks>
</global>
...
</config>
In runtime A/B
would resolved by the Magento config to Vendor_Module_Block_B
which would then included by the autoload from the following path: public/app/local/Vendor/Module/Block/B.php
. To get a better understanding I advise you to take a look at the Mage_Core_Model_Config::getGroupedClassName()
, Mage_Core_Model_Config::getModelInstance()
and Varien_Autoload::autoload()
.