首页 > 解决方案 > 最近查看的产品在自定义容器中被缓存而不更新

问题描述

我添加了 /etc/widget.xml 来调用最近查看的页脚容器。最近查看的块是显示但它应用了缓存,因此新查看的产品不会更新。

最近查看的部分正在更新,仅在刷新缓存后。

<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
     <widget id="catalog_recently_viewed" class="Magento\Catalog\Block\Widget\RecentlyViewed"
            placeholder_image="Magento_Catalog::images/product_widget_viewed.gif"> 
        <containers> 
             <container name="footer">
                <template name="grid" value="grid" />
                <template name="list" value="list" />
            </container> 
        </containers>
    </widget>
</widgets>

标签: magento2

解决方案


我通过使用小部件和 cms 块概念解决了这个问题。由于小部件是通过 ajax 请求工作的,这就是小部件的强大功能!

Magento 2.2.7 版本

第一步:模块文件路径:root/app/Code/Faceless/RecentlyViewed/Setup/UpgradeData.php

<?php

namespace Faceless\RecentlyViewed\Setup;

use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
class UpgradeData implements UpgradeDataInterface
{


    private $blockFactory;

    public function __construct(
        \Magento\Cms\Model\BlockFactory $blockFactory
    ) {
        $this->blockFactory = $blockFactory;
    }

    public function upgrade(
        ModuleDataSetupInterface $setup,
        ModuleContextInterface $context
    ) {
        $setup->startSetup();
        $cmsblockModel = $this->blockFactory->create()->load(
            'recently_viewed', 'identifier'
        );
        $cmsblockModel->getId() ? $cmsblockModel->delete() : '';        
        if (version_compare($context->getVersion(), '1.0.1') < 0) {
            $cmsBlockData = [
                'title' => 'Recently viewed',
                'identifier' => 'recently_viewed',
                'content' => '{{widget type='
                . '"Magento\Catalog\Block\Widget\RecentlyViewed"'
                . ' uiComponent="widget_recently_viewed" page_size="5" '
                . 'show_attributes="name,image,price" show_buttons="add_to_cart"'
                . ' template="product/widget/viewed/grid.phtml"}}',
                'is_active' => 1,
                'stores' => [0, 1, 2],
                'sort_order' => 0
            ];
            $this->blockFactory->create()->setData($cmsBlockData)->save();
        }
        $setup->endSetup();
    }
}

第二步:模块文件路径:root/app/Code/Faceless/RecentlyViewed/view/frontend/layout/default.xml

<?xml version="1.0" ?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="footer">
            <container name="footer.recent" as="footerRecent" htmlTag="div" htmlClass="recently-viewed-wrap" before="-">
                <block class="Magento\Cms\Block\Block" name="Recentlyviewed">
                    <arguments>
                        <argument name="block_id" xsi:type="string">recently_viewed</argument>
                    </arguments>
                </block>
            </container>
        </referenceContainer>
    </body>
</page>

第三步:模块文件路径:root/app/Code/Faceless/RecentlyViewed/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Faceless_RecentlyViewed" setup_version="1.0.1" schema_version="1.0.1">
        <sequence>
            <module name="Magento_Catalog" />
        </sequence>
    </module>
</config> 

第四步:模块文件路径:root/app/Code/Faceless/RecentlyViewed/registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Faceless_RecentlyViewed',
    __DIR__
);

推荐阅读