I have created a custom block to display 10 random products on my homepage, and for load time etc, it is a bad idea to request random products from the database each load. Thus, have incorporated the default magento caching mechanism into my code to cache x versions of the block and rotate them for each user. But, I cannot get it to work correctly.
Currently, it loads random products A, B and C on first page load. Then loads new different random products ( products X, Y & Z) on the next page load. The page load after that loads the random products from the first load (A,B & C).
I cannot see where I have gone wrong thus was wondering if anyone could kindly help myself see my mistake.
Code,
<?php class Vish_RandomProduct_Block_Random extends Mage_Core_Block_Template{ protected function _construct() { $this->addData(array( 'cache_lifetime' => 86400, 'cache_tags'=> array(Mage_Core_Model_Store::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG) )); } protected function _getRandomProductCollection() { $numberOfItems = 12;$productCollection = Mage::getModel('catalog/product')->getCollection() ->addStoreFilter() ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds()) ->addAttributeToFilter('name', array('nlike' => '%Adjustable Book Protection Jackets%'));$candidateIds = $productCollection->getAllIds();$numberOfProducts = count($candidateIds);$chosenIds = []; while ($numberOfItems) { $randomKey = mt_rand(0, $numberOfProducts - 1); if (!isset($chosenIds[$randomKey])) { $chosenIds[$randomKey] = $candidateIds[$randomKey]; --$numberOfItems; } }$productCollection->addIdFilter($chosenIds);$productCollection ->addMinimalPrice() ->addFinalPrice() ->addTaxPercents() ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes()) ->addUrlRewrite(); return $productCollection; } public function getCacheKeyInfo() { $session = Mage::getSingleton('core/session'); $counter = $session->getData('random_counter'); $counter = ($counter + 1) % 10; $session->setData('random_counter', $counter); return array( $this->getNameInLayout(), $counter ); } } ?>
Update:-
investigating further, via the placement of a mage::log, to see the count variable in the getCacheKeyInfo() function it reveals 7 entries each time I refresh. Little confused why this function is running this many times.
2017-11-21T20:11:45+00:00 DEBUG (7): 1 2017-11-21T20:11:45+00:00 DEBUG (7): 2 2017-11-21T20:11:45+00:00 DEBUG (7): 3
Rest of the block code:
vishrandom.phtml
<?php $collection = $this->_getRandomProductCollection(); // Mage::log("template for random called", null, 'randomprodcachelog.log'); ?> <?php if ($collection->getSize() > 0): ?> <div class="jcarousel-wrapper"> <div class="jcarousel"> <ul> <?php foreach ($collection as $_product) { ?> <li><a href="<?php echo $_product->getProductUrl() ?>"> <img src='media/wysiwyg/805.svg' data-src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(200); ?>" alt="" /></a> <div class="productName"> <a href="<?php echo $_product->getProductUrl(); ?>"><?php echo $_product->getName(); ?></a><br/> </div> <?php if($this->htmlEscape($_product->getExtraInfo() !="")):?> <span class="icon icon-info-circle tooltip" title="<?php echo $this->htmlEscape($_product->getExtraInfo())?>" ></span> <?php endif;?> <div class="productCode"> <?php echo $this->__('Product Code: ') . $this->htmlEscape($_product->getData('sku'));?> </div> <?php if($_product->isSaleable()): ?> <p><button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->helper('checkout/cart')->getAddUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Basket') ?></span></span></button></p> <?php else: ?> <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p> <?php endif; ?> <ul class="add-to-links"> <?php if ($this->helper('wishlist')->isAllow()) : ?> <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__('Add to Wishlist') ?></a></li> <?php endif; ?> </ul> </li> <?php }?> </ul> </div> <a href="#" class="jcarousel-control-prev">‹</a> <a href="#" class="jcarousel-control-next">›</a> </div> <?php endif;?>
/local/vish/RandomProduct/etc/config.xml
<?xml version="1.0"?> <config> <modules> <Vish_RandomProduct> <version>0.0.1</version> </Vish_RandomProduct> </modules> <global> <blocks> <Vish_RandomProduct> <class>Vish_RandomProduct_Block</class> </Vish_RandomProduct> </blocks> </global> </config>