2011-05-18 21 views
9

He intentado encontrar una solución pero sin resultados. Mi tarea es escribir el módulo. Debe insertar algunos html en el bloque existente.Magento. Insertar bloque en otro sin cambiar el código de la plantilla

he notado que cuando utilicé archivos .xml de diseño sólo puedo insertar mi bloque en alguna referencia como

<reference name="product.info"> 
    <block type='googlethis/link' name="googlethis" 
      template="catalog/product/googlethis.phtml"/> 
</reference> 

y mi bloque muestra también.

En otros casos debo llamar al método getChildHtml() y no es bueno porque hace cambiar los archivos .phtml de la plantilla.

Entonces, ¿hay manera de insertar mi bloque phtml en cualquier otro bloque de phtml sin llamar getChildHtml()?

Respuesta

20

Hay una manera de hacer esto, aunque no es una solución enteramente elegante. Sin embargo, funcionará en la mayoría de los casos y ha resultado útil en ocasiones.

Básicamente la idea es que reemplaces el bloque que deseas representar tu bloque antes/después en tu diseño XML, coloca ese bloque como un elemento secundario en tu bloque y luego renderiza su salida antes/después del tuyo.

Así que digamos que quería dar salida a una cuadra antes de los totales de bloque en la página del carrito de detalles, se puede hacer lo siguiente en layout.xml de su extensión

<checkout_cart_index> 
    <reference name="checkout.cart"> 
     <block type="myextension/block" name="myextension.block" as="myextension_block" template="myextension/template.phtml"> 
      <action method="setChild"><name>totals</name><block>totals</block></action> 
     </block> 
     <action method="setChild"><name>totals</name><block>myextension.block</block></action> 
    </reference> 
</checkout_cart_index> 

A continuación, en el archivo de template.phtml lo haría tiene:

<div id="myextension"> 
    // Your template code 
</div> 

// Render the totals block that you placed inside your block 
<?php echo $this->getChildHtml('totals'); ?> 

Como ya he dicho, esto no va a adaptarse a cada situación y no es muy elegante, pero funciona.

Jon

+0

esa es una solución ordenada, me gusta –

+0

Hmm, me gusta, gracias. Voy a intentar hoy. –

+0

Intenté esto y funciona –

3

No, no hay una manera genérica de agregar su bloque a ningún otro bloque. La razón por la que funciona ocasionalmente para usted es porque hay algunos tipos de bloques que simplemente enumeran a sus hijos (core/text_list es uno de esos) y algunas plantillas hacen lo mismo manualmente (usando $this->getChild()).

Si desea agregar su bloque debajo de un bloque que no cumple con ninguno de estos criterios, deberá modificar la plantilla para hacer eco de ese bloque.

+0

Gracias por su respuesta. –

+0

También. ¿Podemos detectar de alguna manera qué bloque se puede usar como referencia en la configuración de diseño para la salida sin getChildHtml() y cuál no? Gracias –

+0

La comprobación del tipo de bloque 'core/text_list' sería el primer paso. De lo contrario, grep el directorio de la plantilla para las llamadas '$ this-> getChild()'. –

2

Usted puede tratar de añadir a xml - siguiente método de salida = "ToHTML" - pondrá de bloque a bloque padre Pero ...

<reference name="product.info"> 
    <block type='googlethis/link' name="googlethis" output="to Html" template="catalog/product/googlethis.phtml"/> 
</reference> 
1

Con salida method = "ToHTML "en el diseño, el bloque se clasifica al final del documento. He probado con

<catalog_product_view> 
    <reference name="media"> 
     <block type="pricetag/catalog_product_view" name="catalog.product.price.tag" template="pricetag/price.phtml" output="toHtml" /> 
    </reference> 
</catalog_product_view> 

Y Magento rendido mi bloque después html etiqueta final

-2
+0

por favor escriba su respuesta aquí en lugar de publicar el enlace, ¡gracias! – Stanley

2

It cap possible by add to xml - siguiendo método de salida = "ToHTML" - pondrá de bloque a bloque padre

<reference name="product.info"> 
    <block type='googlethis/link' name="googlethis" as="googlethis" output="toHtml" template="catalog/product/googlethis.phtml"/> 
</reference> 
0

Creo que usted no puede emitir un bloque sin tener en una plantilla que se muestra. Entonces, si crea su extensión además de crear su bloque, debe llamarla en la plantilla donde lo desee. Desafortunadamente eso significa que alguien podría agregar su extensión en su sitio web y si han creado su propia copia del archivo de la plantilla donde se agregó su bloque porque querían modificarlo en su tema, así su bloque no se mostrará allí. Tendrán que darse cuenta de que su módulo necesita una modificación de una plantilla y poner la modificación en su propia plantilla ellos mismos.

Un bloque puede emitirse sin llamarse en una plantilla si le agrega el atributo output="toHtml", pero como algunos otros han señalado, esto hará que el bloque se represente después de la etiqueta </html>. Eso es normal porque el output="toHtml" es lo que hace que el bloque raíz funcione. El bloque raíz no se puede incluir en una plantilla porque no tiene padre, por lo que usa el atributo output="toHtml" y lo hace aparecer. Eso funciona porque cuando Magento renderiza su diseño (construye el HTML de la página) llama al método getOutput() de la clase Mage_Core_Model_Layout y este método realmente obtiene todos los bloques que tienen un param de salida y los vomita en la página 1 por 1 . Normalmente debería tener solo 2 de tales bloques, raíz y "core_profiler". (sí, eso significa que el generador de perfiles aparecerá después de la etiqueta HTML de cierre).

Cuestiones relacionadas