마 젠토 1.9.2.0 정적 블록 디스플레이 문제


77

1.9.1.0에서 작동하는 여러 정적 블록이있는 웹 사이트가 있지만 1.9.2.0에서는 정적 블록이 때때로 올바른 블록이 아닌 잘못된 블록을 표시하기 때문에 산발적으로 표시되기 시작합니다. 때로는 원하는대로 표시됩니다. 누구 든지이 문제와 관련 있을 수있는이 문제를 해결하는 방법을 알고 있습니까?


재현 할 수없는 미친 소리. 더 나은 설명이 있으면 도움이 될 수 있지만 방법이 없습니다. 죄송합니다.
Fabian Blechschmidt

2
이것을 확인할 수 있습니다. 한 가게에서 만났다. 캐시 키는 두 블록 사이에서 동일합니다
Sander Mangel


9
Piotr에 따르면 이것은 현재 확인 된 버그이며 Magento 핵심 팀이 조사하고 있습니다.
benmarks

1
이 버그는 1.9.2.4에서 여전히 분명합니다. 버그 추적기 설명에 시나리오 / 세부 사항을 추가했습니다 .
zigojacko

답변:


61

EE 1.14.2 에서이 문제가 있었고 CE 1.9.2에서도 동일한 문제가 발생했습니다. 이 SE 질문에 대한 내 문제와 해결책을 문서화했습니다 .

기본적으로 다음 코드가 생성자에 추가 되었기 때문에 Mage_Cms_Block_Block:

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

CMS 정적 블록이 이제 캐시됩니다. 캐시 키 정보가 생성되는 방식에서 문제가 발생합니다. Mage_Core_Block_Abstract레이아웃에서 블록 이름을 사용하는 동작으로 돌아갑니다 . 블록이 레이아웃과 함께 추가되지 않은 경우 (예 : cms 페이지)이 이름이 존재하지 않습니다. 이로 인해 정적 블록이 동일한 캐시 키를 공유하고 캐시에서 혼합 될 수 있습니다.

내 솔루션은 Mage_Cms_Block_Block클래스 를 재정의 하고 블록 ID 및 현재 저장소를 기반으로 캐시 키 정보를 설정하는 것이 었습니다 .

