Troubleshooting Magestore - Ajax Cart
When enabling Ajax Cart a conflict with LiteMage can cause a blank page to be served. The following is a step-by-step example for troubleshooting this issue.
- Turn on the debug log.
- In your browser open a page from your site. You should get a blank page at this point.
- In
var/log/system.log
, you will see errors like:2016-04-04T14:12:24+00:00 ERR (3): Warning: simplexml_load_string(): <!--Litemage esi started cart_sidebar--></!--Litemage> in /home/user/public_html/app/code/local/Magestore/Ajaxcart/Helper/Data.php on line 29
These errors are caused by the following code block in
Magestore/Ajaxcart/Helper/Data.php
:/** * get Mini cart block class * * @return string */ public function getMiniCartClass() { if (!isset($this->_cache['mini_cart_class'])) { $minicartSelect = ''; if ($minicartBlock = Mage::app()->getLayout()->getBlock('cart_sidebar')) { $xmlMinicart = simplexml_load_string($this->toXMLElement($minicartBlock->toHtml())); $attributes = $xmlMinicart->attributes(); if ($id = (string)$attributes->id) { $minicartSelect = "#$id"; } elseif ($class = (string)$attributes->class) { $minicartSelect = '[class="' . $class . '"]'; } } $this->_cache['mini_cart_class'] = $minicartSelect; } return $this->_cache['mini_cart_class']; }
Looking more closely at the
getMiniCartClass()
function we see:$xmlMinicart = simplexml_load_string($this->toXMLElement($minicartBlock->toHtml())); $attributes = $xmlMinicart->attributes();
At this point in the code, the value of
$minicartBlock
is already a hole-punched ESI block, so the functiontoHtml()
will return something like<esi:include …>
which will not be understood by thetoXMLElement()
function. - From your browser, append
?LITEMAGE_DEBUG=NOCACHE
to the current URL so you can see the original page without LiteMage.
Check the HTML source window by right clicking on the page and selecting something like View Page Source. Leave this window open.
Now modify the previously mentionedgetMiniCartClass()
function inMagestore/Ajaxcart/Helper/Data.php
, replacing$this->_cache['mini_cart_class'] = $minicartSelect;
with code containing a marker like
$this->_cache['mini_cart_class'] = 'LMDD_' .$minicartSelect . '_LMDD';
Open another browser window and view the same URL as before. Once again look at the source code for this page but this time search for our marker
LMDD_
.
You should find something likeLMDD_[class="login_scroll"]_LMDD
Check a few more URLs with
?LITEMAGE_DEBUG=NOCACHE
to confirm that you always get this same string.
Now we can go back and modify thegetMiniCartClass()
function again, this time commenting out the original logic and putting in the value directly.public function getMiniCartClass() { if (!isset($this->_cache['mini_cart_class'])) { /* $minicartSelect = ''; // this will not work with LiteMage if ($minicartBlock = Mage::app()->getLayout()->getBlock('cart_sidebar')) { $xmlMinicart = simplexml_load_string($this->toXMLElement($minicartBlock->toHtml())); $attributes = $xmlMinicart->attributes(); if ($id = (string)$attributes->id) { $minicartSelect = "#$id"; } elseif ($class = (string)$attributes->class) { $minicartSelect = '[class="' . $class . '"]'; } } */ $minicartSelect = '[class="login_scroll"]'; $this->_cache['mini_cart_class'] = $minicartSelect; } return $this->_cache['mini_cart_class']; }
- Now from your browser, view the original URL without
?LITEMAGE_DEBUG=NOCACHE
. The page should now be displaying correctly. - Perform any final testing and disable the debug log when done.
Note: Enabling mini compare will cause a similar problem and break ESI. You can fix this by following the same steps as above to modify public function getMiniCompareClass()
.