在启用FPC的情况下,magento ee 1.12.0上的任何产品页面上都会出现相同的追加销售产品

在启用FPC的情况下,magento ee 1.12.0上的任何产品页面上都会出现相同的追加销售产品,magento,Magento,我不是百分之百确定,但这似乎是magento为追加销售/相关产品内置的打孔实现中的一个缺陷 我查看了代码,发现追加销售/相关产品的容器取决于客户会话,而不是当前查看的产品 负责追加销售/相关产品缓存的类称为Enterprise\u PageCache\u Model\u Container\u CatalogProductList,它扩展了Enterprise\u PageCache\u Model\u Container\u Advanced\u Quote。此类(CatalogProduct

我不是百分之百确定,但这似乎是magento为追加销售/相关产品内置的打孔实现中的一个缺陷

我查看了代码,发现追加销售/相关产品的容器取决于客户会话,而不是当前查看的产品

负责追加销售/相关产品缓存的类称为
Enterprise\u PageCache\u Model\u Container\u CatalogProductList
,它扩展了
Enterprise\u PageCache\u Model\u Container\u Advanced\u Quote
。此类(CatalogProductList)既不覆盖
\u getCacheId
也不覆盖
\u getAdditionalCacheId
方法。因此,此缓存仅取决于客户的会话,因此,每当任何访问者访问尚未在缓存中的产品页面时,magento都会为该特定产品重建upsells块,然后在该客户的每个产品页面上使用该块

作为临时解决方案,我将下面的方法添加到CatalogProductList类中,它解决了这个问题。我知道这是一个糟糕的解决方案,我将改变这一点,但我想问一下,是否有人有这样的问题,解决办法是什么

添加的方法是

public function applyWithoutApp(&$content)
{
    return false;
}

在我看来,Magento EE将布局中的标准
product.info.upsell
catalog.product.related
块替换为
Enterprise\u TargetRule
扩展中的
design/frontend/Enterprise/default/layout/TargetRule.xml

<catalog_product_view>
    <reference name="product.info">
        <!-- remove name="catalog.product.related" / -->
        <block type="enterprise_targetrule/catalog_product_list_related" name="catalog.product.related" as="relatedProducts" template="targetrule/catalog/product/list/related.phtml">
            <action method="setColumnCount"><columns>3</columns></action>
            <block type="enterprise_targetrule/catalog_product_item" name="catalog.product.related.item" template="targetrule/catalog/product/list/related/item.phtml" />
        </block>
        <!-- remove name="product.info.upsell" / -->
        <block type="enterprise_targetrule/catalog_product_list_upsell" name="product.info.upsell" as="upsell_products" template="targetrule/catalog/product/list/upsell.phtml">
            <action method="setColumnCount"><columns>4</columns></action>
            <block type="enterprise_targetrule/catalog_product_item" name="catalog.product.upsell.item" template="targetrule/catalog/product/list/upsell/item.phtml" />
        </block>
    </reference>
</catalog_product_view>
但它也将目标对准了使用更复杂的容器
Enterprise\u PageCache\u Model\u container\u CatalogProductItem创建的新块,该容器在缓存键中包含产品:

<catalog_product_item_related>
    <block>enterprise_targetrule/catalog_product_item</block>
    <name>catalog.product.related.item</name>
    <placeholder>CATALOG_PRODUCT_ITEM_RELATED</placeholder>
    <container>Enterprise_PageCache_Model_Container_CatalogProductItem</container>
    <cache_lifetime>86400</cache_lifetime>
</catalog_product_item_related>
<catalog_product_item_upsell>
    <block>enterprise_targetrule/catalog_product_item</block>
    <name>catalog.product.upsell.item</name>
    <placeholder>CATALOG_PRODUCT_ITEM_UPSELL</placeholder>
    <container>Enterprise_PageCache_Model_Container_CatalogProductItem</container>
    <cache_lifetime>86400</cache_lifetime>
</catalog_product_item_upsell>

企业\目标规则/目录\产品\项目
目录.产品.相关项目
目录\产品\项目\相关
企业\页面缓存\模型\容器\目录ProductItem
86400
企业\目标规则/目录\产品\项目
catalog.product.upsell.item
目录\产品\项目\追加销售
企业\页面缓存\模型\容器\目录ProductItem
86400

因此,我想知道您当前的主题中是否包含了来自
targetrule.xml
的布局更新?如果没有,这就解释了为什么使用旧块而不是新块。

谢谢,你帮了我很多忙。目标规则布局在我的主题中为空。不过我有一个问题。我能够查看CatalogProductItem的最新实现,它从EE1.12开始被完全重写。然而,缓存密钥仍然依赖于COOKIE\u CART。你知道为什么吗?我不明白为什么这个区块对于每个客户/购物车都应该是唯一的。@anon-不确定,但可能目标规则的某些方面会受到客户的影响?如果您知道不需要会话,可以尝试扩展该容器以从缓存密钥中删除会话。有时Magento的代码不是很优化,因为它们必须支持很多灵活性。明白。再次感谢你,你真的帮了我的忙。
<catalog_product_item_related>
    <block>enterprise_targetrule/catalog_product_item</block>
    <name>catalog.product.related.item</name>
    <placeholder>CATALOG_PRODUCT_ITEM_RELATED</placeholder>
    <container>Enterprise_PageCache_Model_Container_CatalogProductItem</container>
    <cache_lifetime>86400</cache_lifetime>
</catalog_product_item_related>
<catalog_product_item_upsell>
    <block>enterprise_targetrule/catalog_product_item</block>
    <name>catalog.product.upsell.item</name>
    <placeholder>CATALOG_PRODUCT_ITEM_UPSELL</placeholder>
    <container>Enterprise_PageCache_Model_Container_CatalogProductItem</container>
    <cache_lifetime>86400</cache_lifetime>
</catalog_product_item_upsell>