Вариант 1. Разметка XML по типу продукта
Являются ли три различных варианта продукта отдельными типами продуктов случайно (например, настраиваемыми, простыми и загружаемыми)? Если это так, вы можете установить другой шаблон, используя объявление обновления макета в файле темы layout / local.xml:
<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()
и указать шаблон для использования там. Я не буду здесь вдаваться в подробности, потому что считаю, что предыдущие варианты лучше.
Итак, в зависимости от того, какой подход вы выберете, существует множество возможностей (и это еще не все).
person
Vinai
schedule
04.03.2012