1.9.1.0에서 작동하는 여러 정적 블록이있는 웹 사이트가 있지만 1.9.2.0에서는 정적 블록이 때때로 올바른 블록이 아닌 잘못된 블록을 표시하기 때문에 산발적으로 표시되기 시작합니다. 때로는 원하는대로 표시됩니다. 누구 든지이 문제와 관련 이 있을 수있는이 문제를 해결하는 방법을 알고 있습니까?
1.9.1.0에서 작동하는 여러 정적 블록이있는 웹 사이트가 있지만 1.9.2.0에서는 정적 블록이 때때로 올바른 블록이 아닌 잘못된 블록을 표시하기 때문에 산발적으로 표시되기 시작합니다. 때로는 원하는대로 표시됩니다. 누구 든지이 문제와 관련 이 있을 수있는이 문제를 해결하는 방법을 알고 있습니까?
답변:
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에 추가 된 새 줄을 볼 수 있습니다
위의 솔루션은 전체 단계를 제공하지 않으므로 로컬 모듈 기반 솔루션을 사용합니다. 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
이에 대한 공식 패치는 없지만 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
이 문제도 확인할 수 있습니다.
재현하려면 :
을 사용하여 CMS -> Widgets
왼쪽 블록에 정적 블록을 추가하는 위젯을 작성하십시오.
그런 다음 두 번째 위젯을 만들어 step 1
왼쪽 사이드 바에 두 번째 정적 블록 (에서와 다른 블록 )을 추가하십시오.
캐시가 비활성화되면 두 정적 블록이 모두 세로 막대에 올바르게 표시됩니다.
그러나 캐시를 활성화하면 정적 블록이 step 1
두 번 표시됩니다.
Magento의 Piotr은 당분간이 문제에 대한 비공식 패치를 게시했습니다. https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db
트릭을 수행하는 것 같습니다. 예, 핵심을 편집하고 있지만 Magento가 공식 패치 또는 다음 버전을 릴리스 할 때까지 문제를 해결합니다 ...
최신 버전의 Magento는 새로운 보안 기능으로이를 강화합니다. 시스템-> 권한의 권한을 정적 블록에 추가 할 수 있습니다.
나는 가게와 같은 문제가 있었다. 지금까지 내가 찾은 가장 좋은 해결 방법은 영향을받는 블록에 대한 캐싱을 비활성화하는 것입니다. 블록의 캐시 수명을 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"으로 설정하지 마십시오
$block->setCacheLifeTime("null");
노트 NULL
와 "null"이 두 가지 다른 것 (나중에 하나는 문자열 임)이므로 레이아웃 업데이트를 해석 하므로 예상 된 결과를 얻지 못하기 때문입니다.
Magento Connection Manager에서 기존 확장을 업데이트하여이 문제를 해결할 수있었습니다. 그것을 조사한 후, 나는 마 젠토 캐싱 시스템에 문제가 있다는 인상을 받았다.
기본적으로 Magento에는 캐싱 기술과 관련된 여러 패키지가 있습니다. Zend 및 Redis 용 어댑터 및 라이브러리가 포함되어 있습니다.
적절한 패키지를 찾으려고하는 대신 설치에있는 모든 패키지를 업데이트하기로했습니다.
그런 다음 Mage_All_Latest에서 확인 표시를 선택했습니다. 최신 안정 Magento 1.9.0.0 릴리스의 메타 패키지입니다.
올바른 패키지 만 업그레이드하여 문제를 해결할 수도 있습니다. 이 방법이 보안 패치를 적용한다는 의혹 때문에 이것이 더 좋은 방법이라고 생각했습니다.
전체 업그레이드 또는 백 포트 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;
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.9.2 버전에서 확인 된 버그입니다. 시간이 지나면 관리자-> 캐시 관리 섹션 에서 "HTML 출력 차단"캐시를 비활성화하여이 문제를 해결할 수 있습니다.
그것이 도움이되기를 바랍니다.