Was ist der Unterschied zwischen getChildHtml und getBlockHtml?

11

Zusammenfassung

  • Was ist der Unterschied zwischen getChildHtmlund getBlockHtml?
  • Wie kann ich den cms / block-Titel in der Vorlage erhalten?

Ich habe im Wesentlichen die Fußzeile durch meine eigene Fußzeile ersetzt und meine eigene eingestellt. <?= $this->getChildHtml('...') ?>Dies hat nicht funktioniert, bis ich verwendet habe : <?= $this->getBlockHtml('...') ?>.

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

Vorlage (funktioniert nicht):

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

Vorlage (Werke):

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

Lösung:

Zuerst musste ich die Fußzeile in meinem überschreiben, local.xmlindem ich :

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

Das musste ich meinen Kindern hinzufügen (um getChildHtml()arbeiten zu können):

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

Antworten:

27

getBlockHtml('block_name_here')Holen Sie sich das HTML des Blocks mit Namen, block_name_herewenn es im Layout gefunden wird ... überall.
getChildHtml('block_name_here')Sie erhalten block_name_herenur dann das HTML des Blocks mit Namen , wenn dieser Block ein untergeordnetes Element des aktuellen Blocks ist.

Hier ist ein Beispiel. Betrachten Sie den nächsten Layoutabschnitt

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

some_template.phtmlWenn Sie nun in der Vorlagendatei diese Codezeile hinzufügen, <?php echo $this->getBlockHtml('some_other_name')?>erhalten Sie das HTML für den Block some_other_name.
Wenn Sie hinzufügen, erhalten <?php echo $this->getChildHtml('some_other_name')?>Sie nichts.

Im folgenden Szenario

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

getChildHtmlund getBlockHtmlwird dir das gleiche bringen. das HTML des Blocks some_other_name.

Marius
quelle
Danke - Habe ich Recht, wenn ich denke, dass in meiner aktualisierten Frage: <block type="cms/block" name="child_1">Ist ein Kind des footerBlocks? In welchem ​​Fall funktioniert getChildHtml (child_1) nicht?
Asche
@Asche. Ich denke, in Ihrem Fall getChildHtmlfunktioniert das nicht, weil die Layout-Seite (z. B. 3columns.phtml) immer noch den Standard-Fußzeilenblock rendert. Ich meine, er enthält <?php echo $this->getChildHtml('footer') ?>ihn. Habe ich recht? Ich fotografiere hier im Dunkeln, weil ich nicht weiß, wie Ihre Layoutseite aussieht, aber dies ist das erste, was ich überprüfen würde. Versuchen Sie es zu ändern <?php echo $this->getChildHtml('custom_footer') ?>und prüfen Sie, ob Sie es verwenden können getChildHtml.
Marius
Ich denke, du hast recht; Ich habe den alten Fußzeilenblock überschrieben, der funktionierte - obwohl das eigentliche Problem nicht mit Magento zusammenhängt. Ihre Antwort klärt meine Annahmen - danke d00d :)
Asche