Por que alterar o modelo raiz não funciona
Ambos
Mage_Cms_IndexController::indexAction()
e
Mage_Cms_IndexController::viewAction()
responsáveis por exibir a página inicial padrão e uma página do CMS, respectivamente, chamam um auxiliar:
Mage::helper('cms/page')->renderPage($this, $pageId)
Se você pular para o auxiliar (localizado em app / code / core / Mage / Cms / Helper / Page.php) e seguir renderPage()
o método protegido, _renderPage()
verá que o Magento está verificando duas vezes o modelo raiz (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);
}
e
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Ambas as chamadas acontecem depois que os manipuladores de layout, como "cms_page" e similares, são processados, então você está sem sorte aqui.
O que você pode fazer para alterar o modelo raiz
Há um evento cms_page_render
que você pode usar para adicionar seu próprio identificador de layout XML nas páginas do CMS. Crie sua própria extensão (vou poupar alguns detalhes aqui) e configure o observador de eventos no seu 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>
Adicione seu observador de eventos:
<?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;
}
}
Por fim, adicione seu novo identificador XML de layout (por exemplo, no seu 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>
Você também pode usar esse método para adicionar um cms_page_view_after
identificador ou criar identificadores específicos da página ao cms_page_render
passar o $page
objeto ao seu observador.
Por que você não pode adicionar um bloco à "referência esquerda"
Tem certeza de que o modelo que você está usando possui uma coluna esquerda? Essa pergunta pode parecer boba, mas o layout padrão "2 colunas com barra direita", por exemplo, oferece apenas uma área de 'conteúdo' e 'direita'. Posso adicionar blocos à coluna da direita usando cms_page
sem problemas, portanto esse pode ser o problema.
Em geral, você só pode adicionar blocos facilmente a referências e repeti-los se
- o modelo raiz escolhido usa o bloco que você está referenciando (consulte
app/design/frontend/base/default/template/page/*.phtml
) e
- o bloco ao qual você está referenciando é do tipo
core/text_list
, chama $this->getChildhtml()
sem argumentos ou faz outra coisa para ecoar todos os blocos filhos.
Sem mais detalhes, não sei explicar por que seus blocos não ecoam na coluna esquerda ou direita.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Se alguém alterou o URL da página cms, o identificador não funcionará. Idealmente, um campo para 'chave da página' existiria na página do CMS no sistema de administração, então o URL da página, o nome etc poderiam ser alterados e a chave poderia ser a mesma.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
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)
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"
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.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
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 ocms_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 layoutpage_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 daloadLayoutUpdates
chamada e permite inserir um nome de identificador adicional ou remover os nomes de identificadores existentes.fonte
default
identificador, o layout definido no administrador ainda vencerá (ou sejapage_two_columns_right
, ainda será executado mais tarde). Além disso, Re: terminologia - você não substitui os identificadores, seus identificadores sempre coexistem com os outros - é apenas a ordem em que eles executam afeta o resultado final.