EE 1.14.2 / CE 1.9.2 การปรับปรุงการบล็อกแคชมีคีย์แคชที่ไม่ซ้ำกัน - เนื้อหาที่ซ้ำกันแสดงในส่วนหน้า


18

เมื่อฉันอัพเกรดเป็น EE 1.14.2 สิ่งต่าง ๆ เป็นไปอย่างราบรื่น แต่ฉันเจอปัญหาเมื่อฉันเริ่มตรวจสอบหน้าส่วนหน้าต่างๆของฉัน ฉันมีโหนดแคตตาล็อกที่มีหมวดหมู่ย่อยหลายรายการและแต่ละอันมีบล็อกคงที่แตกต่างกันแสดงอยู่ หลังจากการอัปเกรดหน้าใดที่ถูกตีครั้งแรกหลังจากที่ล้างแคชจะปรากฏขึ้นในหน้าต่าง ๆ ทั้งหมด

ฉันไม่ทราบว่าปัญหาเดียวกันนี้จะเกิดขึ้นเมื่อมีการเผยแพร่ CE 1.9.2 หรือไม่ แต่ฉันต้องการนำวิธีแก้ปัญหาของฉันมาที่นี่สำหรับผู้ที่อาจพบปัญหาเดียวกันนี้

ปรับปรุง:ตามที่ยืนยันที่นี่ปัญหาเดียวกันเกิดขึ้นใน CE 1.9.2


คำตอบ:


11

ตั้งแต่นี่คือ EE ฉันสามารถใช้การสนับสนุน Magento ได้ แต่ฉันก็ทำสิ่งต่าง ๆ ด้วยตัวเองเพื่อช่วยมุ่งเน้นปัญหาและหาทางแก้ไขให้เร็วที่สุด การเปลี่ยนแปลงรหัสจัดทำโดย Magento ดังนั้นการปรับใช้กับไฟล์ app / code / core จริงนั้นใช้ได้แม้ว่าคุณจะสามารถทำซ้ำไฟล์ใน / app / code / local และนำการเปลี่ยนแปลงไปใช้

ปัญหาคือวิธีการบล็อกแคชที่เพิ่มใน 1.14.2 ไม่ได้สร้างคีย์แคชที่ไม่ซ้ำดังนั้นเมื่อฉันมีบล็อกจำนวนมากที่ใช้ในพื้นที่ตัวควบคุมหมวดหมู่คีย์แคชที่สร้างขึ้นสิ้นสุดลงจะไม่ซ้ำกันสำหรับหน้าแรกที่เข้าชมเท่านั้น ทำให้หน้าเหล่านั้นทั้งหมดแสดงเนื้อหาที่ซ้ำกัน

การแก้ไขคือการเพิ่มสิ่งต่อไปนี้ (แสดงในรูปแบบไฟล์ diff เพื่อแสดงบริบทโดยรอบการเพิ่ม - เพียงเพิ่มในบรรทัดที่มี + โดยที่พวกเขาต้องไป):

ในแอพ / code / core / Mage / Cms / Block / Block.php ที่บรรทัดที่ 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;
+    }
 }

ในแอพ / code / core / Mage / Cms / Block / Widget / Block.php ที่บรรทัด 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;
+    }
 }

ฉันไม่คิดว่าฉันจะเป็นคนเดียวที่จะเห็นปัญหานี้และถ้ามันปรากฏใน CE 1.9.2 หวังว่านี่จะช่วยแก้ปัญหาสำหรับบางคน


น่าเสียดายที่มันไม่ได้ทำให้เป็น CE 1.9.2 ซึ่งเปิดตัวเมื่อวานนี้ดังนั้นฉันจึงพบปัญหานี้ในเว็บไซต์ลูกค้าของเราหลังการอัปเกรด จะลองแก้ไขนี้
Marco Miltenburg

สิ่งนี้ใช้ไม่ได้สำหรับฉัน
Pixelomo

10

ฉันคิดว่าวิธีที่เหมาะสมคือเราต้องสร้างโมดูลแบบกำหนดเองเพราะคุณทุกคนรู้ว่า Magento Boogieman จะให้คุณ! ถ้าเปลี่ยนแกน :)

คุณจะต้องมีไฟล์ดังต่อไปนี้: 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;
   }
}

สำหรับข้อมูลเพิ่มเติมคุณสามารถเยี่ยมชมบล็อกต่อไปนี้และคุณสามารถดาวน์โหลดได้จาก https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


ทำไมคุณไม่บรรจุในโมดูลด้วยนักแต่งเพลง?
Aleksey Razbakov

ฉันไม่ได้รับการตอบสนองมากที่โพสต์นี้ดังนั้นฉันคิดว่าไม่มีร่างกายต้องการมันในโมดูล
Bhupendra Jadeja

ยังไม่มีใครมีปัญหานี้ ยังไม่มีใครใช้เวอร์ชั่นใหม่ของวีโอไอพี ฉันจะไม่ใช้มันหากฉันไม่ได้มีปัญหากับโมดูลน้ำมันสน
Aleksey Razbakov

ฉันได้เพิ่มลิงค์เพื่อดาวน์โหลดโมดูลนี้
Bhupendra Jadeja

มันจะเจ๋งถ้ามี github กับ modman และนักแต่งเพลงอย่างgithub.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

มีอีกหนึ่งปัญหาเกี่ยวกับการบล็อก CMS ที่ไม่ได้รับการแก้ไขด้วยรหัสที่ระบุจากด้านบน

หากคุณใช้ URL ที่ปลอดภัยและแท็ก {{media}} ในบล็อก CMS ของคุณคุณจะได้รับข้อความ "คำเตือนเนื้อหาที่ไม่ปลอดภัย" จากเบราว์เซอร์เนื่องจาก Magento ให้บริการลิงก์ที่ไม่ปลอดภัยจากแคช

ในการแก้ไขปัญหาคุณต้องเพิ่มแท็กข้อมูลแคชอีกหนึ่งรายการเป็น

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

1

ข้อผิดพลาดนี้สามารถแก้ไขได้ด้วยส่วนขยายเล็ก ๆ นี้ (ไม่จำเป็นต้องแก้ไขไฟล์หลักหรือเพื่อเขียนบล็อกใหม่):

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

และยังมีบรรทัดที่กล่าวถึงโดย @AdvancedLogic เพื่อหลีกเลี่ยงคำเตือนเนื้อหาที่ไม่ปลอดภัย:

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


สิ่งนี้ไม่สามารถใช้งานได้ 1 บล็อกอย่างใด
อเล็กเซย์ Razbakov

บล็อกไหน? ฉันไม่เข้าใจคุณช่วยได้มากกว่านี้ได้ไหม
zitix

มันเป็นเพียงหนึ่งบล็อกคงที่ ไม่มีอะไรพิเศษ ฉันยังคิดว่ามันเป็นเพียงบล็อกแบบสุ่ม มี html ที่ผิด ดูเหมือนว่ามีการใช้แคชที่ไม่ถูกต้องสำหรับบล็อกนี้ ฉันไม่ทราบวิธีการเฉพาะเจาะจงมากขึ้นที่นี่
Aleksey Razbakov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.