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');
のような配列を使用する代わりに、コレクションは、コードが正しく