2011-01-19 92 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>