Mizanpaj XML'sinde birden çok düzen işleci hedefleme


22

Şablonu düğüme /custommodule/customer/infoyükleyen yolda erişilen özel bir denetleyicim var :2columns-left.phtmlroot

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

Yapmak istediğim, giriş yapmamış müşteriler için kök şablonu güncellemektir:

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

Bu şekilde birden fazla yerleşim tutamacını hedefleyemediğimi biliyorum, ancak amacın açık olması gerekir; Müşteriler oturum açmamışken bu düzen tanıtıcısının kök şablonunu güncelleyin.

Kontrol cihazımın tutamacını aşağıdakilerle hedefleyebileceğimi düşünmüştüm:

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

Bu aslında kök şablonu şablonla günceller 1column.phtml, ancak sadece düğümümde hedeflenen sayfa yerine tüm sayfalarda göründüğü gibi reference.

Bu düzen güncellemesinin birkaç permütasyonunu denedim, ancak hiçbiri çalışmıyor gibi görünüyor. Bu bir düzen tutamacını aynı zamanda düzen tutamacını kullanırken nasıl hedefleyebilirim customer_logged_out?

- edit - Açık olmak gerekirse, bu aslında üçüncü parti bir modül.

Yanıtlar:


18

Kendi denetleyicinizi kullandığınız için yalnızca varsayılan tutamaçları kullanmanız gerekmez. İnfoAction yönteminize ekleyebileceğiniz giriş durumuna göre

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

veya

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

ve daha sonra layout.xml dosyanızda kullanın

<mymodule_customer_info_logged_in>

ve

<mymodule_customer_info_logged_out>

- aşağıdaki düzenlemeden sonra ekleme -

Denetleyiciyi düzenlemek istemediğinizi görünce (üncü parti bir uzantı olduğundan), yalnızca controller_action_layout_load_before önce gözlemleyen ayrı bir uzantı oluştururdum.

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

Şık. Bu ideal değildir, ancak nispeten temiz bir çözümdür. Aşağıdaki diğer yorumumda belirttiğim gibi, üçüncü parti bir modülü değiştirmek zorunda kalmamayı tercih ediyorum, fakat burada pek bir seçenek yok gibi görünüyor. Utanç, çünkü customer_logged_in/outtutamaçlar çok güçlü olabilir , ancak bu sınırlama nedeniyle anlaşılmazlar.
pspahn

14

Alan Storm şöyle bir cevap verdi:

/programming//a/5601579/1157493

Özel giriş yapmış olup olmadığını kontrol etme mantığınızı yapmak için bir yardımcı kullanabilirsiniz.

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

Bu Mage::helper('mymodule/myhelper')->switchTemplateIf(); yardımcı olacaktır Şablonu değiştirmeye karar verebilirsiniz veya sadece bu şekilde kalsın.

Şablonu return, bu fonksiyondaki her şeye ayarladığına inanıyorum .

Bu gibi bir şey olurdu:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

Test edilmemiş


Bu düşünceyi de yaptım, ancak modülün ek sınıflarına güvenmek zorunda kalmadan bunu yapmak için sadece modülün yerleşim XML'sine güvenmek zorunda kalmayı umuyordum. XML’de gerekli değilse ek modül kaynakları oluşturmayın ".
pspahn

@pspahn Elbette amaç, Magento'nun sağladığı XML düzen sistemiyle denemek ve yapmak. Maalesef sınırlamaları var ve bunun onlardan biri olduğuna inanıyorum. Yine de, bunun ilave modül kaynağına rağmen mükemmel bir çözüm olduğunu düşünüyorum.
Rick Kuipers

@pspahn Fooman'ın benim önerebileceğim iyi bir alternatif çözümü var. Daha az kodlama gerektirir!
Rick Kuipers

Bu durumda, aslında üçüncü parti bir modül ile ilgileniyorum. Modüllerini düzenlemek zorunda kalmamayı tercih ederim (çünkü güncellemeler bozabilir) ve bunu ayrı bir modülün yardımcı sınıfına yerleştirmeyi tercih etmemeyi tercih etti (çünkü modüllerini ve modülünü kalçaya bağlar).
pspahn

6

Yakın zamanda bu tür bir işleve ihtiyacım vardı ve mevcut düzen tutamaçlarının tüm farklı kombinasyonları için daha fazla düzen tutamaçları eklemek zorlaşıyordu, bu yüzden doğrudan düzen xml'den çoklu düzen tutamaçlarını hedefleme yeteneğini eklemek için bir magento uzantısı oluşturdum.

İşte uzantısı- https://github.com/mridul89/MultipleHandles.git

Bunu böyle kullanırsın.

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

Bu, magento'ya yalnızca yerleşim tutacağı da mevcutsa bu özel customer_logged_outyerleşim tutacağını kullanmasını söyleyecektir custommodule_customer_info.

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.