Изменить порядок блоков через файл local.xml

Можно ли изменить порядок уже существующих блоков через файл local.xml? Я знаю, что вы можете изменить порядок блока с помощью атрибута «после» или «до», но как можно изменить эти атрибуты существующих блоков.

Например, если я хочу разместить многоуровневый навигационный блок под блоком подписки на информационный бюллетень в левом столбце, как мне это сделать?


person Pieter Hoste    schedule 10.12.2010    source источник


Ответы (3)


Вам нужно выполнить небольшой трюк, удалить дочерний блок и добавить его в новую позицию:

<reference name="parent.block.name">
    <action method="unsetChild">
        <alias>child_block_alias</alias>
    </action>
    <action method="insert">
        <blockName>child.block.name</blockName>
        <siblingName>name_of_block</siblingName>
        <after>1</after>
        <alias>child_block_alias</alias>
    </action>
</reference>

Эта инструкция Layout XML делает то, что вы хотите. Посмотрите на этот краткий справочник параметров для метода insert:

  • blockName — это уникальное имя вашего блока в макете, например, product.view.
  • siblingName — это уникальное имя блока, которое уже существует в целевом блоке вставки и используется для позиционирования вашего блока. Оставьте пустым, чтобы отобразить его вверху или внизу.
  • after — логический идентификатор позиции блока. Если равно 1, то блок будет добавлен после siblingName или в конец списка дочерних элементов, если siblingName пусто
  • alias — это псевдоним вашего блока, если он пуст, будет использоваться имя блока.

Некоторые примеры:

Переместить блок боковой панели корзины после недавно просмотренных товаров

<reference name="right">
    <action method="unsetChild">
        <alias>cart_sidebar</alias>
    </action>
    <action method="insert">
        <blockName>cart_sidebar</blockName>
        <siblingName>right.reports.product.viewed</siblingName>
        <after>1</after>
    </action>
</reference>

Переместить блок боковой панели корзины перед недавно просмотренными товарами

<reference name="right">
    <action method="unsetChild">
        <alias>cart_sidebar</alias>
    </action>
    <action method="insert">
        <blockName>cart_sidebar</blockName>
        <siblingName>right.reports.product.viewed</siblingName>
        <after>0</after>
    </action>
</reference>

Переместить блок боковой панели корзины в конец правого блока

<reference name="right">
    <action method="unsetChild">
        <alias>cart_sidebar</alias>
    </action>
    <action method="insert">
        <blockName>cart_sidebar</blockName>
        <siblingName></siblingName>
        <after>1</after>
    </action>
</reference> 

Переместить блок боковой панели корзины в верхнюю часть левого блока

<reference name="right">
    <action method="unsetChild">
        <alias>cart_sidebar</alias>
    </action>
</reference>
<reference name="left">
    <action method="insert">
        <blockName>cart_sidebar</blockName>
    </action>
</reference>

Наслаждайтесь работой с Magento!

person Ivan Chepurnyi    schedule 10.12.2010
comment
Хотя я знаю, что имя аргументов действия не имеет значения, вы везде использовали s/subling/sibling/g :) - person Nick; 12.12.2010
comment
@Ник, да, важен только порядок аргументов, имена аргументов не используются при вызове метода. - person Ivan Chepurnyi; 12.12.2010
comment
Привет, спасибо, что поделились этим уроком. Но у меня вопрос начинающего. Как я могу получить полный список блоков? - person ; 13.02.2011
comment
@Denys: Это заслуживает отдельного вопроса. Используйте кнопку «Задать вопрос» в верхней части страницы. - person clockworkgeek; 13.02.2011

Вы можете удалить предыдущий многоуровневый навигационный блок и добавить новый многоуровневый навигационный блок после блока бюллетеня.

<reference name="left">
 <remove name="catalog.leftnav" />
 <block type="catalog/layer_view" name="catalog.leftnavcustom" after="left.newsletter" template="catalog/layer/view.phtml"/>
</reference>

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

person jrosell    schedule 27.10.2011

Принятый ответ у меня не сработал (EE1.14), но что-то близкое к этому:

<wishlist_index_index>
    <reference name="customer.wishlist.items">
        <action method="unsetChild">
             <name>customer.wishlist.price</name>
        </action>
        <action method="insert">
            <blockName>customer.wishlist.price</blockName>
            <after>customer.wishlist.qty</after>
        </action>
    </reference>
</wishlist_index_index>
person OZZIE    schedule 24.02.2016