Sự cố hiển thị khối tĩnh Magento 1.9.2.0


77

Tôi có một trang web có nhiều khối tĩnh hoạt động trong 1.9.1.0, nhưng với 1.9.2.0, các khối tĩnh bắt đầu hiển thị một cách rời rạc, vì đôi khi chúng hiển thị khối sai thay vì khối chính xác. Đôi khi chúng hiển thị như mong muốn. Có ai biết làm thế nào để giải quyết vấn đề này có thể liên quan đến vấn đề này ?


Điều này nghe có vẻ không thể sản xuất và điên rồ. Nếu bạn có một lời giải thích tốt hơn, chúng tôi có thể giúp bạn, nhưng vì vậy tôi thấy không có cách nào, xin lỗi.
Fabian Blechschmidt

2
Tôi có thể xác nhận điều này. Gặp nó trên một cửa hàng. Các khóa bộ nhớ cache giống hệt nhau giữa 2 khối
Sander Mangel


9
Theo Piotr, đây là một lỗi đã được xác nhận và đang được nhóm nòng cốt Magento xem xét.
đánh dấu

1
Lỗi này vẫn còn rõ ràng trong 1.9.2.4. Đã thêm kịch bản / chi tiết để bình luận theo dõi lỗi .
zigojacko

Câu trả lời:


61

Tôi gặp vấn đề này với EE 1.14.2 và có vẻ như vấn đề tương tự đã xảy ra trong CE 1.9.2. Tôi đã ghi lại vấn đề và giải pháp của mình cho câu hỏi SE này .

Về cơ bản do đoạn mã sau được thêm vào hàm tạo của Mage_Cms_Block_Block:

$this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
$this->setCacheLifetime(false);

Các khối tĩnh CMS hiện được lưu trữ. Vấn đề phát sinh từ cách thông tin khóa bộ nhớ cache được tạo. Nó rơi trở lại Mage_Core_Block_Abstracthành vi sử dụng tên khối trong bố trí. Nếu khối không được thêm vào với bố cục, ví dụ: trên trang cms, tên này không tồn tại. Điều này có thể dẫn đến các khối tĩnh chia sẻ cùng một khóa bộ đệm và bị lẫn trong bộ đệm.

Giải pháp của tôi là ghi đè Mage_Cms_Block_Blocklớp và đặt thông tin khóa bộ đệm dựa trên id khối và cửa hàng hiện tại.

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 and CE 1.9.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

Rõ ràng điều này sẽ cần phải được thêm vào trong mô-đun của riêng bạn bằng một config.xmltệp và chặn ghi đè, v.v. Hoặc bạn có thể sao chép Mage_Cms_Block_Blockvào nhóm mã cục bộ và thêm khóa bộ đệm ở đó.

Bạn có thể xem các dòng mới được thêm vào 1.9.2 tại đây


Làm thế nào bạn bắt đầu các khối tĩnh? Nếu bạn làm điều đó thông qua layout xml, bạn có thể chỉ cần thêm một tên duy nhất vào khối của mình và nó sẽ lưu cache tốt. Trong trường hợp nào bạn sẽ không đặt tên cho khối của mình (có lẽ các vật dụng?)
Erfan

1
@Erfan Vấn đề này xảy ra khi thêm các khối vào các trang CMS như {{block type = "cms / block" block_id = "block_id"}} hoặc khi tải một khối tĩnh trực tiếp trong một mẫu
Andrew Kett

6
đây là một phần mở rộng miễn phí cho vấn đề wierd này. Hy vọng nó sẽ có lợi cho tất cả những người phải đối mặt với vấn đề này. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Phiên bản nào của Magento tương thích với? Cũng sẽ hoạt động chính xác với Mage 1.6.x?
zitix 14/07/2015

1
Tôi đã tạo ra một ý chính cho một giải pháp tạm thời từ câu trả lời của andrewkett. Chỉ cần thêm ứng dụng / code / local / Mage / Cms / Block / Block.php này vào thư mục Magento của bạn và vấn đề sẽ được giải quyết. Chỉ cần nhớ xóa tệp trước khi bạn thực hiện cập nhật Magento tiếp theo của mình (giả sử chúng bao gồm sửa lỗi trong bản cập nhật tiếp theo).
Jay El-Kaake