/**
 * 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();
        }
    }
}

분명히 이것은 config.xml파일 및 블록 재정의 등으로 자신의 모듈에 추가해야합니다 . 또는 Mage_Cms_Block_Block로컬 코드 풀에 복사 하여 캐시 키를 추가 할 수 있습니다.

여기 1.9.2에 추가 된 새 줄을 볼 수 있습니다


이 정적 블록을 어떻게 인스턴스화합니까? 레이아웃 xml을 통해 수행하는 경우 블록에 고유 이름을 추가하면 캐시가 잘 수행됩니다. 어떤 시나리오에서 블록 이름을 지정하지 않겠습니까 (위젯일까요?)
Erfan

1
@Erfan이 문제는 {{block type = "cms / block"block_id = "block_id"}}와 같은 CMS 페이지에 블록을 추가하거나 템플릿에 직접 정적 블록을로드 할 때 발생합니다.
Andrew Kett

6
이 문제에 대한 무료 확장 프로그램입니다. 이 문제에 직면 한 모든 사람에게 도움이 되길 바랍니다. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev 어떤 버전의 Magento와 호환됩니까? Mage 1.6.x에서도 올바르게 작동합니까?
zitix

1
andrewkett의 답변에서 임시 솔루션에 대한 요점을 만들었습니다. 이 app / code / local / Mage / Cms / Block / Block.php 를 Magento 디렉토리에 추가하면 문제가 해결됩니다. 다음 Magento 업데이트를 수행하기 전에 파일을 제거해야합니다 (다음 업데이트에 수정 사항이 포함되어 있다고 가정).
Jay El-Kaake

13

방금 1.9.2.0으로 업그레이드했으며이 문제도 발생합니다. 정적 블록 + 제품을 표시하도록 설정된 범주에 무작위로 잘못된 정적 블록이 표시됩니다. 이것은 1.9.2.0 업그레이드 이전에는 존재하지 않았습니다.

임시 수정 차단 HTML 출력 캐시를 비활성화하면 표시된 블록이 올바르게 표시됩니다.


나는 또한 홈페이지와 제품 페이지에서 이것을 직면하고 있습니다
wk

이것은 현재로서는 효과가 있지만 쓰라린 솔루션이어야합니다
wk

네, 이것이 제가 지금 한 일입니다.
Sharif

13

위의 솔루션은 전체 단계를 제공하지 않으므로 로컬 모듈 기반 솔루션을 사용합니다. 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


모듈을 설정하면 도움이되지 않습니다. 제 문제는 범주에 할당 된 CMS 블록이 사라지고 전혀 표시되지 않는다는 것입니다.
Haim

@Haim 1.9.2.2를 사용하는 경우 시스템-> 권한-> 특정 블록의 cms 블록에 입력해야합니다
Bhupendra Jadeja

나는 마 젠토 버전을 사용하고 있습니다. 1.9.2.0-다시 한 번 내 문제는 약간 다릅니다. 범주 페이지에 표시되도록 CMS 블록을 설정했지만 CMS 블록이 표시되지 않습니다. 캐시를 새로 고치면 다음에 사라질 때까지 표시됩니다
Haim

나는 당신이 지금 생각하는 마 젠토 버전을 업데이트하는 것이 좋습니다.
Bhupendra Jadeja

7

이에 대한 공식 패치는 없지만 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;
>     }

참고 : 여러 상점보기에서 CMS 페이지에 여전히 문제가있는 것으로보고되었습니다.

Magento CE 1.9.2.1은 이것을 부분적으로 만 수정합니다.

여러 상점보기에서 CMS 페이지에 대한 문제가 계속 발생합니다. 업데이트 된 핫픽스는 다음과 같습니다 (공식 패치는 아님). https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

출처 : http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870



4

이 문제도 확인할 수 있습니다.

재현하려면 :

  1. 을 사용하여 CMS -> Widgets왼쪽 블록에 정적 블록을 추가하는 위젯을 작성하십시오.

  2. 그런 다음 두 번째 위젯을 만들어 step 1왼쪽 사이드 바에 두 번째 정적 블록 (에서와 다른 블록 )을 추가하십시오.

  3. 캐시가 비활성화되면 두 정적 블록이 모두 세로 막대에 올바르게 표시됩니다.

  4. 그러나 캐시를 활성화하면 정적 블록이 step 1 두 번 표시됩니다.


안녕하세요 Zitix 나는 당신이 이것을 어떻게 해결하는지 말해 줄 수있는 것과 같은 문제에 직면합니다
Jaimin

3

Magento의 Piotr은 당분간이 문제에 대한 비공식 패치를 게시했습니다. https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db

트릭을 수행하는 것 같습니다. 예, 핵심을 편집하고 있지만 Magento가 공식 패치 또는 다음 버전을 릴리스 할 때까지 문제를 해결합니다 ...


이 트릭은 최신 버전 1.9.3.3에서 사용됩니다. 그러나 그것은 내 문제를 해결하지 못합니다.
Rebel

3

마 젠토를 1.9.2.1로 업그레이드

나는 그것을했고 Blocks HTML 출력을 위해 캐시를 활성화했으며 고정 된 것으로 보입니다.

새 릴리스에서는 일부 보안 문제가 해결되었습니다.


3

최신 버전의 Magento는 새로운 보안 기능으로이를 강화합니다. 시스템-> 권한의 권한을 정적 블록에 추가 할 수 있습니다.


2
magento 1.9.2.0에서는 정적 블록을 캐싱하는 데 문제가 있으며 다른 것에 대해 이야기하고 있습니다.
wk

니스, 나는이 기능을
몰랐다

나는 이것을 좋아한다. :)
zed Blackbeard

2

나는 가게와 같은 문제가 있었다. 지금까지 내가 찾은 가장 좋은 해결 방법은 영향을받는 블록에 대한 캐싱을 비활성화하는 것입니다. 블록의 캐시 수명을 null로 설정하면됩니다.

라이브 사이트에서 "HTML 출력 차단"캐시를 전역 적으로 비활성화하는 것은 사이트 성능에 불필요하게 영향을 미치므로 바람직하지 않습니다.

xml에서 한 블록에 대한 캐시 비활성화

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

PHP에서 한 블록에 대한 캐시 비활성화

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

이 기사에서 지적한 대로 캐시 수명을 "0"으로 설정하지 마십시오


Andreas-이 기사에 설명 된 기술을 사용하면 어떤 영향을 미치며 여기에 제공하는 두 가지 대안이 개요의 부정적인 결과를 어떻게 피할 수 있습니까?
Bryan 'BJ'Hoffpauir Jr.

1
첫 번째 접근 방식은 작동하지 않을 것입니다. magento는이 $block->setCacheLifeTime("null");노트 NULL 와 "null"이 두 가지 다른 것 (나중에 하나는 문자열 임)이므로 레이아웃 업데이트를 해석 하므로 예상 된 결과를 얻지 못하기 때문입니다.
Rajeev K Tomy

1
@BJ Hoffpauir : cms / block 블록에 대한 캐시가 활성화되면 모든 캐시 된 cms / block이 모든 상점보기에 사용됩니다. 동일한 블록 식별자에 대해 영어 (점포보기) 및 독일어 (점포보기) 버전이있는 경우 영어 또는 독일어 버전이 두 점포보기 모두에 사용됩니다. 이 블록의 캐시를 비활성화하면 문제가 해결됩니다. 여전히 블록을 캐시하려면 블록을 다른 블록에 넣고 대신이 블록을 캐시하면됩니다.
Andreas Riedmüller

1
@ Rajeev 감사합니다.이 방법을 여러 게시물에서 찾았지만 귀하가 옳다고 확신합니다. xml에서 캐시를 사용하지 않도록 방법을 변경했습니다. 이전의 방법은 여기에 받아 들여진 대답입니다 : stackoverflow.com/questions/27684236/…
Andreas Riedmüller

2

Magento Connection Manager에서 기존 확장을 업데이트하여이 문제를 해결할 수있었습니다. 그것을 조사한 후, 나는 마 젠토 캐싱 시스템에 문제가 있다는 인상을 받았다.

기본적으로 Magento에는 캐싱 기술과 관련된 여러 패키지가 있습니다. Zend 및 Redis 용 어댑터 및 라이브러리가 포함되어 있습니다.

적절한 패키지를 찾으려고하는 대신 설치에있는 모든 패키지를 업데이트하기로했습니다.

그런 다음 Mage_All_Latest에서 확인 표시를 선택했습니다. 최신 안정 Magento 1.9.0.0 릴리스의 메타 패키지입니다.

올바른 패키지 만 업그레이드하여 문제를 해결할 수도 있습니다. 이 방법이 보안 패치를 적용한다는 의혹 때문에 이것이 더 좋은 방법이라고 생각했습니다.


1

전체 업그레이드 또는 백 포트 1.9.2.0을 수행해야합니다.

1.9.2.1의 CMS 블록 및 위젯 캐싱 변경

magento-1921 / app / code / core / 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 / app / code / core / Mage / Cms / Block / 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

Magento 1.9.3.8을 사용하고 있는데 여전히 문제가 있습니다.

내 수정 사항은 여기에서 찾을 수 있습니다 .

기본적으로 각 캐시 키 정보에 page url 및 blockId를 기반으로 고유 문자열을 추가하므로 각 블록에는 고유 키가 있습니다.

 /**
 * 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;
}

Magento가이 문제에 대한 수정을 준비 할 때까지 파일을 만들 수 있습니다.

앱 / 코드 / 로컬 / 마법사 / Cms / 블록 /Block.php

위의 github url에서 코드를 내용으로 삽입하십시오.

이 코드는 Magento 1.9.2. * 및 1.9.3. *에서 테스트되었습니다.


-1

이것은 1.9.2 버전에서 확인 된 버그입니다. 시간이 지나면 관리자-> 캐시 관리 섹션 에서 "HTML 출력 차단"캐시를 비활성화하여이 문제를 해결할 수 있습니다.

그것이 도움이되기를 바랍니다.


studio2f는 그 대답을 언급했습니다. u @andrewkett를 사용하거나 주요 질문에서 "이 문제"를 클릭하면 도움이 될 것입니다.
wk

2
특정 블록에서만 나타나는 문제를 해결하기 위해 모든 블록 캐싱을 비활성화하면 손가락에 동상이 생길 경우 전체 손을 자르는 것과 비슷합니다. 손가락을 자르는 것 역시 불쾌하지만 적어도 병에 대한 반응은 더 비례 할 것입니다. Andrewkett의 ( magento.stackexchange.com/users/527/andrewkett ) 답변은보다 합리적인 접근 방식입니다 : magento.stackexchange.com/questions/73685/…
Bryan '

CORE 클래스를 편집하거나 변경하지 마십시오.
Ahsan Horani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.