Qual è la differenza tra getChildHtml e getBlockHtml


11

Sinossi

  • Qual è la differenza tra getChildHtmle getBlockHtml?
  • Come posso ottenere il titolo cms / block nel modello?

Ho essenzialmente sostituito il piè di pagina con il mio piè di pagina e impostare la mia <?= $this->getChildHtml('...') ?>questo non ha funzionato fino a quando ho usato: <?= $this->getBlockHtml('...') ?>.

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

Modello (non funziona):

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

Modello (opere):

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

Soluzione:

Prima di tutto ho dovuto scavalcare il piè di pagina nel mio local.xml:

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

Ho dovuto aggiungere i miei figli (per getChildHtml()lavorare):

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

Risposte:


27

getBlockHtml('block_name_here')ottieni l'html del blocco con nome block_name_herese lo trova nel layout ... ovunque.
getChildHtml('block_name_here')ottieni l'html del blocco con nome block_name_heresolo se quel blocco è figlio del blocco corrente.

Ecco un esempio Considera la sezione di layout successiva

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

Ora nel file modello some_template.phtmlse aggiungi questa riga di codice <?php echo $this->getBlockHtml('some_other_name')?>otterrai l'html per il blocco some_other_name.
Se aggiungi <?php echo $this->getChildHtml('some_other_name')?>non otterrai nulla.

Nel seguente scenario

<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 getBlockHtmlti darà la stessa cosa. l'html del blocco some_other_name.


Grazie - Quindi ho ragione nel pensare che nella mia domanda aggiornata <block type="cms/block" name="child_1">sia : un figlio del footerblocco? In tal caso, perché `getChildHtml ('child_1') non funziona?
ash

@Cenere. Penso che nel tuo caso getChildHtmlnon funzioni perché la pagina di layout (ad esempio 3columns.phtml) esegue comunque il rendering del blocco piè di pagina predefinito <?php echo $this->getChildHtml('footer') ?>. Ho ragione? Sto scattando al buio qui perché non so come sia la tua pagina di layout, ma questa è la prima cosa che vorrei controllare. Prova a cambiarlo in <?php echo $this->getChildHtml('custom_footer') ?>e vedi se puoi usarlo getChildHtml.
Marius

Penso tu abbia ragione; Ho sovrascritto il vecchio blocco piè di pagina che funzionava, sebbene il problema reale non fosse legato a Magento. La tua risposta cancella i miei presupposti - grazie d00d :)
ash
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.