Magento - 动态产品属性仅从单个CMS块中提取数据

时间:2015-09-02 15:35:16

标签: magento dynamic-attributes

我在各个产品页面上设置了2个额外的标签,这些标签应该从每个产品的不同CMS块中提取信息。但是,当我查看产品页面时,他们都从我创建的1个CMS块中提取完全相同的信息,而不是从该特定产品的CMS块中提取。

以下是我在尝试进行问题排查时注意到的更多内容:

1)如果我刷新Magento缓存然后转到产品页面,则会显示该页面的正确信息。然后,如果我导航到任何其他产品页面,它总是显示我刷新Magento缓存后我查看的第一个产品的信息。

2)这似乎也与产品类别有关。我有2个产品类别。第1类中的每个产品都会显示相同的CMS Block信息。第2类中的每个产品都会显示相同的CMS Block信息,但这些产品的CMS Block信息实际上与第1类产品不同,但都是相同的。

以下是我如何设置一切:

1)为每个产品创建单独的CMS块,每个产品都有不同的信息。

2)创建textarea属性并将其添加到正确的属性集。对于每个产品,我已将ID输入该产品的CMS块。我进行了双重检查,每个产品都输入了不同的ID。

3)在app / design / frontend / rwd / default / layout / catalog.xml中我添加了以下内容以显示2个新选项卡:

<!-- Features -->
<block type="catalog/product_view_attributes" name="product.features" as="features" template="catalog/product/view/features.phtml">
<action method="addToParentGroup"><group>detailed_info</group></action>
<action method="setTitle" translate="value"><value>Features</value></action>
</block>
<!-- END Features -->

<!-- TECH SPECS -->
<block type="catalog/product_view_attributes" name="product.tech_specs" as="techspecs" template="catalog/product/view/tech_specs.phtml">
<action method="addToParentGroup"><group>detailed_info</group></action>
<action method="setTitle" translate="value"><value>Tech Specs</value></action>
</block>
<!-- END TECH SPECS -->

4)最后,我创建了2个文件

应用程序/设计/前端/ RWD /默认/模板/目录/产品/视图/ features.phtml 应用程序/设计/前端/ RWD /默认/模板/目录/产品/视图/ tech_specs.phtml

以下是代码:

features.phtml

<?php
$_product = $this->getProduct();
$attribute = $_product->getResource()->getAttribute('features');

if ( is_object($attribute) ) {
    $identifier = $_product->getData("features");
}
?>

<?php if ($_sizeBlock = Mage::app()->getLayout()->createBlock('cms/block')->setBlockId($identifier)): ?>
    <div class="std">
        <?php echo $_sizeBlock->toHtml() ?>
    </div>
<?php endif; ?>

tech_specs.phtml

<?php
$_product = $this->getProduct();
$attribute = $_product->getResource()->getAttribute('tech_specs');
if ( is_object($attribute) ) {
    $identifier = $_product->getData("tech_specs");
}
?>

<?php if ($_sizeBlock = Mage::app()->getLayout()->createBlock('cms/block')->setBlockId($identifier)): ?>
    <div class="std">
        <?php echo $_sizeBlock->toHtml() ?>
    </div>
<?php endif; ?>

任何人都知道这里发生了什么?

2 个答案:

答案 0 :(得分:0)

想出来。这是因为Magento正在缓存CMS块。

<强>解决方案:

复制 应用程序/代码/核心/法师/ CMS /砌块/ Block.php

要 app / code / local / Mage / Cms / Block /(我不得不添加丢失的文件夹层次结构)

然后编辑Block.php

在受保护的函数_construct()

更改 $这 - &GT; setCacheLifetime(假);

要 $这 - &GT; setCacheLifetime(空);

不再有CMS阻止缓存,动态内容会按预期显示!

答案 1 :(得分:0)

如果属性是动态的,您可以使用它的内容哈希并将其添加到缓存标记,请参阅示例为“是”或“否”的属性,但如果它更改了缓存重新加载;)

在di.xml中重写来自Magento 2.1供应商的bock后,执行以下操作:

namespace Dpl\Xxx\Block\Catalog\Product\View;

use Magento\Framework\Pricing\PriceCurrencyInterface;

class Attributes extends \Magento\Catalog\Block\Product\View\Attributes
{
    /**
     * Retrieve current product model
     *
     * @return \Magento\Catalog\Model\Product
     */
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Framework\Registry $registry,
        PriceCurrencyInterface $priceCurrency,
        array $data = []
    ) {

        parent::__construct($context, $registry, $priceCurrency, $data);
        $this->setCacheTag($this->getProduct()->getId().'-'.$this->getProduct()->getXxxopen();
    }
}
?>

问候;)