Có điều kiện hiển thị / ẩn các khối trong bố cục XML


32

Làm cách nào để thêm một cách có điều kiện một khối (tùy thuộc vào cấu hình trong bảng quản trị) trong XML bố cục của Magento?

Chúng tôi có thể kiểm tra nếu cấu hình là đúng trên hành động. Trong ví dụ bên dưới, nếu sample/config/show_toplinkscấu hình từ bảng quản trị (trong Hệ thống-> Cấu hình) là đúng , thì tệp mẫu links.phtmlsẽ được sử dụng để hiển thị Liên kết hàng đầu. Nếu sample/config/show_toplinkssai , thì mẫu mặc định sẽ được sử dụng.

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

Tôi tìm thấy cách giải quyết này ở đâu đó trên web. Chúng tôi có thể đặt mẫu trống làm mẫu mặc định cho Liên kết hàng đầu, như thế này:

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

Trong trường hợp này, nếu sample/config/show_toplinksđúng , thì mẫu links.phtmlsẽ được sử dụng và Liên kết hàng đầu sẽ được hiển thị. nhưng nếu sample/config/show_toplinkssai , thì empty_template_for_links.phtmlmẫu sẽ được sử dụng và mẫu đó hoàn toàn trống, do đó nó không trả về bất kỳ HTML nào và các Liên kết hàng đầu sẽ không hiển thị.

  1. Có cách nào khác để hiển thị có điều kiện hoặc ẩn các khối tùy thuộc vào cấu hình trong bảng quản trị không?
  2. Cách giải quyết này có an toàn không?
  3. Điều này có thể gây ra bất kỳ lỗi không mong muốn?

CHỈNH SỬA:

Dựa trên tất cả các câu trả lời tôi nghĩ rằng giải pháp của Rick Kuipers có vẻ thuận tiện nhất cho trường hợp của tôi. Nhưng tôi có một câu hỏi liên quan khác:

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

Nếu tôi có nhiều khối để thêm như thế này (sử dụng appendphương thức và ifconfig), giả sử 50, nó có ảnh hưởng đến hiệu suất không? Chỉ một số khối sẽ thực sự được hiển thị (phụ thuộc vào cài đặt của người dùng trong Hệ thống -> Cấu hình), nhưng tôi cần thêm tất cả các khối đó trước khi tôi có điều kiện nối chúng vào bên trong <reference name="footer">...</reference>.

Magento có ngay lập tức xử lý tất cả các khối được thêm vào như thế này không?

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

Hoặc các khối chỉ được xử lý nếu cuối cùng chúng phải được hiển thị trong mẫu? Vì vậy, Magento sẽ phải xử lý tất cả 50 khối của tôi mặc dù thực tế là chỉ một số trong những khối đó cần được hiển thị?

Câu trả lời:


28

Tôi muốn thêm tùy chọn của mình thay vì câu trả lời.

Cách tiếp cận của tôi là sử dụng hành động chắp thêm:

    <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
Điều này có thể áp dụng trong một số trường hợp nhất định (và là suy nghĩ ban đầu của tôi), tuy nhiên trong trường hợp này, khối trong câu hỏi ( top.links ) được gọi theo mặc định từ lõi.
đánh dấu

@benmark ah bạn có nghĩa là vì lợi ích của nó có mô-đun? Sau đó, cách tiếp cận của bạn sẽ là cách tiếp cận tốt nhất trong trường hợp này.
Rick Kuipers

1
@RickKuipers 1. Bạn có thể làm rõ phương thức "chắp thêm" này hoạt động như thế nào không? Nó sẽ di chuyển my_blockbên trong "đầu", hoặc nó sẽ thêm một bản sao khác của khối đó bên trong "đầu" và bản sao đầu tiên sẽ vẫn được hiển thị ở một nơi khác (như khối đã được thêm trước đó <reference name="head">)? 2. Trong tệp PHP nào tôi có thể tìm thấy tất cả các phương thức bố trí như "chắp thêm" hoặc "unsetChild"?
zitix

1
@zitix Nếu định nghĩa của khối nằm trong <reference name="root">(hoặc bất kỳ core/text_listkhối không nào khác ) thì nó sẽ không được hiển thị tự động trừ khi nó được gọi bởi getChildHtml(). Nó sẽ không di chuyển khối, nó sẽ là một bản sao để bạn có thể nối nó nhiều lần. <action>gọi một phương thức trong khối. Vì vậy, nó phụ thuộc vào khối mà chúng ta đang nói về. Bạn có thể tìm thấy một vài tiêu chuẩn trong Mage_Core_Block_Abstract. Nhưng bất kỳ phương pháp nào thuộc sở hữu của khối có thể được gọi bằng cách sử dụng <action>.
Rick Kuipers

@RickKuipers Và phương pháp này ảnh hưởng đến hiệu suất như thế nào? (Tôi đã chỉnh sửa câu hỏi của mình) Khối cần được thêm <block type="core/template" name="my_block" template="my/block.phtml" />ngay cả khi cuối cùng nó sẽ không được hiển thị.
zitix

15

Bằng cách sử dụng _templatetài sản để ẩn đầu ra là một cách tiếp cận mới. Tôi muốn đảo ngược các giá trị trên tùy chọn cấu hình để Yes = 0 (có lẽ là mô hình nguồn tùy chỉnh) và gọi khối đầuunsetChild cha :

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

1
Cảm ơn bạn, điều này rất tốt nhưng nó yêu cầu đảo ngược tất cả các trường cấu hình trong Hệ thống -> Cấu hình. Tôi sẽ cần phải thay đổi: Top Links: [enable/disable]thành một cái gì đó như Hide Top Links: [Yes/No].
zitix

1
Các mô hình nguồn cho cấu hình hệ thống cực kỳ dễ dàng và đường dẫn này ít phức tạp hơn nhiều so với việc thêm một trình xử lý cập nhật bố cục tùy chỉnh thông qua trình quan sát.
đánh dấu

12

Đối với câu hỏi của bạn:

  1. Phương pháp của tôi chỉ mở rộng theo bạn

  2. Tôi không thể hiểu tại sao nó sẽ không

  3. Một lần nữa, mã của bạn khá an toàn đằng sau các phương thức không gây ra ngoại lệ ( getStoreConfigđối với một, sẽ chỉ trả về giá trị giả, do đó, điều khiển có điều kiện của bạn sẽ không được thêm vào) nhưng bạn sẽ có một ngoại lệ nếu tệp mẫu trống không tồn tại. Sử dụng thẻ tự đóng để chuyển một giá trị trống (ví dụ <template />)

Nếu tôi đang phát triển điều này, tôi sẽ mở rộng giải pháp của bạn để bao gồm một người quan sát kiểm tra cấu hình và có điều kiện thêm một điều khiển vào bố cục của bạn. Sau đó, trong tệp bố cục của bạn, bạn có thể đặt cả hai hành động bên trong các thẻ điều khiển khác nhau- defaultshow_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>

Và sau đó trong ObserverMô hình của bạn ...

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

Aaaand cuối cùng trong bố cục của bạn:

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

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

Cảm ơn bạn, tôi đã không biết điều này, tôi chắc chắn sẽ sử dụng phương pháp này trong tương lai. Nhưng đối với những gì tôi cần làm bây giờ, nó đòi hỏi quá nhiều mã bổ sung.
zitix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.