Ваш подход почти правильный.
Две вещи:
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>
.
Здесь нужно знать о порядке обработки дескрипторов макета.Примерно это:
<default>
<[route]_[controller]_[action]>
<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.