Jaka jest różnica między getChildHtml a getBlockHtml

11

Streszczenie

  • Jaka jest różnica między getChildHtmli getBlockHtml?
  • Jak mogę uzyskać tytuł cms / block w szablonie?

Mam zasadniczo zastąpiony stopkę z własnej stopce i ustawić własną rękę <?= $this->getChildHtml('...') ?>to nie działa, aż kiedyś: <?= $this->getBlockHtml('...') ?>.

Układ 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>

Szablon (nie działa):

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

Szablon (działa):

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

Rozwiązanie:

Przede wszystkim musiałem przesłonić stopkę w moim local.xml:

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

Musiałem dodać moje dzieci ( getChildHtml()aby pracować):

<reference name="footer">
    <block type="cms/block" name="child_1">
         <action method="setBlockId"><block_id>footer_child_1</block_id></action>
    </block>
</reference>
popiół
źródło

Odpowiedzi:

27

getBlockHtml('block_name_here')dostaniesz html bloku z nazwą, block_name_herejeśli znajdzie go w układzie ... gdziekolwiek.
getChildHtml('block_name_here')dostaniesz html bloku o nazwie block_name_heretylko wtedy, gdy ten blok jest potomkiem bieżącego bloku.

Oto przykład. Rozważ kolejną sekcję układu

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

Teraz w pliku szablonu, some_template.phtmljeśli dodasz ten wiersz kodu <?php echo $this->getBlockHtml('some_other_name')?>, otrzymasz HTML dla bloku some_other_name.
Jeśli dodasz <?php echo $this->getChildHtml('some_other_name')?>, nic nie dostaniesz.

W następującym scenariuszu

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

getChildHtmli getBlockHtmldostaniesz to samo. HTML bloku some_other_name.

Marius
źródło
Dzięki - więc mam rację, myśląc, że w moim zaktualizowanym pytaniu, że: <block type="cms/block" name="child_1">jest dzieckiem z footerbloku? W takim przypadku dlaczego `getChildHtml ('child_1') nie działa?
popiół
@Popiół. Myślę, że w twoim przypadku getChildHtmlto nie działa, ponieważ strona układu (na przykład 3columns.phtml) nadal renderuje domyślny blok stopki. Mam na myśli, że ma <?php echo $this->getChildHtml('footer') ?>go w sobie. Czy mam rację? Kręcę tutaj w ciemności, ponieważ nie wiem, jak wygląda strona układu, ale to pierwsza rzecz, którą sprawdzę. Spróbuj zmienić go na <?php echo $this->getChildHtml('custom_footer') ?>i sprawdź, czy możesz użyć getChildHtml.
Marius
Myślę, że masz rację; Zastąpiłem stary blok stopki, który działał - chociaż faktyczny problem nie był związany z Magento. Twoja odpowiedź oczyszcza moje przypuszczenia - dzięki d00d :)
popiół