2012-07-31 22 views
11

Después de tropezar con la siguiente clase mientras miraba el código fuente de magento: Mage_Core_Block_Template_Facade, no tengo absolutamente ninguna idea de lo que hace esta clase.¿Cuál es el propósito de Mage_Core_Block_Template_Facade

Obviamente lo he visto e investigado un poco, pero simplemente no está claro para mí.

Puede alguien explicar su propósito en la vida y cuando podría ser útil el uso de

+0

He intentado analizar todo eso varias veces, y nunca he sido capaz de entender de qué se trata. Dicho esto, hay algunos comentarios al respecto en este hilo de comentarios http://www.pulsestorm.net/nofrills-layout-chapter-five que podrían tener sentido para ti (no podía entender lo que decía el Sr. Masy, pero puede que tenga sentido para ti) –

+0

No estoy seguro de lo que estaba recibiendo ese comentario :) - He respondido con mis pensamientos sobre el bloque de fachada. Probablemente podría haberlo explicado un poco mejor, pero ojalá llegue al punto –

+0

@DrewHunter. Simplemente señalando a Stephen hacia un lugar para comenzar a investigar cosas, no valía la pena una respuesta real. –

Respuesta

42

Mage_Core_Block_Template_Facade, en realidad es bastante sencillo de entender. Es ..

  • Permite a un valor que se encuentra en el bloque
  • Permite el diseño para especificar un atributo/valor de un objeto de registro que se establecería en el bloque
  • Permite la igualdad de los dos valores por encima para ser evaluados

en esencia, esto es lo que hace que el bloque de la fachada diferente de otros bloques - la interacción con el registro y la comparación de una clave de registro/valor con una clave de instancia del bloque/valor - todo desde xml diseño.

No es sólo un ejemplo del bloque que se utiliza en código del núcleo ...

Buscando en catalog.xmlproduct/view.phtml y verá Container1 y container2 bloques - ambos son idénticos, pero sólo uno es alguna vez renderizado en el resultado final.

¿Por qué están ambos allí? Esto explicará cómo funciona Mage_Core_Block_Template_Facade.

Core está utilizando el bloque de fachada como un método para permitir la posición de bloque de opciones de producto dentro de product/view.phtml (no dentro del diseño, pero dentro de la plantilla) para que se pueda configurar en el área de administración. Si mira en la pestaña de diseño mientras edita un producto, debe observar la última opción: "Mostrar opciones de producto en": los dos valores desplegables se correlacionan con los bloques container1 y container2 que se pueden ver en catalog.xml y view.phtml . Específicamente, mirando en product/view.phtml debería ver container1 y container2 posicionados en diferentes divs.

El diseño decide cuál de estos bloques se mostrará en función del valor establecido en "Mostrar opciones de producto en" utilizando el bloque de fachada.

Aquí es cómo funciona ...


Comprobar catalog.xml y verá:

<block type="core/template_facade" name="product.info.container1" as="container1"> 
    <action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action> 
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action> 
    <action method="append"><block>product.info.options.wrapper</block></action> 
    <action method="append"><block>product.info.options.wrapper.bottom</block></action> 
</block> 
<block type="core/template_facade" name="product.info.container2" as="container2"> 
    <action method="setDataByKey"><key>alias_in_layout</key><value>container2</value></action> 
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action> 
    <action method="append"><block>product.info.options.wrapper</block></action> 
    <action method="append"><block>product.info.options.wrapper.bottom</block></action> 
</block> 
<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action> 
<action method="unsetCallChild"><child>container2</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action> 

setDataByKey

<action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action> 

Esto establece un identificador para este bloque que se evaluará contra el objeto de registro. En el contexto de los contenedores de opciones, este valor tendrá que coincidir con uno de los valores desplegables en el área de administración mencionada anteriormente.

setDataByKeyFromRegistry

<action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action> 

Le indica el bloque "bueno, cuando tenemos que mirar al producto objeto en el registro y agarrar el valor de la clave options_container/atributo". Similar a: Mage::registry('product')->getData('options_container');

Es de esperar que este valor sea container1 o container2 en este ejemplo específico.

ifEquals

Finalmente, ifEquals se llama en conjunción con unsetCallChild para eliminar el contenedor no seleccionado en el área de administración.

usando container1 como un ejemplo ...

<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action> 

esta llama al método ifEquals en esa instancia de bloque, si el valor de retorno es 0 entonces container1 será desarmado y sin fundir.

Cuestiones relacionadas