Установить шаблон блока Magento в макете XML - PullRequest
8 голосов
/ 03 марта 2012

Возникли проблемы при настройке шаблона блока в макете Magento xml. Я пытаюсь установить шаблон дочернего блока, а не весь макет страницы (почти все документы объясняют, как установить шаблон макета).

Справочная информация: я обновляю дескриптор макета в своем настраиваемом действии, используя тег <update /> в макете моего модуля xml.

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

Мой макет HTML:

<?xml version="1.0"?>
<layout version="0.1.0">
<mymodule_product_index>
    <update handle="catalog_product_view" />
    <reference name="content">
        <block type="catalog/product_view" 
        name="product.info" output="toHtml" template="mymodule/product.phtml" />
        </reference>

    <reference name="product.info.bundle">
        <action method="setTemplate"><template>mymodule/customtemplate.phtml</template></action>
    </reference>
</mymodule_product_index>
</layout>

setTemplate на product.info.bundle никогда не работает; это, кажется, не затрагивает расположение вообще. Я попытался обернуть <reference> в другие <reference> узлы из родительских блоков без эффекта. Можно ли таким образом заменить шаблоны блоков? Я чувствую, что моя проблема связана с тем, что я использую <update />.

Кстати, я знаю, что мой макет xml загружается и ошибок нет, остальная часть файла работает нормально, кеширование отключено, все равно очистил кеш и т. Д.

1 Ответ

18 голосов
/ 05 марта 2012

Ваш подход почти правильный.
Две вещи:
1.Установите новый шаблон вместо создания нового блока
Вместо того, чтобы просто назначать другой шаблон для блока product.info, вы создаете новый экземпляр с тем же именем, заменяете оригинальный экземпляр, а затем новыйШаблон настроен на это.Вместо этого используйте это:

<mymodule_product_index>
    <update handle="catalog_product_view" />
    <reference name="product.info">
        <action method="setTemplate">
            <template>mymodule/product.phtml</template>
        </action>
    </reference>
</mymodule_product_index>

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

2.Порядок обработки
Если вы посмотрите, где объявлен блок представления product.info.bundle для связанных продуктов, вы увидите, что это происходит в файле bundle.xml, в дескрипторе обновления макета с именем <PRODUCT_TYPE_bundle>.

Ваш код ссылается на блок из дескриптора макета <[route]_[controller]_[action]>, то есть <mymodule_product_index>.

Здесь нужно знать о порядке обработки дескрипторов макета.Примерно это:

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <custom_handles>

Ручка <PRODUCT_TYPE_bundle> принадлежиттретий тип дескрипторов макета, что означает, что он обрабатывается после дескриптора <mymodule_product_index>.
По сути, вы ссылаетесь на блок product.info.bundle до его объявления.

Чтобы исправить это, вынужно также использовать ручку <PRODUCT_TYPE_bundle>.Конечно, это повлияет на каждый показ продукта в комплекте.Используя только макет XML, пути к этому нет.

Вот несколько советов, как решить эту проблему.

Вы можете создать отдельный маршрут в вашем модуле для отображения связанных продуктов, а затем включить дескриптор <PRODUCT_TYPE_bundle>, используя update директива для этой страницы тоже.

В вашем контроллере пользовательских действий вы можете добавить другой дескриптор обновления макета, который обрабатывается после <PRODUCT_TYPE_bundle>.

Вы можете использовать наблюдатель событий, чтобы установить шаблон для блока product.info.bundle, если он создан.Одной из возможностей может быть событие controller_action_layout_generate_blocks_after.

Вы понимаете, есть много способов обойти это, но они требуют PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...