Cập nhật bộ đệm ẩn khối EE 1.14.2 / CE 1.9.2 có các khóa bộ đệm không duy nhất - nội dung trùng lặp hiển thị trên lối vào


18

Khi tôi nâng cấp lên EE 1.14.2, hầu hết mọi thứ đều suôn sẻ nhưng tôi đã gặp phải một vấn đề khi tôi bắt đầu kiểm tra các trang frontend khác nhau của mình. Tôi có một nút danh mục với một số danh mục con và mỗi loại có một khối tĩnh khác nhau hiển thị trên chúng. Sau khi nâng cấp, trang nào được nhấn đầu tiên sau khi xóa bộ đệm sẽ hiển thị trên tất cả các trang khác nhau.

Tôi không biết vấn đề tương tự sẽ xuất hiện khi CE 1.9.2 được phát hành nhưng tôi muốn đưa giải pháp của mình cho những ai có thể tìm thấy vấn đề tương tự.

CẬP NHẬT: Như đã xác nhận ở đây , vấn đề tương tự đã xảy ra trong CE 1.9.2


Câu trả lời:


11

Vì đây là EE, tôi có thể sử dụng hỗ trợ Magento nhưng tôi cũng tự mình giải quyết mọi việc để giúp tập trung vào vấn đề và có được giải pháp nhanh nhất có thể. Các thay đổi mã được Magento cung cấp, do đó, áp dụng chúng cho các tệp ứng dụng / mã / lõi thực tế là tốt mặc dù bạn luôn có thể sao chép các tệp trong / app / code / local của mình và áp dụng các thay đổi ở đó.

Vấn đề là phương pháp bộ đệm ẩn được thêm vào trong 1.14.2 không tạo ra khóa bộ đệm duy nhất nên khi tôi có nhiều khối được sử dụng trong không gian bộ điều khiển danh mục, khóa bộ đệm được tạo cuối cùng chỉ là duy nhất cho lần truy cập trang đầu tiên, dẫn đến tất cả các trang đó để hiển thị nội dung trùng lặp.

Cách khắc phục là thêm phần sau (hiển thị ở định dạng tệp diff để hiển thị bối cảnh xung quanh các phần bổ sung - chỉ cần thêm vào các dòng có dấu + nơi chúng cần đến):

Trong ứng dụng / mã / lõi / Mage / Cms / Block / Block.php ở dòng 72:

         }
         return $html;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result = array(
+                $blockId,
+                Mage::app()->getStore()->getCode(),
+            );
+        } else {
+            $result = parent::getCacheKeyInfo();
+        }
+        return $result;
+    }
 }

Trong ứng dụng / mã / lõi / Mage / Cms / Block / Widget / Block.php ở dòng 82:

                 $helper = Mage::helper('cms');
                 $processor = $helper->getBlockTemplateProcessor();
                 $this->setText($processor->filter($block->getContent()));
+                $this->addModelTags($block);
             }
         }

         unset(self::$_widgetUsageMap[$blockHash]);
         return $this;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $result = parent::getCacheKeyInfo();
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result[] = $blockId;
+        }
+        return $result;
+    }
 }

Tôi sẽ không nghĩ mình là người duy nhất nhìn thấy vấn đề này và nếu nó xuất hiện trong CE 1.9.2, hy vọng điều này sẽ giúp giải quyết vấn đề này cho một số người.


Thật không may, nó đã không được đưa vào CE 1.9.2 được phát hành ngày hôm qua vì vậy tôi đã gặp phải vấn đề này trên một trong các trang web của khách hàng sau khi nâng cấp. Sẽ thử sửa lỗi này.
Marco Miltenburg

điều này không hiệu quả với tôi
Pixelomo 22/03/2016

10

Tôi nghĩ cách thích hợp là chúng ta cần tạo mô-đun Tùy chỉnh vì tất cả các bạn đều biết rằng Magento Boogieman sẽ giúp bạn! nếu thay đổi lõi :)

Bạn sẽ cần phải theo dõi các tập tin sau: app/etc/modules/Bhupendra_Cms.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Bhupendra_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms/>
            </depends>
        </Bhupendra_Cms>
    </modules>
</config>

app/code/local/Bhupendra/Cms/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
            <Bhupendra_Cms>
                <version>1.0.0</version>
            </Bhupendra_Cms>
        </modules>
        <global>
            <blocks>
                <cms>
                    <rewrite>
                        <block>Bhupendra_Cms_Block_Block</block>
                        <widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
                    </rewrite>
                </cms>
            </blocks>
        </global>