13

Tôi mới nâng cấp lên 1.9.2.0 và tôi cũng đang trải nghiệm điều này. Các danh mục được đặt để hiển thị Khối tĩnh + Sản phẩm hiển thị ngẫu nhiên Khối tĩnh sai. Điều này không tồn tại trước khi nâng cấp 1.9.2.0 của tôi.

Khắc phục tạm thời Tắt bộ đệm đầu ra HTML và các khối được hiển thị là chính xác.


Tôi cũng phải đối mặt với điều này tại trang chủ và trong các trang sản phẩm
wk

Công việc này bây giờ nhưng nên là một giải pháp cay đắng
wk

Đúng, đây là những gì tôi đã làm bây giờ.
Sharif

13

Ở đây chúng tôi đi với giải pháp dựa trên mô-đun cục bộ như giải pháp trên không cung cấp toàn bộ các bước. Chúng tôi 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 liên kết sau và cũng có thể tải xuống từ đó https://www.milople.com/bloss/ec Commerce / solve-magento-static-block-display-su.html


Thiết lập mô-đun và nó không giúp ích gì - vấn đề của tôi là các khối CMS được gán cho danh mục biến mất, chúng hoàn toàn không hiển thị.
Haim

@ Yêu cầu nếu bạn đang sử dụng 1.9.2.2 thì bạn cần truy cập vào System-> quyền -> khối cms của khối cụ thể đó
Bhupendra Jadeja

Tôi đang sử dụng Magento ver. 1.9.2.0 - nhưng một lần nữa vấn đề của tôi hơi khác một chút, tôi đặt khối CMS hiển thị trên trang danh mục và khối CMS không hiển thị - nếu tôi làm mới bộ đệm thì nó sẽ hiển thị cho đến lần tiếp theo nó biến mất
Haim

Tôi đề nghị bạn cập nhật phiên bản magento tôi nghĩ rằng nó đã được bây giờ.
Bhupendra Jadeja

7

Không có bản vá chính thức cho điều này, tuy nhiên, nó đã được giải quyết trong CE 1.9.2.1

diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }
diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Widget/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
90a92,106
> 
>     /**
>      * 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;
>     }

Lưu ý: Nó đã được báo cáo rằng vẫn còn vấn đề với các trang CMS trên nhiều lượt xem cửa hàng:

Magento CE 1.9.2.1 chỉ sửa lỗi này một phần.

Vấn đề vẫn còn tồn tại đối với Trang CMS trên nhiều lượt xem cửa hàng. Đây là một Hotfix được cập nhật (Lưu ý đây không phải là bản vá chính thức): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Nguồn: http : //www.magentoc Commerce.com/products/orms-tracking/su/index/id/870



4

Tôi có thể xác nhận vấn đề này quá.

Để sao chép:

  1. Sử dụng CMS -> Widgets, tạo một widget để thêm một khối tĩnh vào thanh bên trái.

  2. Sau đó tạo tiện ích thứ hai để thêm khối tĩnh thứ hai (khối khác với trong step 1) vào thanh bên trái.

  3. Nếu bộ đệm bị tắt, cả hai khối tĩnh được hiển thị chính xác trong thanh bên.

  4. Nhưng nếu bạn bật bộ đệm, bạn sẽ thấy khối tĩnh step 1 được hiển thị hai lần.


Xin chào Zitix Tôi đối mặt với vấn đề tương tự như bạn, bạn có thể cho tôi biết cách bạn giải quyết vấn đề này không
Jaimin

3

Piotr từ Magento đã xuất bản một bản vá không chính thức cho vấn đề này vào thời điểm hiện tại: https : //gist.github.com/piotrekk vitaminki / ecd245e8c9390e4020db

Có vẻ để làm các mẹo. Vâng, đó là chỉnh sửa lõi, nhưng khắc phục sự cố cho đến khi Magento phát hành bản vá chính thức hoặc phiên bản tiếp theo ...


Thủ thuật này được sử dụng trên phiên bản mới hơn 1.9.3.3. Tuy nhiên nó không khắc phục vấn đề của tôi.
Nổi loạn

3

Nâng cấp Magento lên 1.9.2.1

Tôi đã làm điều đó và kích hoạt bộ đệm cho đầu ra Blocks HTML và nó dường như đã được sửa.

Cũng như một số vấn đề bảo mật được giải quyết trong bản phát hành mới.


3

Trong phiên bản mới nhất của Magento tăng cường nó với các tính năng bảo mật mới. bạn có thể thêm quyền trong system-> quyền vào khối tĩnh.


2
trong magento 1.9.2.0 có một vấn đề trong bộ nhớ đệm khối tĩnh, bạn đang nói về một cái gì đó khác nhau.
wk

Thật tuyệt, tôi không biết về tính năng này
amit_game 20/03/2016

Tôi thích điều này. :)
zed Blackbeard

2

Tôi đã có cùng một vấn đề với cửa hàng của tôi. Cách giải quyết tốt nhất mà tôi đã tìm ra cho đến nay là tắt kích hoạt bộ đệm ẩn cho các khối bị ảnh hưởng. Bạn có thể làm như vậy bằng cách đặt tuổi thọ bộ đệm của các khối thành null.

Vô hiệu hóa toàn bộ bộ đệm "Khối đầu ra HTML" trên một trang web trực tiếp không phải là một ý tưởng hay vì nó không cần thiết ảnh hưởng đến hiệu suất trang web.

Vô hiệu hóa bộ đệm cho một khối trong xml:

<block ... >
    ...
    <action method="unsetData"><key>cache_lifetime</key></action>
    <action method="unsetData"><key>cache_tags</key></action>
</block>

Vô hiệu hóa bộ đệm cho một khối trong php:

$this->getLayout()->createBlock('cms/block')
    ->setCacheLifetime(null)
    ->setBlockId('block-id')
    ->toHtml();

Không đặt thời gian tồn tại của bộ đệm thành "0" như được chỉ ra trong bài viết này


Andreas - Tôi tò mò về tác động của việc sử dụng kỹ thuật được mô tả trong bài viết đó là gì và làm thế nào để hai phương án bạn cung cấp ở đây tránh được hậu quả tiêu cực mà bạn vạch ra?
Bryan 'BJ' Hoffpauir Jr.

1
Cách tiếp cận đầu tiên sẽ không hiệu quả bởi vì, magento sẽ diễn giải rằng cập nhật bố cục giống như $block->setCacheLifeTime("null");Lưu ý này NULL và "null" là hai điều khác nhau (sau này là một chuỗi) và do đó kết quả dự kiến ​​sẽ không thu được.
Rajeev K Tomy

1
@BJ Hoffpauir: Nếu bộ đệm cho khối cms / khối được kích hoạt, cùng một cms / khối được lưu trong bộ đệm sẽ được sử dụng cho tất cả các chế độ xem của cửa hàng. Nếu bạn có phiên bản tiếng Anh (cửa hàng) và tiếng Đức (cửa hàng xem) cho cùng một mã định danh khối thì tiếng Anh hoặc tiếng Đức sẽ được sử dụng cho cả chế độ xem cửa hàng. Vô hiệu hóa bộ đệm cho khối này giải quyết vấn đề. Nếu bạn vẫn muốn lưu trữ khối, bạn có thể làm như vậy bằng cách đặt khối vào khối khác và thay vào đó khối này.
Andreas Riedmüller

1
@Rajeev Cảm ơn, tôi đã tìm thấy phương pháp này trong một số bài đăng, nhưng tôi khá chắc chắn rằng bạn đã đúng. Tôi đã thay đổi phương thức để vô hiệu hóa bộ đệm trong xml. Phương pháp trước đây là một câu trả lời được chấp nhận ở đây: stackoverflow.com/questions/27684236/
Kẻ

2

Tôi đã có thể khắc phục sự cố này bằng cách cập nhật các tiện ích mở rộng hiện có trong Trình quản lý kết nối Magento. Sau khi xem xét nó, tôi có ấn tượng rằng vấn đề tồn tại trong hệ thống bộ nhớ đệm Magento.

Theo mặc định, Magento có một số gói liên quan đến các công nghệ bộ nhớ đệm của nó. Chúng bao gồm các bộ điều hợp và thư viện cho Zend và Redis.

Thay vì cố gắng tìm gói phù hợp, tôi chọn cập nhật tất cả các gói trong cài đặt của mình.

Sau đó, tôi đã chọn dấu kiểm trên: Mage_All_Latest Đây là Metapackage cho bản phát hành Magento 1.9.0.0 ổn định mới nhất.

Có thể khắc phục sự cố bằng cách chỉ nâng cấp các gói phù hợp. Tôi cảm thấy đây là cách tốt hơn để đi vì tôi nghi ngờ rằng phương pháp này cũng áp dụng các bản vá bảo mật.


1

Bạn sẽ phải thực hiện nâng cấp đầy đủ hoặc backport 1.9.2.0

CMS Block và bộ đệm ẩn thay đổi trong 1.9.2.1

magento-1921 / ứng dụng / mã / lõi / Mage / Cms / Block / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Block.php magento-1921/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }

magento-1921 / ứng dụng / mã / lõi / Pháp sư / Cms / Khối / Widget / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Widget/Block.php magento-1921/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
89a91,105
>     }
> 
>     /**
>      * 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;

0

Tôi đang sử dụng Magento 1.9.3.8 và sự cố vẫn còn tồn tại.

Bạn có thể tìm thấy sửa chữa của tôi ở đây :

Về cơ bản, tôi đang thêm một chuỗi duy nhất dựa trên url trang và blockId cho mỗi thông tin khóa bộ đệm, vì vậy mỗi khối sẽ có một khóa duy nhất:

 /**
 * Generates a string based on the page url (for example category/product pages) and concatenate the block id to the url
 * Removes the caracters: /, . , &, = and , from this string
 */
