¿Cómo agregar condicionalmente un bloque (dependiendo de la configuración en el panel de administración) en el diseño XML de Magento?
Podemos verificar si config es verdadero en las acciones. En el ejemplo a continuación, si la sample/config/show_toplinks
configuración desde el panel de administración (en Sistema-> Configuración) es verdadera , entonces el archivo de plantilla links.phtml
se usará para representar los Enlaces principales. Si sample/config/show_toplinks
es falso , se utilizará la plantilla predeterminada.
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
</reference>
Encontré esta solución en algún lugar de la web. Podemos configurar una plantilla vacía como plantilla predeterminada para Top Links, de esta manera:
<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>
En este caso, si sample/config/show_toplinks
es cierto , links.phtml
se utilizará la plantilla y se mostrarán los enlaces principales. pero si sample/config/show_toplinks
es falso , la empty_template_for_links.phtml
plantilla se usará y esa plantilla estará completamente vacía, por lo que no devuelve ningún HTML y los enlaces principales no estarán visibles.
- ¿Hay alguna otra forma de mostrar u ocultar condicionalmente los bloques dependiendo de la configuración en el panel de administración?
- ¿Es segura esta solución?
- ¿Puede esto causar algún error inesperado?
EDITAR:
Basado en todas las respuestas, creo que la solución de Rick Kuipers parece la más conveniente para mi caso. Pero tengo otra pregunta 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>
Si tengo que agregar muchos bloques como este (usando el append
método y ifconfig
), digamos 50,
¿afecta el rendimiento ? Solo se mostrarán realmente algunos de los bloques (eso depende de la configuración del usuario en el Sistema -> Configuración), pero necesito agregar todos esos bloques antes de agregarlos condicionalmente dentro <reference name="footer">...</reference>
.
¿Magento procesa instantáneamente todos los bloques agregados así?
<block type="core/template" name="my_block" template="my/block.phtml" />
¿O los bloques se procesan solo si finalmente deben mostrarse en la plantilla? Entonces, ¿Magento tendrá que procesar todos mis 50 bloques a pesar del hecho de que solo algunos de esos bloques deben mostrarse?
my_block
dentro de "head", o agregará otra copia de ese bloque dentro de "head" y la primera copia todavía se mostrará en otro lugar (ya que el bloque ya se agregó antes<reference name="head">
)? 2. ¿En qué archivo PHP puedo encontrar todos esos métodos de diseño como "append" o "unsetChild"?<reference name="root">
(o en cualquier otrocore/text_list
bloque que no sea), no se mostrará automáticamente a menos que se llamegetChildHtml()
. No moverá el bloque, será una copia para que pueda agregarlo varias veces.<action>
llama a un método en el bloque. Entonces depende de qué bloque estamos hablando. Puedes encontrar algunos estándares enMage_Core_Block_Abstract
. Pero cualquier método propiedad del bloque se puede llamar usando<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
incluso si finalmente no se mostrará.Al usar la
_template
propiedad para ocultar la salida es un enfoque novedoso. Preferiría invertir los valores en la opción de configuración para que Sí = 0 (quizás un modelo fuente personalizado) y llamarunsetChild
al bloque principal principal :fuente
Top Links: [enable/disable]
a algo asíHide Top Links: [Yes/No]
.En cuanto a sus preguntas:
Mi método solo se expande sobre el tuyo
No puedo ver por qué no sería
Nuevamente, su código es bastante seguro detrás de los métodos que no causarán excepciones (
getStoreConfig
por ejemplo, solo devolverán valores falsos, por lo que no se agregará su identificador condicional) pero obtendrá una excepción si el archivo de plantilla vacío no existe. Use una etiqueta de cierre automático para pasar un valor vacío (por ejemplo<template />
)Si estuviera desarrollando esto, ampliaría su solución para incluir un observador que verifique la configuración y condicionalmente agregue un controlador a su diseño. Luego, en su archivo de diseño, puede establecer ambas acciones dentro de diferentes identificadores
default
yshow_toplinks
Y luego en tu
Observer
modelo ...Aaa y finalmente en su diseño:
fuente