Quelle est la différence entre getChildHtml et getBlockHtml

11

Synopsis

  • Quelle est la difference entre getChildHtmlet getBlockHtml?
  • Comment puis-je obtenir le titre cms / block dans le modèle?

Je l' ai essentiellement remplacé le pied avec mon pied de page et mettre ma propre <?= $this->getChildHtml('...') ?>Cela n'a pas fonctionné jusqu'à ce que je: <?= $this->getBlockHtml('...') ?>.

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

Modèle (ne fonctionne pas):

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

Modèle (travaux):

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

Solution:

Tout d'abord, j'ai dû remplacer le pied de page à l'intérieur de mon local.xmlpar:

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

J'ai dû ajouter mes enfants (pour getChildHtml()pouvoir travailler):

<reference name="footer">
    <block type="cms/block" name="child_1">
         <action method="setBlockId"><block_id>footer_child_1</block_id></action>
    </block>
</reference>
cendre
la source

Réponses:

27

getBlockHtml('block_name_here')vous obtenez le html du bloc avec nom block_name_heres'il le trouve dans la mise en page ... n'importe où.
getChildHtml('block_name_here')vous obtenez le html du bloc avec nom block_name_hereuniquement si ce bloc est un enfant du bloc actuel.

Voici un exemple. Considérez la prochaine section de mise en page

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

Maintenant, dans le fichier modèle, some_template.phtmlsi vous ajoutez cette ligne de code, <?php echo $this->getBlockHtml('some_other_name')?>vous obtiendrez le code HTML du bloc some_other_name.
Si vous ajoutez, <?php echo $this->getChildHtml('some_other_name')?>vous n'obtiendrez rien.

DANS le scénario suivant

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

getChildHtmlet getBlockHtmlvous obtiendrez la même chose. le html du bloc some_other_name.

Marius
la source
Merci - J'ai donc raison de penser que dans ma question mise à jour: <block type="cms/block" name="child_1">est-ce un enfant du footerbloc? Dans ce cas, pourquoi `getChildHtml ('child_1') ne fonctionne-t-il pas?
ash
@Cendre. Je pense que dans votre cas, cela getChildHtmlne fonctionne pas parce que la page de mise en page (3columns.phtml par exemple) affiche toujours le bloc de pied de page par défaut <?php echo $this->getChildHtml('footer') ?>. Ai-je raison? Je tire dans le noir ici parce que je ne sais pas à quoi ressemble votre page de mise en page, mais c'est la première chose que je vérifierais. Essayez de le changer <?php echo $this->getChildHtml('custom_footer') ?>et voyez si vous pouvez l'utiliser getChildHtml.
Marius
Je pense que tu as raison; J'ai remplacé l'ancien bloc de pied de page sur lequel il fonctionnait - bien que le problème réel ne soit pas lié à Magento. Votre réponse efface mes hypothèses - merci d00d :)
ash