แสดง / ซ่อนบล็อคในเค้าโครง XML โดยมีเงื่อนไข


32

วิธีเพิ่มบล็อกแบบมีเงื่อนไข (ขึ้นอยู่กับการกำหนดค่าในแผงการดูแลระบบ) ใน XML เลย์เอาต์ของ Magento?

เราสามารถตรวจสอบว่าการตั้งค่าเป็นจริงกับการกระทำ ในตัวอย่างด้านล่างหากการsample/config/show_toplinksกำหนดค่าจากแผงควบคุม (ในระบบ -> การกำหนดค่า) เป็นจริงไฟล์แม่แบบlinks.phtmlจะถูกใช้เพื่อแสดงผลลิงก์ยอดนิยม หากsample/config/show_toplinksเป็นเท็จจะมีการใช้แม่แบบเริ่มต้น

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

ฉันพบวิธีแก้ปัญหานี้ที่ใดที่หนึ่งในเว็บ เราสามารถตั้งค่าเทมเพลตเปล่าเป็นเทมเพลตเริ่มต้นสำหรับลิงค์ยอดนิยมเช่นนี้:

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

ในกรณีนี้ถ้าsample/config/show_toplinksเป็นจริงเทมเพลตlinks.phtmlจะถูกใช้และลิงก์ยอดนิยมจะปรากฏขึ้น แต่ถ้าsample/config/show_toplinksเป็นเท็จแล้วempty_template_for_links.phtmlแม่แบบจะถูกใช้และแม่แบบที่จะสมบูรณ์ว่างจึงไม่กลับมาใช้ HTML และลิงก์ยอดนิยมจะมองไม่เห็น

  1. มีวิธีอื่นที่จะแสดงหรือซ่อนบล็อคตามเงื่อนไขโดยขึ้นอยู่กับการกำหนดค่าในแผงควบคุมหรือไม่
  2. วิธีแก้ปัญหานี้ปลอดภัยหรือไม่
  3. สิ่งนี้สามารถทำให้เกิดข้อผิดพลาดที่ไม่คาดคิดได้หรือไม่?

แก้ไข:

จากคำตอบทั้งหมดฉันคิดว่าทางออกของ Rick Kuipers ดูจะสะดวกที่สุดสำหรับกรณีของฉัน แต่ฉันมีคำถามอื่นที่เกี่ยวข้อง:

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

หากฉันมีหลายบล็อกที่จะเพิ่มเช่นนี้ (ใช้appendวิธีการและifconfig) สมมติว่า 50 มันมีผลต่อประสิทธิภาพหรือไม่ เพียงบางส่วนของบล็อกที่จะแสดงจริงๆ (ที่ขึ้นอยู่กับการตั้งค่าของผู้ใช้ในระบบ -> Config) <reference name="footer">...</reference>แต่ฉันจำเป็นต้องเพิ่มบล็อกทุกคนก่อนที่ผมจะมีเงื่อนไขผนวกไว้ภายใน

Magento ประมวลผลบล็อกทั้งหมดที่เพิ่มเข้ามาเช่นนี้ทันทีหรือไม่?

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

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

คำตอบ:


28

ฉันต้องการที่จะเพิ่มตัวเลือกของฉันตรงข้ามกับคำตอบของเครื่องหมายบอกตำแหน่ง

แนวทางของฉันคือใช้การดำเนินการต่อท้าย:

    <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
สิ่งนี้สามารถนำไปใช้ในบางกรณี (และเป็นความคิดเริ่มต้นของฉัน) อย่างไรก็ตามในกรณีนี้บล็อกที่เป็นปัญหา ( top.links ) จะถูกเรียกใช้โดยค่าเริ่มต้นจากแกน
benmarks

@ เครื่องหมายคุณอาหมายถึงเพื่อให้มันเป็นแบบแยกส่วนได้หรือไม่ จากนั้นแนวทางของคุณจะเป็นแนวทางที่ดีที่สุดในกรณีนี้
Rick Kuipers

