Perlihatkan / sembunyikan blok dalam tata letak XML

32

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_toplinkskonfigurasi dari panel admin (di System-> Configuration) benar , maka file template links.phtmlakan digunakan untuk membuat Top Links. Jika sample/config/show_toplinksadalah 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_toplinksadalah true , maka template links.phtmlakan digunakan dan Top Link akan ditampilkan. tetapi jika sample/config/show_toplinksini palsu , maka empty_template_for_links.phtmltemplate yang akan digunakan dan template yang benar-benar kosong, sehingga tidak kembali HTML apapun dan Top Links tidak akan terlihat.

  1. Apakah ada cara lain untuk menampilkan atau menyembunyikan blok tergantung pada konfigurasi di panel admin?
  2. Apakah solusi ini aman?
  3. 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 appendmetode 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?

zitix
sumber

Jawaban:

28

Saya ingin menambahkan opsi saya sebagai lawan dari jawaban benmarks.

Pendekatan saya adalah menggunakan aksi append:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>
Rick Kuipers
sumber
1
Ini dapat diterapkan dalam kasus-kasus tertentu (dan merupakan pemikiran awal saya), namun dalam kasus ini blok yang dimaksud ( top.links ) dipanggil secara default dari inti.
patokan
@ Ben ah maksudmu demi memilikinya modular? Maka pendekatan Anda akan menjadi pendekatan terbaik dalam hal ini.
Rick Kuipers
1
@RickKuipers 1. Bisakah Anda mengklarifikasi cara kerja metode "append" ini? Apakah itu akan bergerak my_blockdi 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"?
zitix
1
@zitix Jika definisi blok ada di <reference name="root">(atau non core/text_listblok lainnya) maka tidak akan ditampilkan secara otomatis kecuali jika dipanggil oleh getChildHtml(). 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 di Mage_Core_Block_Abstract. Tetapi metode apa pun yang dimiliki oleh blok dapat disebut menggunakan <action>.
Rick Kuipers
@RickKuipers Dan bagaimana metode ini memengaruhi kinerja? (Saya mengedit pertanyaan saya) Blokir perlu ditambahkan <block type="core/template" name="my_block" template="my/block.phtml" />walaupun itu tidak akan akhirnya ditampilkan.
zitix
15

Dengan menggunakan _templateproperti 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 :

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>
tanda batas
sumber
1
Terima kasih, ini sangat bagus tetapi perlu membalikkan semua bidang konfigurasi di Sistem -> Konfigurasi. Saya perlu mengubah: Top Links: [enable/disable]ke sesuatu seperti Hide Top Links: [Yes/No].
zitix
1
Model sumber untuk konfigurasi sistem sangat mudah, dan jalur ini jauh lebih rumit daripada menambahkan pegangan pembaruan tata letak kustom melalui pengamat.
patokan
12

Untuk pertanyaan Anda:

  1. Metode saya hanya mengembang pada Anda

  2. Saya tidak mengerti mengapa itu tidak terjadi

  3. Sekali lagi, kode Anda cukup aman di belakang metode yang tidak akan menyebabkan pengecualian ( getStoreConfiguntuk 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 defaultdanshow_toplinks

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

Dan kemudian di ObserverModel Anda ...

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

Aaa dan akhirnya di tata letak Anda:

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>
mpw
sumber
Terima kasih, saya tidak tahu ini, saya pasti akan menggunakan metode ini di masa depan. Tetapi untuk apa yang perlu saya lakukan sekarang, itu membutuhkan terlalu banyak kode tambahan.
zitix