Version Notes
N/A
Download this release
Release Info
| Developer | Jonathan Selander |
| Extension | Made_Cache |
| Version | 1.0.6 |
| Comparing to | |
| See all releases | |
Code changes from version 1.0.4 to 1.0.6
- app/code/community/Made/Cache/Block/Checkout/Cart/Sidebar.php +72 -0
- app/code/community/Made/Cache/Model/Layout.php +27 -52
- app/code/community/Made/Cache/Model/Observer.php +14 -3
- app/code/community/Made/Cache/controllers/VarnishController.php +1 -1
- app/code/community/Made/Cache/etc/config.xml +15 -1
- app/design/frontend/base/default/layout/madecache.xml +8 -0
- package.xml +4 -4
app/code/community/Made/Cache/Block/Checkout/Cart/Sidebar.php
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* The cart sidebar block is widely used and often put on top of a layout. As
|
| 4 |
+
* its loading time is usually around ~300ms, caching it is a good idea
|
| 5 |
+
*
|
| 6 |
+
* @package Made_Cache
|
| 7 |
+
* @author info@madepeople.se
|
| 8 |
+
* @copyright Copyright (c) 2012 Made People AB. (http://www.madepeople.se/)
|
| 9 |
+
*/
|
| 10 |
+
class Made_Cache_Block_Checkout_Cart_Sidebar
|
| 11 |
+
extends Mage_Checkout_Block_Cart_Sidebar
|
| 12 |
+
{
|
| 13 |
+
/**
|
| 14 |
+
* Return the quote item id
|
| 15 |
+
*
|
| 16 |
+
* @return int
|
| 17 |
+
*/
|
| 18 |
+
protected function _getQuoteId()
|
| 19 |
+
{
|
| 20 |
+
$quote = $this->getCustomQuote() ? $this->getCustomQuote() : $this->getQuote();
|
| 21 |
+
return $quote->getId();
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
/**
|
| 25 |
+
* Only cache if there actually is a quote in the session. hasItems() is
|
| 26 |
+
* costly, so we don't want to use it. This means an empty cart block
|
| 27 |
+
* that previously had items is fetched from cache.
|
| 28 |
+
*
|
| 29 |
+
* @return int|null
|
| 30 |
+
*/
|
| 31 |
+
public function getCacheLifetime()
|
| 32 |
+
{
|
| 33 |
+
if (!$this->getQuote()->getId()) {
|
| 34 |
+
return null;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
return $this->getData('cache_lifetime');
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
/**
|
| 41 |
+
* Clear on custom cache tag maintained by observer
|
| 42 |
+
*
|
| 43 |
+
* @return array
|
| 44 |
+
*/
|
| 45 |
+
public function getCacheTags()
|
| 46 |
+
{
|
| 47 |
+
$tags = array('SALES_QUOTE_' . $this->_getQuoteId());
|
| 48 |
+
return $tags;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
/**
|
| 52 |
+
* Clear on custom cache tag maintained by observer
|
| 53 |
+
*
|
| 54 |
+
* @return array
|
| 55 |
+
*/
|
| 56 |
+
public function getCacheKey()
|
| 57 |
+
{
|
| 58 |
+
$keys = array(
|
| 59 |
+
'BLOCK_TPL',
|
| 60 |
+
Mage::app()->getStore()->getCode(),
|
| 61 |
+
$this->getTemplateFile(),
|
| 62 |
+
'template' => $this->getTemplate(),
|
| 63 |
+
$this->_getQuoteId()
|
| 64 |
+
);
|
| 65 |
+
|
| 66 |
+
$key = array_values($keys);
|
| 67 |
+
$key = implode('|', $key);
|
| 68 |
+
$key = sha1($key);
|
| 69 |
+
|
| 70 |
+
return $key;
|
| 71 |
+
}
|
| 72 |
+
}
|
app/code/community/Made/Cache/Model/Layout.php
CHANGED
|
@@ -16,6 +16,13 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 16 |
*/
|
| 17 |
protected $_cacheBlocks = array();
|
| 18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
/**
|
| 20 |
* Default cache lifetime
|
| 21 |
*
|
|
@@ -81,6 +88,17 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 81 |
}
|
| 82 |
}
|
| 83 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
return $this;
|
| 85 |
}
|
| 86 |
|
|
@@ -94,7 +112,7 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 94 |
{
|
| 95 |
// Generate parent for single block definitions
|
| 96 |
if ($parentIsMain !== false) {
|
| 97 |
-
$this->_generateBlock($parent,
|
| 98 |
}
|
| 99 |
if (empty($parent)) {
|
| 100 |
$parent = $this->getNode();
|
|
@@ -157,7 +175,7 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 157 |
}
|
| 158 |
|
| 159 |
/**
|
| 160 |
-
* Add block object to layout based on
|
| 161 |
*
|
| 162 |
* @param Varien_Simplexml_Element $node
|
| 163 |
* @param Varien_Simplexml_Element $parent
|
|
@@ -165,24 +183,13 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 165 |
*/
|
| 166 |
protected function _generateBlock($node, $parent)
|
| 167 |
{
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
} else {
|
| 171 |
-
$className = (string)$node['type'];
|
| 172 |
-
}
|
| 173 |
-
|
| 174 |
$blockName = (string)$node['name'];
|
| 175 |
-
$
|
| 176 |
-
Varien_Profiler::start($_profilerKey);
|
| 177 |
-
|
| 178 |
-
$block = $this->addBlock($className, $blockName);
|
| 179 |
if (!$block) {
|
| 180 |
return $this;
|
| 181 |
}
|
| 182 |
-
|
| 183 |
-
if (!empty($node['esi'])) {
|
| 184 |
-
$block->setData('esi', (int)$node['esi']);
|
| 185 |
-
}
|
| 186 |
|
| 187 |
if (in_array($blockName, array_keys($this->_cacheBlocks))) {
|
| 188 |
$block->setData('cache_lifetime', $this->_cacheBlocks[$blockName]);
|
|
@@ -191,43 +198,11 @@ class Made_Cache_Model_Layout extends Mage_Core_Model_Layout
|
|
| 191 |
$block->setData('cache_tags', (string)$node['cache_tags']);
|
| 192 |
}
|
| 193 |
}
|
| 194 |
-
|
| 195 |
-
if (
|
| 196 |
-
$
|
| 197 |
-
} elseif ($parent) {
|
| 198 |
-
$parentName = $parent->getBlockName();
|
| 199 |
-
if (!empty($parentName)) {
|
| 200 |
-
$parentBlock = $this->getBlock($parentName);
|
| 201 |
-
}
|
| 202 |
-
}
|
| 203 |
-
if (!empty($parentBlock)) {
|
| 204 |
-
$alias = isset($node['as']) ? (string)$node['as'] : '';
|
| 205 |
-
if (isset($node['before'])) {
|
| 206 |
-
$sibling = (string)$node['before'];
|
| 207 |
-
if ('-'===$sibling) {
|
| 208 |
-
$sibling = '';
|
| 209 |
-
}
|
| 210 |
-
$parentBlock->insert($block, $sibling, false, $alias);
|
| 211 |
-
} elseif (isset($node['after'])) {
|
| 212 |
-
$sibling = (string)$node['after'];
|
| 213 |
-
if ('-'===$sibling) {
|
| 214 |
-
$sibling = '';
|
| 215 |
-
}
|
| 216 |
-
$parentBlock->insert($block, $sibling, true, $alias);
|
| 217 |
-
} else {
|
| 218 |
-
$parentBlock->append($block, $alias);
|
| 219 |
-
}
|
| 220 |
-
}
|
| 221 |
-
if (!empty($node['template'])) {
|
| 222 |
-
$block->setTemplate((string)$node['template']);
|
| 223 |
-
}
|
| 224 |
-
|
| 225 |
-
if (!empty($node['output'])) {
|
| 226 |
-
$method = (string)$node['output'];
|
| 227 |
-
$this->addOutputBlock($blockName, $method);
|
| 228 |
}
|
| 229 |
-
|
| 230 |
-
|
| 231 |
return $this;
|
| 232 |
}
|
| 233 |
}
|
| 16 |
*/
|
| 17 |
protected $_cacheBlocks = array();
|
| 18 |
|
| 19 |
+
/**
|
| 20 |
+
* Keep track of which blocks should be converted to ESI tags
|
| 21 |
+
*
|
| 22 |
+
* @var array
|
| 23 |
+
*/
|
| 24 |
+
protected $_esiBlocks = array();
|
| 25 |
+
|
| 26 |
/**
|
| 27 |
* Default cache lifetime
|
| 28 |
*
|
| 88 |
}
|
| 89 |
}
|
| 90 |
}
|
| 91 |
+
|
| 92 |
+
// Find blocks that should be represented by ESI tags
|
| 93 |
+
$esiList = $xml->xpath("//esi/*");
|
| 94 |
+
if (count($esiList)) {
|
| 95 |
+
foreach ($esiList as $node) {
|
| 96 |
+
$blockName = trim((string)$node);
|
| 97 |
+
$this->_esiBlocks[] = $blockName;
|
| 98 |
+
}
|
| 99 |
+
array_unique($this->_esiBlocks);
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
return $this;
|
| 103 |
}
|
| 104 |
|
| 112 |
{
|
| 113 |
// Generate parent for single block definitions
|
| 114 |
if ($parentIsMain !== false) {
|
| 115 |
+
$this->_generateBlock($parent, new Varien_Object);
|
| 116 |
}
|
| 117 |
if (empty($parent)) {
|
| 118 |
$parent = $this->getNode();
|
| 175 |
}
|
| 176 |
|
| 177 |
/**
|
| 178 |
+
* Add block object to layout based on XML node data
|
| 179 |
*
|
| 180 |
* @param Varien_Simplexml_Element $node
|
| 181 |
* @param Varien_Simplexml_Element $parent
|
| 183 |
*/
|
| 184 |
protected function _generateBlock($node, $parent)
|
| 185 |
{
|
| 186 |
+
parent::_generateBlock($node, $parent);
|
| 187 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
| 188 |
$blockName = (string)$node['name'];
|
| 189 |
+
$block = $this->getBlock($blockName);
|
|
|
|
|
|
|
|
|
|
| 190 |
if (!$block) {
|
| 191 |
return $this;
|
| 192 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 193 |
|
| 194 |
if (in_array($blockName, array_keys($this->_cacheBlocks))) {
|
| 195 |
$block->setData('cache_lifetime', $this->_cacheBlocks[$blockName]);
|
| 198 |
$block->setData('cache_tags', (string)$node['cache_tags']);
|
| 199 |
}
|
| 200 |
}
|
| 201 |
+
|
| 202 |
+
if (in_array($blockName, $this->_esiBlocks)) {
|
| 203 |
+
$block->setData('esi', 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
}
|
| 205 |
+
|
|
|
|
| 206 |
return $this;
|
| 207 |
}
|
| 208 |
}
|
app/code/community/Made/Cache/Model/Observer.php
CHANGED
|
@@ -24,9 +24,8 @@ class Made_Cache_Model_Observer
|
|
| 24 |
}
|
| 25 |
|
| 26 |
/**
|
| 27 |
-
* ESI tags for Varnish, needs the block
|
| 28 |
-
*
|
| 29 |
-
* Phoenix_VarnishCache
|
| 30 |
*
|
| 31 |
* @param Varien_Event_Observer $observer
|
| 32 |
*/
|
|
@@ -70,4 +69,16 @@ class Made_Cache_Model_Observer
|
|
| 70 |
->cleanType(Mage_Core_Block_Abstract::CACHE_GROUP);
|
| 71 |
}
|
| 72 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
}
|
| 24 |
}
|
| 25 |
|
| 26 |
/**
|
| 27 |
+
* ESI tags for Varnish, needs the block to have the attribute esi === 1
|
| 28 |
+
* as well as Varnish configured with for instance Phoenix_VarnishCache
|
|
|
|
| 29 |
*
|
| 30 |
* @param Varien_Event_Observer $observer
|
| 31 |
*/
|
| 69 |
->cleanType(Mage_Core_Block_Abstract::CACHE_GROUP);
|
| 70 |
}
|
| 71 |
}
|
| 72 |
+
|
| 73 |
+
/**
|
| 74 |
+
* Clear quote cache on custom tag
|
| 75 |
+
*
|
| 76 |
+
* @param Varien_Event_Observer $observer
|
| 77 |
+
*/
|
| 78 |
+
public function clearQuoteCache(Varien_Event_Observer $observer)
|
| 79 |
+
{
|
| 80 |
+
// Only work when there is an active quote in the session
|
| 81 |
+
$object = $observer->getEvent()->getQuote();
|
| 82 |
+
Mage::app()->cleanCache(array('SALES_QUOTE_' . $object->getId()));
|
| 83 |
+
}
|
| 84 |
}
|
app/code/community/Made/Cache/controllers/VarnishController.php
CHANGED
|
@@ -32,7 +32,7 @@ class Made_Cache_VarnishController extends Mage_Core_Controller_Front_Action
|
|
| 32 |
$layout->generateXml();
|
| 33 |
$blockNodes = $layout->getNode()
|
| 34 |
->xpath('//*[@name="'.$blockName.'"]');
|
| 35 |
-
|
| 36 |
if (!empty($blockNodes)) {
|
| 37 |
foreach ($blockNodes as $node) {
|
| 38 |
$layout->generateBlocks($node, true);
|
| 32 |
$layout->generateXml();
|
| 33 |
$blockNodes = $layout->getNode()
|
| 34 |
->xpath('//*[@name="'.$blockName.'"]');
|
| 35 |
+
|
| 36 |
if (!empty($blockNodes)) {
|
| 37 |
foreach ($blockNodes as $node) {
|
| 38 |
$layout->generateBlocks($node, true);
|
app/code/community/Made/Cache/etc/config.xml
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
<config>
|
| 10 |
<modules>
|
| 11 |
<Made_Cache>
|
| 12 |
-
<version>1.0.
|
| 13 |
</Made_Cache>
|
| 14 |
</modules>
|
| 15 |
<global>
|
|
@@ -40,8 +40,22 @@
|
|
| 40 |
<widget_block>Made_Cache_Block_Cms_Widget_Block</widget_block>
|
| 41 |
</rewrite>
|
| 42 |
</cms>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
</blocks>
|
| 44 |
<events>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
<review_save_after>
|
| 46 |
<observers>
|
| 47 |
<cache_review_save_after>
|
| 9 |
<config>
|
| 10 |
<modules>
|
| 11 |
<Made_Cache>
|
| 12 |
+
<version>1.0.6</version>
|
| 13 |
</Made_Cache>
|
| 14 |
</modules>
|
| 15 |
<global>
|
| 40 |
<widget_block>Made_Cache_Block_Cms_Widget_Block</widget_block>
|
| 41 |
</rewrite>
|
| 42 |
</cms>
|
| 43 |
+
<checkout>
|
| 44 |
+
<rewrite>
|
| 45 |
+
<cart_sidebar>Made_Cache_Block_Checkout_Cart_Sidebar</cart_sidebar>
|
| 46 |
+
</rewrite>
|
| 47 |
+
</checkout>
|
| 48 |
</blocks>
|
| 49 |
<events>
|
| 50 |
+
<sales_quote_save_after>
|
| 51 |
+
<observers>
|
| 52 |
+
<quote_save_after>
|
| 53 |
+
<type>singleton</type>
|
| 54 |
+
<class>cache/observer</class>
|
| 55 |
+
<method>clearQuoteCache</method>
|
| 56 |
+
</quote_save_after>
|
| 57 |
+
</observers>
|
| 58 |
+
</sales_quote_save_after>
|
| 59 |
<review_save_after>
|
| 60 |
<observers>
|
| 61 |
<cache_review_save_after>
|
app/design/frontend/base/default/layout/madecache.xml
CHANGED
|
@@ -21,7 +21,15 @@
|
|
| 21 |
<name>product.info</name>
|
| 22 |
<name>product_list</name>
|
| 23 |
<name>category.products</name>
|
|
|
|
| 24 |
</cache>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
</default>
|
| 26 |
|
| 27 |
<checkout_onepage_index>
|
| 21 |
<name>product.info</name>
|
| 22 |
<name>product_list</name>
|
| 23 |
<name>category.products</name>
|
| 24 |
+
<name lifetime="7200">cart_sidebar</name>
|
| 25 |
</cache>
|
| 26 |
+
|
| 27 |
+
<!-- Example of rendering the cart using ESI -->
|
| 28 |
+
<!--
|
| 29 |
+
<esi>
|
| 30 |
+
<name>cart_sidebar</name>
|
| 31 |
+
</esi>
|
| 32 |
+
-->
|
| 33 |
</default>
|
| 34 |
|
| 35 |
<checkout_onepage_index>
|
package.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Made_Cache</name>
|
| 4 |
-
<version>1.0.
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license>OSL 3.0</license>
|
| 7 |
<channel>community</channel>
|
|
@@ -18,9 +18,9 @@ ESI is supported in conjunction with Phoenix_VarnishCache, and allows for super-
|
|
| 18 |
A good block cache is vital for scaling a site, be sure to implement it before residing to full page cache.</description>
|
| 19 |
<notes>N/A</notes>
|
| 20 |
<authors><author><name>Jonathan Selander</name><user>jonathan_monday</user><email>jonathan@mondaycreative.se</email></author></authors>
|
| 21 |
-
<date>2012-05-
|
| 22 |
-
<time>
|
| 23 |
-
<contents><target name="magecommunity"><dir name="Made"><dir name="Cache"><dir name="Block"><dir name="Catalog"><dir name="Product"><dir name="List"><file name="Product.php" hash="ba8d5fba2fa01d571333e72146d80d40"/></dir><file name="List.php" hash="377798f55bcbe90fda0d3dd582bbea77"/><file name="View.php" hash="14a2b6a99872a0fbbfc9e5390f56642b"/></dir></dir><dir name="Cms"><file name="Block.php" hash="e99bc96a3a6cd1bee4658b163b1ee63e"/><file name="Page.php" hash="156f4eb0d9dfd6f8dd0d3fce40f0c356"/><dir name="Widget"><file name="Block.php" hash="3e74a85404ab796bf46db6c36e479d49"/></dir></dir></dir><dir name="Model"><file name="Layout.php" hash="
|
| 24 |
<compatible/>
|
| 25 |
<dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
|
| 26 |
</package>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Made_Cache</name>
|
| 4 |
+
<version>1.0.6</version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license>OSL 3.0</license>
|
| 7 |
<channel>community</channel>
|
| 18 |
A good block cache is vital for scaling a site, be sure to implement it before residing to full page cache.</description>
|
| 19 |
<notes>N/A</notes>
|
| 20 |
<authors><author><name>Jonathan Selander</name><user>jonathan_monday</user><email>jonathan@mondaycreative.se</email></author></authors>
|
| 21 |
+
<date>2012-05-12</date>
|
| 22 |
+
<time>15:45:42</time>
|
| 23 |
+
<contents><target name="magecommunity"><dir name="Made"><dir name="Cache"><dir name="Block"><dir name="Catalog"><dir name="Product"><dir name="List"><file name="Product.php" hash="ba8d5fba2fa01d571333e72146d80d40"/></dir><file name="List.php" hash="377798f55bcbe90fda0d3dd582bbea77"/><file name="View.php" hash="14a2b6a99872a0fbbfc9e5390f56642b"/></dir></dir><dir name="Checkout"><dir name="Cart"><file name="Sidebar.php" hash="93fc87f013fe054993383034c96c23b5"/></dir></dir><dir name="Cms"><file name="Block.php" hash="e99bc96a3a6cd1bee4658b163b1ee63e"/><file name="Page.php" hash="156f4eb0d9dfd6f8dd0d3fce40f0c356"/><dir name="Widget"><file name="Block.php" hash="3e74a85404ab796bf46db6c36e479d49"/></dir></dir></dir><dir name="Model"><file name="Layout.php" hash="94475af1640d47763b17914c4af73846"/><file name="Observer.php" hash="3d8aaad098e61bfd20c9701234ec7266"/></dir><dir name="controllers"><file name="VarnishController.php" hash="6ae7446eef83e106c56b0f05711c3ffa"/></dir><dir name="etc"><file name="config.xml" hash="30195c4aad4535bae9f47079c7d851c8"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Made_Cache.xml" hash="4cf53cc9b4e525eb560f7fe1278d96bd"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="madecache.xml" hash="6a0f95410f1aed85851bcab8437b53e8"/></dir></dir></dir></dir></target></contents>
|
| 24 |
<compatible/>
|
| 25 |
<dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
|
| 26 |
</package>
|
