¿Cuál es la diferencia entre getChildHtml y getBlockHtml

11

Sinopsis

  • ¿Cuál es la diferencia entre getChildHtmly getBlockHtml?
  • ¿Cómo puedo obtener el título de cms / block en la plantilla?

He reemplazado esencialmente el pie de página con mi propio pie de página y establecer mi propio <?= $this->getChildHtml('...') ?>esto no funcionó hasta que usé: <?= $this->getBlockHtml('...') ?>.

Diseño XML:

<layout>
    <default>
        <block type="core/template" name="custom_footer" as="footer" template="page/html/footer.phtml">
            <block type="cms/block" name="child_1">
                <action method="setBlockId"><block_id>footer_child_1</block_id></action>
            </block>
         </block>
    </layout>
</default>

Plantilla (no funciona):

<footer>
    <div class="row">
        <div class="col-sp4"><?= $this->getChildHtml('child_1') ?></div>
    </div>
</footer>

Plantilla (Obras):

<footer>
    <div class="row">
        <div class="col-sp4"><?= $this->getBlockHtml('child_1') ?></div>
    </div>
</footer>

Solución:

En primer lugar, tuve que anular el pie de página dentro de mi local.xmlpor:

<default>
    <block type="core/template" template="page/html/custom_footer.phtml" name ="custom_footer" as "footer" />
</default>

Tuve que agregar a mis hijos (para getChildHtml()poder trabajar):

<reference name="footer">
    <block type="cms/block" name="child_1">
         <action method="setBlockId"><block_id>footer_child_1</block_id></action>
    </block>
</reference>
ceniza
fuente

Respuestas:

27

getBlockHtml('block_name_here')te da el html del bloque con nombre block_name_heresi lo encuentra en el diseño ... en cualquier lugar.
getChildHtml('block_name_here')obtiene el html del bloque con nombre block_name_heresolo si ese bloque es hijo del bloque actual.

Aquí hay un ejemplo. Considere la siguiente sección de diseño

<block type="core/template" template="some_template.phtml" name="some_name" />
<block type="core/template" template="some_other_template.phtml" name="some_other_name" />

Ahora, en el archivo de plantilla, some_template.phtmlsi agrega esta línea de código <?php echo $this->getBlockHtml('some_other_name')?>, obtendrá el html para el bloque some_other_name.
Si agrega <?php echo $this->getChildHtml('some_other_name')?>no obtendrá nada.

EN el siguiente escenario

<block type="core/template" template="some_template.phtml" name="some_name">
    <block type="core/template" template="some_other_template.phtml" name="some_other_name" />
</block>

getChildHtmly getBlockHtmlte conseguirá lo mismo. El html del bloque some_other_name.

Marius
fuente
Gracias. Entonces, ¿estoy en lo cierto al pensar que en mi pregunta actualizada que: <block type="cms/block" name="child_1">es un hijo del footerbloque? En cuyo caso, ¿por qué `getChildHtml ('child_1') no funciona?
ceniza
@Ceniza. Creo que en su caso eso getChildHtmlno funciona porque la página de diseño (3columns.phtml, por ejemplo) todavía representa el bloque de pie de página predeterminado. Es decir, tiene <?php echo $this->getChildHtml('footer') ?>dentro. Estoy en lo cierto? Estoy filmando en la oscuridad aquí porque no sé cómo se ve tu página de diseño, pero esto es lo primero que revisaría. Intente cambiarlo a <?php echo $this->getChildHtml('custom_footer') ?>y vea si puede usarlo getChildHtml.
Marius
Creo que tienes razón; Sobreescribí el antiguo bloque de pie de página que funcionaba, aunque el problema real no estaba relacionado con Magento. Su respuesta aclara mis suposiciones - gracias d00d :)
ceniza