Bố cục local.xml so với bố trí mô-đun


7

Gần đây tôi đã bắt đầu sử dụng local.xmlnhư sân chơi của mình để bố trí. Trước khi tôi nghi ngờ sử dụng nó vì ... lý do.
Tôi đã thấy lợi thế của nó, nhưng bây giờ tôi đã va phải một bức tường gạch.
Trong catalog.xmltệp bố cục mặc định có một khối nhất định (tên không quan trọng). Sử dụng layout.xmltôi đã thêm một khối con chung vào nó nơi tôi muốn đặt các khối khác.

<reference name="not.important">
    <block type="core/text_list" name="extra.left.menu" as="extra" />
</reference>

Càng xa càng tốt.
Nhưng bây giờ, tôi có một tiện ích mở rộng nên thêm khối con vào một phần mở rộng ở trên.
Nếu tôi thêm khối mới này bằng cách sử dụng local.xmlnó hoạt động độc đáo.

<block type="core/text_list" name="extra.left.menu" as="extra">
    <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</block>

Nhưng tôi không muốn thực hiện thông qua local.xmlvì tiện ích mở rộng mới này có thể bị vô hiệu hóa trong tương lai. Nếu tôi thực hiện thông qua local.xmlvà vô hiệu hóa tiện ích mở rộng, nó sẽ tràn vào các tệp nhật ký của tôi vì khối này không còn tồn tại nữa.
Vì vậy, trong tập tin bố trí mở rộng của tôi, tôi thêm điều này:

<reference name="extra.left.menu">
    <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</reference>

Nhưng cách này không hiệu quả. Tôi cảm thấy điều này xảy ra vì local.xmltệp được tải sau cùng và tôi không thể thêm phụ thuộc mô-đun để tệp bố cục tiện ích mở rộng của tôi sẽ được tải sau layout.xml.
Làm thế nào tôi nên giải quyết điều này? Tôi đã nhận được một cái gì đó sai?
Hoặc nếu tôi muốn nó như thế này, tôi phải sử dụng "cách cũ tốt" nhân bản catalog.xmltrong chủ đề của mình và thêm khối mới này vào catalog.xmlchủ đề của tôi?


Tôi cho rằng một ifconfig trên màn hình frontend bị vô hiệu hóa sẽ không đáp ứng nhu cầu của bạn
David Manners

@DavidManners. có và không. Nếu mô-đun của tôi biến mất hoàn toàn và ifconfig có thể không giúp đỡ. Nhưng nếu ai đó gỡ bỏ mô-đun, nó cũng sẽ xóa db, vì vậy nó có thể hoạt động.
Marius

Tôi đã có một cái nhìn nhanh về điều này và tôi không nghĩ rằng nó sẽ làm việc. Bạn luôn có thể thêm một nút mới vào khối và thay đổi cách tạo khối nhưng đó là một cuộc nói chuyện điên rồ :)
David Manners

Câu trả lời:


6

