我正在学习如何使用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保护集合不被序列化,因为它们可能非常大。
最后,在序列化urlencode()
和serialize(urlencode($categories))
之前,我尝试urldecode(unserialize($categories))
,但是在反序列化时我得到了使用此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 :(得分:0)
最后我解决了它,答案最开始时比我最简单,但是我在这里写的是因为它可能会对将来有所帮助。
由于集合无法缓存或序列化,我使用集合中需要的数据创建了一个数组。
CREATE TABLE #DataDetails
(
StoreName CHAR(3), storeID int
)
CREATE TABLE #JOBTRACKING
(
store_code int, REPAIRNO INT, JOBSTATUS INT, created_Date DATE
)
INSERT #DataDetails VALUES( 'ABC', 1), ('XYZ', 2)
INSERT #JOBTRACKING VALUES (1, 1000, 100, '2017-03-08'), (1, 1001, 100, '2017-03-08'), (1, 1001, 100, '2017-03-08'), (1, 1008, 100, '2017-03-08'), (1, 1009, 100, '2017-03-08')
,(2, 1011, 100, '2017-03-08'), (2, 1011, 100, '2017-03-08'), (2, 1013, 100, '2017-03-08'), (2, 1014, 100, '2017-03-08'), (2, 1015, 100, '2017-03-08'), (2, 1015, 100, '2017-03-08')
SELECT UL.StoreName, COUNT(1) AS TotalDelivery
FROM #DataDetails AS UL
LEFT OUTER JOIN #JOBTRACKING AS JT
ON UL.storeID = JT.store_code
WHERE CAST(JT.created_Date AS date)='2017-03-08'
AND JT.JOBSTATUS=100
AND JT.REPAIRNO IN (SELECT REPAIRNO from #JOBTRACKING j WHERE j.store_code = UL.storeID GROUP BY j.REPAIRNO HAVING COUNT(1) = 1)
GROUP BY UL.StoreName, UL.storeID
我让集合只添加我需要的字段,并选择我想要的数据。
+-----------+---------------+
| StoreName | TotalDelivery |
+-----------+---------------+
| ABC | 3 |
| XYZ | 2 |
+-----------+---------------+
现在我创建一个包含我想要的数据的对象的数组。下一步是序列化我刚刚制作的数组并将其保存在缓存中。
$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()));
}