我想在Magento中编写一个cronjob,它按照某些参数加载产品集合并将其保存在我可以在cms / page中使用的地方。
我的第一种方法是使用Magento的注册表,但这不起作用,即简单
Mage::register('label',$product_collection);
...不起作用,因为我的PHTML文件中的Mage :: registry似乎没有“label”...
有人能指出我正确的方向吗?这是正确的方法吗?如果是这样,如何使它工作;如果没有,该怎么做?
提前致谢!
答案 0 :(得分:4)
不幸的是,Mage :: register不会让你到达目的地。 Mage注册表项保存在正在运行的PHP脚本的内存中,因此它的范围限定为运行PHP代码的页面请求,因此不会在cron和PHTML文件之间共享。
为了实现您的目标,您需要将集合缓存到持久存储,例如硬盘或Memcache。您可能必须在缓存之前专门调用load()函数,如下所示:
<?php
// ...
// ... Somewhere in your cron script
$product_collection = Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('some_field', 'some_value');
$product_collection->load(); // Magento kind of "lazy-loads" its data, so
// without this, you might not save yourself
// from executing MySQL code in the PHTML
// Serialize the data so it can be saved to cache as a string
$cacheData = serialize($product_collection);
$cacheKey = 'some sort of unique cache key';
// Save the serialized collection to the cache (defined in app/etc/local.xml)
Mage::app()->getCacheInstance()->save($cacheData, $cacheKey);
然后,在您的PHTML文件中尝试:
<?php
// ...
$cacheKey = 'same unique cache key set in the cron script';
// Load the collection from cache
$product_collection = Mage::app()->getCacheInstance()->load($cacheKey);
// I'm not sure if Magento will auto-unserialize your object, so if
// the cache gives us a string, then we will do it ourselves
if ( is_string($product_collection) ) {
$product_collection = unserialize($product_collectoin);
}
// ...