Яка різниця між 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') не працює?
попіл

@Зола. Я думаю, що у вашому випадку getChildHtmlце не працює, тому що сторінка макета (наприклад, 3column.phtml) все ще видає блок нижнього колонтитулу за замовчуванням. Я маю на увазі, що він знаходиться <?php echo $this->getChildHtml('footer') ?>всередині нього. Я правий? Я знімаю тут у темряві, бо не знаю, як виглядає ваша макетна сторінка, але це перше, що я перевірив би. Спробуйте змінити його <?php echo $this->getChildHtml('custom_footer') ?>і побачити, чи можете ви використовувати getChildHtml.
Маріус

Я думаю, ти маєш рацію; Я перезаписав старий блок нижнього колонтитулу, він працював - Хоча справжня проблема не була пов'язана з Magento. Ваша відповідь очищує мої припущення - спасибі d00d :)
попел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.