Вариант 1: компоновка XML по типу продукта
Являются ли три различных варианта продукта отдельными типами продукта случайно (например, конфигурируемые, простые и загружаемые)?Если это так, вы можете установить другой шаблон, используя объявление обновления макета в своих темах layout / local.xml file:
<layout>
<PRODUCT_TYPE_configurable>
<reference name="product.info">
<action method="setTemplate">
<template>my/catalog/product/view_configurable.phtml</template>
</action>
</reference>
</PRODUCT_TYPE_configurable>
<PRODUCT_TYPE_simple>
<reference name="product.info">
<action method="setTemplate">
<template>my/catalog/product/view_simple.phtml</template>
</action>
</reference>
</PRODUCT_TYPE_simple>
<!-- etc... -->
</layout>
Вариант 2: пользовательские обновления макета
Вы также можете использовать свойство обновлений пользовательского макета продуктов, чтобы указать шаблон для использования с помощью макета XML.В этом случае просто опустите дескриптор макета из кода выше.
Вариант 3: наблюдатель событий
Если ваши варианты продукта не могут быть различены по типу продукта, и вы не хотитедобавив пользовательский макет XML для каждого продукта, вам действительно придется создать атрибут продукта, который указывает, к какому типу продукта относится.Сделайте его невидимым на внешнем интерфейсе, если вы не хотите, чтобы клиенты видели его.
Затем создайте наблюдатель события для события controller_action_layout_render_before_catalog_product_view
.
В методе наблюдателя получите блок product.info и установите нужный шаблон.
public function controllerActionLayoutRenderBeforeCatalogProductView(Varien_Event_Observer $observer)
{
$block = Mage::app()->getLayout()->getBlock('product.info');
switch ($observer->getProduct()->getYourAttribute())
{
case 'Special Products':
$block->setTemplate('my/catalog/product/view_special.phtml');
break;
case 'Regular Products':
$block->setTemplate('my/catalog/product/view_regular.phtml');
break;
case 'Other Products':
$block->setTemplate('my/catalog/product/view_other.phtml');
break;
}
}
Вариант 4: перезапись блока
Другой вариант - хотя и более подверженный конфликтам - будет переписать блок catalog/product_view
, перегрузить метод _beforeToHtml()
и указать используемый там шаблон.Я не буду вдаваться в подробности, потому что я думаю, что предыдущие варианты лучше.
Так что, в зависимости от выбранного вами подхода, существует много возможностей (это еще не все).