private function generateUrlBasedString($blockId = null)
{
    $currentUrl = Mage::helper('core/url')->getCurrentUrl();
    $url = Mage::getSingleton('core/url')->parseUrl($currentUrl);
    $path = '_' . $url->getPath();

    $path = str_replace('/', '', $path);
    $path = str_replace('.', '', $path);
    $path = str_replace('&', '', $path);
    $path = str_replace(',', '', $path);
    $path = str_replace('=', '', $path);

    if(isset($blockId)) {
        $path .= '_' . $blockId;
    }

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

Cho đến khi Magento chuẩn bị sửa lỗi cho vấn đề này, bạn có thể tạo tệp:

ứng dụng / mã / cục bộ / Mage / Cms / Block / Block.php

và chèn mã từ url github ở trên làm nội dung.

Mã này được kiểm tra cho Magento 1.9.2. * Và 1.9.3. *


-1

Đây là lỗi được xác nhận trong phiên bản 1.9.2, theo thời gian, bạn có thể giải quyết vấn đề này bằng cách vô hiệu hóa bộ đệm "Chặn đầu ra HTML" từ quản trị viên -> phần quản lý bộ đệm

Hy vọng nó giúp


studio2f đã đề cập đến câu trả lời này, bạn có thể sử dụng @andrewkett hoặc nhấp vào "vấn đề này" trong câu hỏi chính, điều này cũng sẽ giúp bạn
wk

2
Tôi có thể nói rằng việc vô hiệu hóa tất cả bộ nhớ đệm khối để giải quyết vấn đề chỉ xuất hiện trên một số khối cụ thể giống như chặt toàn bộ bàn tay của một người nếu bạn bị tê cóng ngón tay. Chặt ngón tay, trong khi cũng khó chịu, ít nhất sẽ là một phản ứng tương xứng hơn với bệnh tật. Andrewkett của ( magento.stackexchange.com/users/527/andrewkett ) Câu trả lời là một cách tiếp cận hợp lý hơn: magento.stackexchange.com/questions/73685/...
Bryan 'BJ' Hoffpauir Jr.

Không bao giờ chỉnh sửa hoặc thay đổi các lớp CORE.
Ahsan Horani
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.