ความแตกต่างระหว่าง 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ใช้งานไม่ได้เนื่องจากหน้าเลย์เอาต์ (เช่น 3columns.phtml) ยังคงแสดงผลส่วนท้ายของบล็อกเริ่มต้นฉันหมายความว่ามันมี<?php echo $this->getChildHtml('footer') ?>อยู่ข้างใน ฉันถูกไหม? ฉันถ่ายในที่มืดที่นี่เพราะฉันไม่รู้ว่าหน้าเลย์เอาต์ของคุณเป็นอย่างไร แต่นี่เป็นสิ่งแรกที่ฉันจะตรวจสอบ ลองเปลี่ยนไปและดูว่าคุณสามารถใช้<?php echo $this->getChildHtml('custom_footer') ?> getChildHtml
Marius

ฉันคิดว่าคุณพูดถูก ฉันเขียนทับส่วนท้ายของบล็อกเก่าซึ่งใช้งานได้ - แม้ว่าปัญหาที่เกิดขึ้นจริงไม่เกี่ยวข้องกับวีโอไอพี คำตอบของคุณล้างสมมติฐานของฉัน - ขอบคุณ d00d :)
เถ้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.