Erfan is right that the html is outputted twice, once as a child of 'checkout.onepage.login' and once as a child of 'checkout.onepage.billing'
Thus there are two child blocks with the same name.
Each can have a different template, and each gets rendered as a child of the parent.
To change the persistent block in either of the parent blocks, you need to target the parent block directly such as:
<checkout_onepage_index>
<reference name="checkout.onepage.login">
<block type="persistent/form_remember" name="persistent.remember.me" template="my/custom/template.phtml" />
</reference>
</checkout_onepage_index>
The above will only change the template in the login block.
If you only target the child block 'persistent.remember.me' then magento seems to only change the occurrence of the first found block. Start Speculation: This is most likely in order or alpha occurrence , with 'checkout.onepage.billing' appearing alphabetically before 'checkout.onepage.login', in whatever array is used to store the block internally. The fact that .billing is rendered after .login just makes it look like it is only changing the second occurrence. :) End Speculation
You can't do that. Specifically, you can't use the <update/>
tag in a CMS page's Layout Update XML field.
Magento processes the <update/>
nodes when it is initially loading the layout update files, and layout updates from the core_layout_update
table. This is done with the fetchRecursiveUpdates
function.
#File: app/code/core/Mage/Core/Model/Layout/Update.php
public function fetchPackageLayoutUpdates($handle)
{
//...
$this->fetchRecursiveUpdates($updateXml);
//...
return true;
}
public function fetchDbLayoutUpdates($handle)
{
//...
$this->fetchRecursiveUpdates($updateXml);
//...
}
//...
public function fetchRecursiveUpdates($updateXml)
{
foreach ($updateXml->children() as $child) {
if (strtolower($child->getName())=='update' && isset($child['handle'])) {
$this->merge((string)$child['handle']);
// Adding merged layout handle to the list of applied hanles
$this->addHandle((string)$child['handle']);
}
}
return $this;
}
A CMS page, however, is rendered later on via a helper method. The rendering of a CMS page includes this code
#File: app/code/core/Mage/Cms/Helper/Page.php
$action->loadLayoutUpdates();
$layoutUpdate = ($page->getCustomLayoutUpdateXml() && $inRange)
? $page->getCustomLayoutUpdateXml() : $page->getLayoutUpdateXml();
$action->getLayout()->getUpdate()->addUpdate($layoutUpdate);
$action->generateLayoutXml()->generateLayoutBlocks();
The loadLayoutUpdates
call is the standard loading of the layout, including the fetchRecursiveUpdates
mentioned above.
Then, Magento looks for a custom layout XML update set on the CMS page object
$layoutUpdate = ($page->getCustomLayoutUpdateXml() && $inRange)
? $page->getCustomLayoutUpdateXml() : $page->getLayoutUpdateXml();
and adds it directly to the list of updates to apply
$action->getLayout()->getUpdate()->addUpdate($layoutUpdate);
This means the scanning for the update
tag is never done.
If I was trying to implement something like this, I'd add a new block in the CMS page's layout update XML, and then add the shared layout items programmatically in the blocks _prepareLayout
method. (not sure off the top of my head if that would work w/r/t to timing, but that'd be where I'd start)
Best Answer
Balaji.
you need just set reference name and don't require to define block type again.
See at My blog