Düzenli olarak mizanpaj XML'de blokları gösterme / gizleme


32

Magento'nun mizanpaj XML'sinde koşullu olarak bir blok (yönetici panelindeki yapılandırmaya bağlı olarak) nasıl eklenir?

Config işlemlerinde doğru olup olmadığını kontrol edebiliriz. Aşağıdaki örnekte sample/config/show_toplinks, yönetici panelinden config (Sistem-> Yapılandırma'da) true ise , şablon dosyası links.phtmlEn İyi Bağlantıları oluşturmak için kullanılır. Eğer sample/config/show_toplinksbir yanlış , o zaman varsayılan şablon kullanılacaktır.

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

Bu geçici çözümü web'de bir yerde buldum. Üst Bağlantılar için boş bir şablonu varsayılan şablon olarak ayarlayabiliriz, şunun gibi:

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

Bu durumda, sample/config/show_toplinksbir gerçek , daha sonra şablon links.phtmlkullanılan olacak ve Üst Linkler görüntülenecektir. ama eğer sample/config/show_toplinksbir yanlış , o zaman empty_template_for_links.phtmlşablon kullanılacak ve herhangi bir HTML dönmez ve Üst Linkler görünmez böylece şablon, tamamen boştur.

  1. Yönetici panelindeki yapılandırmaya bağlı olarak blokları koşullu olarak göstermenin veya gizlemenin başka bir yolu var mı?
  2. Bu geçici çözüm güvenli midir?
  3. Bu beklenmedik hatalara neden olabilir mi?

DÜZENLE:

Tüm cevaplara dayanarak, Rick Kuipers'in çözümünün benim davam için en uygun göründüğünü düşünüyorum. Ancak başka bir sorum daha var:

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

Bu gibi eklemek için birçok blok varsa ( appendve yöntemini kullanarak ifconfig), diyelim ki 50, performansı etkiler mi? Sadece bazı bloklar gerçekten gösterilecektir (bu, kullanıcının Sistem -> Konfigürasyondaki ayarlarına bağlıdır), fakat şartlı olarak eklemelerini eklemeden önce tüm bu blokları eklemem gerekiyor <reference name="footer">...</reference>.

Magento, bunun gibi eklenen tüm blokları anında işler mi?

    <block type="core/template" name="my_block" template="my/block.phtml" />

Veya bloklar yalnızca şablonda nihayet gösterilmeleri gerekiyorsa işlenir? Öyleyse Magento'nun 50 bloğumun tamamını işlemesi gerekecek, ancak bu blokların yalnızca bir kısmının gösterilmesi gerekebilir mi?

Yanıtlar:


28

Seçeneğimin yanıtının aksine seçeneğimi de eklemek istiyorum.

Benim yaklaşımım, ekleme eylemini kullanmaktır:

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

1
Bu, bazı durumlarda geçerli olabilir (ve benim ilk düşüncem), ancak bu durumda söz konusu blok ( top.links ) çekirdekten varsayılan olarak çağrılır.
Benmark

@ benmarks ah modüler olması için mi demek istiyorsun? Öyleyse yaklaşımınız bu durumda en iyi yaklaşım olacaktır.
Rick Kuipers,

1
@RickKuipers 1. Bu "ekleme" yönteminin nasıl çalıştığını açıklayabilir misiniz? my_block“Head” içinde hareket edecek mi, yoksa “head” içine o bloğun başka bir kopyasını ekleyecek mi ve ilk kopya yine başka bir yerde gösterilecek mi (blok daha önce eklenmiş olduğu gibi <reference name="head">)? 2. Hangi PHP dosyasında "append" veya "unsetChild" gibi tüm bu yerleşim yöntemlerini bulabilirim?
zitix,

1
@zitix Eğer bloğun tanımı <reference name="root">(ya da herhangi bir core/text_listblok dışı ) ise, çağrılmadıkça otomatik olarak gösterilmez getChildHtml(). Bloğu taşımayacak, bir kopya olacak, böylece birden çok defa ekleyebileceksin. <action>blokta bir yöntem çağırır. Yani hangi bloktan bahsettiğimize bağlı. İçinde birkaç standart olanı bulabilirsiniz Mage_Core_Block_Abstract. Ancak bloğun sahip olduğu herhangi bir yöntem kullanılarak çağrılabilir <action>.
Rick Kuipers,

@RickKuipers Peki bu yöntem performansı nasıl etkiler? (Sorumu değiştirdim) <block type="core/template" name="my_block" template="my/block.phtml" />Sonunda görüntülenmeyecek olsa bile blok eklenmesi gerekiyor .
zitix,

15

_templateÇıktıyı gizlemek için özelliğini kullanarak yeni bir yaklaşımdır. Config seçeneğindeki değerleri tersine çevirmeyi tercih ederim, böylece Yes = 0 (belki de özel bir kaynak model) ve unsetChildana kafa bloğunu çağırır :

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

1
Teşekkürler, bu çok iyi ama Sistem -> Konfig. Değişmem gerekecek: Top Links: [enable/disable]Gibi bir şey Hide Top Links: [Yes/No].
zitix

1
Sistem konfigürasyonu için kaynak modelleri inanılmaz derecede kolaydır ve bu yol gözlemci aracılığıyla özel bir düzen güncelleme tutamağı eklemekten çok daha az karmaşıktır.
Benmark

12

Sorularınıza gelince:

  1. Benim yöntemim sadece size göre genişler.

  2. Neden olmayacağını anlayamıyorum.

  3. Yine, kodunuz istisnalara yol açmayacak yöntemlerin ardında oldukça güvenlidir ( getStoreConfigbirincisi, sadece sahte değerler döndürür, bu nedenle koşullu tanıtıcınız eklenmez) ancak boş şablon dosyası yoksa, bir istisna elde edersiniz. Boş bir değer iletmek için kendiliğinden kapanan bir etiket kullanın (örn. <template />)

Bunu geliştiriyor olsaydım, çözümünüzü yapılandırmayı kontrol eden ve şartlı olarak düzeninize bir tanıtıcı ekleyen bir gözlemci içerecek şekilde genişletirdim. Ardından, düzen dosyasında farklı handles- içeride hem eylemleri ayarlayabilirsiniz defaultveshow_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>

Ve sonra senin ObserverModelinde ...

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

Aaave sonunda düzeninize:

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

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

Teşekkürler, bunu bilmiyordum, gelecekte bu yöntemi kullanacağım kesin. Ama şimdi yapmam gerekenler için, çok fazla ek kod gerektiriyor.
zitix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.