dagfr
dagfr

Reputation: 2384

Product layout update depending on attribute set

I want my product belonging to attribute sets X use a different template without setting the layout update in all product one by one.

I created this new handle in the layout file :

<product_view_bis>
        <reference name="product.info">
        <action method="setTemplate"><template>catalog/product/view7.phtml</template></action>
        <block type="core/template" name="replacements" template="catalog/product/replacements.phtml">
            <block type="replacements/replacement" name="replacement_options" template="catalog/product/replacement_options.phtml">
                <action method="addOptionRenderer"><type>select</type><block>replacements/options</block><template>catalog/product/view/options/type/replacement.phtml</template></action>
            </block>
        </block>
    </reference>
</product_view_bis>

Then I extend the Related Helper (Mage_Catalog_Helper_Product_View) to fit this with :

if ($product->getAttributeSetId()==X) $update->addHandle('product_view_bis');

This should replace the catalog/product/view.phtml with my own file which call some custom blocks

It doesn't work at all. But If I put this :

<reference name="product.info">
    <action method="setTemplate"><template>catalog/product/view7.phtml</template></action>
    <block type="core/template" name="replacements" template="catalog/product/replacements.phtml">
        <block type="replacements/replacement" name="replacement_options" template="catalog/product/replacement_options.phtml">
            <action method="addOptionRenderer"><type>select</type><block>replacements/options</block><template>catalog/product/view/options/type/replacement.phtml</template></action>
        </block>
    </block>
</reference>

Into the product Custom Layout Update in the backend it works.

Can anyone help me ?

Upvotes: 1

Views: 325

Answers (1)

dagfr
dagfr

Reputation: 2384

I managed to get it working through Observer

I set an event observer on controller_action_layout_generate_blocks_after

public function generateBlocksAfter($event)
{                      
    $controller   = $event->getAction();
//limit to the product view page 
if($controller->getFullActionName() != 'catalog_product_view')
{
    return;
}
$layout       = $controller->getLayout();
$root = $layout->getBlock('root');
$product_info = $layout->getBlock('product.info');
if(!$product_info)
{
    Mage::log('Could not find product.info block');
    return;
}
$id = Mage::registry('current_product')->getId();
$prod = Mage::getModel('catalog/product')->load($id);
if ($prod->getAttributeSetId()==X) {
$product_info->setTemplate('catalog/product/view7.phtml');
$root->setTemplate('page/view7.phtml');
$replacement =   $layout->createBlock('core/template')->setBlockAlias('replacements')->setTemplate('catalog/product/replacements.phtml')->setLayout($layout)->setNameInLayout('replacements');

$options =     $layout->createBlock('replacements/replacement')->setBlockAlias('replacement_options')->setTemplate('catalog/product/replacement_options.phtml')->setLayout($layout)->setNameInLayout('replacement_options');
$options->addOptionRenderer('select','replacements/options','catalog/product/view/options/type/replacement.phtml');
$product_info->setChild('replacements',$replacement);
$replacement->setChild('replacement_options',$options);
}

}

Upvotes: 1

Related Questions