Bagaimana cara menambahkan blok secara kondisional (tergantung pada konfigurasi di panel admin) di tata letak Magento's XML?
Kami dapat memeriksa apakah konfigurasi benar pada tindakan. Dalam contoh di bawah ini, jika sample/config/show_toplinks
konfigurasi dari panel admin (di System-> Configuration) benar , maka file template links.phtml
akan digunakan untuk membuat Top Links. Jika sample/config/show_toplinks
adalah palsu , maka template default akan digunakan.
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
</reference>
Saya menemukan solusi ini di suatu tempat di web. Kami dapat menetapkan templat kosong sebagai templat default untuk Tautan Teratas, seperti ini:
<reference name="top.links">
<action method="setTemplate" ifconfig="sample/config/show_toplinks">
<template>page/template/links.phtml</template>
</action>
<!-- OR set completely empty template -->
<action method="setTemplate">
<template>page/template/empty_template_for_links.phtml</template>
</action>
</reference>
Dalam hal ini, jika sample/config/show_toplinks
adalah true , maka template links.phtml
akan digunakan dan Top Link akan ditampilkan. tetapi jika sample/config/show_toplinks
ini palsu , maka empty_template_for_links.phtml
template yang akan digunakan dan template yang benar-benar kosong, sehingga tidak kembali HTML apapun dan Top Links tidak akan terlihat.
- Apakah ada cara lain untuk menampilkan atau menyembunyikan blok tergantung pada konfigurasi di panel admin?
- Apakah solusi ini aman?
- Apakah ini dapat menyebabkan kesalahan yang tidak terduga?
EDIT:
Berdasarkan semua jawaban, saya pikir solusi Rick Kuipers terlihat paling nyaman untuk kasus saya. Tapi saya punya pertanyaan terkait lainnya:
<block type="core/template" name="my_block" template="my/block.phtml" />
<!-- ...add more blocks here -->
<reference name="footer">
<action method="append" ifconfig="sample/config/show_toplinks">
<block>my_block</block>
</action>
<!-- ...append more blocks here -->
</reference>
Jika saya memiliki banyak blok untuk ditambahkan seperti ini (menggunakan append
metode dan ifconfig
), katakanlah 50,
apakah itu mempengaruhi kinerja ? Hanya beberapa blok yang akan benar-benar ditampilkan (itu tergantung pada pengaturan pengguna di Sistem -> Config), tetapi saya perlu menambahkan semua blok itu sebelum saya menambahkannya secara kondisional di dalamnya <reference name="footer">...</reference>
.
Apakah Magento langsung memproses semua blok yang ditambahkan seperti ini?
<block type="core/template" name="my_block" template="my/block.phtml" />
Atau blok diproses hanya jika akhirnya harus ditampilkan dalam templat? Jadi, apakah Magento harus memproses semua 50 blok saya meskipun hanya beberapa blok yang perlu ditampilkan?
my_block
di dalam "head", atau akan menambahkan salinan lain dari blok itu di dalam "head" dan salinan pertama akan tetap ditampilkan di tempat lain (seperti blok sudah ditambahkan sebelumnya<reference name="head">
)? 2. Di mana file PHP saya dapat menemukan semua metode tata letak seperti "append" atau "unsetChild"?<reference name="root">
(atau noncore/text_list
blok lainnya) maka tidak akan ditampilkan secara otomatis kecuali jika dipanggil olehgetChildHtml()
. Itu tidak akan memindahkan blok, itu akan menjadi salinan sehingga Anda dapat menambahkannya beberapa kali.<action>
memanggil metode di blok. Jadi itu tergantung pada blok mana yang sedang kita bicarakan. Anda dapat menemukan beberapa yang standar diMage_Core_Block_Abstract
. Tetapi metode apa pun yang dimiliki oleh blok dapat disebut menggunakan<action>
.<block type="core/template" name="my_block" template="my/block.phtml" />
walaupun itu tidak akan akhirnya ditampilkan.Dengan menggunakan
_template
properti untuk menyembunyikan output adalah pendekatan baru. Saya lebih suka membalikkan nilai pada opsi konfigurasi sehingga Ya = 0 (mungkin model sumber khusus) dan memanggil blok kepalaunsetChild
induk :sumber
Top Links: [enable/disable]
ke sesuatu sepertiHide Top Links: [Yes/No]
.Untuk pertanyaan Anda:
Metode saya hanya mengembang pada Anda
Saya tidak mengerti mengapa itu tidak terjadi
Sekali lagi, kode Anda cukup aman di belakang metode yang tidak akan menyebabkan pengecualian (
getStoreConfig
untuk satu, hanya akan mengembalikan nilai-nilai palsu, sehingga pegangan bersyarat Anda tidak akan ditambahkan) tetapi Anda akan mendapatkan pengecualian jika file template kosong tidak ada. Gunakan tag yang menutup sendiri untuk memberikan nilai kosong (mis.<template />
)Jika saya mengembangkan ini, saya akan memperluas solusi Anda untuk menyertakan pengamat yang memeriksa konfigurasi dan menambahkan pegangan untuk tata letak Anda. Kemudian, dalam file tata letak Anda, Anda dapat mengatur kedua tindakan di dalam berbagai pegangan
default
danshow_toplinks
Dan kemudian di
Observer
Model Anda ...Aaa dan akhirnya di tata letak Anda:
sumber