Неверный порядок загрузки Layout XML

15

Когда я создаю файл макета для административной области (будь то в сообществе или в локальном пуле кода), иногда Magento загружает этот макет xml перед загрузкой макета модуля Adminhtml xml. Эффект заключается в том, что ссылочные вызовы отбрасываются, потому что не создано ни одного блока для их применения.

Очевидно, что кеширование здесь не играет роли. Я добавил Mage_Adminhtmlв <depends/>узел в файле объявления модуля.

Это проблема, которая у вас была раньше? Если так, как это решено?

Я работал над этой проблемой несколько раз и каждый раз находил решение, но я не могу понять, с чем это вообще связано.

Джозеф в SwiftOtter
источник

Ответы:

16

Трудно сказать без конкретного примера, но я подозреваю, что вы столкнулись с проблемой порядка файлов или порядка дескрипторов.

В частности, Magento загружает свои XML-файлы в порядке модулей с local.xmlпоследним прикрепленным. Вот типичный список, по порядку

frontend/base/default/layout/core.xml
frontend/rwd/default/layout/page.xml
frontend/rwd/default/layout/directory.xml
frontend/rwd/default/layout/cms.xml
frontend/rwd/default/layout/customer.xml
frontend/rwd/default/layout/catalog.xml
frontend/rwd/default/layout/catalog_msrp.xml
frontend/rwd/default/layout/catalogsearch.xml
frontend/base/default/layout/payment.xml
frontend/rwd/default/layout/sales.xml
frontend/base/default/layout/sales/billing_agreement.xml
frontend/base/default/layout/sales/recurring_profile.xml
frontend/base/default/layout/cataloginventory.xml
frontend/base/default/layout/shipping.xml
frontend/rwd/default/layout/checkout.xml
frontend/rwd/default/layout/paypal.xml
frontend/base/default/layout/bml.xml
frontend/rwd/default/layout/poll.xml
frontend/rwd/default/layout/review.xml
frontend/rwd/default/layout/tag.xml
frontend/base/default/layout/reports.xml
frontend/base/default/layout/googleanalytics.xml
frontend/rwd/default/layout/wishlist.xml
frontend/base/default/layout/paypaluk.xml
frontend/base/default/layout/giftmessage.xml
frontend/rwd/default/layout/contacts.xml
frontend/base/default/layout/sendfriend.xml
frontend/rwd/default/layout/rss.xml
frontend/base/default/layout/productalert.xml
frontend/rwd/default/layout/oauth.xml
frontend/base/default/layout/authorizenet.xml
frontend/rwd/default/layout/bundle.xml
frontend/rwd/default/layout/captcha.xml
frontend/base/default/layout/centinel.xml
frontend/rwd/default/layout/newsletter.xml
frontend/rwd/default/layout/downloadable.xml
frontend/base/default/layout/pagecache.xml
frontend/rwd/default/layout/persistent.xml
frontend/base/default/layout/weee.xml
frontend/base/default/layout/xmlconnect.xml
frontend/base/default/layout/moneybookers.xml
frontend/base/default/layout/pulsestorm_checkoutstep.xml
frontend/rwd/default/layout/local.xml

XML-файлы макета заказа загружаются в зависимости от того, какие правила XML макета заказа применяются - для  каждого дескриптора . Это последняя часть, которая запутывает людей. Дескрипторы - это узлы верхнего уровня XML.

<config>
    <handle_name>
    </handle_name>
</config>

Дескрипторы похожи на события для макета - для каждого запроса страницы Magento выдает несколько дескрипторов. Вы можете использовать Commerce Bug, чтобы увидеть, какие маркеры выдаются для конкретного запроса страницы.

введите описание изображения здесь

Для тех, у кого отключены изображения, дескрипторы, выданные для этого конкретного запроса страницы, были

<default />
<catalog_category_layered_nochildren />
<STORE_default />
<THEME_frontend_rwd_default />
<catalog_category_view />
<catalog_category_default />
<CATEGORY_3 />

Это означает, что Magento будет запускать каждый defaultкусок XML: сначала для core.xmlфайла, затем каждый defaultкусок для page.xmlфайла, вплоть до local.xml.

Затем Magento будет запускать каждый catalog_category_layered_nochildrenфрагмент XML: сначала для core.xmlфайла, затем для page.xmlфайла, вплоть до local.xml.

Это продолжается для каждой ручки.

Это означает, что если у вас есть немного XML обновления макета local.xmlвнутри defaultдескриптора, он будет запущен до того, как немного XML обновления макета core.xmlнаходится внутри catalog_category_layered_nochildrenдескриптора. Это, безусловно, то, что вызывает наибольшую путаницу в системе макетов XML, особенно с учетом того, что вокруг распространено немного общепринятого мнения, что «local.xml загружается последним».

Если вышесказанное немного смутило вас и вам нужно больше узнать о системе Layout XML, я все же считаю, что моя книга « Без излишеств Magento Layout» - лучший способ изучить систему наизнанку.

Алан Сторм
источник