Como adicionar condicionalmente um bloco (dependendo da configuração no painel de administração) no XML de layout do Magento?
Podemos verificar se a configuração é verdadeira nas ações. No exemplo abaixo, se a sample/config/show_toplinks
configuração do painel de administração (em Sistema-> Configuração) for verdadeira , o arquivo de modelo links.phtml
será usado para renderizar os Links principais. Se sample/config/show_toplinks
for falso , o modelo padrão será usado.
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
</reference>
Encontrei essa solução alternativa em algum lugar da web. Podemos definir um modelo vazio como padrão para os Links principais, assim:
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
<!-- OR set completely empty template -->
<action method="setTemplate">
<template>page/template/empty_template_for_links.phtml</template>
</action>
</reference>
Nesse caso, se sample/config/show_toplinks
for verdade , o modelo links.phtml
será usado e os Links principais serão exibidos. mas se sample/config/show_toplinks
for falso , o empty_template_for_links.phtml
modelo será usado e esse modelo estará completamente vazio; portanto, ele não retornará nenhum HTML e os Links principais não estarão visíveis.
- Existe outra maneira de mostrar ou ocultar condicionalmente os blocos, dependendo da configuração no painel de administração?
- Esta solução alternativa é segura?
- Isso pode causar erros inesperados?
EDITAR:
Com base em todas as respostas, acho que a solução de Rick Kuipers parece a mais conveniente para o meu caso. Mas eu tenho outra pergunta relacionada:
<block type="core/template" name="my_block" template="my/block.phtml" />
<!-- ...add more blocks here -->
<reference name="footer">
<action method="append" ifconfig="sample/config/show_toplinks">
<block>my_block</block>
</action>
<!-- ...append more blocks here -->
</reference>
Se eu tenho muitos blocos para adicionar assim (usando o append
método e ifconfig
), digamos 50,
isso afeta o desempenho ? Apenas alguns dos blocos serão realmente exibidos (isso depende da configuração do usuário em Sistema -> Configuração), mas preciso adicionar todos esses blocos antes de anexá-los condicionalmente <reference name="footer">...</reference>
.
O Magento processa instantaneamente todos os blocos adicionados assim?
<block type="core/template" name="my_block" template="my/block.phtml" />
Ou os blocos são processados apenas se tiverem que ser finalmente exibidos no modelo? Então o Magento terá que processar todos os meus 50 blocos, apesar do fato de que apenas alguns deles precisam ser exibidos?
my_block
dentro de "head" ou adicionará outra cópia desse bloco dentro de "head" e a primeira cópia ainda será exibida em outro lugar (como o bloco já havia sido adicionado antes<reference name="head">
)? 2. Em qual arquivo PHP posso encontrar todos esses métodos de layout como "append" ou "unsetChild"?<reference name="root">
(ou em qualquer outrocore/text_list
bloco), ela não será exibida automaticamente, a menos que seja chamada por elegetChildHtml()
. Ele não moverá o bloco, será uma cópia para que você possa anexá-lo várias vezes.<action>
chama um método no bloco. Portanto, depende de qual bloco estamos falando. Você pode encontrar alguns padrão emMage_Core_Block_Abstract
. Mas qualquer método de propriedade do bloco pode ser chamado usando<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
mesmo que não seja finalmente exibido.O uso da
_template
propriedade para ocultar a saída é uma nova abordagem. Eu preferiria reverter os valores na opção de configuração para que Sim = 0 (talvez um modelo de origem personalizado) e chamarunsetChild
o bloco principal pai :fonte
Top Links: [enable/disable]
para algo assimHide Top Links: [Yes/No]
.Quanto às suas perguntas:
Meu método apenas se expande sobre o seu
Não vejo por que não seria
Novamente, seu código é bastante seguro por trás de métodos que não causam exceções (
getStoreConfig
por exemplo, retornarão apenas valores falsos, portanto seu identificador condicional não será adicionado), mas você receberá uma exceção se o arquivo de modelo vazio não existir. Use uma tag de fechamento automático para passar um valor vazio (por exemplo<template />
)Se eu estivesse desenvolvendo isso, estenderia sua solução para incluir um observador que verifica a configuração e adiciona condicionalmente um identificador ao seu layout. Em seguida, no arquivo de layout, você pode definir as duas ações em diferentes identificadores -
default
eshow_toplinks
E então no seu
Observer
modelo ...E finalmente, no seu layout:
fonte