Apa perbedaan antara getChildHtml dan getBlockHtml

11

Ringkasan

  • Apa perbedaan antara getChildHtmldan getBlockHtml?
  • Bagaimana saya bisa mendapatkan judul cms / blok di template?

Saya telah dasarnya diganti footer dengan footer saya sendiri dan mengatur sendiri <?= $this->getChildHtml('...') ?>ini tidak bekerja sampai aku digunakan: <?= $this->getBlockHtml('...') ?>.

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

Templat (tidak berfungsi):

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

Templat (Karya):

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

Larutan:

Pertama-tama saya harus mengganti footer di dalam saya local.xmldengan:

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

Saya harus menambahkan anak-anak saya (agar getChildHtml()dapat bekerja):

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

Jawaban:

27

getBlockHtml('block_name_here')dapatkan Anda html dari blok dengan nama block_name_herejika menemukannya di tata letak ... di mana saja.
getChildHtml('block_name_here')dapatkan html blok dengan nama block_name_herehanya jika blok itu adalah anak dari blok saat ini.

Berikut ini sebuah contoh. Pertimbangkan bagian tata letak selanjutnya

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

Sekarang dalam file template some_template.phtmljika Anda menambahkan baris kode ini <?php echo $this->getBlockHtml('some_other_name')?>Anda akan mendapatkan html untuk blok tersebut some_other_name.
Jika Anda menambahkan <?php echo $this->getChildHtml('some_other_name')?>Anda tidak akan mendapatkan apa-apa.

DALAM skenario berikut

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

getChildHtmldan getBlockHtmlakan memberi Anda hal yang sama. html dari blok some_other_name.

Marius
sumber
Terima kasih - Jadi, apakah saya benar dalam berpikir bahwa dalam pertanyaan saya yang diperbarui itu: <block type="cms/block" name="child_1">apakah anak itu adalah anak kecil footer? Dalam hal ini mengapa `getChildHtml ('child_1') tidak berfungsi?
abu
@Abu. Saya pikir dalam kasus Anda itu getChildHtmltidak berfungsi karena halaman tata letak (3columns.phtml misalnya) masih membuat blok footer default. Maksud saya ada <?php echo $this->getChildHtml('footer') ?>di dalamnya. Apakah saya benar? Saya memotret dalam gelap di sini karena saya tidak tahu bagaimana tampilan halaman tata letak Anda, tetapi ini adalah hal pertama yang akan saya periksa. Coba ubah <?php echo $this->getChildHtml('custom_footer') ?>dan lihat apakah Anda dapat menggunakannya getChildHtml.
Marius
Saya pikir kamu benar; Saya menimpa blok footer lama itu berfungsi - Meskipun masalah sebenarnya tidak terkait Magento. Jawaban Anda menghapus asumsi saya - terima kasih d00d :)
ash