В чем разница между getChildHtml и getBlockHtml

11

конспект

  • В чем разница между getChildHtmlи getBlockHtml?
  • Как я могу получить заголовок cms / block в шаблоне?

Я по существу заменил колонтитул с моим собственным колонтитула и установить мое собственное <?= $this->getChildHtml('...') ?>Это не работа , пока я не использовал: <?= $this->getBlockHtml('...') ?>.

Макет 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>

Шаблон (не работает):

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

Шаблон (Работы):

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

Решение:

Прежде всего я должен был переопределить нижний колонтитул в моем local.xml:

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

Я должен был добавить своих детей (для того, getChildHtml()чтобы работать):

<reference name="footer">
    <block type="cms/block" name="child_1">
         <action method="setBlockId"><block_id>footer_child_1</block_id></action>
    </block>
</reference>
ясень
источник

Ответы:

27

getBlockHtml('block_name_here')получите html блока с именем, block_name_hereесли он найдет его в макете ... где угодно.
getChildHtml('block_name_here')Получите html блока с именем, block_name_hereтолько если этот блок является дочерним по отношению к текущему блоку.

Вот пример. Рассмотрим следующий раздел макета

<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.phtmlесли вы добавите эту строку кода, <?php echo $this->getBlockHtml('some_other_name')?>вы получите HTML для блока some_other_name.
Если вы добавите, <?php echo $this->getChildHtml('some_other_name')?>вы ничего не получите.

В следующем сценарии

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

getChildHtmlи getBlockHtmlполучит тебе то же самое. HTML-код блока some_other_name.

Мариус
источник
Спасибо. Значит, я прав, думая, что в моем обновленном вопросе это: <block type="cms/block" name="child_1">ребенок footerблока? В каком случае почему `getChildHtml ('child_1') не работает?
пепел
@Ash. Я думаю, что в вашем случае getChildHtmlэто не работает, потому что страница макета (например, 3columns.phtml) по-прежнему отображает блок нижнего колонтитула по умолчанию. Я имею в виду, что он есть <?php echo $this->getChildHtml('footer') ?>внутри. Я прав? Я снимаю здесь в темноте, потому что не знаю, как выглядит ваша верстка, но это первое, что я бы проверил. Попробуйте изменить его на <?php echo $this->getChildHtml('custom_footer') ?>и посмотрите, сможете ли вы его использовать getChildHtml.
Мариус
Я думаю ты прав; Я перезаписал старый блок нижнего колонтитула, он работал - хотя реальная проблема не была связана с Magento. Ваш ответ проясняет мои предположения - спасибо, d00d :)
пепел