2011-01-19 13 views
4

商品が属している属性セットに基づいて異なる商品ビューを作成したい: Magentoはこれを行う方法を提供していますか?Magento:属性セットに基づくテンプレート

- UPDATE -

後dan.codes提案私はMage_Catalog_ProductControllerに

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

を追加しました(私はProductController.phpを複製してローカルに入れて/メイジ/カタログ/コントローラ/) 。

は、その後、私は

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

をcatalog.xmlをするだけで

<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を作成したが、それは私の中に表示されていないこれを追加しました製品ビューページ。

- UPDATE Magentoのは、1.5から

私は、ハンドラの更新が最後のMagentoのリリースに移動したことに気付きました。

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

は現在Mage/Catalog/Helper/Product/View.phpにあります。
私はテストしましたが、それでも素晴らしいです!

+0

その多分そのあなただけのコードが動作していることを確認する、あなたのブロックに何をしているか、私のために働い:PHP私は、これは可能性は、以下のレイアウトXMLで使用できるようになり

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を変更し、テンプレートを別のものに設定し、ページが変更されているかどうかを確認します。 ' –

答えて

4

ありません、それはしないが、あなたはで、あなたは

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

を追加することができ、コードがこの

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

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

です下Mage_Catalog_ProductControllerに_initProductLayout方法を拡張することで、そうするように機能を拡張することができますあなたが持っていた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をcore/Mage/Catalog/controllersからlocal/Mage/Catalog/controllersにコピーしました。その後、新しいレイアウトを挿入しようとしましたが、何も起こりませんでした。私は何か間違いを犯しましたか? – pasine

+0

あなたのしたことで投稿を更新できますか?どのようなxmlファイルを入れましたか、それは新しいものではありませんでしたか? –

+0

私の投稿を更新しました – pasine

2

もしあなたがスイッチしたいそして、ここで設定した属性に基づいて時間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

この上の良いチュートリアルがあります:私は

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

次config.xmlで設定し、このためにcontroller_action_layout_load_before

http://magebase.com/magento-tutorials/creating-custom-layout-handles/

これは、次のイベントを使用していますが、そしてオブザーバーで。

<?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> 
関連する問題