การกำหนดเป้าหมายหลายเค้าโครงจัดการในเค้าโครง XML


22

ฉันมีตัวควบคุมแบบกำหนดเองที่เข้าถึงที่พา ธ/custommodule/customer/infoซึ่งกำลังโหลด2columns-left.phtmlเทมเพลตบนrootโหนดดังต่อไปนี้:

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

สิ่งที่ฉันต้องการจะทำคืออัปเดตเทมเพลตรูทสำหรับลูกค้าที่ไม่ได้เข้าสู่ระบบบางอย่างเช่น:

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

ฉันเข้าใจว่าฉันไม่สามารถกำหนดเป้าหมายหลายเลย์เอาต์ในแบบนี้ได้ แต่ความตั้งใจควรชัดเจน อัพเดตเทมเพลตรูทสำหรับการจัดการเลย์เอาต์นี้ในขณะที่ลูกค้าไม่ได้ล็อกอิน

ฉันคิดว่าฉันสามารถกำหนดเป้าหมายตัวควบคุมของฉันด้วยสิ่งต่อไปนี้:

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

นี่เป็นการอัปเดตเทมเพลตรูทด้วย1column.phtmlเทมเพลต แต่มันก็ทำในสิ่งที่ดูเหมือนจะเป็นทุกหน้าแทนที่จะเป็นแค่หน้าเป้าหมายในreferenceโหนดของฉัน

ฉันได้ลองหลายวิธีในการอัพเดทเลย์เอาต์นี้ แต่ดูเหมือนว่าจะไม่มีอะไรทำงาน ฉันจะกำหนดเป้าหมายตัวจัดการรูปแบบนี้ได้อย่างไรในเวลาเดียวกันโดยใช้ตัวcustomer_logged_outจัดการเค้าโครง

- แก้ไข - เพื่อให้ชัดเจนนี่เป็นโมดูลของบุคคลที่สามจริงๆ

คำตอบ:


18

เนื่องจากคุณใช้คอนโทรลเลอร์ของคุณเองคุณไม่จำเป็นต้องใช้มือจับเริ่มต้นเท่านั้น ขึ้นอยู่กับสถานะเข้าสู่ระบบที่คุณสามารถเพิ่มในวิธีการข้อมูลของคุณ

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

หรือ

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

จากนั้นในการใช้ไฟล์ layout.xml ของคุณ

<mymodule_customer_info_logged_in>

และ

<mymodule_customer_info_logged_out>

- นอกจากนี้หลังจากการแก้ไขของคุณด้านล่าง -

เห็นว่าคุณไม่ต้องการแก้ไขตัวควบคุม (เนื่องจากเป็นส่วนขยายของบุคคลที่สาม) ฉันจะสร้างส่วนขยายแยกต่างหากซึ่งจะสังเกตเห็นเฉพาะ 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
    }

โก๋. มันไม่เหมาะ แต่เป็นวิธีที่ค่อนข้างสะอาด ดังที่ฉันพูดถึงในความคิดเห็นอื่นของฉันด้านล่างฉันไม่จำเป็นต้องปรับเปลี่ยนโมดูลของบุคคลที่สาม แต่ดูเหมือนว่ามีตัวเลือกไม่มากที่นี่ ความอัปยศเพราะcustomer_logged_in/outมือจับอาจทรงพลัง แต่พวกมันก็ถูกขลิบเพราะข้อ จำกัด นี้
pspahn

14

Alan Storm ได้ตอบสิ่งที่คล้ายกันเช่นนี้:

/programming//a/5601579/1157493

คุณสามารถใช้ผู้ช่วยทำตรรกะของคุณในการตรวจสอบว่ากำหนดเองในการเข้าสู่ระบบ

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

มันจะโทรหาMage::helper('mymodule/myhelper')->switchTemplateIf(); ผู้ช่วยที่คุณสามารถเลือกที่จะเปลี่ยนเทมเพลตหรือเพียงแค่เก็บไว้เช่นนี้

ฉันเชื่อว่ามันตั้งแม่แบบให้กับสิ่งที่คุณreturnอยู่ในฟังก์ชั่นนั้น

มันจะมีลักษณะเช่นนี้:

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

ยังไม่ทดลอง


ฉันมีความคิดเช่นนี้ แต่ฉันหวังว่าจะต้องพึ่งพา layout XML ของโมดูลเพื่อดำเนินการนี้โดยไม่ต้องพึ่งพาคลาสเพิ่มเติมในโมดูล - ปรัชญาของ "ถ้าทำได้ใน XML ให้ทำได้ ใน XML อย่าสร้างโมดูลทรัพยากรเพิ่มเติมหากไม่จำเป็น "
pspahn

@pspahn แน่นอนว่าเป้าหมายคือการพยายามและทำกับระบบโครงร่าง XML ที่วีโอไอพีจัดหาให้ แต่น่าเสียดายที่มันมีข้อ จำกัด และฉันเชื่อว่านี่เป็นหนึ่งในนั้น แม้ว่าฉันจะยังคงคิดว่านี่เป็นทางออกที่ทำงานได้อย่างสมบูรณ์แม้จะมีทรัพยากรโมดูลพิเศษ
Rick Kuipers

@pspahn Fooman มีทางเลือกที่ดีซึ่งฉันอยากจะแนะนำมากกว่าของฉัน มันต้องใช้รหัสน้อย!
Rick Kuipers

ในกรณีนี้ฉันกำลังจัดการกับโมดูลบุคคลที่สาม ฉันไม่ต้องการแก้ไขโมดูลของพวกเขา (เนื่องจากการอัปเดตอาจทำให้เสีย) และฉันไม่ควรวางสิ่งนี้ไว้ในคลาสผู้ช่วยของโมดูลแยกต่างหาก (เนื่องจากมันเชื่อมโยงโมดูลและโมดูลเข้าด้วยกัน
pspahn

6

เมื่อเร็ว ๆ นี้ฉันต้องการฟังก์ชั่นประเภทนี้ & มันเป็นการยากที่จะเพิ่มการจัดการเลย์เอาต์เพิ่มเติม & เพิ่มเติมสำหรับชุดค่าผสมของเลย์เอาต์ที่มีอยู่ทั้งหมดดังนั้นฉันจึงสร้างส่วนเสริมคุณภาพเยี่ยมเพื่อเพิ่มความสามารถในการกำหนดเป้าหมาย

นี่คือลิงก์ไปยังส่วนขยาย - https://github.com/mridul89/MultipleHandles.git

คุณจะใช้มันแบบนี้ -

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

สิ่งนี้จะบอกให้วีโอไอพีใช้เฉพาะcustomer_logged_outเลย์เอาต์เลย์เอาท์เฉพาะถ้าcustommodule_customer_infoเลย์เอาต์เลย์เอาต์นั้นมีอยู่ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.