Describe the relationship between templates and blocks
Can any block in Magento use a template file?
The template file usage in Magento is restricted to Mage_Core_Block_Template and blocks inheriting from it.
Other blocks in Magento like Mage_Core_Block_Text does not inherit from it but from Mage_Core_Block_Abstract so it cannot use a template file for rendering.
How does the $this variable work inside the template file?
In Magento, the template file for each block is ‘included’ by a php include directive during the render phase, so it´s clear that $this inside a template file, always refer to the block class instance.
The include is done in the fetchView() method of Mage_Core_Block_Template.
Is it possible to render a template without a block in Magento?
Well, never knows what’s the correct answer to some like this. This is not possible in a non-tricky way, but you may copy part of the fetchView() to make it works… Definitely not a good practise, but possible any way.
The include of a template in a Magento Block is as follows:
public function fetchView($fileName)
{
. . .
// Templates can be output directly to the browser or its content added to
// the response which at the end of the process is sent to the browser
// in one piece. In most cases, it will be stored in the response and
// Magento will send it at the end of the request processing
$do = $this->getDirectOutput();
if (!$do) {
ob_start();
}
. . .
// This part includes the template file directly, so it's result is output
// directly or captured to a variable (see ob_start and ob_get_clean calls)
// The template file path is generated by realpath...
$includeFilePath = realpath($this->_viewDir . DS . $fileName);
if (strpos($includeFilePath, realpath($this->_viewDir)) === 0 || $this->_getAllowSymlinks()) {
include $includeFilePath;
} else {
Mage::log('Not valid template file:'.$fileName, Zend_Log::CRIT, null, null, true);
}
. . .
// Finally the generated output by the template, is captured or output.
if (!$do) {
$html = ob_get_clean();
} else {
$html = '';
}
. . .
}
Is it possible to have a block without a template in Magento?
Of course yes… in fact, the only predefined block class in Magento that uses a template file is Mage_Core_Block_Template. It is the most used, but not the only block class in Magento.
Other classes in Magento like Mage_Core_Block_Text or Mage_Core_Block_Text_List doesn’t use a template file.

Hey! Qué opinas sobre el artículo?