3

Magentoコレクションデータコレクションデータファイルのときに拡張キャッシュを更新したいと思います。COLLECTION_DATAキャッシュが更新され、他のイベントに対しても更新されます。これにより、このキャッシュがクリーンアップされます。

私はカスタムクラスを持っています、主要な部分は次のとおりです:

$this->_usecache = Mage::app()->useCache('collections');
if ($this->_usecache){
    $cache = Mage::app()->getCache();
    $key = "mycategory".$this->_config['rootid'];
    $this->tmpAllItems = $cache->load($key);
} else {
    $this->tmpAllItems = false;
}
if ($this->tmpAllItems === false){
    $this->tmpAllItems = array();
    $model = Mage::getModel('catalog/category');
    $categories = $model->getCategories($this->_config['rootid'], 0, true, false, true);
    $k = array_keys($categories->getNodes());
    $parent = $categories[$k[0]]->getParent();
    $this -> treeToFlat($parent);
    if ($this->_usecache) 
    {
         $cache->save(serialize($this->tmpAllItems),
                      $key,
                      array(Mage_Catalog_Model_Category::CACHE_TAG,
                            Mage_Core_Model_App::CACHE_TAG)
                     );
    } else {
        $this->tmpAllItems = unserialize($this->tmpAllItems);
    }
    return $this->tmpAllItems;

したがって、私の目標は、Mage_Catalog_Model_Category :: CACHE_TAGがクリーンアップされたときに、このキャッシュもリフレッシュ/クリーンアップすることです。これはどのように可能ですか?

更新#1

使った時

$cache = Mage::app()->getCacheInstance();

それ以外の

$cache = Mage::app()->getCache();

クリーンが機能し始めました。カテゴリがあるとリストが更新されましたが、何も起こらなければキャッシュのままでした。また、誰かがこの変更でこれが可能である理由を説明できますか?

解決

...
$cache->save(serialize($this->tmpAllItems),$key,array('my_cache_tag'));
....

次にクリアします:

    $cache = Mage::app()->getCache();
    foreach($cache->getTags() as $tag){
        if(strpos($tag, 'my_cache_tag')){
            $ids = $cache->getIdsMatchingAnyTags(array($tag));
            foreach($ids as $id){
                $cache->remove($id);
            }
        }
    }
4

4 に答える 4

3

この問題の解決策を見つけました。管理パネルで[キャッシュの更新]をクリックするとオブザーバーを使用します。ブログで詳細を確認できます。

ステップ1:管理パネルで[更新]をクリックしたときにイベントを含むオブザーバーを作成します。

    <events>
   <adminhtml_cache_refresh_type>
    <observers>
     <yournamespace_yourextenstion_model_observer>
      <type>singleton</type>
      <class>YourNameSpace_YourExtenstion_Model_Observer</class>
      <method>adminhtml_cache_refresh_type</method>
     </yournamespace_yourextenstion_model_observer>
    </observers>
   </adminhtml_cache_refresh_type>
  </events

これで、ファイル名を次のように作成できます。Observer.php次のパスをたどります:YourNameSpace / YourExtenstion / Model / Observer.phpそして、このコードをObserver.phpに追加します。

これはobserver.phpファイルのコンテンツです

class YourNameSpace_YourExtenstion_Model_Observer
{
 public function adminhtml_cache_refresh_type($observer)
 {
  $request = Mage::app()--->getRequest()->getPost('types');
  if(in_array('ee_content', $request))
  {
   $cache = Mage::app()->getCache();
   $tags = $cache->getTags();
   $ee_content = '';
   foreach($tags as $tag)
   {
    if(strpos($tag, 'ee_content'))
    {
     $ee_content = $tag;
    }
   }
   if($ee_content !='')
   {


    $ids = $cache->getIdsMatchingAnyTags(array($ee_content));
    foreach($ids as $id)
    {
     $cache->remove($id);
    }
   }

  }
 }
} 
于 2013-11-18T04:01:56.353 に答える
2

イベントapplication_clean_cacheを確認してください

-のようにキャッシュをクリアするときMage::app()->cleanCache();

またはシステムが製品などを保存するとき...

管理パネルを介してキャッシュをクリアするときのイベント-adminhtml_cache_refresh_typeを確認してください

オブザーバーのコード

Mage::app()->getCache()->clean('all', array('my_tag'));

キャッシュを更新する必要があるかどうかを確認するために、オブザーバーにロジックを追加する必要があります

于 2015-05-07T13:04:16.553 に答える
0

getCacheInstance()コアキャッシュモデルインスタンスgetCache()を取得し、キャッシュオブジェクトを取得します。

getCacheInstance()とによってすべてをきれいにするgetCache()には、以下のように使用する必要があります。

Mage::app()->getCacheInstance()->flush();
Mage::app()->getCache()->clean();

カスタムキャッシュタイプをクリーンアップするには、次を使用します。

Mage::app()->getCacheInstance()->cleanType('your_custom_cache_type');
于 2013-03-27T11:11:32.890 に答える
0

こんにちはMage::dispatchEventメソッドを使用して、独自のディスパッチイベントを作成できます。モデルファイルMage_Catalog_Model_Categoryをオーバーライドし、そこに新しいディスパッチャーを登録します。

于 2013-04-07T04:30:00.637 に答える