Khi kết xuất bố cục trong Magento, một vài bước sẽ xảy ra:

  1. Xử lý được xác định (mặc định, catalog_product_view, v.v.)
  2. Tất cả các tệp XML được tải và hợp nhất thành một tệp XML lớn, tệp đó được lưu trữ ở đâu đó trong bộ đệm.
  3. Nội dung của tất cả các thẻ điều khiển được tải và hợp nhất thành một tệp trang xml.
  4. Thứ tự nơi các tệp XML được tải theo thứ tự bảng chữ cái và local.xml được tải lần cuối (cũng có các bản cập nhật bố cục cơ sở dữ liệu được tải ngay cả sau này. (Nguồn https://github.com/OpenMage/magento-mirror/blob/magento -1,9 / ứng dụng / mã / lõi / Pháp sư / Lõi / Mô hình / Bố cục / Cập nhật.php # L433-L438 )
  5. Cuối cùng, XML được phân tích cú pháp và các khối được bắt đầu.

Vậy tại sao ví dụ của bạn không hoạt động? Điều này là do tệp XML mô-đun được tải trước tệp local.xml. Điều xảy ra là trước tiên hệ thống cố gắng thêm một khối vào một tham chiếu (đến một khối) chưa tồn tại.

Để giải quyết vấn đề te: Bạn có thể sử dụng một bản cập nhật, các bản cập nhật được đặt trước tay cầm mà chúng được gọi.

<default>
    <update handle="awesome_new_container_handle"/>
</default>

<awesome_new_container_handle>
    <reference name="not.important">
        <block type="core/text_list" name="extra.left.menu" as="extra" />
    </reference>
</awesome_new_container_handle>

Và trong tập tin mô-đun khác của bạn thêm khối như bạn đã làm.

<default>
    <reference name="extra.left.menu">
        <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
    </reference>
</default>

Bạn có chắc chắn 100% giải pháp này hoạt động? Tôi có một cảm giác mạnh mẽ rằng điều này sẽ không hoạt động vì cập nhật xảy ra bên trong defaultxử lý thông qua local.xmlvà bạn đang tham khảo defaultcách tự xử lý bố cục trong tệp xml bố cục tùy chỉnh. Nếu bạn được sử dụng một bố trí xử lý khác trong tập tin đó, thì nó sẽ hoạt động. Tôi có đúng không?
Rajeev K Tomy

Điều này đã không làm việc chính xác. Nhưng nó đã cho tôi một ý tưởng và tôi đã làm cho nó hoạt động. Tôi đã sử dụng 2 tay cầm bố trí. Vì vậy, tôi đã thêm đánh dấu từ local.xmlmột tay cầm local_xml_handlevà đánh dấu từ tệp bố cục mở rộng trong một tay cầm khác extension_layout_handle. Sau đó, tôi sử dụng cả hai trong local.xmlmột sau khi khác. Vì vậy, xử lý bố trí từ phần mở rộng được áp dụng sau lần đầu tiên <default><update handle="local_xml_handle" /><update handle="extension_layout_handle" /></default>. Nếu tôi vô hiệu hóa tiện ích mở rộng của mình thì sẽ không extension_layout_handlecó gì để tải. Cảm ơn.
Marius

Oh, và cảm ơn vì lời giải thích tốt đẹp cho dòng tập tin bố trí. Tôi chắc chắn độc giả tương lai cũng sẽ đánh giá cao điều này.
Marius

1

Điều này hơi khó thực hiện thông qua LAYOUT XML PHIM. Bởi vì local.xmltập tin sẽ tải cuối cùng. Vì vậy, một khối được "xác định" bên trong tệp local.xml không thể được "tham chiếu" thông qua bất kỳ tệp bố cục nào khác.

Thông thường tôi sẽ sử dụng bất kỳ người quan sát nào để thêm một khối trong tình huống như vậy.

Tuy nhiên, có một cách khác không tồn tại, tôi nghĩ. Bạn có thể xác định khối đó trong defaultxử lý thông qua local.xmltập tin. Bây giờ nó mở ra một cơ hội để sử dụng layout handlessẽ xem xét sau khi defaultxử lý bố cục của Magento. Vì khối được bao gồm thông qua defaulttay cầm, nếu bạn đang tham chiếu khối thông qua xử lý bố cục khác thông qua tệp xml bố cục của riêng bạn, Magento hiện biết về khối của bạn, ngay cả khi nó được thêm qua local.xmltệp.

local.xml

<default>
    <reference name="not.important">
        <block type="core/text_list" name="extra.left.menu" as="extra" />
    </reference>
</default>

your_layout.xml

<custom_handle> <!-- anything except `default` -->
    <reference name="extra.left.menu">
        <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
    </reference>
</custom_handle>

BIÊN TẬP

Trước hết tôi muốn nói rằng, tôi có đủ thời gian dành cho bạn :-)

Tôi đã kiểm tra mã của mình bằng cách tạo một bản demo. Đây là những gì tôi đã cố gắng. Tôi đã thêm mã này vào local.xmltập tin

<layout>
    <default>
        <reference name="content">
            <block type="core/text_list" name="extra.left.menu" as="extra" />
        </reference>
    </default>
</layout>

Sau đó tôi thêm mã dưới đây trực tiếp vào catalog.xmltập tin.

<catalog_category_layered translate="label">
        ....

        <reference name="content">
            <reference name="extra.left.menu">
                <block type="core/template" template="test.phtml" as="some_name" name="some_name" />
            </reference>
            ......
        </reference>
</catalog_category_layered>

Sau đó tôi tải một danh mục lớp, tôi thấy nội dung test.phtmlở đó như thế này. (xin vui lòng không sử dụng core/templatekhối làm khối con cho mục đích thử nghiệm này. Nhưng trong trường hợp của bạn, nó sẽ thay thế bằng khối riêng của bạn. Nhưng nó hoàn toàn không phải là vấn đề. Cả hai trường hợp đều giống nhau)

tôi ở đây

Vì vậy, quan điểm của tôi là, phương pháp này chắc chắn hoạt động. Tôi chắc chắn về điểm này bởi vì tôi đã sử dụng thủ thuật này nhiều lần trước đây và đạo sư cuối cùng của tôi để bố trí magento là @alanstorm :-)


Xin lỗi, điều này đã không làm việc. Nhưng cảm ơn vì đã dành thời gian của bạn.
Marius

Cảm ơn đã thử. Tôi đã cập nhật câu trả lời của tôi. Chỉ cần thông báo cho bạn rằng, phương pháp của tôi không sai.
Rajeev K Tomy

Nếu bạn nói nó hoạt động tôi tin bạn. điều đó có nghĩa là tôi đã không làm đúng. Tôi sẽ thử lại.
Marius

Tôi đang chờ đợi phản ứng của bạn. Dành thời gian của riêng bạn để kiểm tra nó :-)
Rajeev K Tomy

Chuyện lạ. Nó hoạt động nếu tôi thêm extra.left.menukhối trực tiếp trong contentkhối. Nhưng nó không nếu tôi thêm nó bên trong một khối khác mà là con của contenthay left. Tôi đoán điều này xứng đáng được +1. Dù sao, đừng dành nhiều thời gian hơn cho việc này. Tôi thích cách tiếp cận với 2 tay cầm bố trí. như tôi đã giải thích trong một trong những bình luận cho câu trả lời này: magento.stackexchange.com/a/41624/146 . Bằng cách nào đó nó đường may sạch hơn cho tôi.
Marius
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.