Rees46_Personalization - Version 4.0.0

Version Notes

Used JS SDK III

Download this release

Release Info

Developer REES46
Extension Rees46_Personalization
Version 4.0.0
Comparing to
See all releases


Code changes from version 3.3.7 to 4.0.0

Files changed (23) hide show
  1. app/code/community/Rees46/Personalization/Helper/Admin.php +17 -19
  2. app/code/community/Rees46/Personalization/Helper/Data.php +55 -79
  3. app/code/community/Rees46/Personalization/Helper/Event.php +45 -53
  4. app/code/community/Rees46/Personalization/Model/Observer.php +101 -111
  5. app/code/community/Rees46/Personalization/controllers/Adminhtml/PersonalizationController.php +55 -58
  6. app/code/community/Rees46/Personalization/controllers/BlockController.php +91 -90
  7. app/code/community/Rees46/Personalization/etc/adminhtml.xml +40 -43
  8. app/code/community/Rees46/Personalization/etc/config.xml +6 -3
  9. app/code/community/Rees46/Personalization/etc/system.xml +59 -71
  10. app/design/adminhtml/default/default/layout/rees46_personalization.xml +9 -39
  11. app/design/adminhtml/default/default/template/rees46/personalization/index.phtml +26 -20
  12. app/design/frontend/base/default/layout/rees46_personalization.xml +6 -40
  13. app/design/frontend/base/default/template/rees46/personalization/blocks/cart.phtml +0 -3
  14. app/design/frontend/base/default/template/rees46/personalization/blocks/category.phtml +0 -4
  15. app/design/frontend/base/default/template/rees46/personalization/blocks/category_popular.phtml +0 -3
  16. app/design/frontend/base/default/template/rees46/personalization/blocks/home.phtml +0 -5
  17. app/design/frontend/base/default/template/rees46/personalization/blocks/product.phtml +0 -5
  18. app/design/frontend/base/default/template/rees46/personalization/css.phtml +0 -3
  19. app/design/frontend/base/default/template/rees46/personalization/init.phtml +136 -155
  20. app/etc/modules/Rees46_Personalization.xml +1 -3
  21. app/locale/en_US/Rees46_Personalization.csv +10 -8
  22. app/locale/ru_RU/Rees46_Personalization.csv +7 -5
  23. package.xml +17 -62
