Узел <default/>
- это то, что называется «дескриптором макета». Каждый запрос в Magent генерирует несколько таких ручек. Посетите вкладку Layout на демо-сайте Commerce Bug , чтобы получить представление о сгенерированных дескрипторах.
Magento объединяет все макеты XML-файлов в одно гигантское дерево, называемое макетом пакета. Затем дескрипторы определяют, какие фрагменты Layout XML Update используются для конкретного запроса. Эти фрагменты объединяются в макет страницы. Как вы интуитивно понимали, дескриптор <default/>
добавляется всегда , поэтому вы размещаете все сайты в своей системе.
Плохая новость заключается в том, что, хотя есть дескриптор для страниц CMS (<cms_page_view />
), это все равно будет делом "все или ничего". Вы можете добавить что-то на все страницы CMS, но не на определенные страницы CMS. Так что да, раздел XML обновления макета администратора CMS - это «правильный» способ сделать то, что вы хотите.
Хорошая новость в том, что есть два подхода, которые вы можете использовать, которые более чисты, чем те, которые вы придумали до сих пор. Во-первых, вы можете немного навести порядок, определив свой собственный дескриптор в своем XML-файле, а затем использовать специальную команду Layout XML, чтобы включить этот дескриптор.
В своем XML-файле добавьте фрагмент XML-кода Layout Update в пользовательский дескриптор.
<pre><layout version="0.1.0"> <my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names>
<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager" />
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
</block>
</reference>
</my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names>
</layout>
Затем в CMS Admin добавьте следующий XML-код Layout Update для нужных вам страниц
<update handle="my_fancy_pants_unique_handle_name_which_doesnt_conflict_with_existing_names" />
Magento позволяет XML-фрагментам Layout Update добавлять дополнительные дескрипторы к запросу. Это то, что вы делаете выше. Это немного проясняет ситуацию, и если вы хотите изменить часть XML, есть централизованное место для этого.
Обновление : Оказывается, что команда может только использоваться из самих XML-файлов Layout. Код, который загружает XML-код Layout Update для страниц CMS, - это не тот код, который загружает и обрабатывает обновления для файлов XML. Magento буквально добавит что-либо в форму CMS в качестве обновления макета. Он не будет обрабатывать его для рекурсивных обновлений. Таким образом, добавление чего-то подобного к local.xml
будет работать
<mock_product_list>
<reference name="head">
<label>Mock Product List</label>
<action method="addItem"><type>skin_js</type><name>js/sw/wall.js</name></action>
</reference>
</mock_product_list>
<cms_page_view>
<update handle="mock_product_list" />
</cms_page_view>
Но вы не можете сделать это напрямую с помощью обновления, примененного через администратора CMS. Живи и учись.
Все это говорит о том, что подход с использованием виджетов, вероятно, все еще жизнеспособен, и альтернативой этому было бы.
Создание пользовательского модуля с пользовательским классом блока
Класс блока не отображает HTML
Класс блока содержит единственный метод с именем что-то вроде «addFooToLayout»
Затем на своей странице CMS добавьте обновление, подобное этому
<block type="yourmodule/yourblock" name="unique_name" alias="unique_name">
<action method="addFooToLayout" />
</block>
и затем в вашем определении блока
public addFooToLayout()
{
$layout = Mage::getSingleton('core/layout');
$head = $layout->getBlock('head');
$head->addItem('skin_js','js/sw/wall.js');
//etc...
}
Что-то в этом роде должно работать и будет немного понятнее (в зависимости от того, сколько XML Layout Update вы хотите добавить). Однако, я не проверял это, и мой авторитет подорван на этом, поэтому покупатель остерегается.
Второй подход состоит в том, чтобы создать отдельный виджет , который включает в себя то, что вы хотите добавить на страницу, а затем с помощью администратора экземпляра виджета добавить этот виджет в определенные блоки на определенных страницах. Эти ссылки должны помочь вам начать.
Наконец, рискуя стать шиллом, я недавно самостоятельно опубликовал книгу о макетах Magento , в которой подробно рассматриваются вопросы такого рода. Это стоит вашего времени, если вы заинтересованы в понимании того, как работает вся система.