Nhắm mục tiêu nhiều xử lý bố cục trong bố cục XML


22

Tôi có một bộ điều khiển tùy chỉnh được truy cập tại đường dẫn /custommodule/customer/infođang tải 2columns-left.phtmlmẫu trên rootnút như sau:

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

Những gì tôi muốn làm là cập nhật mẫu gốc cho những khách hàng chưa đăng nhập, một cái gì đó như:

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

Tôi hiểu rằng tôi không thể nhắm mục tiêu nhiều tay cầm bố cục theo cách này, nhưng ý định nên rõ ràng; cập nhật mẫu gốc cho bố cục này xử lý trong khi khách hàng không đăng nhập.

Tôi đã nghĩ rằng tôi có thể nhắm mục tiêu xử lý của bộ điều khiển của tôi với những điều sau đây:

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

Điều này thực sự cập nhật mẫu gốc với 1column.phtmlmẫu, nhưng nó đang làm như vậy trên những gì dường như là tất cả các trang thay vì chỉ trang được nhắm mục tiêu trong referencenút của tôi .

Tôi đã thử một vài hoán vị của bản cập nhật bố cục này, nhưng dường như không có gì hoạt động. Làm cách nào tôi có thể nhắm mục tiêu một điều khiển bố cục này trong khi sử dụng customer_logged_outtay cầm bố trí?

- chỉnh sửa - Để rõ ràng, đây thực sự là một mô-đun của bên thứ ba.

Câu trả lời:


18

Vì bạn đang sử dụng bộ điều khiển của riêng mình, bạn không cần chỉ sử dụng tay cầm mặc định. Dựa trên trạng thái đã đăng nhập, bạn có thể thêm vào phương thức InfoAction của mình

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

hoặc là

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

và sau đó trong tệp layout.xml của bạn sử dụng

<mymodule_customer_info_logged_in>

<mymodule_customer_info_logged_out>

- Ngoài ra sau khi chỉnh sửa của bạn dưới đây -

Thấy rằng bạn không muốn chỉnh sửa bộ điều khiển (vì đó là tiện ích mở rộng của bên thứ 3), tôi sẽ tạo một tiện ích mở rộng riêng biệt chỉ quan sát bộ điều khiển_action_layout_load_b 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
    }

Ngạc nhiên. Điều này không lý tưởng, nhưng là một giải pháp tương đối sạch sẽ. Như tôi đã đề cập trong bình luận khác của mình bên dưới, tôi không muốn phải sửa đổi mô-đun của bên thứ ba, nhưng có vẻ như không có nhiều sự lựa chọn ở đây. Thật xấu hổ, bởi vì các customer_logged_in/outtay cầm thể rất mạnh mẽ, nhưng họ bị gim bởi giới hạn này.
pspahn

14

Alan Storm đã trả lời một cái gì đó tương tự như thế này:

/programming//a/5601579/1157493

Bạn có thể sử dụng một trình trợ giúp để thực hiện logic của mình để kiểm tra xem tùy chỉnh đăng nhập.

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

Nó sẽ gọi Mage::helper('mymodule/myhelper')->switchTemplateIf(); Trong trình trợ giúp đó, bạn có thể quyết định chuyển mẫu hoặc chỉ giữ nó như thế này.

Tôi tin rằng nó đặt mẫu cho bất cứ điều gì bạn returntrong chức năng đó.

Nó sẽ trông giống như thế này:

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

Chưa được kiểm tra


Tôi cũng có suy nghĩ này, nhưng tôi hy vọng chỉ phải dựa vào bố cục XML của mô-đun để thực hiện điều này mà không phải dựa vào các lớp bổ sung trong mô-đun - triết lý "nếu có thể được thực hiện bằng XML, hãy làm điều đó trong XML, không tạo thêm tài nguyên mô-đun nếu không cần thiết ".
pspahn

@pspahn Tất nhiên mục tiêu là thử và làm điều đó với hệ thống bố cục XML mà Magento cung cấp, thật không may, nó có những hạn chế và tôi tin rằng đây là một trong số đó. Mặc dù tôi vẫn nghĩ rằng đây là một giải pháp hoàn toàn khả thi mặc dù có thêm tài nguyên mô-đun.
Rick Kuipers

@pspahn Fooman có một giải pháp thay thế tốt mà tôi muốn giới thiệu qua tôi. Nó đòi hỏi ít mã hóa hơn!
Rick Kuipers

Trong trường hợp này, tôi thực sự đang làm việc với một mô-đun của bên thứ ba. Tôi thà không phải chỉnh sửa mô-đun của họ (vì các bản cập nhật có thể phá vỡ mô-đun) và tôi không muốn đặt nó trong lớp trợ giúp của mô-đun riêng biệt (vì điều đó gắn mô-đun và mô-đun của họ với nhau ở hông).
pspahn

6

Gần đây tôi cần loại chức năng này và nó gặp khó khăn khi thêm nhiều tay cầm bố trí nhiều hơn cho tất cả các kết hợp khác nhau của tay cầm bố cục hiện có, vì vậy tôi đã tạo một tiện ích mở rộng magento để thêm khả năng nhắm mục tiêu trực tiếp nhiều tay cầm bố cục từ xml bố cục.

Đây là liên kết đến tiện ích mở rộng- https://github.com/mridul89/Mult MônHandles.git

Bạn sẽ sử dụng nó như thế này-

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

Điều này sẽ cho magento chỉ sử dụng customer_logged_outtay cầm bố trí cụ thể này nếu custommodule_customer_infoxử lý bố trí cũng có mặt.

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.