app/code/community/Rees46/Personalization/Helper/Admin.php CHANGED
@@ -1,19 +1,17 @@
1
- <?php
2
- /**
3
- * Personalizaton Admin helper
4
- *
5
- * @author Magento
6
- */
7
- class Rees46_Personalization_Helper_Admin extends Mage_Core_Helper_Abstract
8
- {
9
- /**
10
- * Check permission for passed action
11
- *
12
- * @param string $action
13
- * @return bool
14
- */
15
- public function isActionAllowed($action)
16
- {
17
- return Mage::getSingleton('admin/session')->isAllowed('personalization/manage/' . $action);
18
- }
19
- }
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_Helper_Admin extends Mage_Core_Helper_Abstract
6
+ {
7
+ /**
8
+ * Check permission for passed action
9
+ *
10
+ * @param string $action
11
+ * @return bool
12
+ */
13
+ public function isActionAllowed($action)
14
+ {
15
+ return Mage::getSingleton('admin/session')->isAllowed('personalization/manage/' . $action);
16
+ }
17
+ }
 
 
app/code/community/Rees46/Personalization/Helper/Data.php CHANGED
@@ -1,79 +1,55 @@
1
- <?php
2
- /**
3
- * Personalization Data helper
4
- *
5
- * @author REES46
6
- */
7
- class Rees46_Personalization_Helper_Data extends Mage_Core_Helper_Data
8
- {
9
- /**
10
- * Path to store config if front-end output is enabled
11
- *
12
- * @var string
13
- */
14
- const XML_PATH_ENABLED = 'personalization/view/enabled';
15
-
16
-
17
- /**
18
- * REES46 API Key
19
- * @var string
20
- */
21
- const XML_PATH_API_KEY = 'personalization/view/api_key';
22
-
23
- /**
24
- * REES46 Secret Key
25
- * @var string
26
- */
27
- const XML_PATH_SECRET_KEY = 'personalization/view/secret_key';
28
-
29
- /**
30
- * REES46 Expert Mode Flag
31
- * @var boolean
32
- */
33
- const XML_PATH_EXPERT_MODE = 'personalization/view/expert_mode';
34
-
35
-
36
- /**
37
- * Checks whether news can be displayed in the frontend
38
- *
39
- * @param integer|string|Mage_Core_Model_Store $store
40
- * @return boolean
41
- */
42
- public function isEnabled($store = null)
43
- {
44
- return Mage::getStoreConfigFlag(self::XML_PATH_ENABLED, $store);
45
- }
46
-
47
- /**
48
- * Return REES46 API Key
49
- * @param integer|string|Mage_Core_Model_Store $store
50
- * @return string
51
- */
52
- public function getAPIKey($store = null) {
53
- $api_key = Mage::getStoreConfig(self::XML_PATH_API_KEY, $store);
54
- return $api_key ? $api_key : false;
55
- }
56
-
57
-
58
- /**
59
- * Returns ids array of products in customer's cart
60
- * @return array
61
- */
62
- public function getCartProductIds() {
63
- $cart = Mage::getModel('checkout/cart')->getQuote();
64
- return array_map(function($element){ return $element->getProductId(); }, $cart->getAllItems());
65
- }
66
-
67
- /**
68
- * Checks whether module works in expert mode
69
- *
70
- * @param integer|string|Mage_Core_Model_Store $store
71
- * @return boolean
72
- */
73
- public function isExpertMode($store = null)
74
- {
75
- return Mage::getStoreConfigFlag(self::XML_PATH_EXPERT_MODE, $store);
76
- }
77
-
78
- }
79
-
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_Helper_Data extends Mage_Core_Helper_Data
6
+ {
7
+ /**
8
+ * Path to store config if front-end output is enabled
9
+ *
10
+ * @var string
11
+ */
12
+ const XML_PATH_ENABLED = 'personalization/view/enabled';
13
+
14
+ /**
15
+ * REES46 API Key
16
+ * @var string
17
+ */
18
+ const XML_PATH_API_KEY = 'personalization/view/api_key';
19
+
20
+ /**
21
+ * REES46 Secret Key
22
+ * @var string
23
+ */
24
+ const XML_PATH_SECRET_KEY = 'personalization/view/secret_key';
25
+
26
+ /**
27
+ * Checks whether news can be displayed in the frontend
28
+ *
29
+ * @param integer|string|Mage_Core_Model_Store $store
30
+ * @return boolean
31
+ */
32
+ public function isEnabled($store = null)
33
+ {
34
+ return Mage::getStoreConfigFlag(self::XML_PATH_ENABLED, $store);
35
+ }
36
+
37
+ /**
38
+ * Return REES46 API Key
39
+ * @param integer|string|Mage_Core_Model_Store $store
40
+ * @return string
41
+ */
42
+ public function getAPIKey($store = null) {
43
+ $api_key = Mage::getStoreConfig(self::XML_PATH_API_KEY, $store);
44
+ return $api_key ? $api_key : false;
45
+ }
46
+
47
+ /**
48
+ * Returns ids array of products in customer's cart
49
+ * @return array
50
+ */
51
+ public function getCartProductIds() {
52
+ $cart = Mage::getModel('checkout/cart')->getQuote();
53
+ return array_map(function($element){ return $element->getProductId(); }, $cart->getAllItems());
54
+ }
55
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/Rees46/Personalization/Helper/Event.php CHANGED
@@ -1,53 +1,45 @@
1
- <?php
2
- /**
3
- * News Image Helper
4
- *
5
- * @author Magento
6
- */
7
- class Rees46_Personalization_Helper_Event extends Mage_Core_Helper_Abstract
8
- {
9
-
10
- const REES46_SESSION_KEY_IDENTIFIER = 'rees46_events';
11
-
12
- /**
13
- * Collect event's data to buffer for future rendering in template
14
- * @param $name
15
- * @param $data
16
- */
17
- public function pushEvent($name, $data) {
18
- $events = $this->getEventsQueue();
19
- array_push($events, array(
20
- 'name' => $name,
21
- 'data' => $data
22
- ));
23
- Mage::getSingleton('core/session')->setData(self::REES46_SESSION_KEY_IDENTIFIER, $events);
24
- }
25
-
26
-
27
- /**
28
- * Return array of REES46 events storage
29
- * @param bool $and_clear_queue Clear events if set to true
30
- * @return array
31
- */
32
- public function getEventsQueue($and_clear_queue = false) {
33
- $events = Mage::getSingleton('core/session')->getData(self::REES46_SESSION_KEY_IDENTIFIER);
34
- if(!is_array($events)) {
35
- $events = array();
36
- }
37
- if($and_clear_queue) {
38
- $this->clearEventsQueue();
39
- }
40
- return $events;
41
- }
42
-
43
-
44
- /**
45
- * Clear REES46 events storage
46
- */
47
- public function clearEventsQueue() {
48
- Mage::getSingleton('core/session')->unsetData(self::REES46_SESSION_KEY_IDENTIFIER);
49
- }
50
-
51
-
52
-
53
- }
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_Helper_Event extends Mage_Core_Helper_Abstract
6
+ {
7
+ const REES46_SESSION_KEY_IDENTIFIER = 'rees46_events';
8
+
9
+ /**
10
+ * Collect event's data to buffer for future rendering in template
11
+ * @param $name
12
+ * @param $data
13
+ */
14
+ public function pushEvent($name, $data) {
15
+ $events = $this->getEventsQueue();
16
+ array_push($events, array(
17
+ 'name' => $name,
18
+ 'data' => $data
19
+ ));
20
+ Mage::getSingleton('core/session')->setData(self::REES46_SESSION_KEY_IDENTIFIER, $events);
21
+ }
22
+
23
+ /**
24
+ * Return array of REES46 events storage
25
+ * @param bool $and_clear_queue Clear events if set to true
26
+ * @return array
27
+ */
28
+ public function getEventsQueue($and_clear_queue = false) {
29
+ $events = Mage::getSingleton('core/session')->getData(self::REES46_SESSION_KEY_IDENTIFIER);
30
+ if(!is_array($events)) {
31
+ $events = array();
32
+ }
33
+ if($and_clear_queue) {
34
+ $this->clearEventsQueue();
35
+ }
36
+ return $events;
37
+ }
38
+
39
+ /**
40
+ * Clear REES46 events storage
41
+ */
42
+ public function clearEventsQueue() {
43
+ Mage::getSingleton('core/session')->unsetData(self::REES46_SESSION_KEY_IDENTIFIER);
44
+ }
45
+ }
 
 
 
 
 
 
 
 
app/code/community/Rees46/Personalization/Model/Observer.php CHANGED
@@ -1,111 +1,101 @@
1
- <?php
2
- /**
3
- * Personalizatoin module observer
4
- *
5
- * @author Magento
6
- */
7
- class Rees46_Personalization_Model_Observer
8
- {
9
- /**
10
- * Event after show product.
11
- * Used to track product views
12
- *
13
- * @param Varien_Event_Observer $observer
14
- */
15
- public function productViewed(Varien_Event_Observer $observer)
16
- {
17
- $product = $observer->getEvent()->getData('product');
18
- if(!is_null($product)) {
19
- $product_data = $this->_prepareCommonProductInfo($product);
20
- Mage::helper('rees46_personalization/event')->pushEvent('view', $product_data);
21
- }
22
- }
23
-
24
-
25
- /**
26
- * Event after product added to cart.
27
- * Used to track product carts
28
- *
29
- * @param Varien_Event_Observer $observer
30
- */
31
- public function productAddedToCart(Varien_Event_Observer $observer)
32
- {
33
- $product = $observer->getEvent()->getData('product');
34
- if(!is_null($product)) {
35
- $product_data = $this->_prepareCommonProductInfo($product);
36
- Mage::helper('rees46_personalization/event')->pushEvent('cart', $product_data);
37
- }
38
- }
39
-
40
-
41
- /**
42
- * Event after product removed from cart.
43
- * Used to track product carts
44
- *
45
- * @param Varien_Event_Observer $observer
46
- */
47
- public function productRemovedFromCart(Varien_Event_Observer $observer)
48
- {
49
- $product = $observer->getEvent()->getQuoteItem()->getProduct();
50
- if(!is_null($product)) {
51
- $product_data = $this->_prepareCommonProductInfo($product);
52
- Mage::helper('rees46_personalization/event')->pushEvent('remove_from_cart', $product_data);
53
- }
54
- }
55
-
56
- /**
57
- * Event after order created.
58
- *
59
- * @param Varien_Event_Observer $observer
60
- */
61
- public function purchaseHappened(Varien_Event_Observer $observer)
62
- {
63
- $order = $observer->getEvent()->getOrder();
64
- if(!is_null($order)) {
65
- $order_data = array(
66
- 'order_id' => $order->getIncrementId(),
67
- 'products' => array()
68
- );
69
- $items = $order->getItemsCollection();
70
- foreach($items as $item) {
71
- $product = $item->getProduct();
72
- $product_data = $this->_prepareCommonProductInfo($product);
73
- $product_data['amount'] = $item->getQtyToShip();
74
- $order_data['products'][] = $product_data;
75
- }
76
- Mage::helper('rees46_personalization/event')->pushEvent('purchase', $order_data);
77
- }
78
- }
79
-
80
-
81
-
82
-
83
-
84
- /**
85
- * Prepare base array of data about product for tracking
86
- * @param Mage_Catalog_Model_Product $product
87
- * @return array
88
- */
89
- private function _prepareCommonProductInfo(Mage_Catalog_Model_Product $product) {
90
- $images = $product->getMediaGalleryImages();
91
- if($images && $images->count() > 0) {
92
- $image = $images->getFirstItem()->getUrl();
93
- } else {
94
- $image = null;
95
- }
96
- return array(
97
- 'item_id' => $product->getId(),
98
- 'name' => $product->getName(),
99
- 'description' => $product->getDescription(),
100
- 'categories' => $product->getCategoryIds(),
101
- 'price' => $product->getSpecialPrice() ? $product->getSpecialPrice() : $product->getPrice(),
102
- 'is_available' => $product->isAvailable(),
103
- 'locations' => null,
104
- 'url' => null,
105
- 'image_url' => $image,
106
- 'tags' => null,
107
- /* @todo: do not forgot processing of recommender */
108
- 'recommended_by' => null
109
- );
110
- }
111
- }
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_Model_Observer
6
+ {
7
+ /**
8
+ * Event after show product.
9
+ * Used to track product views
10
+ *
11
+ * @param Varien_Event_Observer $observer
12
+ */
13
+ public function productViewed(Varien_Event_Observer $observer)
14
+ {
15
+ $product = $observer->getEvent()->getData('product');
16
+ if(!is_null($product)) {
17
+ $product_data = $this->_prepareCommonProductInfo($product);
18
+ Mage::helper('rees46_personalization/event')->pushEvent('view', $product_data);
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Event after product added to cart.
24
+ * Used to track product carts
25
+ *
26
+ * @param Varien_Event_Observer $observer
27
+ */
28
+ public function productAddedToCart(Varien_Event_Observer $observer)
29
+ {
30
+ $product = $observer->getEvent()->getData('product');
31
+ if(!is_null($product)) {
32
+ $product_data = $this->_prepareCommonProductInfo($product);
33
+ Mage::helper('rees46_personalization/event')->pushEvent('cart', $product_data);
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Event after product removed from cart.
39
+ * Used to track product carts
40
+ *
41
+ * @param Varien_Event_Observer $observer
42
+ */
43
+ public function productRemovedFromCart(Varien_Event_Observer $observer)
44
+ {
45
+ $product = $observer->getEvent()->getQuoteItem()->getProduct();
46
+ if(!is_null($product)) {
47
+ $product_data = $this->_prepareCommonProductInfo($product);
48
+ Mage::helper('rees46_personalization/event')->pushEvent('remove_from_cart', $product_data);
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Event after order created.
54
+ *
55
+ * @param Varien_Event_Observer $observer
56
+ */
57
+ public function purchaseHappened(Varien_Event_Observer $observer)
58
+ {
59
+ $order = $observer->getEvent()->getOrder();
60
+ if(!is_null($order)) {
61
+ $order_data = array(
62
+ 'order_id' => $order->getIncrementId(),
63
+ 'order_price' => $order->getBaseGrandTotal(),
64
+ 'products' => array()
65
+ );
66
+ $items = $order->getItemsCollection();
67
+ foreach($items as $item) {
68
+ $product = $item->getProduct();
69
+ $product_data = $this->_prepareCommonProductInfo($product);
70
+ $product_data['amount'] = $item->getQtyToShip();
71
+ $order_data['products'][] = $product_data;
72
+ }
73
+ Mage::helper('rees46_personalization/event')->pushEvent('purchase', $order_data);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Prepare base array of data about product for tracking
79
+ * @param Mage_Catalog_Model_Product $product
80
+ * @return array
81
+ */
82
+ private function _prepareCommonProductInfo(Mage_Catalog_Model_Product $product) {
83
+ $images = $product->getMediaGalleryImages();
84
+
85
+ if($images && $images->count() > 0) {
86
+ $image = $images->getFirstItem()->getUrl();
87
+ } else {
88
+ $image = null;
89
+ }
90
+
91
+ return array(
92
+ 'id' => $product->getId(),
93
+ 'stock' => $product->isAvailable(),
94
+ 'price' => $product->getSpecialPrice() ? $product->getSpecialPrice() : $product->getPrice(),
95
+ 'name' => $product->getName(),
96
+ 'categories' => implode(',', $product->getCategoryIds()),
97
+ 'image' => $image,
98
+ 'url' => $product->getProductUrl(false),
99
+ );
100
+ }
101
+ }
 
 
 
 
 
 
 
 
 
 
app/code/community/Rees46/Personalization/controllers/Adminhtml/PersonalizationController.php CHANGED
@@ -1,58 +1,55 @@
1
- <?php
2
- /**
3
- * Personalization Overview Controller
4
- *
5
- * @author REES46
6
- */
7
- class Rees46_Personalization_Adminhtml_PersonalizationController extends Mage_Adminhtml_Controller_Action
8
- {
9
- /**
10
- * Init actions
11
- *
12
- * @return Magentostudy_News_Adminhtml_NewsController
13
- */
14
- protected function _initAction()
15
- {
16
- /* load layout, set active menu and breadcrumbs */
17
- $this->loadLayout()
18
- ->_setActiveMenu('personalization/overview')
19
- ->_addBreadcrumb(
20
- Mage::helper('rees46_personalization')->__('Personalization'),
21
- Mage::helper('rees46_personalization')->__('Personalization')
22
- )
23
- ->_addBreadcrumb(
24
- Mage::helper('rees46_personalization')->__('Overview'),
25
- Mage::helper('rees46_personalization')->__('Overview')
26
- )
27
- ;
28
- $this->_addContent($this->getLayout()->createBlock('adminhtml/template')->setTemplate('rees46/personalization/index.phtml'));
29
- return $this;
30
- }
31
-
32
- /**
33
- * Index action
34
- */
35
- public function indexAction()
36
- {
37
- $this->_title($this->__('Personalization'))
38
- ->_title($this->__('Overview'));
39
-
40
- $this->_initAction();
41
- $this->renderLayout();
42
- }
43
-
44
- /**
45
- * Check the permission to run it
46
- *
47
- * @return boolean
48
- */
49
- protected function _isAllowed()
50
- {
51
- switch ($this->getRequest()->getActionName()) {
52
- default:
53
- return Mage::getSingleton('admin/session')->isAllowed('personalization/overview');
54
- break;
55
- }
56
- }
57
-
58
- }
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_Adminhtml_PersonalizationController extends Mage_Adminhtml_Controller_Action
6
+ {
7
+ /**
8
+ * Init actions
9
+ *
10
+ * @return Magentostudy_News_Adminhtml_NewsController
11
+ */
12
+ protected function _initAction()
13
+ {
14
+ /* load layout, set active menu and breadcrumbs */
15
+ $this->loadLayout()
16
+ ->_setActiveMenu('personalization/overview')
17
+ ->_addBreadcrumb(
18
+ Mage::helper('rees46_personalization')->__('Personalization'),
19
+ Mage::helper('rees46_personalization')->__('Personalization')
20
+ )
21
+ ->_addBreadcrumb(
22
+ Mage::helper('rees46_personalization')->__('Overview'),
23
+ Mage::helper('rees46_personalization')->__('Overview')
24
+ )
25
+ ;
26
+ $this->_addContent($this->getLayout()->createBlock('adminhtml/template')->setTemplate('rees46/personalization/index.phtml'));
27
+ return $this;
28
+ }
29
+
30
+ /**
31
+ * Index action
32
+ */
33
+ public function indexAction()
34
+ {
35
+ $this->_title($this->__('Personalization'))
36
+ ->_title($this->__('Overview'));
37
+
38
+ $this->_initAction();
39
+ $this->renderLayout();
40
+ }
41
+
42
+ /**
43
+ * Check the permission to run it
44
+ *
45
+ * @return boolean
46
+ */
47
+ protected function _isAllowed()
48
+ {
49
+ switch ($this->getRequest()->getActionName()) {
50
+ default:
51
+ return Mage::getSingleton('admin/session')->isAllowed('personalization/overview');
52
+ break;
53
+ }
54
+ }
55
+ }
 
 
 
app/code/community/Rees46/Personalization/controllers/BlockController.php CHANGED
@@ -1,90 +1,91 @@
1
- <?php
2
- /**
3
- * News frontend controller
4
- *
5
- * @author Magento
6
- */
7
- class Rees46_Personalization_BlockController extends Mage_Core_Controller_Front_Action
8
- {
9
- /**
10
- * Pre dispatch action that allows to redirect to no route page in case of disabled extension through admin panel
11
- */
12
- public function preDispatch()
13
- {
14
- parent::preDispatch();
15
-
16
- if (!Mage::helper('rees46_personalization')->isEnabled()) {
17
- $this->setFlag('', 'no-dispatch', true);
18
- $this->_redirect('noRoute');
19
- }
20
- }
21
-
22
- /**
23
- * Render recommended products as block
24
- */
25
- public function indexAction()
26
- {
27
- $this->loadLayout();
28
- $product_ids = $this->getRequest()->getParam('ids');
29
- $product_ids = explode(',', $product_ids);
30
- $recommender_type = $this->getRequest()->getParam('type');
31
- $minimum_recommended_products = intval($this->getRequest()->getParam('minimum'));
32
- $products = array();
33
-
34
- $attributes = Mage::getSingleton('catalog/config')->getProductAttributes();
35
- $collection = Mage::getModel('catalog/product')
36
- ->getCollection()
37
- ->addAttributeToFilter('entity_id', array('in' => $product_ids))
38
- ->addAttributeToSelect($attributes);
39
-
40
- /* Sort items as REES46 returned */
41
- foreach($product_ids as $id) {
42
- foreach($collection as $product) {
43
- if($product->getId() == $id) {
44
- $products[] = $product;
45
- }
46
- }
47
- }
48
-
49
- if( $minimum_recommended_products > 0 && count($products) >= $minimum_recommended_products ) {
50
-
51
- /* Get block title - from locale or from front-end */
52
- $block_title = Mage::helper('rees46_personalization')->__($recommender_type);
53
- if($this->getRequest()->getParam('block_title')) {
54
- $block_title = $this->getRequest()->getParam('block_title');
55
- $block_title = urldecode($block_title);
56
- }
57
-
58
- $html = '<div class="rees46 rees46-recommend"><div class="recommender-block-title">' . $block_title . '</div><div class="recommended-items">';
59
- foreach($products as $product) {
60
-
61
- /* Specific settings cause problems with large photos, so find it another way */
62
- $productForImage = Mage::getModel('catalog/product')->load($product->getId());
63
-
64
- /* Sometimes Magento adds special attributes to URL's, so add our attributes depending of this situation */
65
- $product_url = $product->getProductUrl(false);
66
- if( strpos($product_url, '?') !== false ) {
67
- $product_url = str_replace('?', '?recommended_by=' . $recommender_type . '& ', $product_url);
68
- } else {
69
- $product_url = $product_url . '?recommended_by=' . $recommender_type;
70
- }
71
- $html .= '<div class="recommended-item">
72
- <div class="recommended-item-photo">
73
- <a href="' . $product_url . '"><img src="' . $productForImage->getThumbnailUrl(200, 200) . '"></a></div>
74
- <div class="recommended-item-title">
75
- <a href="' . $product_url . '">' . $product->getName() . '</a>
76
- </div>
77
- <div class="recommended-item-price">' . $product->getFormatedPrice() . '</div>
78
- <div class="recommended-item-action"><a href="' . $product_url . '">' . Mage::helper('rees46_personalization')->__('More') . '</a></div>
79
- </div>';
80
- }
81
- $html .= '</div></div>';
82
- echo $html;
83
- } else {
84
- echo '';
85
- }
86
-
87
- }
88
-
89
-
90
- }
 
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ class Rees46_Personalization_BlockController extends Mage_Core_Controller_Front_Action
6
+ {
7
+ /**
8
+ * Pre dispatch action that allows to redirect to no route page in case of disabled extension through admin panel
9
+ */
10
+ public function preDispatch()
11
+ {
12
+ parent::preDispatch();
13
+
14
+ if (!Mage::helper('rees46_personalization')->isEnabled()) {
15
+ $this->setFlag('', 'no-dispatch', true);
16
+ $this->_redirect('noRoute');
17
+ }
18
+ }
19
+
20
+ /**
21
+ * Render recommended products as block
22
+ */
23
+ public function indexAction()
24
+ {
25
+ $this->loadLayout();
26
+ $products = array();
27
+
28
+ $product_ids = explode(',', $this->getRequest()->getParam('ids'));
29
+ $type = $this->getRequest()->getParam('type');
30
+ $limit = intval($this->getRequest()->getParam('limit'));
31
+
32
+ $attributes = Mage::getSingleton('catalog/config')->getProductAttributes();
33
+ $collection = Mage::getModel('catalog/product')
34
+ ->getCollection()
35
+ ->addAttributeToFilter('entity_id', array('in' => $product_ids))
36
+ ->addAttributeToSelect($attributes);
37
+
38
+ /* Sort items as REES46 returned */
39
+ foreach($product_ids as $id) {
40
+ foreach($collection as $product) {
41
+ if ($product->getId() == $id) {
42
+ $products[] = $product;
43
+
44
+ if (count($products) == $limit) {
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ if (count($products) > 0) {
52
+ if ($this->getRequest()->getParam('title')) {
53
+ $title = urldecode($this->getRequest()->getParam('title'));
54
+ } else {
55
+ $title = Mage::helper('rees46_personalization')->__($type);
56
+ }
57
+
58
+ $html = '<div class="rees46 rees46-recommend"><div class="recommender-block-title">' . $title . '</div><div class="recommended-items">';
59
+
60
+ foreach($products as $product) {
61
+ /* Specific settings cause problems with large photos, so find it another way */
62
+ $productForImage = Mage::getModel('catalog/product')->load($product->getId());
63
+
64
+ /* Sometimes Magento adds special attributes to URL's, so add our attributes depending of this situation */
65
+ $product_url = $product->getProductUrl(false);
66
+
67
+ if (strpos($product_url, '?') !== false) {
68
+ $product_url = str_replace('?', '?recommended_by=' . $type . '& ', $product_url);
69
+ } else {
70
+ $product_url = $product_url . '?recommended_by=' . $type;
71
+ }
72
+
73
+ $html .= '<div class="recommended-item">
74
+ <div class="recommended-item-photo">
75
+ <a href="' . $product_url . '"><img src="' . $productForImage->getThumbnailUrl(200, 200) . '"></a></div>
76
+ <div class="recommended-item-title">
77
+ <a href="' . $product_url . '">' . $product->getName() . '</a>
78
+ </div>
79
+ <div class="recommended-item-price">' . $product->getFormatedPrice() . '</div>
80
+ <div class="recommended-item-action"><a href="' . $product_url . '">' . Mage::helper('rees46_personalization')->__('More') . '</a></div>
81
+ </div>';
82
+ }
83
+
84
+ $html .= '</div></div>';
85
+
86
+ echo $html;
87
+ } else {
88
+ echo '';
89
+ }
90
+ }
91
+ }
app/code/community/Rees46/Personalization/etc/adminhtml.xml CHANGED
@@ -1,43 +1,40 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /**
4
- * Magento admin config
5
- *
6
- * @author Magento
7
- */
8
- -->
9
- <config>
10
- <menu>
11
- <personalization translate="title" module="rees46_personalization">
12
- <title>REES46 Recommendations</title>
13
- <sort_order>65</sort_order>
14
- <children>
15
- <overview translate="title" module="rees46_personalization">
16
- <title>Overview</title>
17
- <action>adminhtml/personalization</action>
18
- <sort_order>50</sort_order>
19
- </overview>
20
- </children>
21
- </personalization>
22
- </menu>
23
-
24
- <acl>
25
- <resources>
26
- <admin>
27
- <children>
28
- <system>
29
- <children>
30
- <config>
31
- <children>
32
- <personalization translate="title" module="rees46_personalization">
33
- <title>Overview</title>
34
- </personalization>
35
- </children>
36
- </config>
37
- </children>
38
- </system>
39
- </children>
40
- </admin>
41
- </resources>
42
- </acl>
43
- </config>
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
5
+ */
6
+ -->
7
+ <config>
8
+ <menu>
9
+ <personalization translate="title" module="rees46_personalization">
10
+ <title>REES46 Recommendations</title>
11
+ <sort_order>65</sort_order>
12
+ <children>
13
+ <overview translate="title" module="rees46_personalization">
14
+ <title>Overview</title>
15
+ <action>adminhtml/personalization</action>
16
+ <sort_order>50</sort_order>
17
+ </overview>
18
+ </children>
19
+ </personalization>
20
+ </menu>
21
+ <acl>
22
+ <resources>
23
+ <admin>
24
+ <children>
25
+ <system>
26
+ <children>
27
+ <config>
28
+ <children>
29
+ <personalization translate="title" module="rees46_personalization">
30
+ <title>Overview</title>
31
+ </personalization>
32
+ </children>
33
+ </config>
34
+ </children>
35
+ </system>
36
+ </children>
37
+ </admin>
38
+ </resources>
39
+ </acl>
40
+ </config>
 
 
 
app/code/community/Rees46/Personalization/etc/config.xml CHANGED
@@ -1,8 +1,13 @@
1
  <?xml version="1.0"?>
 
 
 
 
 
2
  <config>
3
  <modules>
4
  <Rees46_Personalization>
5
- <version>3.3.7</version>
6
  </Rees46_Personalization>
7
  </modules>
8
  <global>
@@ -139,5 +144,3 @@
139
  </personalization>
140
  </default>
141
  </config>
142
-
143
-
1
  <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
5
+ */
6
+ -->
7
  <config>
8
  <modules>
9
  <Rees46_Personalization>
10
+ <version>4.0.0</version>
11
  </Rees46_Personalization>
12
  </modules>
13
  <global>
144
  </personalization>
145
  </default>
146
  </config>
 
 
app/code/community/Rees46/Personalization/etc/system.xml CHANGED
@@ -1,71 +1,59 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /**
4
- * Magento admin configuratuib section config
5
- *
6
- * @author Magento
7
- */
8
- -->
9
- <config>
10
- <sections>
11
- <personalization>
12
- <class>separator-top</class>
13
- <label>REES46 Recommendations</label>
14
- <tab>general</tab>
15
- <frontend_type>text</frontend_type>
16
- <sort_order>500</sort_order>
17
- <show_in_default>1</show_in_default>
18
- <show_in_website>1</show_in_website>
19
- <show_in_store>1</show_in_store>
20
-
21
- <groups>
22
- <view translate="label">
23
- <label>REES46 Settings</label>
24
- <frontend_type>text</frontend_type>
25
- <sort_order>10</sort_order>
26
- <show_in_default>1</show_in_default>
27
- <show_in_website>1</show_in_website>
28
- <show_in_store>1</show_in_store>
29
- <fields>
30
- <enabled translate="label">
31
- <label>Enable Personalization On Frontend</label>
32
- <frontend_type>select</frontend_type>
33
- <source_model>adminhtml/system_config_source_yesno</source_model>
34
- <sort_order>10</sort_order>
35
- <show_in_default>1</show_in_default>
36
- <show_in_website>1</show_in_website>
37
- <show_in_store>1</show_in_store>
38
- </enabled>
39
- <api_key translate="label">
40
- <label>API Key</label>
41
- <comment>Put API key taken after registration in rees46.com here.</comment>
42
- <sort_order>30</sort_order>
43
- <depends><enabled>1</enabled></depends>
44
- <show_in_default>1</show_in_default>
45
- <show_in_website>1</show_in_website>
46
- <show_in_store>1</show_in_store>
47
- </api_key>
48
- <secret_key translate="label">
49
- <label>Secret Key</label>
50
- <comment>Put secret key taken after registration in rees46.com here.</comment>
51
- <sort_order>50</sort_order>
52
- <depends><enabled>1</enabled></depends>
53
- <show_in_default>1</show_in_default>
54
- <show_in_website>1</show_in_website>
55
- <show_in_store>1</show_in_store>
56
- </secret_key>
57
- <expert_mode translate="label">
58
- <label>Manual Blocks Embed (see installation guide)</label>
59
- <frontend_type>select</frontend_type>
60
- <source_model>adminhtml/system_config_source_yesno</source_model>
61
- <sort_order>80</sort_order>
62
- <show_in_default>1</show_in_default>
63
- <show_in_website>1</show_in_website>
64
- <show_in_store>1</show_in_store>
65
- </expert_mode>
66
- </fields>
67
- </view>
68
- </groups>
69
- </personalization>
70
- </sections>
71
- </config>
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
5
+ */
6
+ -->
7
+ <config>
8
+ <sections>
9
+ <personalization>
10
+ <class>separator-top</class>
11
+ <label>REES46 Recommendations</label>
12
+ <tab>general</tab>
13
+ <frontend_type>text</frontend_type>
14
+ <sort_order>500</sort_order>
15
+ <show_in_default>1</show_in_default>
16
+ <show_in_website>1</show_in_website>
17
+ <show_in_store>1</show_in_store>
18
+ <groups>
19
+ <view translate="label">
20
+ <label>Settings</label>
21
+ <frontend_type>text</frontend_type>
22
+ <sort_order>10</sort_order>
23
+ <show_in_default>1</show_in_default>
24
+ <show_in_website>1</show_in_website>
25
+ <show_in_store>1</show_in_store>
26
+ <fields>
27
+ <enabled translate="label">
28
+ <label>Enable Module</label>
29
+ <frontend_type>select</frontend_type>
30
+ <source_model>adminhtml/system_config_source_yesno</source_model>
31
+ <sort_order>10</sort_order>
32
+ <show_in_default>1</show_in_default>
33
+ <show_in_website>1</show_in_website>
34
+ <show_in_store>1</show_in_store>
35
+ </enabled>
36
+ <api_key translate="label">
37
+ <label>API Key</label>
38
+ <comment>Put API key taken after registration in rees46.com here.</comment>
39
+ <sort_order>20</sort_order>
40
+ <depends><enabled>1</enabled></depends>
41
+ <show_in_default>1</show_in_default>
42
+ <show_in_website>1</show_in_website>
43
+ <show_in_store>1</show_in_store>
44
+ </api_key>
45
+ <secret_key translate="label">
46
+ <label>Secret Key</label>
47
+ <comment>Put secret key taken after registration in rees46.com here.</comment>
48
+ <sort_order>30</sort_order>
49
+ <depends><enabled>1</enabled></depends>
50
+ <show_in_default>1</show_in_default>
51
+ <show_in_website>1</show_in_website>
52
+ <show_in_store>1</show_in_store>
53
+ </secret_key>
54
+ </fields>
55
+ </view>
56
+ </groups>
57
+ </personalization>
58
+ </sections>
59
+ </config>
 
 
 
 
 
 
 
 
 
 
 
 
app/design/adminhtml/default/default/layout/rees46_personalization.xml CHANGED
@@ -1,43 +1,13 @@
1
  <?xml version="1.0"?>
2
- <layout version="0.1.0">
3
- <!-- @rees46 -->
4
-
5
- <!-- All pages tracking -->
6
- <default>
7
- <reference name="before_body_end">
8
- <block type="core/template" name="rees46_init" after="-" template="rees46/personalization/init.phtml"/>
9
- </reference>
10
- </default>
11
-
12
- <!-- Home-->
13
- <cms_index_index>
14
- <reference name="content">
15
- <block type="core/template" name="rees46_home" after="-" template="rees46/personalization/blocks/home.phtml" />
16
- </reference>
17
- </cms_index_index>
18
-
19
-
20
- <!-- Category -->
21
- <catalog_category_view translate="label">
22
- <reference name="content">
23
- <block type="core/template" name="rees46_category" after="category.products" template="rees46/personalization/blocks/category.phtml" />
24
- </reference>
25
- </catalog_category_view>
26
-
27
- <!-- Product -->
28
- <catalog_product_view translate="label">
29
- <reference name="content">
30
- <block type="core/template" name="rees46_product" after="-" template="rees46/personalization/blocks/product.phtml" />
31
- </reference>
32
- </catalog_product_view>
33
-
34
- <!-- Cart -->
35
- <checkout_cart_index translate="label">
36
  <reference name="content">
37
- <block type="core/template" name="rees46_cart" after="-" template="rees46/personalization/blocks/cart.phtml" />
38
  </reference>
39
- </checkout_cart_index>
40
-
41
  </layout>
42
-
43
-
1
  <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
5
+ */
6
+ -->
7
+ <layout>
8
+ <adminhtml_personalization_index>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  <reference name="content">
10
+ <block type="rees46_personalization/adminhtml_personalization" name="personalization" />
11
  </reference>
12
+ </adminhtml_personalization_index>
 
13
  </layout>
 
 
app/design/adminhtml/default/default/template/rees46/personalization/index.phtml CHANGED
@@ -1,21 +1,27 @@
1
- <!-- @rees46 -->
2
- <table border="0">
3
- <tr>
4
- <td>
5
- <img src="//cdn.rees46.com/rees46_magento_logo.png" alt="REES46 Logo">
6
- </td>
7
- <td style="padding-left: 20px">
8
- <h1>REES46 Recommendation Engine Overview</h1>
9
- <p>In REES46 backoffice you will find:</p>
10
- <ul style="list-style: disc; padding-left: 20px;">
11
- <li>Recommendation Engine performance reports.</li>
12
- <li>Trigger mailings management and reports.</li>
13
- <li>E-mail marketing control and reports.</li>
14
- <li>Remarketing control and reports</li>
15
- <li>Product analytics reports.</li>
16
- <li>Audience segmentation service.</li>
17
- </ul>
18
- <p style="margin-top: 20px"><a href="https://rees46.com" target="_blank" style="display: inline-block; border: 1px solid #222; padding: 5px 10px; border-radius: 10px; color: #222; text-decoration: none">Go to my REES46 backoffice</a></p>
19
- </td>
20
- </tr>
 
 
 
 
 
 
21
  </table>
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ ?>
6
+ <table>
7
+ <tr>
8
+ <td>
9
+ <img src="<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA). 'rees46/logo.png'; ?>" alt="REES46">
10
+ </td>
11
+ <td style="padding-left: 20px">
12
+ <h1>REES46 Recommendation Engine Overview</h1>
13
+ <p><?php echo __('Go to your REES46 store dashboard to get the access to:'); ?></p>
14
+ <ul style="list-style: disc; padding-left: 40px;">
15
+ <li><?php echo __('Triggered emails'); ?></li>
16
+ <li><?php echo __('Email marketing tool'); ?></li>
17
+ <li><?php echo __('Personalized search'); ?></li>
18
+ <li><?php echo __('Web push triggered notifications'); ?></li>
19
+ <li><?php echo __('Instant web push notifications'); ?></li>
20
+ <li><?php echo __('Audience segmentation'); ?></li>
21
+ <li><?php echo __('Abandoned cart remarketing tool'); ?></li>
22
+ </ul><br>
23
+ <button onclick="window.open('https://rees46.com/customers/sign_in', '_blank'); return false;" class="primary"><?php echo __('REES46 dashboard'); ?></button><br><br>
24
+ <p><?php echo __('Documentation:'); ?> <a href="<?php echo __('http://docs.rees46.com/display/en/Magento+1.9.x+Extension'); ?>" target="_blank"><?php echo __('http://docs.rees46.com/display/en/Magento+1.9.x+Extension'); ?></a></p>
25
+ </td>
26
+ </tr>
27
  </table>
app/design/frontend/base/default/layout/rees46_personalization.xml CHANGED
@@ -1,47 +1,13 @@
1
  <?xml version="1.0"?>
 
 
 
 
 
2
  <layout version="0.1.0">
3
- <!-- @rees46 -->
4
-
5
- <!-- All pages tracking -->
6
  <default>
7
- <reference name="before_body_end">
8
  <block type="core/template" name="rees46_init" after="-" template="rees46/personalization/init.phtml"/>
9
  </reference>
10
- <reference name="before_body_end">
11
- <block type="core/template" name="rees46_css" before="-" template="rees46/personalization/css.phtml"/>
12
- </reference>
13
  </default>
14
-
15
- <!-- Home-->
16
- <cms_index_index>
17
- <reference name="content">
18
- <block type="core/template" name="rees46_home" after="-" template="rees46/personalization/blocks/home.phtml" />
19
- </reference>
20
- </cms_index_index>
21
-
22
-
23
- <!-- Category -->
24
- <catalog_category_view translate="label">
25
- <reference name="content">
26
- <block type="core/template" name="rees46_category_popular" after="category.description" template="rees46/personalization/blocks/category_popular.phtml" />
27
- <block type="core/template" name="rees46_category" after="category.products" template="rees46/personalization/blocks/category.phtml" />
28
- </reference>
29
- </catalog_category_view>
30
-
31
- <!-- Product -->
32
- <catalog_product_view translate="label">
33
- <reference name="content">
34
- <block type="core/template" name="rees46_product" after="-" template="rees46/personalization/blocks/product.phtml" />
35
- </reference>
36
- </catalog_product_view>
37
-
38
- <!-- Cart -->
39
- <checkout_cart_index translate="label">
40
- <reference name="content">
41
- <block type="core/template" name="rees46_cart" after="-" template="rees46/personalization/blocks/cart.phtml" />
42
- </reference>
43
- </checkout_cart_index>
44
-
45
  </layout>
46
-
47
-
1
  <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
5
+ */
6
+ -->
7
  <layout version="0.1.0">
 
 
 
8
  <default>
9
+ <reference name="head">
10
  <block type="core/template" name="rees46_init" after="-" template="rees46/personalization/init.phtml"/>
11
  </reference>
 
 
 
12
  </default>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  </layout>
 
 
app/design/frontend/base/default/template/rees46/personalization/blocks/cart.phtml DELETED
@@ -1,3 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isExpertMode() != true): ?>
2
- <div class="rees46 rees46-recommend" data-type="see_also"></div>
3
- <?php endif; ?>
 
 
 
app/design/frontend/base/default/template/rees46/personalization/blocks/category.phtml DELETED
@@ -1,4 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isExpertMode() != true): ?>
2
- <div class="rees46 rees46-recommend" data-type="recently_viewed"></div>
3
- <div class="rees46 rees46-recommend" data-type="interesting"></div>
4
- <?php endif; ?>
 
 
 
 
app/design/frontend/base/default/template/rees46/personalization/blocks/category_popular.phtml DELETED
@@ -1,3 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isExpertMode() != true): ?>
2
- <div class="rees46 rees46-recommend" data-type="popular" data-category="<?php echo Mage::registry('current_category')->getId() ?>">популярные</div>
3
- <?php endif; ?>
 
 
 
app/design/frontend/base/default/template/rees46/personalization/blocks/home.phtml DELETED
@@ -1,5 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isExpertMode() != true): ?>
2
- <div class="rees46 rees46-recommend" data-type="popular"></div>
3
- <div class="rees46 rees46-recommend" data-type="interesting"></div>
4
- <div class="rees46 rees46-recommend" data-type="recently_viewed"></div>
5
- <?php endif; ?>
 
 
 
 
 
app/design/frontend/base/default/template/rees46/personalization/blocks/product.phtml DELETED
@@ -1,5 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isExpertMode() != true): ?>
2
- <div class="rees46 rees46-recommend" data-type="also_bought" data-item="<?php echo Mage::registry('current_product')->getId() ?>"></div>
3
- <div class="rees46 rees46-recommend" data-type="similar" data-item="<?php echo Mage::registry('current_product')->getId() ?>"></div>
4
- <div class="rees46 rees46-recommend" data-type="interesting" data-item="<?php echo Mage::registry('current_product')->getId() ?>"></div>
5
- <?php endif; ?>
 
 
 
 
 
app/design/frontend/base/default/template/rees46/personalization/css.phtml DELETED
@@ -1,3 +0,0 @@
1
- <?php if (Mage::helper('rees46_personalization')->isEnabled()): ?>
2
- <link rel="stylesheet" type="text/css" href="//rees46.com/shop_css/<?= $this->helper('rees46_personalization')->getAPIKey() ?>" media="all" />
3
- <?php endif; ?>
 
 
 
app/design/frontend/base/default/template/rees46/personalization/init.phtml CHANGED
@@ -1,163 +1,144 @@
1
- <?php if (Mage::helper('rees46_personalization')->isEnabled()): ?>
2
- <?php $rees46_api_key = $this->helper('rees46_personalization')->getAPIKey(); ?>
3
- <?php if($rees46_api_key != false): ?>
4
- <!-- @rees46 -->
5
- <script src="//cdn.rees46.com/rees46_script2.js"></script>
6
- <script type="text/javascript">
7
- REES46_CART = <?php echo json_encode($this->helper('rees46_personalization')->getCartProductIds()); ?>;
8
- jQuery(document).ready(function(){
9
- var user_data = null;
10
- <?php if (Mage::getSingleton('customer/session')->isLoggedIn()): ?>
11
- var user_data = {
12
- id: <?php echo Mage::getSingleton('customer/session')->getCustomer()->getID() ?>,
13
- email: '<?php echo Mage::getSingleton('customer/session')->getCustomer()->getEmail() ?>'
14
- };
15
- <?php endif; ?>
16
- REES46.init('<?php echo $this->helper('rees46_personalization')->getAPIKey() ?>', user_data, function() {
17
- REES46.addStyleToPage();
18
- <?php $events = Mage::helper('rees46_personalization/event')->getEventsQueue(true) ?>
19
- <?php foreach($events as $event): ?>
20
- <?php if($event['name'] == 'view' || $event['name'] == 'cart' || $event['name'] == 'remove_from_cart'): ?>
21
- REES46.pushData('<?php echo $event['name'] ?>', {
22
- item_id: '<?php echo $event['data']['item_id'] ?>',
23
- name: '<?php echo $event['data']['name'] ?>',
24
- price: '<?php echo $event['data']['price'] ?>',
25
- is_available: '<?php echo intval($event['data']['is_available']) ?>',
26
- categories: [<?php echo implode(',', $event['data']['categories']) ?>],
27
- <?php if($event['data']['recommended_by']): ?>
28
- recommended_by: '<?php echo $event['data']['recommended_by'] ?>',
29
- <?php endif; ?>
30
- });
31
- <?php endif; ?>
32
- <?php if($event['name'] == 'purchase'): ?>
33
- REES46.pushData('purchase', [
34
- <?php foreach($event['data']['products'] as $product): ?>
35
- {
36
- item_id: '<?php echo $product['item_id'] ?>',
37
- name: '<?php echo $product['name'] ?>',
38
- price: '<?php echo $product['price'] ?>',
39
- is_available: '<?php echo intval($product['is_available']) ?>',
40
- categories: [<?php echo implode(',', $product['categories']) ?>],
41
- amount: <?php echo $product['amount'] ?>,
42
- <?php if($product['recommended_by']): ?>
43
- recommended_by: '<?php echo $product['recommended_by'] ?>',
44
- <?php endif; ?>
45
- },
46
- <?php endforeach; ?>
47
- ],
48
- '<?php echo $event['data']['order_id'] ?>');
49
- <?php endif; ?>
50
- <?php endforeach; ?>
51
-
52
- jQuery('.rees46.rees46-recommend').each(function(){
53
- var recommenderBlock = jQuery(this);
54
- var recommenderType = recommenderBlock.data('type');
55
- switch(recommenderType) {
56
- case 'interesting':
57
- case 'also_bought':
58
- case 'similar':
59
- case 'recently_viewed':
60
- case 'buying_now':
61
- REES46.recommend({
62
- recommender_type: recommenderType,
63
- item: recommenderBlock.data('item'),
64
- cart: REES46_CART
65
- }, function(data){
66
- REES46_Recommender_Callback(recommenderType, recommenderBlock, data);
67
- });
68
- break;
69
- case 'popular':
70
- REES46.recommend({
71
- recommender_type: recommenderType,
72
- category: recommenderBlock.data('category')
73
- }, function(data){
74
- REES46_Recommender_Callback(recommenderType, recommenderBlock, data);
75
- });
76
- break;
77
- case 'see_also':
78
- REES46.recommend({
79
- recommender_type: recommenderType,
80
- cart: REES46_CART
81
- }, function(data){
82
- REES46_Recommender_Callback(recommenderType, recommenderBlock, data);
83
- });
84
- break;
85
- }
86
- });
87
-
88
- function REES46_Recommender_Callback(recommenderType, block, data) {
89
- /* @todo: update settings – include parameter for limit minimum recommended items */
90
- var min_products = 1;
91
- if(data.length >= min_products) {
92
- REES46RENDER(
93
- '/personalization/block',
94
- {
95
- ids: data,
96
- type: recommenderType,
97
- minimum: min_products,
98
- block_title: ( block.data('title') || '' )
99
- },
100
- function(response) {
101
- if(response) {
102
- block.html(response);
103
- }
104
- }
105
- );
106
- }
107
- };
108
-
109
- /**
110
- * Функция должна всегда получать URL (без параметров) и отдельно params независимо от: POST или GET запрос
111
- * @param url
112
- * @param attributes
113
- * @param callback
114
- * @returns {*}
115
- * @constructor
116
- */
117
- function REES46RENDER (url, attributes, callback) {
118
 
119
- var params = "ids=" + attributes.ids.join(',') + "&block_title=" + attributes.block_title + "&minimum=" + attributes.minimum + "&type=" + attributes.type;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
- /* Обработка результата запроса */
122
- var handler = function () {
123
- if (_xml.readyState == 4) {
124
- if (_xml.status == 200) {
125
- if (typeof(callback) == 'function') {
126
- callback(_xml.responseText);
127
- }
128
- }
129
- }
130
- };
 
 
 
 
 
 
 
 
131
 
132
- var handlerIE = function () {
133
- if (typeof(callback) == 'function') {
134
- callback(_xml.responseText);
135
- }
136
- };
 
 
 
 
 
137
 
138
- try {
139
- var XHR = window.XDomainRequest || window.XMLHttpRequest;
140
- var _xml = new XHR();
141
- _xml.withCredentials = "true";
142
- _xml.open('GET', url + '?' + params, true);
143
- if (XHR == window.XDomainRequest) {
144
- _xml.onload = handlerIE;
145
- } else {
146
- _xml.onload = handler;
147
- }
148
- _xml.send(null);
149
- this._xml = _xml;
150
- return this._xml;
151
- } catch( e ) {
152
- console.log(e);
153
- }
154
 
155
- return true;
156
- };
 
 
 
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
- });
160
- });
161
- </script>
162
- <?php endif; ?>
 
163
  <?php endif; ?>
1
+ <?php
2
+ /**
3
+ * Copyright © 2017 REES46, INC. All rights reserved.
4
+ */
5
+ ?>
6
+ <?php if (Mage::helper('rees46_personalization')->isEnabled() && $this->helper('rees46_personalization')->getAPIKey()): ?>
7
+ <!-- BEGIN REES46 INIT -->
8
+ <script type="text/javascript">
9
+ (function(r){window.r46=window.r46||function(){(r46.q=r46.q||[]).push(arguments)};var s=document.getElementsByTagName(r)[0],rs=document.createElement(r);rs.async=1;rs.src='//cdn.rees46.com/v3.js';s.parentNode.insertBefore(rs,s);})('script');
10
+ r46('init', '<?php echo $this->helper('rees46_personalization')->getAPIKey(); ?>');
11
+ r46('add_css', 'recommendations');
12
+ <?php if (Mage::getSingleton('customer/session')->isLoggedIn()): ?>
13
+ r46('profile', 'set', {id: <?php echo Mage::getSingleton('customer/session')->getCustomer()->getID() ?>, email: '<?php echo Mage::getSingleton('customer/session')->getCustomer()->getEmail() ?>'});
14
+ <?php endif; ?>
15
+ REES46_CART = <?php echo json_encode($this->helper('rees46_personalization')->getCartProductIds()); ?>;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ jQuery(document).ready(function() {
18
+ <?php foreach(Mage::helper('rees46_personalization/event')->getEventsQueue(true) as $event): ?>
19
+ <?php if ($event['name'] == 'view'): ?>
20
+ r46('track', 'view', {
21
+ id: <?php echo $event['data']['id'] ?>,
22
+ stock: <?php echo intval($event['data']['stock']) ?>,
23
+ price: <?php echo $event['data']['price'] ?>,
24
+ name: '<?php echo $event['data']['name'] ?>',
25
+ categories: [<?php echo $event['data']['categories'] ?>],
26
+ image: '<?php echo $event['data']['image'] ?>',
27
+ url: '<?php echo $event['data']['url'] ?>'
28
+ });
29
+ <?php endif; ?>
30
+ <?php if ($event['name'] == 'cart'): ?>
31
+ r46('track', 'cart', <?php echo $event['data']['id'] ?>);
32
+ <?php endif; ?>
33
+ <?php if ($event['name'] == 'remove_from_cart'): ?>
34
+ r46('track', 'remove_from_cart', <?php echo $event['data']['id'] ?>);
35
+ <?php endif; ?>
36
+ <?php if ($event['name'] == 'purchase'): ?>
37
+ r46('track', 'purchase', {
38
+ products: [
39
+ <?php foreach($event['data']['products'] as $product): ?>
40
+ {id: <?php echo $product['id'] ?>, price: <?php echo $product['price'] ?>, amount: <?php echo $product['amount'] ?>},
41
+ <?php endforeach; ?>
42
+ ],
43
+ order: '<?php echo $event['data']['order_id'] ?>',
44
+ order_price: <?php echo $event['data']['order_price'] ?>
45
+ });
46
+ <?php endif; ?>
47
+ <?php endforeach; ?>
48
+ jQuery('.rees46.rees46-recommend').each(function(){
49
+ var recommenderBlock = jQuery(this);
50
+ var recommenderType = recommenderBlock.data('type');
51
+ switch(recommenderType) {
52
+ case 'interesting':
53
+ case 'also_bought':
54
+ case 'similar':
55
+ case 'recently_viewed':
56
+ case 'buying_now':
57
+ case 'supply':
58
+ r46('recommend', recommenderType, {item: recommenderBlock.data('item'), cart: [REES46_CART]}, function(results) {
59
+ REES46_Recommender_Callback(recommenderType, recommenderBlock, results);
60
+ });
61
+ break;
62
+ case 'popular':
63
+ r46('recommend', recommenderType, {category: recommenderBlock.data('category'), cart: [REES46_CART]}, function(results) {
64
+ REES46_Recommender_Callback(recommenderType, recommenderBlock, results);
65
+ });
66
+ break;
67
+ case 'see_also':
68
+ r46('recommend', recommenderType, {cart: [REES46_CART]}, function(results) {
69
+ REES46_Recommender_Callback(recommenderType, recommenderBlock, results);
70
+ });
71
+ break;
72
+ }
73
+ });
74
 
75
+ function REES46_Recommender_Callback(recommenderType, block, data) {
76
+ if (data.length > 0) {
77
+ REES46RENDER(
78
+ '<?php echo Mage::helper('core/url')->getHomeUrl(); ?>personalization/block',
79
+ {
80
+ ids: data,
81
+ type: recommenderType,
82
+ limit: (block.data('limit') || 4),
83
+ title: (block.data('title') || '')
84
+ },
85
+ function(response) {
86
+ if(response) {
87
+ block.html(response);
88
+ }
89
+ }
90
+ );
91
+ }
92
+ };
93
 
94
+ /**
95
+ * Функция должна всегда получать URL (без параметров) и отдельно params независимо от: POST или GET запрос
96
+ * @param url
97
+ * @param attributes
98
+ * @param callback
99
+ * @returns {*}
100
+ * @constructor
101
+ */
102
+ function REES46RENDER (url, attributes, callback) {
103
+ var params = "ids=" + attributes.ids.join(',') + "&title=" + attributes.title + "&limit=" + attributes.limit + "&type=" + attributes.type;
104
 
105
+ /* Обработка результата запроса */
106
+ var handler = function () {
107
+ if (_xml.readyState == 4) {
108
+ if (_xml.status == 200) {
109
+ if (typeof(callback) == 'function') {
110
+ callback(_xml.responseText);
111
+ }
112
+ }
113
+ }
114
+ };
 
 
 
 
 
 
115
 
116
+ var handlerIE = function () {
117
+ if (typeof(callback) == 'function') {
118
+ callback(_xml.responseText);
119
+ }
120
+ };
121
 
122
+ try {
123
+ var XHR = window.XDomainRequest || window.XMLHttpRequest;
124
+ var _xml = new XHR();
125
+ _xml.withCredentials = "true";
126
+ _xml.open('GET', url + '?' + params, true);
127
+ if (XHR == window.XDomainRequest) {
128
+ _xml.onload = handlerIE;
129
+ } else {
130
+ _xml.onload = handler;
131
+ }
132
+ _xml.send(null);
133
+ this._xml = _xml;
134
+ return this._xml;
135
+ } catch( e ) {
136
+ console.log(e);
137
+ }
138
 
139
+ return true;
140
+ };
141
+ });
142
+ </script>
143
+ <!-- END REES46 INIT -->
144
  <?php endif; ?>
app/etc/modules/Rees46_Personalization.xml CHANGED
@@ -1,9 +1,7 @@
1
  <?xml version="1.0"?>
2
  <!--
3
  /**
4
- * Personalization module config
5
- *
6
- * @author REES46
7
  */
8
  -->
9
  <config>
1
  <?xml version="1.0"?>
2
  <!--
3
  /**
4
+ * Copyright © 2017 REES46, INC. All rights reserved.
 
 
5
  */
6
  -->
7
  <config>
app/locale/en_US/Rees46_Personalization.csv CHANGED
@@ -1,8 +1,10 @@
1
- "popular","Popular products"
2
- "interesting","It may be interesting for you"
3
- "also_bought","People also bought this product"
4
- "similar","Similar products"
5
- "see_also","Do not forget to look these products"
6
- "recently_viewed","Recently viewed"
7
- "buying_now","People buying it right now"
8
- "More","More Info"
 
 
1
+ "interesting","You May Also Like"
2
+ "also_bought","Frequently Bought Together"
3
+ "similar","Similar Products"
4
+ "popular","Popular Products"
5
+ "see_also","Recommended For You"
6
+ "recently_viewed","You Recently Viewed"
7
+ "buying_now","Trending Products"
8
+ "search","Customers Who Looked For This Item Also Bought"
9
+ "supply","Regular Purchase"
10
+ "More","More"
app/locale/ru_RU/Rees46_Personalization.csv CHANGED
@@ -1,8 +1,10 @@
1
- "popular","Популярные товары"
2
- "interesting","Возможно, вас это заинтересует"
3
- "also_bought","С этим товаром также покупают"
4
  "similar","Похожие товары"
5
- "see_also","Не забудьте посмотреть"
 
6
  "recently_viewed","Вы недавно смотрели"
7
- "buying_now","Люди покупают это прямо сейчас"
 
 
8
  "More","Подробнее"
1
+ "interesting","Возможно, вам это понравится"
2
+ "also_bought","С этим товаром покупают"
 
3
  "similar","Похожие товары"
4
+ "popular","Популярные товары"
5
+ "see_also","Посмотрите также"
6
  "recently_viewed","Вы недавно смотрели"
7
+ "buying_now","Прямо сейчас покупают"
8
+ "search","Пользователи, искавшие этот товар, также купили"
9
+ "supply","У вас скоро закончатся"
10
  "More","Подробнее"
package.xml CHANGED
@@ -1,71 +1,26 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Rees46_Personalization</name>
4
- <version>3.3.7</version>
5
  <stability>stable</stability>
6
  <license>GNU</license>
7
  <channel>community</channel>
8
  <extends/>
9
- <summary>REES 46 is a omnichannel platform of e-commerce personalization, including storefront personalization, trigger-based and transactional mailings, abandoned cart remarketing and high-precision segmentation service.</summary>
10
- <description>REES 46 is a omnichannel platform of e-commerce personalization, including storefront personalization, trigger-based and transactional mailings, abandoned cart remarketing and high-precision segmentation service.&#xD;
11
- &#xD;
12
- == In-store personalization. &#xD;
13
- &#xD;
14
- Make your storefront more personalized automatically &#x2014; with recommender blocks:&#xD;
15
- &#xD;
16
- - Personalized Popular Products.&#xD;
17
- - Personalized Similar Products.&#xD;
18
- - Personalized Related Products.&#xD;
19
- - Personalized Interesting Products.&#xD;
20
- - Recently Viewed Products.&#xD;
21
- - People Buying It Right Now.&#xD;
22
- &#xD;
23
- == Omnichannel recommendations. &#xD;
24
- &#xD;
25
- Personalise all channels: your online storefront, search, mailings, push-notifications and offline recommendations as well. Also you can integrate your email-marketing platform with REES46 personalized mechanics &#x2014; and gain the powerful marketing tool.&#xD;
26
- &#xD;
27
- == Personalized email-marketing. &#xD;
28
- &#xD;
29
- Use trigger-based and transactional mailing to activate your customers, to return them to ordering or to raise some spontaneous purchase. It works better than traditional emails because you can include personalized product recommendation into each customer&#x2019;s mailing.&#xD;
30
- &#xD;
31
- == Audience segmentation. &#xD;
32
- &#xD;
33
- Define target segments automatically due to the fact that REES46 knows the history of the customers&#x2019; behaviour.&#xD;
34
- &#xD;
35
- == Remarketing and abandoned carts. &#xD;
36
- &#xD;
37
- REES46 helps to return your customers and remind them to complete the ordering. Our advertising network has CPA-model, so you will pay only for orders, not views or clicks. Save money and sell more!&#xD;
38
- &#xD;
39
- == Industry specific algorithms. &#xD;
40
- &#xD;
41
- Nobody can&#x2019;t sell apparels in the same way as cosmetics or FMCG, right? So REES46 using industry algorithms to act more accurate and recommend the most relevant items to customers.&#xD;
42
- &#xD;
43
- Available industrial algorithms at this moment:&#xD;
44
- &#xD;
45
- - Apparel.&#xD;
46
- - Baby products.&#xD;
47
- - FMCG.&#xD;
48
- - Pets products.&#xD;
49
- - Home improvement and repair.&#xD;
50
- - Cosmetics.&#xD;
51
- - Consumer electronics.&#xD;
52
- &#xD;
53
- == Virtual profiles and Big Data. &#xD;
54
- &#xD;
55
- REES46 knows not only customers&#x2019; basic info, but also it keeps data about user&#x2019;s children, pets, skin condition or hair type, family budget and relations between the family members. Every customer has it&#x2019;s own virtual profile in REES46 with all this data (keeping anonymously!). &#xD;
56
- &#xD;
57
- == In-house analytics. &#xD;
58
- &#xD;
59
- All KPIs and ordering history are available at your REES46 profile. Track the perfomance of your campaigns and see the sales growth.&#xD;
60
- &#xD;
61
- == Bonus: make more income with REES46 online-merchandising platform. &#xD;
62
- &#xD;
63
- You can participate in our advertising program. Switch on the merchandising mode to allow the promotiong brands to appear in first row of your in-store recommendation. You&#x2019;ll get revenue for clicks. It&#x2019;s important: this model promote only items that already in your catalogue (not the items from another sites)!</description>
64
- <notes>Centralized CSS management.</notes>
65
- <authors><author><name>REES46</name><user>mkechinov</user><email>kechinoff@gmail.com</email></author></authors>
66
- <date>2016-07-29</date>
67
- <time>15:22:27</time>
68
- <contents><target name="magecommunity"><dir name="Rees46"><dir name="Personalization"><dir name="Helper"><file name="Admin.php" hash="2d31ca47bba5404e8b9d777027f70f48"/><file name="Data.php" hash="eecf1cab557b61ff3de492ca8d768ff2"/><file name="Event.php" hash="b556b383c49d1ce32e75a34739c0ec80"/></dir><dir name="Model"><file name="Observer.php" hash="46514b2c3bebbf55a375df6eef73b01d"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="PersonalizationController.php" hash="223eb514006587a194e969487e650b6d"/></dir><file name="BlockController.php" hash="af21b92af9fb8c8aacc60f41cf40b54c"/></dir><dir name="etc"><file name="adminhtml.xml" hash="6377f088c69a7b1b241fe382893d0254"/><file name="config.xml" hash="f60a7ac504290d1652aa033b087d646f"/><file name="system.xml" hash="9b5cca89ddeea0405ed55fb34f7dea7f"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="rees46_personalization.xml" hash="83770ae4cef3d6602ab4bace18c50d18"/></dir><dir name="template"><dir name="rees46"><dir name="personalization"><file name="index.phtml" hash="4af8baf7282f391241fc980b6d56aff5"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="rees46_personalization.xml" hash="b1a6845c76cc0e3efbf901bb5a6a0322"/></dir><dir name="template"><dir name="rees46"><dir name="personalization"><dir name="blocks"><file name="cart.phtml" hash="c594f670a1b069c5c8418db41a89e4a7"/><file name="category.phtml" hash="ddaa3e5542058a6091ada3565e32b085"/><file name="category_popular.phtml" hash="db6f2d7df16ab69b76030eb008df9b22"/><file name="home.phtml" hash="3ca3dff9140e0bb0d850b456f9bf8640"/><file name="product.phtml" hash="8e5621b3897e374fe34436326f2132e9"/></dir><file name="css.phtml" hash="8a8c5c44da1286ec14b040f5edeb2cfd"/><file name="init.phtml" hash="a62110d92e9a14645e428b830ad087ce"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Rees46_Personalization.xml" hash="67bdc8c38ce74e98dda5d70a0943f2fe"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="Rees46_Personalization.csv" hash="0169f9749d80016235f9c69c245f0976"/></dir><dir name="ru_RU"><file name="Rees46_Personalization.csv" hash="9a71f4c9cb704beb7bf698595ee9db13"/></dir></dir></target></contents>
69
  <compatible/>
70
- <dependencies><required><php><min>5.2.1</min><max>7.0.0</max></php></required></dependencies>
71
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Rees46_Personalization</name>
4
+ <version>4.0.0</version>
5
  <stability>stable</stability>
6
  <license>GNU</license>
7
  <channel>community</channel>
8
  <extends/>
9
+ <summary>REES46 is free professional recommender system for e-commerce, with personalized merchandising, trigger and digest mailings, search personalization, etc. analyzes customers activity and recommend them best goods they are willing to buy for greater conversion and ARPPU.</summary>
10
+ <description>REES46 is an all-in-one marketing suite that can be applied to an e-commerce store of any size, demographic, or niche. Once set up, you can manage several tools from a central dashboard that will make your basic marketing processes easier to manage and follow up.&#xD;
11
+ &#xD;
12
+ Using REES46 you can easily:&#xD;
13
+ &#xD;
14
+ Acquire more visitors using our advertising platform with extremely precise targeting.&#xD;
15
+ Convert your visitors into customers using personalized product recommendations and personalized search.&#xD;
16
+ Recover abandoned carts using triggered emails, web push notifications and remarketing.&#xD;
17
+ Induce repeat purchases through digest emails and push notifications with individual selections of recommended products.&#xD;
18
+ Gain customer feedback, product and store reviews to improve your store credibility and merchant reputation. </description>
19
+ <notes>Used JS SDK III</notes>
20
+ <authors><author><name>REES46</name><user>mkechinov</user><email>kechinoff@gmail.com</email></author><author><name>REES46</name><user>p0v1n0m</user><email>ay@rees46.com</email></author></authors>
21
+ <date>2017-03-23</date>
22
+ <time>15:43:59</time>
23
+ <contents><target name="magecommunity"><dir name="Rees46"><dir name="Personalization"><dir name="Helper"><file name="Admin.php" hash="a01aceaba456186604b779c5920cafe9"/><file name="Data.php" hash="4896d769e47ba5c0896d0c8b2e7ec92d"/><file name="Event.php" hash="c50e9b22f08a3251602a3372d2622b65"/></dir><dir name="Model"><file name="Observer.php" hash="14f3fae00e741ffbaa6a9842a642d5c9"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="PersonalizationController.php" hash="b3ddd3bb3a8acc4df0034f1dc681b952"/></dir><file name="BlockController.php" hash="b393c157296eb4ffd52af2e69eeac4bc"/></dir><dir name="etc"><file name="adminhtml.xml" hash="051c97f0c45ce97134344590f930cd73"/><file name="config.xml" hash="81ae75517b240152cb9acdc27fffc4d2"/><file name="system.xml" hash="7d2293a79736ee4ffa30151cfd4ba28d"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="rees46_personalization.xml" hash="682bbcffec8a0933d64ef2910fc52bb0"/></dir><dir name="template"><dir name="rees46"><dir name="personalization"><file name="index.phtml" hash="f09eeb4522c3b5095591697fa92803af"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="rees46_personalization.xml" hash="ec585005bed91c3f5204122d6a9dcbc5"/></dir><dir name="template"><dir name="rees46"><dir name="personalization"><file name="init.phtml" hash="717be6d0b3d8aa5eec26a58c0ab13432"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Rees46_Personalization.xml" hash="7b0cf94d20b8263561e8b63cf52d22ae"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="Rees46_Personalization.csv" hash="eb3790f608f01c384916cc2660820987"/></dir><dir name="ru_RU"><file name="Rees46_Personalization.csv" hash="022b43e549a584556d1a68ea7901d7b9"/></dir></dir></target></contents>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  <compatible/>
25
+ <dependencies><required><php><min>5.2.1</min><max>6.0.0</max></php></required></dependencies>
26
  </package>