2017-03-08 11 views
0

Magentoキャッシュを使用する方法を学習しています。コレクションをシリアライズしようとしています。Magentoがキャッシュを使用していて、コレクションをシリアライズできません。

実はこれは私のコードです:まず

class Feliu_Featuredcategories_Block_Topcategories extends Mage_Core_Block_Template 
{ 

protected function _construct() 
{ 
    $storeId = Mage::app()->getStore()->getId(); 
    $this->addData(array(
     'cache_lifetime'   => 3600, 
     'cache_tags'    => array(Mage_Catalog_Model_Product::CACHE_TAG), 
     'cache_key'     => 'homepage-most-view-' . $storeId, 
    )); 
} 

public function setData() 
{ 
    $storeId = Mage::app()->getStore()->getId(); 
    $cache = Mage::app()->getCache(); 
    $key = 'homepage-most-view-' . $storeId; 
    $cached_categories = $cache->load($key); 

    if (! $cached_categories) { 
     $categories = Mage::getModel('catalog/category') 
      ->getCollection() 
      ->addAttributeToSelect(array('data', 'name', 'add_to_top_categories')) 
      ->addAttributeToFilter('add_to_top_categories', array('eq' => '1')); 
     $categories->load(); 

     $cache->save(serialize($categories), $key); 

    } else { 
     $categories = unserialize($cached_categories); 
    } 

    return $categories; 
} 
} 

私が直接$cache->save($categories, $key);しようとしたが、私はコレクションは直接保存することができないことを読んで、私が言ったエラーました:「automatic_serializationはは上にある必要があります」をautomatic_serializationをtrueに設定しようとすると、セキュリティ上の理由でアクティブ化できないというメッセージが表示されました。

次に、私は上記のコードが示すように、シリアル化しようとしましたが、どちらも動作しませんでした。 Magentoは、コレクションが本当に大きなものになる可能性があるため、コレクションのシリアル化を保護しているようです。

だから最終的に私はserialize(urlencode($categories))urldecode(unserialize($categories))をシリアライズする前にurlencode()しようとしたが、私はこのaproachと空の文字列をアンシリアライズしてシリアライズ文字列"N;"を得ました。

私は、Magentoの1.9.3を使用していると私は、このドキュメントと、前の質問の後:

https://www.nicksays.co.uk/developers-guide-magento-cache/

http://inchoo.net/magento/magento-block-caching/

Magento: serialization error on caching Collection

Magento how to cache a productCollection

そして、いくつかの他の質問についてはこれは、しかし、おそらく必要はありませんあまりにも多くのリンクを書く、私は迷惑メールしたくありません。

編集:私は

$categories = array('banana', 'apple', 'kiwi', 'strawberry', 'pomelo', 'melon'); 

のような配列を使用する代わりに、コレクションは、コードが正しく

答えて

0

最後に、私は、それが最初にかかわらず、私よりも簡単です答えは、それを解決したが、私に動作するようであればそれは将来誰かを助けるかもしれないので、ここに書きなさい。

コレクションのキャッシュやシリアル化ができないため、コレクションから必要なデータを含む配列を作成しました。

$categories = Mage::getModel('catalog/category') 
    ->getCollection() 
    ->addAttributeToFilter('add_to_top_categories', array('eq' => '1')) 
    ->addAttributeToSelect(array('data', 'name')); 

私はコレクションは、私が必要なフィールドだけを追加し、私がしたいデータを選択します。

$array = array(); 
    foreach ($categories as $_category) 
    { 
     array_push($array, array('url' => $_category->getUrl(), 'name' => $_category->getName())); 
    } 

ここで、私が望むデータでオブジェクトを保持する配列を作成します。次のステップでは、作成した配列をシリアル化してキャッシュに保存します。

$cache->save(serialize($array), $key, array('custom_home_cache'), 60*60); 

とデータを取り出すには、同じくらい簡単です$cache->load(unserialize($key))

関連する問題