</config>

app/code/local/Bhupendra/Cms/Block/Block.php

<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {

   public function getCacheKeyInfo()
    {

      $blockId = $this->getBlockId();
      if ($blockId) {
            $result = array(
                $blockId,
                Mage::app()->getStore()->getCode(),
            );
      } else {
           $result = parent::getCacheKeyInfo();
       }
       return $result;
   }

}

app/code/local/Bhupendra/Cms/Block/Widget/Block.php

class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
       /**
     * Storage for used widgets
     *
     * @var array
     */
    static protected $_widgetUsageMap = array();

    /**
     * Prepare block text and determine whether block output enabled or not
     * Prevent blocks recursion if needed
     *
     * @return Mage_Cms_Block_Widget_Block
     */
    protected function _beforeToHtml()
    {
        parent::_beforeToHtml();
        $blockId = $this->getData('block_id');
        $blockHash = get_class($this) . $blockId;

        if (isset(self::$_widgetUsageMap[$blockHash])) {
            return $this;
        }
        self::$_widgetUsageMap[$blockHash] = true;

        if ($blockId) {
            $block = Mage::getModel('cms/block')
                ->setStoreId(Mage::app()->getStore()->getId())
                ->load($blockId);
            if ($block->getIsActive()) {
                /* @var $helper Mage_Cms_Helper_Data */
                $helper = Mage::helper('cms');
                $processor = $helper->getBlockTemplateProcessor();
                $this->setText($processor->filter($block->getContent()));
                $this->addModelTags($block);
            }
        }

        unset(self::$_widgetUsageMap[$blockHash]);
        return $this;
    }

     /**
     * Retrieve values of properties that unambiguously identify unique content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $result = parent::getCacheKeyInfo();
        $blockId = $this->getBlockId();
        if ($blockId) {
            $result[] = $blockId;
       }
        return $result;
   }
}

Để biết thêm thông tin, bạn có thể truy cập blog sau đây và bạn cũng có thể tải xuống từ đó https://www.milople.com/bloss/ec Commerce / solve-magento-static-block-display-su.html


Tại sao bạn không đóng gói nó trong một mô-đun với nhà soạn nhạc?
Aleksey Razbakov 29/07/2015

Tôi đã không nhận được nhiều phản hồi cho bài đăng này vì vậy tôi nghĩ rằng không có ai muốn nó trong mô-đun
Bhupendra Jadeja

chưa ai có vấn đề này chưa ai sử dụng phiên bản magento mới. Tôi cũng sẽ không sử dụng nó nếu tôi không gặp vấn đề với mô-đun turpentine
Aleksey Razbakov

Tôi đã thêm liên kết để tải xuống mô-đun này
Bhupendra Jadeja

Sẽ thật tuyệt khi có nó trong github với modman và nhà soạn nhạc như github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

Có một vấn đề nữa với bộ nhớ đệm khối CMS, không được sửa với mã đã cho từ phía trên.

Nếu bạn đang sử dụng các url và {{media}} an toàn trong các khối CMS của mình, bạn sẽ nhận được thông báo "Cảnh báo nội dung không an toàn" từ trình duyệt, vì Magento cung cấp các liên kết không an toàn từ bộ đệm.

Để giải quyết nó, bạn cần thêm một thẻ thông tin bộ đệm, như

(int)Mage::app()->getStore()->isCurrentlySecure(),

1

Lỗi này cũng có thể được sửa chữa với phần mở rộng nhỏ này (không cần chỉnh sửa các tệp lõi cũng như viết lại các khối):

https://github.com/progammer-rkt/Rkt_SbCache

Và nó cũng chứa dòng được đề cập bởi @AdvifiedLogic để tránh cảnh báo nội dung không an toàn:

(int)Mage::app()->getStore()->isCurrentlySecure()


điều này không hoạt động cho 1 khối bằng cách nào đó
Aleksey Razbakov 29/07/2015

Cho khối nào? Tôi không hiểu, bạn có thể cụ thể hơn được không?
zitix

Nó chỉ là một khối tĩnh. Không có gì cụ thể. Tôi thậm chí nghĩ rằng nó chỉ là khối ngẫu nhiên. Có html sai. Có vẻ như bộ đệm sai cho khối này đã được sử dụng. Tôi không biết làm thế nào để cụ thể hơn ở đây.
Aleksey Razbakov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.