Magento: template based on attribute set

attributesmagentoproducttemplates

I want to create different product views based on the attribute set the product belongs to:
does Magento provide a way to do this?

– UPDATE –

Following dan.codes suggestion I've added

$update->addHandle('PRODUCT_ATTRIBUTE_SET_ID_'.$product->getAttributeSetId());

to Mage_Catalog_ProductController (I duplicated ProductController.php and put it in local/Mage/Catalog/controllers/).

Then I added this to catalog.xml

<PRODUCT_ATTRIBUTE_SET_ID_9> // PRODUCT ID of Book Attribute Set
    <label>Catalog Product View (Book)</label>
    <reference name="product.info">
        <block type="catalog/product_view_type_book" name="product.info.book" as="product_type_data" template="catalog/product/view/attribute_set/book.phtml">
            <block type="core/text_list" name="product.info.book.extra" as="product_type_data_extra"/>
        </block>
    </reference>
</PRODUCT_ATTRIBUTE_SET_ID_9>

just after

<PRODUCT_TYPE_virtual translate="label" module="catalog">
    <label>Catalog Product View (Virtual)</label>
    <reference name="product.info">
        <block type="catalog/product_view_type_virtual" name="product.info.virtual" as="product_type_data" template="catalog/product/view/type/virtual.phtml">
            <block type="core/text_list" name="product.info.virtual.extra" as="product_type_data_extra"/>
        </block>
    </reference>
</PRODUCT_TYPE_virtual>

I then created catalog/product/view/attribute_set/book.phtml, but it is not displayed in my product view page.

– UPDATE MAGENTO 1.5 –

I've noticed that the handler update has moved in the last Magento release.

$update->addHandle('PRODUCT_TYPE_'.$product->getTypeId());
$update->addHandle('PRODUCT_'.$product->getId());

is in Mage/Catalog/Helper/Product/View.php now.
I've tested and it still works great!

Best Answer

No it doesn't but you can extend the functionality to do so by extending the _initProductLayout method in Mage_Catalog_ProductController under where the code is this

    $update = $this->getLayout()->getUpdate();
    $update->addHandle('default');
    $this->addActionLayoutHandles();

    $update->addHandle('PRODUCT_TYPE_'.$product->getTypeId());
    $update->addHandle('PRODUCT_'.$product->getId());

You could add

$update->addHandle('PRODUCT_ATTRIBUTE_SET_ID_'.$product->getAttributeSetId());

Then in your layout.xml you could have

<PRODUCT_ATTRIBUTE_SET_ID_IDHERE>
  <reference name="root">
            <action method="setTemplate"><template>template/path/here.html</template></action>
        </reference>
</PRODUCT_ATTRIBUTE_SET_ID_IDHERE>
Related Topic