1
@RickKuipers 1. คุณช่วยอธิบายได้ไหมว่าวิธีการ "ผนวก" นี้ทำงานอย่างไร? มันจะย้ายmy_blockเข้าไปข้างใน "หัว" หรือจะเพิ่มอีกหนึ่งสำเนาของบล็อกนั้นใน "หัว" และสำเนาแรกจะยังคงปรากฏที่อื่น (เมื่อบล็อกถูกเพิ่มก่อนหน้านี้<reference name="head">) 2. ไฟล์ PHP ชนิดใดที่ฉันสามารถหาวิธีการจัดวางทั้งหมดเช่น "ผนวก" หรือ "unsetChild"
zitix

1
@zitix หากนิยามบล็อกที่อยู่ใน<reference name="root">(หรืออื่น ๆ ที่ไม่ใช่ใด ๆcore/text_listบล็อก) getChildHtml()แล้วมันจะไม่ถูกนำมาแสดงโดยอัตโนมัติเว้นแต่มันถูกเรียกโดย มันจะไม่ย้ายบล็อกมันจะเป็นสำเนาเพื่อให้คุณสามารถผนวกได้หลายครั้ง <action>เรียกวิธีการในบล็อก ดังนั้นมันขึ้นอยู่กับว่าเรากำลังพูดถึงบล็อกอะไร Mage_Core_Block_Abstractคุณสามารถหาคนมาตรฐานไม่กี่คนใน แต่วิธีการใด ๆ <action>ที่เป็นเจ้าของโดยบล็อกสามารถเรียกใช้
ริก Kuipers

@RickKuipers และวิธีการนี้ส่งผลต่อประสิทธิภาพอย่างไร (ฉันแก้ไขคำถามของฉัน) ต้องเพิ่มบล็อก<block type="core/template" name="my_block" template="my/block.phtml" />แม้ว่าจะไม่ปรากฏขึ้นในที่สุด
zitix

15

โดยใช้_templateคุณสมบัติเพื่อซ่อนเอาต์พุตเป็นวิธีการใหม่ ฉันต้องการที่จะย้อนกลับค่าในตัวเลือกการตั้งค่าเพื่อให้ Yes = 0 (อาจเป็นรูปแบบที่มาที่กำหนดเอง) และโทรunsetChildบนบล็อกหัวหลัก:

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

1
ขอบคุณนี่เป็นสิ่งที่ดีมาก แต่ต้องมีการย้อนกลับฟิลด์การกำหนดค่าทั้งหมดในระบบ -> การกำหนดค่า ฉันจะต้องเปลี่ยน: เพื่อสิ่งที่ต้องการTop Links: [enable/disable] Hide Top Links: [Yes/No]
zitix

1
โมเดลต้นทางสำหรับการกำหนดค่าระบบทำได้ง่ายอย่างไม่น่าเชื่อและเส้นทางนี้มีความซับซ้อนน้อยกว่าการเพิ่มหมายเลขอ้างอิงการปรับปรุงเค้าโครงที่กำหนดเองผ่านทางผู้สังเกตการณ์
benmarks

12

ตามคำถามของคุณ:

  1. วิธีการของฉันเพิ่งจะขยายไปกับคุณ

  2. ฉันไม่เห็นว่าทำไมมันจะไม่เป็น

  3. อีกครั้งรหัสของคุณค่อนข้างปลอดภัยอยู่เบื้องหลังวิธีที่จะไม่ก่อให้เกิดข้อยกเว้น ( getStoreConfigสำหรับหนึ่งจะเพิ่งส่งกลับค่าเท็จดังนั้นการจัดการตามเงื่อนไขของคุณจะไม่ถูกเพิ่ม) แต่คุณจะได้รับการยกเว้นถ้าไฟล์เทมเพลตเปล่าไม่มีอยู่ ใช้แท็กปิดตัวเองเพื่อส่งผ่านค่าว่าง (เช่น<template />)

ถ้าฉันกำลังพัฒนาสิ่งนี้ฉันจะขยายวิธีแก้ปัญหาของคุณเพื่อรวมผู้สังเกตการณ์ซึ่งตรวจสอบการกำหนดค่าและเพิ่มหมายเลขอ้างอิงในเค้าโครงของคุณ จากนั้นในไฟล์เลย์เอาต์ของคุณคุณสามารถตั้งค่าการกระทำทั้งสองอย่างภายในที่จับที่แตกต่างกันdefaultและshow_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>

และจากนั้นในObserverรูปแบบของคุณ...

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

ในที่สุด Aaaand ในเค้าโครงของคุณ:

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

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

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