Sự khác biệt giữa getChildHtml và getBlockHtml là gì


11

Tóm tắc

  • Sự khác biệt giữa getChildHtmlvà là getBlockHtmlgì?
  • Làm thế nào tôi có thể có được tiêu đề cms / khối trong mẫu?

Về cơ bản, tôi đã thay thế chân trang bằng chân trang của mình và tự đặt chân <?= $this->getChildHtml('...') ?>này Điều này không hoạt động cho đến khi tôi sử dụng : <?= $this->getBlockHtml('...') ?>.

Bố cục 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>

Mẫu (không hoạt động):

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

Mẫu (Hoạt động):

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

Giải pháp:

Trước hết tôi phải ghi đè chân trang bên trong local.xmlbằng cách:

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

Tôi phải thêm con (để getChildHtml()đi làm):

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

Câu trả lời:


27

getBlockHtml('block_name_here')lấy cho bạn html của khối có tên block_name_herenếu nó tìm thấy nó trong bố cục ... ở bất cứ đâu.
getChildHtml('block_name_here')lấy cho bạn html của khối chỉ với tên block_name_herenếu khối đó là con của khối hiện tại.

Đây là một ví dụ. Xem xét phần bố trí tiếp theo

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

Bây giờ trong tệp mẫu some_template.phtmlnếu bạn thêm dòng mã này, <?php echo $this->getBlockHtml('some_other_name')?>bạn sẽ nhận được html cho khối some_other_name.
Nếu bạn thêm <?php echo $this->getChildHtml('some_other_name')?>bạn sẽ không nhận được gì.

IN kịch bản sau

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

getChildHtmlgetBlockHtmlsẽ giúp bạn có được điều tương tự. html của khối some_other_name.


Cảm ơn - Vì vậy, tôi có đúng khi nghĩ rằng trong câu hỏi cập nhật của mình rằng: <block type="cms/block" name="child_1">có phải là một đứa trẻ của footerkhối không? Trong trường hợp nào tại sao `getChildHtml ('child_1') không hoạt động?
tro

@Tro. Tôi nghĩ rằng trong trường hợp của bạn getChildHtmlkhông hoạt động vì trang bố cục (ví dụ 3column.phtml) vẫn hiển thị khối chân trang mặc định. Tôi có nghĩa là nó có <?php echo $this->getChildHtml('footer') ?>bên trong nó. Tôi có đúng không Tôi đang chụp trong bóng tối ở đây vì tôi không biết trang bố cục của bạn trông như thế nào, nhưng đây là điều đầu tiên tôi sẽ kiểm tra. Hãy thử thay đổi nó <?php echo $this->getChildHtml('custom_footer') ?>và xem nếu bạn có thể sử dụng getChildHtml.
Marius

Tôi nghĩ bạn đúng; Tôi ghi đè lên phần chân trang cũ mà nó đang hoạt động - Mặc dù vấn đề thực tế không liên quan đến Magento. Câu trả lời của bạn xóa bỏ các giả định của tôi - cảm ơn d00d :)
tro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.