ajax_products - Version 1.0.0

Version Notes

Load Ajax Products in the category pages

Download this release

Release Info

Developer Mohammed Meabed
Extension ajax_products
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/community/Web/AjaxProducts/Block/Js.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Web_AjaxProducts_Block_Js extends Mage_Core_Block_Template
3
+ {
4
+ public function getLoadedProductCollection()
5
+ {
6
+ $block = Mage::getBlockSingleton('catalog/product_list');
7
+ return $block->getLoadedProductCollection();
8
+ }
9
+ }
app/code/community/Web/AjaxProducts/Helper/Data.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Web_AjaxProducts_Helper_Data extends Mage_Core_Helper_Abstract {
3
+ public function isEnabled()
4
+ {
5
+ return Mage::getStoreConfig('catalog/ajax_products/enabled');
6
+ }
7
+ public function getProductsPerRequest()
8
+ {
9
+ $value = abs(Mage::getStoreConfig('catalog/ajax_products/products_in_request'));
10
+ if($value == 0){$value = 6;}
11
+ return $value;
12
+ }
13
+ public function getRequestOffset()
14
+ {
15
+ $value = Mage::getStoreConfig('catalog/ajax_products/request_offset');
16
+ if($value < 10 ){$value = 10;}
17
+ return $value;
18
+ }
19
+ public function getToolbarBlock()
20
+ {
21
+ return Mage::getBlockSingleton('catalog/product_list_toolbar');
22
+ }
23
+
24
+ public function getAllIdsSelect($collection,$limit = null, $offset = null)
25
+ {
26
+ $idsSelect = clone $collection->getSelect();
27
+ //$idsSelect->reset(Zend_Db_Select::ORDER);
28
+ //$idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
29
+ //$idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
30
+ //$idsSelect->reset(Zend_Db_Select::COLUMNS);
31
+ $idsSelect->columns('e.' . $collection->getEntity()->getIdFieldName());
32
+ $idsSelect->limit($limit, $offset);
33
+ return $idsSelect;
34
+ }
35
+ public function getAllIds($collection,$limit = null, $offset = null)
36
+ {
37
+ return $collection->getConnection()->fetchCol($this->getAllIdsSelect($collection,$limit, $offset), array());
38
+ }
39
+ public function getAjaxIds($collection)
40
+ {
41
+
42
+ /* @var $ajaxCollection Mage_Catalog_Model_Resource_Product_Collection */
43
+
44
+ $ajaxCollection = clone $collection;
45
+ $toolbar = $this->getToolbarBlock();
46
+
47
+ //$ajaxCollection->setCurPage($toolbar->getCurrentPage());
48
+
49
+ $limit = (int)$toolbar->getLimit();
50
+ $offset = $toolbar->getCurrentPage() * $limit;
51
+
52
+ if ($toolbar->getCurrentOrder()) {
53
+ $ajaxCollection->setOrder($toolbar->getCurrentOrder(), $toolbar->getCurrentDirection());
54
+ }
55
+ return $this->getAllIds($ajaxCollection,10000,$offset);
56
+ }
57
+ }
app/code/community/Web/AjaxProducts/controllers/IndexController.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Web_AjaxProducts_IndexController extends Mage_Core_Controller_Front_Action
3
+ {
4
+ public function indexAction()
5
+ {
6
+ $_helper = Mage::helper('web_ajaxproducts');
7
+ if (!$_helper->isEnabled()) {
8
+ return;
9
+ }
10
+ if (!$this->getRequest()->isXmlHttpRequest()) {
11
+ return;
12
+ }
13
+ $this->getResponse()->clearAllHeaders();
14
+ $ids = $this->getRequest()->getPost('ids');
15
+ if ($ids) {
16
+ $ids = explode(',', $ids);
17
+ }
18
+ if (!is_array($ids) || (count($ids) > $_helper->getProductsPerRequest()) || count($ids) < 1) {
19
+ return;
20
+ }
21
+ $toolbar = Mage::getBlockSingleton('catalog/product_list_toolbar');
22
+ $block = $this->getLayout()->createBlock('catalog/product_list', 'products_' . md5(join(',', $ids)))
23
+ ->setTemplate('catalog/product/list_ajax.phtml')
24
+ ->setMode($toolbar->getCurrentMode())
25
+ ->setIds($ids);
26
+ echo $block->toHtml();
27
+ }
28
+ }
app/code/community/Web/AjaxProducts/etc/config.xml ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Web_AjaxProducts>
5
+ <version>1.0.0</version>
6
+ </Web_AjaxProducts>
7
+ </modules>
8
+ <frontend>
9
+ <routers>
10
+ <ajax_products>
11
+ <use>standard</use>
12
+ <args>
13
+ <module>Web_AjaxProducts</module>
14
+ <frontName>ajax_product</frontName>
15
+ </args>
16
+ </ajax_products>
17
+ </routers>
18
+ <layout>
19
+ <updates>
20
+ <web_ajaxproducts>
21
+ <file>ajaxproducts.xml</file>
22
+ </web_ajaxproducts>
23
+ </updates>
24
+ </layout>
25
+ </frontend>
26
+ <global>
27
+ <models>
28
+ <web_ajaxproducts>
29
+ <class>Web_AjaxProducts_Model</class>
30
+ </web_ajaxproducts>
31
+ </models>
32
+ <blocks>
33
+ <web_ajaxproducts>
34
+ <class>Web_AjaxProducts_Block</class>
35
+ </web_ajaxproducts>
36
+ </blocks>
37
+ <helpers>
38
+ <web_ajaxproducts>
39
+ <class>Web_AjaxProducts_Helper</class>
40
+ </web_ajaxproducts>
41
+ </helpers>
42
+ <resources>
43
+ <web_ajaxproducts_setup>
44
+ <setup>
45
+ <module>Web_AjaxProducts</module>
46
+ </setup>
47
+ </web_ajaxproducts_setup>
48
+ </resources>
49
+ </global>
50
+ <default>
51
+ <catalog>
52
+ <ajax_products>
53
+ <enabled>1</enabled>
54
+ <products_in_request>6</products_in_request>
55
+ <request_offset>300</request_offset>
56
+ </ajax_products>
57
+ </catalog>
58
+ </default>
59
+ </config>
app/code/community/Web/AjaxProducts/etc/system.xml ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <sections>
4
+ <catalog>
5
+ <groups>
6
+ <ajax_products translate="label">
7
+ <label>Ajax Product</label>
8
+ <frontend_type>text</frontend_type>
9
+ <sort_order>1000</sort_order>
10
+ <show_in_default>1</show_in_default>
11
+ <show_in_website>1</show_in_website>
12
+ <show_in_store>1</show_in_store>
13
+ <fields>
14
+ <enabled translate="label">
15
+ <label>Enable Ajax Product List</label>
16
+ <frontend_type>select</frontend_type>
17
+ <source_model>adminhtml/system_config_source_yesno</source_model>
18
+ <sort_order>10</sort_order>
19
+ <show_in_default>1</show_in_default>
20
+ <show_in_website>1</show_in_website>
21
+ <show_in_store>1</show_in_store>
22
+ </enabled>
23
+ <products_in_request translate="label comment">
24
+ <label>Products per Ajax Request</label>
25
+ <comment>The higher value you assign the more load time for the request. (6 to 12 is good number) </comment>
26
+ <frontend_type>text</frontend_type>
27
+ <sort_order>15</sort_order>
28
+ <show_in_default>1</show_in_default>
29
+ <show_in_website>1</show_in_website>
30
+ <show_in_store>1</show_in_store>
31
+ </products_in_request>
32
+ <request_offset translate="label comment">
33
+ <label>Ajax Request Offset</label>
34
+ <comment>The offset from the bottom (in pixels) of the page to Fire the ajax request (the height before the user reach the footer of the page) must be above 10 (pixel) ( it depends on the design ) </comment>
35
+ <frontend_type>text</frontend_type>
36
+ <sort_order>20</sort_order>
37
+ <show_in_default>1</show_in_default>
38
+ <show_in_website>1</show_in_website>
39
+ <show_in_store>1</show_in_store>
40
+ </request_offset>
41
+ </fields>
42
+ </ajax_products>
43
+ </groups>
44
+ </catalog>
45
+ </sections>
46
+ </config>
app/code/community/Web/AjaxProducts/sql/web_ajaxproducts_setup/mysql4-install-1.0.0.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by Mohammed Meabed
4
+ * Date: 9/3/13
5
+ * Time: 12:54 PM
6
+ */
7
+ /* @var $installer Mage_Core_Model_Resource_Setup */
8
+ $installer = $this;
9
+
10
+ $installer->startSetup();
11
+
12
+
13
+
14
+ $installer->endSetup();
app/design/frontend/default/default/layout/ajaxproducts.xml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <layout version="0.1.0">
2
+ <default>
3
+ <reference name="content">
4
+ <block type="web_ajaxproducts/js" after="category.products" name="ajax.products,js" template="extra/js.phtml"></block>
5
+ </reference>
6
+ </default>
7
+ </layout>
app/design/frontend/default/default/template/catalog/product/list_ajax.phtml ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $_productIds = $this->getIds();
3
+ $_helper = $this->helper('catalog/output');
4
+ ?>
5
+ <?php // List mode ?>
6
+ <?php if ($this->getMode() != 'grid'): ?>
7
+ <?php $_iterator = 0; ?>
8
+ <ol class="products-list" id="products-list">
9
+ <?php foreach ($_productIds as $_productId):
10
+ $_product = Mage::getModel('catalog/product')->load($_productId);?>
11
+ <li class="item<?php if (++$_iterator == sizeof($_productIds)): ?> last<?php endif; ?>">
12
+ <?php // Product Image ?>
13
+ <a href="<?php echo $_product->getProductUrl() ?>"
14
+ title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img
15
+ src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(135); ?>" width="135" height="135"
16
+ alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>"/></a>
17
+ <?php // Product description ?>
18
+ <div class="product-shop">
19
+ <div class="f-fix">
20
+ <?php $_productNameStripped = $this->stripTags($_product->getName(), null, true); ?>
21
+ <h2 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>"
22
+ title="<?php echo $_productNameStripped; ?>"><?php echo $_helper->productAttribute(
23
+ $_product, $_product->getName(), 'name'
24
+ ); ?></a></h2>
25
+ <?php if ($_product->getRatingSummary()): ?>
26
+ <?php echo $this->getReviewsSummaryHtml($_product) ?>
27
+ <?php endif; ?>
28
+ <?php echo $this->getPriceHtml($_product, true) ?>
29
+ <?php if ($_product->isSaleable()): ?>
30
+ <p>
31
+ <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart"
32
+ onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__(
33
+ 'Add to Cart'
34
+ ) ?></span></span></button>
35
+ </p>
36
+ <?php else: ?>
37
+ <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
38
+ <?php endif; ?>
39
+ <div class="desc std">
40
+ <?php echo $_helper->productAttribute($_product, $_product->getShortDescription(), 'short_description') ?>
41
+ <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $_productNameStripped ?>"
42
+ class="link-learn"><?php echo $this->__('Learn More') ?></a>
43
+ </div>
44
+ <ul class="add-to-links">
45
+ <?php if ($this->helper('wishlist')->isAllow()) : ?>
46
+ <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__(
47
+ 'Add to Wishlist'
48
+ ) ?></a></li>
49
+ <?php endif; ?>
50
+ <?php if ($_compareUrl = $this->getAddToCompareUrl($_product)): ?>
51
+ <li><span class="separator">|</span> <a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__(
52
+ 'Add to Compare'
53
+ ) ?></a></li>
54
+ <?php endif; ?>
55
+ </ul>
56
+ </div>
57
+ </div>
58
+ </li>
59
+ <?php endforeach; ?>
60
+ </ol>
61
+ <script type="text/javascript">decorateList('products-list', 'none-recursive')</script>
62
+
63
+ <?php else: ?>
64
+
65
+ <?php // Grid Mode ?>
66
+
67
+ <?php $_collectionSize = count($_productIds); ?>
68
+ <?php $_columnCount = $this->getColumnCount(); ?>
69
+ <?php $i = 0;
70
+ foreach ($_productIds as $_productId):
71
+ $_product = Mage::getModel('catalog/product')->load($_productId);?>
72
+ <?php if ($i++ % $_columnCount == 0): ?>
73
+ <ul class="products-grid">
74
+ <?php endif ?>
75
+ <li class="item<?php if (($i - 1) % $_columnCount == 0): ?> first<?php elseif ($i % $_columnCount == 0): ?> last<?php endif; ?>">
76
+ <a href="<?php echo $_product->getProductUrl() ?>"
77
+ title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img
78
+ src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(135); ?>" width="135" height="135"
79
+ alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>"/></a>
80
+
81
+ <h2 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>"
82
+ title="<?php echo $this->stripTags($_product->getName(), null, true) ?>"><?php echo $_helper->productAttribute(
83
+ $_product, $_product->getName(), 'name'
84
+ );echo $_product->getId(); ?></a></h2>
85
+ <?php if ($_product->getRatingSummary()): ?>
86
+ <?php echo $this->getReviewsSummaryHtml($_product, 'short') ?>
87
+ <?php endif; ?>
88
+ <?php echo $this->getPriceHtml($_product, true) ?>
89
+ <div class="actions">
90
+ <?php if ($_product->isSaleable()): ?>
91
+ <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart"
92
+ onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__(
93
+ 'Add to Cart'
94
+ ) ?></span></span></button>
95
+ <?php else: ?>
96
+ <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
97
+ <?php endif; ?>
98
+ <ul class="add-to-links">
99
+ <?php if ($this->helper('wishlist')->isAllow()) : ?>
100
+ <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__(
101
+ 'Add to Wishlist'
102
+ ) ?></a></li>
103
+ <?php endif; ?>
104
+ <?php if ($_compareUrl = $this->getAddToCompareUrl($_product)): ?>
105
+ <li><span class="separator">|</span> <a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__(
106
+ 'Add to Compare'
107
+ ) ?></a></li>
108
+ <?php endif; ?>
109
+ </ul>
110
+ </div>
111
+ </li>
112
+ <?php if ($i % $_columnCount == 0 || $i == $_collectionSize): ?>
113
+ </ul>
114
+ <?php endif ?>
115
+ <?php endforeach ?>
116
+ <script type="text/javascript">decorateGeneric($$('ul.products-grid'), ['odd', 'even', 'first', 'last'])</script>
117
+ <?php endif; ?>
app/design/frontend/default/default/template/extra/js.phtml ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $_helper = Mage::helper('web_ajaxproducts');
3
+ if ($_helper->isEnabled()):
4
+ $_productCollection = $this->getLoadedProductCollection();
5
+ $ids = $_helper->getAjaxIds($_productCollection);?>
6
+ <div class="load-more-products"
7
+ style="display: none; font-weight: bold; padding: 6px; text-align: center; color: rgb(59, 89, 152); border: 1px solid;"><?php echo $this->__(
8
+ 'Loading more products'
9
+ ); ?></div>
10
+ <script type="text/javascript">
11
+ Array.prototype.chunk = function (chunkSize) {
12
+ var array = this;
13
+ return [].concat.apply([],
14
+ array.map(function (elem, i) {
15
+ return i % chunkSize ? [] : [array.slice(i, i + chunkSize)];
16
+ })
17
+ );
18
+ }
19
+ var pIds = <?php echo Zend_Json::encode($ids);?>;
20
+ var RequestOffset = <?php echo $_helper->getRequestOffset();?>;
21
+ var isRequest = false;
22
+ var endProducts = false;
23
+ var currentPage = 0;
24
+ var RequestLimit = <?php echo $_helper->getProductsPerRequest();?>;
25
+
26
+ function getMoreProducts() {
27
+ var y = (document.all) ? document.body.scrollTop : window.pageYOffset;
28
+ var max = window.scrollMaxY ||
29
+ (document.body.scrollHeight - document.body.clientHeight);
30
+ loadMoreSelector = '.load-more-products';
31
+ pidsArray = pIds.chunk(RequestLimit);
32
+ if ((max - y) < RequestOffset) {
33
+ if (isRequest || endProducts) {
34
+ return;
35
+ }
36
+ if (typeof pidsArray[currentPage] == 'undefined') {
37
+ endProducts = true;
38
+ return;
39
+ }
40
+ isRequest = true;
41
+ $$(loadMoreSelector).first().show();
42
+ idParam = pidsArray[currentPage].toString();
43
+ new Ajax.Request('<?php echo $this->getUrl('ajax_product/index/index')?>', {
44
+ method: 'post',
45
+ parameters: {ids: idParam },
46
+ onSuccess: function (transport) {
47
+ var response = transport.responseText || "";
48
+ //$$('.load-products')[0].hide();
49
+ $$(loadMoreSelector).first().hide();
50
+ if ($$('.products-list').first() != undefined) {
51
+ $$('.products-list').first().down('.item:last').insert({after: response});
52
+ } else {
53
+ $$('.category-products').first().down('.products-grid:last').insert({after: response});
54
+ }
55
+ currentPage++;
56
+ isRequest = false;
57
+ },
58
+ onFailure: function () {
59
+ isRequest = true;
60
+ alert('Something went wrong, please refresh the page and try again.');
61
+ }
62
+ });
63
+ }
64
+ }
65
+ setInterval(getMoreProducts, 250);
66
+ </script>
67
+ <?php endif; ?>
app/etc/modules/Web_AjaxProducts.xml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Web_AjaxProducts>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ <depends>
8
+ <Mage_Bundle/>
9
+ <Mage_Catalog/>
10
+ <Mage_CatalogInventory/>
11
+ <Mage_CatalogSearch/>
12
+
13
+ </depends>
14
+ </Web_AjaxProducts>
15
+ </modules>
16
+ </config>
package.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>ajax_products</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.gnu.org/licenses/lgpl.html">LGPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Load Ajax Products in the category pages </summary>
10
+ <description>Load Ajax Products in the category pages </description>
11
+ <notes>Load Ajax Products in the category pages&#xD;
12
+ </notes>
13
+ <authors><author><name>Mohammed Meabed</name><user>meabed</user><email>mo.meabed@gmail.com</email></author></authors>
14
+ <date>2013-09-04</date>
15
+ <time>08:39:46</time>
16
+ <contents><target name="magecommunity"><dir name="Web"><dir name="AjaxProducts"><dir name="Block"><file name="Js.php" hash="59a8076432ea7227085170d1af81de60"/></dir><dir name="Helper"><file name="Data.php" hash="b38bab8518e794716bbff2b1999503c2"/></dir><dir name="controllers"><file name="IndexController.php" hash="fcfee0a719ca2bd2fadf9a8fa6652257"/></dir><dir name="etc"><file name="config.xml" hash="f3f8bb15534a9297d1fac8fc80d26363"/><file name="system.xml" hash="9bc59dd30d05cac4d6c181910a14fc14"/></dir><dir name="sql"><dir name="web_ajaxproducts_setup"><file name="mysql4-install-1.0.0.php" hash="ced8cdf1ae54dd079badea01c520d6ef"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="ajaxproducts.xml" hash="04399975d8172e481722b989b8dba201"/></dir><dir name="template"><dir name="extra"><file name="js.phtml" hash="584741370ee35004bccf57fbfc0eb4ee"/></dir><dir name="catalog"><dir name="product"><file name="list_ajax.phtml" hash="4fd04ae7bde2e16d1eb7d9172e2cfb84"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Web_AjaxProducts.xml" hash="19d046a996eaee43c2504419fc329ce7"/></dir></target></contents>
17
+ <compatible/>
18
+ <dependencies><required><php><min>5.1.1</min><max>6.0.0</max></php></required></dependencies>
19
+ </package>