1.9.1.0で動作していた複数の静的ブロックを含むWebサイトがありますが、1.9.2.0では、静的ブロックが散発的に表示されるようになります。必要に応じて表示される場合があります。誰でもに関連している可能性があり、この問題解決する方法を知っていますこの問題を?
1.9.1.0で動作していた複数の静的ブロックを含むWebサイトがありますが、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
、ローカルコードプールにコピーしてキャッシュキーを追加することもできます。
ここでは、上記のソリューションでは手順全体が提供されないため、ローカルモジュールベースのソリューションを使用します。カスタムモジュールを作成する必要があります。MagentoBoogiemanがあなたを手に入れることを皆さんはご存知だからです!コアを変更する場合:)
次のファイルが必要です。 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
MagentoのPiotrは、当面この問題に対する非公式パッチを公開しています:https : //gist.github.com/piotrekkaminski/ecd245e8c9390e4020db
トリックをするようです。はい、コアを編集していますが、Magentoが公式パッチまたは次のバージョンをリリースするまで問題を修正しています...
Magentoの最新バージョンでは、新しいセキュリティ機能で機能が強化されています。system-> permissionsで静的ブロックにパーミッションを追加できます。
私の店でも同じ問題がありました。私がこれまでに発見した最善の回避策は、影響を受けるブロックのキャッシュを無効にすることです。これを行うには、ブロックのキャッシュライフタイムをnullに設定します。
ライブサイトで「ブロックHTML出力」キャッシュをグローバルに無効にすることは、サイトのパフォーマンスに不必要に影響するため、良いアイデアではありません。
xmlの1ブロックのキャッシュを無効にします:
<block ... >
...
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
</block>
PHPの1ブロックのキャッシュを無効にします:
$this->getLayout()->createBlock('cms/block')
->setCacheLifetime(null)
->setBlockId('block-id')
->toHtml();
この記事で指摘されているように、キャッシュの有効期間を「0」に設定しないでください
$block->setCacheLifeTime("null");
Note NULL
と「null」が2つの異なるもの(後で1つは文字列)であると解釈し、期待される結果が得られないためです。
Magento Connection Managerの既存の拡張機能を更新することで、この問題を修正できました。調べてみると、Magentoキャッシングシステムに問題があるという印象を受けました。
デフォルトでは、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を使用していますが、問題は引き続き存在します。
ここで私の修正を見つけることができます:
基本的に、ページの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がこの問題の修正を準備するまで、ファイルを作成できます。
app / code / local / Mage / Cms / Block / Block.php
上記のgithub URLのコードをコンテンツとして挿入します。
このコードは、Magento 1.9.2。*および1.9.3。*でテストされています
これはバージョン1.9.2のバグとして確認されていますが、当面はadmin- > cache management sectionから「Blocks HTML output」キャッシュを無効にするだけでこの問題を解決できます。
それが役に立てば幸い