2011-01-19 115 views
4

我想创建基于设定的产品属性不同的产品的看法属于: 不Magento的提供了一种方式来做到这一点?Magento的:基于属性模板设置

- 更新 -

继dan.codes建议我增加

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

到Mage_Catalog_ProductController(我复制ProductController.php并把它放在本地/法师/目录/控制器/) 。

然后我说这只是后

<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> 

然后我创建的目录/产品/视图/ attribute_set/book.phtml的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> 

,但它不是在我的显示产品查看页面。

- 更新Magento的1.5 -

我注意到,在处理程序更新,在过去的Magento版本已经移动了。

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

现在在Mage/Catalog/Helper/Product/View.php中。
我测试过,它仍然伟大工程!

+0

它的工作对我来说,也许它你在做什么在你的块,只是为了确保代码工作改变你的xml以引用根,并将模板设置为不同的东西,看看页面是否改变。 ` – 2011-01-20 13:11:32

回答

4

不,它不需要,但你可以通过在这里的代码是这个

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

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

在Mage_Catalog_ProductController延长_initProductLayout方法然后在扩展功能这样做你可以添加

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

你的layout.xml你可以有

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

好的,你的建议听起来不错,但我试图申请没有成功。我将ProductController.php从核心/法师/目录/控制器复制到本地/法师/目录/控制器。然后我尝试插入新的布局,但没有发生任何事情。我犯了一些错误吗? – pasine 2011-01-19 14:51:10

2

如果万一你想切换根据设置,那么在此属性^ h view.phtml是你需要做什么:

<PRODUCT_ATTRIBUTE_SET_ID_9> 
    <label>Catalog Product View (Default)</label> 
    <reference name="product.info"> 
     <action method="setTemplate"><template>catalog/product/custom-view.phtml</template></action> 
    </reference> 
</PRODUCT_ATTRIBUTE_SET_ID_9> 

就在您的catalog.xml中添加此或local.xml中
希望这有助于。
感谢

2

在灯架上有一个很好的教程:http://magebase.com/magento-tutorials/creating-custom-layout-handles/

它使用下列事件:controller_action_layout_load_before

为此,我在config.xml中设置了以下

<events> 
    <controller_action_layout_load_before> 
     <observers> 
      <mymodule> 
       <class>mymodule/observer</class> 
       <method>addAttributeSetHandle</method> 
      </mymodule> 
     </observers> 
    </controller_action_layout_load_before> 
</events> 

并在观察员。PHP我会

public function addAttributeSetHandle(Varien_Event_Observer $observer) 
{ 
    $product = Mage::registry('current_product'); 

    /** 
    * Return if it is not product page 
    */ 
    if (!$this->isBookProduct($product)) { 
     return; 
    } 

    $niceName = 'book'; 

    /* @var $update Mage_Core_Model_Layout_Update */ 
    $update = $observer 
      ->getEvent() 
      ->getLayout() 
      ->getUpdate(); 
    $handles = $update->getHandles(); // Store all handles in a variable 
    $update->resetHandles(); // Remove all handles 

    /** 
    * Rearrange layout handles to ensure PRODUCT_<product_id> 
    * handle is added last 
    */ 
    foreach ($handles as $handle) { 
     $update->addHandle($handle); 
     if ($handle == 'PRODUCT_TYPE_' . $product->getTypeId()) { 
      $update->addHandle('PRODUCT_ATTRIBUTE_SET_' . $niceName); 
     } 
    } 
} 

protected function isBookProduct($product) 
{ 
    if (null === $product || !($product instanceof Mage_Catalog_Model_Product)) { 
     return false; 
    } 
    // TODO instead of hardcoded value we could use here something neat to get by name thru eav/entity_attribute_set model, some config value which hold that ID or use some other approach... 
    $book_set_id = 9; 

    if ($product->getAttributeSetId() != $book_set_id) { 
     return false; 
    } 
    return true; 
} 

这使得可能在布局XML使用下列内容:

<?xml version="1.0"?> 
    <layout version="0.1.0"> 
     <PRODUCT_ATTRIBUTE_SET_book> 
      <reference name="product.info"> 
       <action method="setTemplate"> 
        <template>mymodule/book/product/view.phtml</template> 
       </action> 
      </reference> 
     </PRODUCT_ATTRIBUTE_SET_book> 
    </layout>