Menargetkan banyak pegangan tata letak dalam tata letak XML

22

Saya memiliki pengontrol khusus yang diakses di jalur /custommodule/customer/infoyang memuat 2columns-left.phtmltemplate pada rootnode sebagai berikut:

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

Yang ingin saya lakukan adalah memperbarui templat root untuk pelanggan yang tidak masuk, seperti:

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

Saya mengerti bahwa saya tidak dapat menargetkan beberapa pegangan tata letak dengan cara ini, tetapi tujuannya harus jelas; perbarui templat root untuk pegangan tata letak ini sementara pelanggan tidak masuk.

Saya berpikir bahwa saya dapat menargetkan pegangan pengontrol saya dengan yang berikut:

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

Ini memang memperbarui template root dengan 1column.phtmltemplate, tetapi melakukan hal itu pada apa yang tampaknya menjadi semua halaman, bukan hanya halaman yang ditargetkan di referencenode saya .

Saya telah mencoba beberapa permutasi dari pembaruan tata letak ini, tetapi sepertinya tidak ada yang berhasil. Bagaimana saya bisa menargetkan pegangan tata letak yang satu ini sementara pada saat yang sama menggunakan customer_logged_outpegangan tata letak?

- edit - Agar jelas, ini sebenarnya adalah modul pihak ketiga.

pspahn
sumber

Jawaban:

18

Karena Anda menggunakan pengontrol Anda sendiri, Anda tidak perlu hanya menggunakan pegangan default. Berdasarkan status login Anda dapat menambahkan metode infoAction Anda

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

atau

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

dan kemudian dalam penggunaan file layout.xml Anda

<mymodule_customer_info_logged_in>

dan

<mymodule_customer_info_logged_out>

- Selain setelah edit Anda di bawah ini -

Melihat bahwa Anda tidak ingin mengedit controller (karena ini adalah ekstensi pihak ke-3), saya akan membuat ekstensi terpisah yang hanya mengamati controller_action_layout_load_before

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

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

        //code to add the custom handles based on login
    }
Kristof di Fooman
sumber
Manis. Ini tidak ideal, tetapi merupakan solusi yang relatif bersih. Seperti yang saya sebutkan di komentar saya yang lain di bawah ini, saya lebih suka tidak perlu memodifikasi modul pihak ketiga, tetapi sepertinya tidak ada banyak pilihan di sini. Malu, karena customer_logged_in/outpegangannya bisa sangat kuat, tetapi mereka menjadi lalai karena keterbatasan ini.
pspahn
14

Alan Storm telah menjawab sesuatu yang mirip seperti ini:

/programming//a/5601579/1157493

Anda dapat menggunakan helper untuk melakukan logika Anda memeriksa apakah kustom masuk.

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

Ini akan memanggil Mage::helper('mymodule/myhelper')->switchTemplateIf(); In helper Anda dapat memutuskan untuk mengganti template atau membiarkannya seperti ini.

Saya percaya ini menetapkan template untuk apa pun yang Anda returndalam fungsi itu.

Akan terlihat seperti ini:

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

Belum dicoba

Rick Kuipers
sumber
Saya memang memiliki pemikiran ini juga, tapi saya berharap hanya harus bergantung pada tata letak modul XML untuk melakukan ini tanpa harus bergantung pada kelas tambahan dalam modul - filosofi "jika dapat dilakukan dalam XML, lakukan dalam XML, jangan membuat sumber daya modul tambahan jika tidak diperlukan ".
pspahn
@ pspahn Tentu saja tujuannya adalah untuk mencoba dan melakukannya dengan sistem tata letak XML yang disediakan Magento, sayangnya ia memiliki keterbatasan dan saya percaya ini adalah salah satunya. Meskipun saya masih berpikir ini adalah solusi yang layak meskipun sumber daya modul tambahan.
Rick Kuipers
@ pspahn Fooman memiliki solusi alternatif yang baik yang saya sarankan daripada saya. Ini membutuhkan lebih sedikit coding!
Rick Kuipers
Dalam hal ini, saya sebenarnya berurusan dengan modul pihak ketiga. Saya lebih suka tidak perlu mengedit modul mereka (karena pembaruan dapat merusaknya) dan saya lebih suka tidak menempatkan ini di kelas pembantu modul yang terpisah (karena itu mengikat modul dan modul mereka bersama-sama di pinggul).
pspahn
6

Saya baru-baru ini membutuhkan fungsionalitas semacam ini & semakin sulit menambahkan lebih banyak & lebih banyak pegangan tata letak untuk semua kombinasi yang berbeda dari pegangan tata letak yang ada, jadi saya membuat ekstensi magento untuk menambahkan kemampuan menargetkan beberapa pegangan tata letak dari tata letak xml secara langsung.

Berikut tautan ke ekstensi- https://github.com/mridul89/MultipleHandles.git

Anda akan menggunakannya seperti ini-

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

Ini akan memberitahu Magento untuk hanya menggunakan customer_logged_outpegangan tata letak khusus ini jika custommodule_customer_infotata letak pegangan juga ada.

Mridul Aggarwal
sumber