Since you are using your own controller you don't need to only use the default handles. Based on the logged in status you could add in your infoAction method
$this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');
or
$this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');
and then in your layout.xml file use
<mymodule_customer_info_logged_in>
and
<mymodule_customer_info_logged_out>
-- addition after your edit below --
Seeing that you don't want to edit the controller (since it is a 3rd party extension), I would create a separate extension that only observes controller_action_layout_load_before
$update = $observer->getEvent()->getLayout()->getUpdate();
$handles = $update->getHandles();
if (in_array('custommodule_customer_info', $handles)) {
//code to add the custom handles based on login
}
Why changing the root template doesn't work
Both
Mage_Cms_IndexController::indexAction()
and
Mage_Cms_IndexController::viewAction()
which are responsible for displaying the default homepage and a CMS page respectively call a helper:
Mage::helper('cms/page')->renderPage($this, $pageId)
If you jump into the helper (located at app/code/core/Mage/Cms/Helper/Page.php) and follow renderPage()
to the protected method _renderPage()
you'll see that Magento is checking two times for a root template (Magento CE 1.7.0.2):
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
and
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Both calls happen after layout handles like "cms_page" and the like are processed, so you are out of luck here.
What you can do to change the root template
There is an event cms_page_render
which you can use for adding your own XML layout handle on CMS pages. Create your own extension (I'll spare some details here) and configure the event observer in your config.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Emzee_Cms>
<version>0.0.1</version>
</Emzee_Cms>
</modules>
<global>
<events>
<cms_page_render>
<observers>
<emzee_cms_page_render>
<class>emzee_cms/observer</class>
<method>cms_page_render</method>
</emzee_cms_page_render>
</observers>
</cms_page_render>
</events>
<models>
<emzee_cms>
<class>Emzee_Cms_Model</class>
</emzee_cms>
</models>
</global>
</config>
Add your event observer:
<?php
class Emzee_Cms_Model_Observer
{
public function cms_page_render(Varien_Event_Observer $observer)
{
$action = $observer->getEvent()->getControllerAction();
$actionName = strtolower($action->getFullActionName());
$action->getLayout()->getUpdate()
->addHandle($actionName . '_after');
return $this;
}
}
Finally, add your new layout XML handle (e.g. in your local.xml
):
<?xml version="1.0"?>
<layout version="0.1.0">
<cms_index_index_after>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</cms_index_index_after>
</layout>
You can use this method as well to add a cms_page_view_after
handle or create page specific handles as cms_page_render
passes the $page
object to your observer.
Why you can't add a block to the 'reference left'
Are you sure that the template you're using has a left column? This question may sound silly but the default "2 columns with right bar" layout for example only offers a 'content' and a 'right' area. I can add blocks to the right column using cms_page
without problems so this could be the problem.
In general, you can only easily add blocks to references and echo them if
- the chosen root template uses the block you're referencing (see
app/design/frontend/base/default/template/page/*.phtml
) and
- the block you're referencing either is of type
core/text_list
, calls $this->getChildhtml()
without arguments or does something else to echo all child blocks.
Without further details, I can't tell you why your blocks are not echo'd in the left or right column.
Best Answer
As far as I know, this facility is not available with magento by default. You cannot remove a layout handle which has added to the layout via another layout update file.
When we perform an
update handle
inside antherlayout handle
as you shown above, what magento does is, it will update the layout by including the blocks which are defined inside theupdate handle
along with existing blocks in the layout. So when we come tolocal.xml
file, theupdate handle
has no relevance at all. It made its effect by updating the layout tree with its defined blocks.So the only thing, that you can do is remove blocks which are added via these
update handles
. However you need to be really care about this step. Becauseupdate handle
may contain blocks which are using by magento layout in different section. You should not remove these blocks vialocal.xml
. But you can surely remove custom blocks which are specific to the third party extension if that block content is not at all necessary. You can do this like below.File :
app\design\frontend\<package>/<theme>/layout/local.xml
You need to fill the remove section by adding all of the custom blocks which are included via
update handles
.