Можно ли изменить тип блока в макете XML?

13

Можно ли изменить тип блока в макете XML?

Я знаю, как изменить шаблон, используя setTemplateметод, но я пытаюсь изменить тип блока. Это возможно?

Марти Уоллес
источник
пожалуйста, объясните подробно, что вы должны изменить
Кейул Шах

Ответы:

7

Изменение типа блока означает изменение класса блока, поэтому нет, но ...

... вы можете просто перезаписать блок:

  1. Найдите дескриптор макета, который вызывается позже ИЛИ убедитесь, что ваш layout.xmlобработан после создания блока, например, с помощью <depends>inCompany_Module.xml
  2. Просто создайте новый блок другого типа с тем же именем

Проблема в том, что это перезаписывает блок и не меняет тип. Это означает, что все, что сделано в этом блоке между созданием и вашим изменением, потеряно.

Например, для изменения catalog.navigation:

<layout version="0.1.0">
    <catalog_category_default translate="label">
        <reference name="left">
            <block type="myModule/navigation" name="catalog.leftnav" after="currency" template="myModule/catalog/navigation/left.phtml"/>
        </reference>
    </catalog_category_default>
</layout>
Фабиан Блехшмидт
источник
1
Вы также можете создать новый класс блоков, который «наследует» класс блоков, который вы хотите заменить. Вам нужно будет добавить запись в config.xml вашего пользовательского расширения, чтобы поменять класс блоков с вашим. Это имело бы смысл, если вы планируете расширить или изменить функциональность блока.
Бьяджо Аробба
3

Вы не можете изменить это в файлах макета afaik. Однако вы можете расширить и переопределить их в ваших конфигурационных файлах.

Пример:

<config>
    <global>
        <blocks>
            <catalog>
                <rewrite><product_view>My_Custom_Block_Product_View</product_view></rewrite>
            </catalog>
        </blocks>
    </global>
</config>

Не забудьте расширить оригинальный блок.

smdev
источник
1

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

То, что я в итоге делаю, и, кажется, работает (в файле макета)

<controller_x_y>
    <reference name="block_name_reference">
        <block type="mymodule/customblock" name="block_name_reference" />
    </reference>
</controller_x_y>

Надеюсь это поможет.

Элвин Нгуен
источник