【问题标题】:Magento: template based on attribute setMagento:基于属性集的模板
【发布时间】:2011-01-19 13:00:50
【问题描述】:

我想根据产品所属的属性集创建不同的产品视图: Magento 是否提供了一种方法来做到这一点?

- 更新-

按照我添加的 dan.codes 建议

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

到 Mage_Catalog_ProductController(我复制了 ProductController.php 并把它放在 local/Mage/Catalog/controllers/ 中)。

然后我将它添加到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>

紧接着

<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,但它没有显示在我的产品视图页面中。

- 更新 MAGENTO 1.5 -

我注意到处理程序更新已在上次 Magento 版本中移动。

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

现在在 Mage/Catalog/Helper/Product/View.php 中。
我已经测试过了,它仍然很好用!

【问题讨论】:

  • 它为我工作,也许它是你在你的块中所做的,只是为了确保代码正在工作,更改你的 xml 以引用根并将模板设置为不同的东西,看看页面是否变化。 `

标签: templates magento attributes product


【解决方案1】:

不,它没有,但您可以通过扩展 Mage_Catalog_ProductController 中的 _initProductLayout 方法来扩展功能,代码是 this

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

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

你可以添加

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

【讨论】:

  • 好的,你的建议听起来不错,但我刚刚尝试申请但没有成功。我将 ProductController.php 从 core/Mage/Catalog/controllers 复制到本地/Mage/Catalog/controllers。然后我尝试插入新布局,但什么也没发生。我是不是做错了什么?
  • 你能用你所做的更新你的帖子吗?你放的是什么xml文件,不是新的吧?
  • 仅供参考,代码在 Magento 1.5 中的位置不同。我已经更新了我的帖子以调整您的代码以适应更改。
  • 如果其他人偶然发现了这一点,我们的博客 magebase.com/magento-tutorials/creating-custom-layout-handles 上有一个完整的教程,它使用事件观察器来实现相同的目标。
【解决方案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
希望这会有所帮助。
谢谢

【讨论】:

    【解决方案3】:

    有一个很好的教程: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>
    

    在 Observer.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>
    

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2016-07-21
      相关资源
      最近更新 更多