Qual é a diferença entre getChildHtml e getBlockHtml

11

Sinopse

  • Qual é a diferença entre getChildHtmle getBlockHtml?
  • Como posso obter o título cms / block no modelo?

Tenho essencialmente substituído o rodapé com a minha própria rodapé e definir meu próprio <?= $this->getChildHtml('...') ?>Isto não funcionou até que eu usei: <?= $this->getBlockHtml('...') ?>.

XML de layout:

<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>

Modelo (não funciona):

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

Modelo (Trabalhos):

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

Solução:

Antes de tudo, tive que substituir o rodapé dentro do meu local.xmlpor:

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

Eu tive que adicionar meus filhos (para getChildHtml()poder trabalhar):

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

Respostas:

27

getBlockHtml('block_name_here')get é o html do bloco com o nome, block_name_herese o encontrar no layout ... em qualquer lugar.
getChildHtml('block_name_here')get é o html do bloco com nome block_name_heresomente se esse bloco for filho do bloco atual.

Aqui está um exemplo. Considere a próxima seção de layout

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

Agora, no arquivo de modelo, some_template.phtmlse você adicionar esta linha de código <?php echo $this->getBlockHtml('some_other_name')?>, receberá o html do bloco some_other_name.
Se você adicionar <?php echo $this->getChildHtml('some_other_name')?>, não receberá nada.

No cenário a seguir

<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>

getChildHtmle getBlockHtmlvocê terá a mesma coisa. o html do bloco some_other_name.

Marius
fonte
Obrigado - Então, estou certo ao pensar que, na minha pergunta atualizada, <block type="cms/block" name="child_1">é : um filho do footerbloco? Nesse caso, por que o `getChildHtml ('child_1') não funciona?
ash
@Cinza. Eu acho que no seu caso isso getChildHtmlnão funciona porque a página de layout (3columns.phtml por exemplo) ainda renderiza o bloco de rodapé padrão <?php echo $this->getChildHtml('footer') ?>. Estou certo? Estou filmando aqui no escuro porque não sei como é a aparência da sua página de layout, mas é a primeira coisa que verifico. Tente alterá-lo para <?php echo $this->getChildHtml('custom_footer') ?>e veja se você pode usá-lo getChildHtml.
Marius
Eu acho que você está certo; Eu substituí o antigo bloco de rodapé que estava funcionando - embora o problema real não estivesse relacionado ao Magento. Sua resposta limpa minhas suposições - graças D00d :)
ash