Em relação à sua "não é possível adicionar um bloco usando <reference name="left
/>, você tem certeza de que sua página do CMS possui um bloco com o nome esquerdo? Por exemplo, se você considerar a página inicial padrão que acompanha os dados de amostra do Magento, ela parece ter um bloco chamado esquerda.
No entanto, se você olhar para a página no back-end, poderá ver que ela está configurada para usar o modelo raiz
`2 columns with right bar`
e, em seguida, em sua área de conteúdo, a coluna esquerda é adicionada usando a marcação HTML (alterne o WYSIWYG para a visualização de origem)
<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>
Este gráfico direcionado deixa claro que não há nenhum bloco com o qual left
se conectar ( clique para ver a imagem no tamanho original )
Em relação à configuração de um modelo, se você procurar na fonte o menu suspenso "Layout"
<select id="page_root_template" name="root_template" class=" required-entry select">
<option value="empty">Empty</option>
<option value="one_column">1 column</option>
<option value="two_columns_left">2 columns with left bar</option>
<option value="two_columns_right" selected="selected">2 columns with right bar</option>
<option value="three_columns">3 columns</option>
</select>
Você pode ver quando você está definindo neste campo, o valor real ser salvo é algo como one_column
, two_columns_left
, etc. Estes valores corespond de alças de layout do mesmo nome.
#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
<label>All One-Column Layout Pages</label>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>one_column</name></action>
</reference>
</page_one_column>
...
<page_two_columns_left translate="label">
<label>All Two-Column Layout Pages (Left Column)</label>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>two_columns_left</name></action>
</reference>
</page_two_columns_left>
Quando o Magento está renderizando uma página do CMS, ele faz referência aos valores salvos e adiciona o identificador de layout apropriado à página. Embora seja tangencial à pergunta, esse identificador é adicionado aqui
#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action $action, $pageId = null, $renderLayout = true)
{
//...
$action->addActionLayoutHandles();
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
//...
}
Mais importante, porém, é a ordem em que as alças de layout são adicionadas
Como você pode ver na captura de tela acima, o page_two_columns_right
identificador é adicionado após o cms_index_index
identificador. Isso significa que, se você adicionar o código de atualização xml do layout para alterar o modelo, cms_index_index
seu código será executado, mas o código xml de atualização do layout page_two_columns_right
será executado depois dele.
Sempre suspeitei que isso ocorra por design, para garantir que o modelo definido na interface do usuário esteja sempre correto. Na versão anterior do Magento, a <action method="setIsHandle"><applied>1</applied></action>
chamada de método parece ter existido pelos mesmos motivos.
Portanto, não há como fazer o que você deseja usando o código xml de layout puro. Se você estiver confortável com a criação de módulos personalizados e código de observador, verifique o cms_page_render
evento. Isso é acionado logo antes da loadLayoutUpdates
chamada e permite inserir um nome de identificador adicional ou remover os nomes de identificadores existentes.