Ampersand_RichRelevance - Version 0.1.3

Version Notes

Ampersand Commerce RichRelevance v0.1.3

Download this release

Release Info

Developer Ampersand Commerce
Extension Ampersand_RichRelevance
Version 0.1.3
Comparing to
See all releases


Version 0.1.3

Files changed (41) hide show
  1. app/code/community/Ampersand/RichRelevance/Block/AddToCart.php +41 -0
  2. app/code/community/Ampersand/RichRelevance/Block/Adminhtml/DownloadButton.php +33 -0
  3. app/code/community/Ampersand/RichRelevance/Block/Adminhtml/PushButton.php +33 -0
  4. app/code/community/Ampersand/RichRelevance/Block/Adminhtml/System/Config/Renderer/Placements.php +34 -0
  5. app/code/community/Ampersand/RichRelevance/Block/Cart.php +33 -0
  6. app/code/community/Ampersand/RichRelevance/Block/Category.php +26 -0
  7. app/code/community/Ampersand/RichRelevance/Block/Checkout.php +83 -0
  8. app/code/community/Ampersand/RichRelevance/Block/Header.php +44 -0
  9. app/code/community/Ampersand/RichRelevance/Block/Item.php +22 -0
  10. app/code/community/Ampersand/RichRelevance/Block/Placement.php +14 -0
  11. app/code/community/Ampersand/RichRelevance/Block/Search.php +59 -0
  12. app/code/community/Ampersand/RichRelevance/Helper/Data.php +210 -0
  13. app/code/community/Ampersand/RichRelevance/Helper/Feed.php +92 -0
  14. app/code/community/Ampersand/RichRelevance/Helper/Log.php +45 -0
  15. app/code/community/Ampersand/RichRelevance/Helper/Service.php +145 -0
  16. app/code/community/Ampersand/RichRelevance/Model/Cron.php +74 -0
  17. app/code/community/Ampersand/RichRelevance/Model/Observer.php +33 -0
  18. app/code/community/Ampersand/RichRelevance/Model/Push.php +38 -0
  19. app/code/community/Ampersand/RichRelevance/changelog.txt +5 -0
  20. app/code/community/Ampersand/RichRelevance/controllers/Adminhtml/RequestController.php +48 -0
  21. app/code/community/Ampersand/RichRelevance/etc/adminhtml.xml +22 -0
  22. app/code/community/Ampersand/RichRelevance/etc/config.xml +131 -0
  23. app/code/community/Ampersand/RichRelevance/etc/integration/out.messages.xml +228 -0
  24. app/code/community/Ampersand/RichRelevance/etc/integration/out.types.xml +84 -0
  25. app/code/community/Ampersand/RichRelevance/etc/system.xml +281 -0
  26. app/code/community/Ampersand/RichRelevance/sql/ampersand_richrelevance_setup/mysql4-install-0.0.1.php +27 -0
  27. app/design/frontend/base/default/layout/ampersand_richrelevance.xml +107 -0
  28. app/design/frontend/base/default/template/ampersand_richrelevance/footer.phtml +7 -0
  29. app/design/frontend/base/default/template/ampersand_richrelevance/header.phtml +35 -0
  30. app/design/frontend/base/default/template/ampersand_richrelevance/placement.phtml +7 -0
  31. app/design/frontend/base/default/template/ampersand_richrelevance/types/add-to-cart.phtml +8 -0
  32. app/design/frontend/base/default/template/ampersand_richrelevance/types/cart.phtml +16 -0
  33. app/design/frontend/base/default/template/ampersand_richrelevance/types/category.phtml +13 -0
  34. app/design/frontend/base/default/template/ampersand_richrelevance/types/checkout.phtml +12 -0
  35. app/design/frontend/base/default/template/ampersand_richrelevance/types/home.phtml +10 -0
  36. app/design/frontend/base/default/template/ampersand_richrelevance/types/item.phtml +15 -0
  37. app/design/frontend/base/default/template/ampersand_richrelevance/types/search.phtml +15 -0
  38. app/etc/modules/Ampersand_RichRelevance.xml +12 -0
  39. lib/licenses/service_richrelevance.lic +10 -0
  40. package.xml +28 -0
  41. skin/frontend/base/default/ampersand_richrelevance/css/default.css +43 -0
app/code/community/Ampersand/RichRelevance/Block/AddToCart.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_AddToCart extends Mage_Core_Block_Template
3
+ {
4
+ protected $_addedToCartItemId;
5
+
6
+ /**
7
+ * Sets the template for add to cart
8
+ *
9
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
10
+ */
11
+ protected function _construct()
12
+ {
13
+ parent::_construct();
14
+ $this->setTemplate('ampersand_richrelevance/types/add-to-cart.phtml');
15
+ }
16
+
17
+ /**
18
+ * Retrieve id of the item last added to the cart
19
+ *
20
+ * @return int
21
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
22
+ */
23
+ public function getAddedToCartItemId()
24
+ {
25
+ if (is_null($this->_addedToCartItemId)) {
26
+ $this->_addedToCartItemId = Mage::getSingleton('core/session')
27
+ ->getData(Ampersand_RichRelevance_Helper_Data::SESSION_KEY_LAST_ADDED_ITEM_ID);
28
+
29
+ Mage::getSingleton('core/session')
30
+ ->unsetData(Ampersand_RichRelevance_Helper_Data::SESSION_KEY_LAST_ADDED_ITEM_ID);
31
+
32
+ $log = Mage::helper('ampersand_richrelevance/log');
33
+ $log->addItem(
34
+ Ampersand_RichRelevance_Helper_Log::TYPE_ADDTOCART,
35
+ "R3_ADDTOCART.addItemIdToCart({$this->_addedToCartItemId});"
36
+ );
37
+ }
38
+
39
+ return $this->_addedToCartItemId;
40
+ }
41
+ }
app/code/community/Ampersand/RichRelevance/Block/Adminhtml/DownloadButton.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Adminhtml_DownloadButton
3
+ extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ /**
6
+ * Define download button properties such as label and associated controller
7
+ *
8
+ * @param Varien_Data_Form_Element_Abstract $element
9
+ * @return string
10
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
11
+ */
12
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
13
+ {
14
+ $this->setElement($element);
15
+
16
+ $store = $this->getRequest()->getParam('store');
17
+ $url = $this->getUrl(
18
+ 'ampersand_richrelevance_admin/request/download',
19
+ array(
20
+ 'store_id' => $store,
21
+ )
22
+ );
23
+
24
+ $html = $this->getLayout()->createBlock('adminhtml/widget_button')
25
+ ->setType('button')
26
+ ->setClass('scalable')
27
+ ->setLabel('Generate and download')
28
+ ->setOnClick("setLocation('{$url}')")
29
+ ->toHtml();
30
+
31
+ return $html;
32
+ }
33
+ }
app/code/community/Ampersand/RichRelevance/Block/Adminhtml/PushButton.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Adminhtml_PushButton
3
+ extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ /**
6
+ * Define push button properties such as label and associated controller
7
+ *
8
+ * @param Varien_Data_Form_Element_Abstract $element
9
+ * @return string
10
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
11
+ */
12
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
13
+ {
14
+ $this->setElement($element);
15
+
16
+ $store = $this->getRequest()->getParam('store');
17
+ $url = $this->getUrl(
18
+ 'ampersand_richrelevance_admin/request/push',
19
+ array(
20
+ 'store_id' => $store,
21
+ )
22
+ );
23
+
24
+ $html = $this->getLayout()->createBlock('adminhtml/widget_button')
25
+ ->setType('button')
26
+ ->setClass('scalable')
27
+ ->setLabel('Generate and push')
28
+ ->setOnClick("setLocation('{$url}')")
29
+ ->toHtml();
30
+
31
+ return $html;
32
+ }
33
+ }
app/code/community/Ampersand/RichRelevance/Block/Adminhtml/System/Config/Renderer/Placements.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Adminhtml_System_Config_Renderer_Placements
3
+ extends Ampersand_Adminhtml_Block_System_Config_Renderer_ArrayAbstract
4
+ {
5
+ /**
6
+ * Define custom renderer for placements table
7
+ *
8
+ * @return Ampersand_RichRelevance_Block_Adminhtml_System_Config_Renderer_Placements
9
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
10
+ */
11
+ protected function _prepareToRender()
12
+ {
13
+ $this->addColumn(
14
+ 'page_type',
15
+ array(
16
+ 'label' => Mage::helper('ampersand_richrelevance')->__('Page Type'),
17
+ 'style' => 'width:100px',
18
+ )
19
+ );
20
+
21
+ $this->addColumn(
22
+ 'name',
23
+ array(
24
+ 'label' => Mage::helper('ampersand_richrelevance')->__('Placement Name'),
25
+ 'style' => 'width:150px',
26
+ )
27
+ );
28
+
29
+ $this->_addAfter = false;
30
+ $this->_addButtonLabel = Mage::helper('ampersand_richrelevance')->__('Add Placement');
31
+
32
+ return $this;
33
+ }
34
+ }
app/code/community/Ampersand/RichRelevance/Block/Cart.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Cart extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Retrieve ids of items in the cart from the session
6
+ *
7
+ * @return array
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ public function getCartItemIds()
11
+ {
12
+ $log = Mage::helper('ampersand_richrelevance/log');
13
+
14
+ $itemCollection = Mage::getSingleton('checkout/session')->getQuote()->getItemsCollection();
15
+
16
+ $cartItemIds = array();
17
+ foreach ($itemCollection as $_item) {
18
+ // Don't use simple products that have associated configurables
19
+ if (!is_null($_item->getParentItemId())) {
20
+ continue;
21
+ }
22
+
23
+ $cartItemId = $_item->getSku();
24
+ $cartItemIds[] = $cartItemId;
25
+ $log->addItem(
26
+ Ampersand_RichRelevance_Helper_Log::TYPE_CART,
27
+ "R3_CART.addItemId({$cartItemId});"
28
+ );
29
+ }
30
+
31
+ return $cartItemIds;
32
+ }
33
+ }
app/code/community/Ampersand/RichRelevance/Block/Category.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Category extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Retrieve category object from registry
6
+ *
7
+ * @return Mage_Catalog_Model_Category $category
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ public function getCategory()
11
+ {
12
+ $category = Mage::registry('current_category');
13
+
14
+ $log = Mage::helper('ampersand_richrelevance/log');
15
+ $log->addItem(
16
+ Ampersand_RichRelevance_Helper_Log::TYPE_CATEGORY,
17
+ "R3_CATEGORY.setId({$category->getId()});"
18
+ );
19
+ $log->addItem(
20
+ Ampersand_RichRelevance_Helper_Log::TYPE_CATEGORY,
21
+ "R3_CATEGORY.setName({$category->getName()});"
22
+ );
23
+
24
+ return $category;
25
+ }
26
+ }
app/code/community/Ampersand/RichRelevance/Block/Checkout.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Checkout extends Mage_Core_Block_Template
3
+ {
4
+ protected $_orderNumber;
5
+
6
+ /**
7
+ * Retrieve order number from registry
8
+ *
9
+ * @return int
10
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
11
+ */
12
+ public function getOrderNumber()
13
+ {
14
+ if (!$this->_orderNumber) {
15
+ $orderIds = Mage::registry(Ampersand_RichRelevance_Helper_Data::REGISTRY_KEY_ORDER_IDS);
16
+ $orderId = reset($orderIds);
17
+
18
+ $order = Mage::getModel('sales/order')->load($orderId);
19
+ $this->_orderNumber = $order->getIncrementId();
20
+ }
21
+
22
+ return $this->_orderNumber;
23
+ }
24
+
25
+ /**
26
+ * Retrieve items from an order
27
+ *
28
+ * @return array
29
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
30
+ */
31
+ public function getOrderItems()
32
+ {
33
+ $orderIds = Mage::registry(Ampersand_RichRelevance_Helper_Data::REGISTRY_KEY_ORDER_IDS);
34
+
35
+ $orderItems = array();
36
+ foreach ($orderIds as $_orderId) {
37
+ $order = Mage::getModel('sales/order')->load($_orderId);
38
+ $items = $order->getAllItems();
39
+
40
+ foreach ($items as $_item) {
41
+ // Don't use simple products that have associated configurables
42
+ if (!is_null($_item->getParentItemId())) {
43
+ continue;
44
+ }
45
+
46
+ $_productId = $_item->getProductId();
47
+ if (array_key_exists($_productId, $orderItems)) {
48
+ $orderItems[$_productId]->setQty(
49
+ $orderItems[$_productId]->getQty() + $_item->getQtyToInvoice()
50
+ );
51
+ } else {
52
+ $formattedPrice = Mage::helper('ampersand_richrelevance')
53
+ ->formatPrice($_item->getPrice());
54
+
55
+ $orderItems[$_productId] = new Varien_Object(
56
+ array(
57
+ 'sku' => $_item->getSku(),
58
+ 'price' => $formattedPrice,
59
+ 'qty' => $_item->getQtyToInvoice(),
60
+ )
61
+ );
62
+ }
63
+ }
64
+ }
65
+
66
+ $log = Mage::helper('ampersand_richrelevance/log');
67
+ $log->addItem(
68
+ Ampersand_RichRelevance_Helper_Log::TYPE_CHECKOUT,
69
+ "R3_PURCHASED.setOrderNumber({$this->getOrderNumber()});"
70
+ );
71
+ foreach ($orderItems as $_productData) {
72
+ $log->addItem(
73
+ Ampersand_RichRelevance_Helper_Log::TYPE_CHECKOUT,
74
+ 'R3_PURCHASED.addItemIdPriceQuantity('
75
+ . $_productData->getSku() . ', '
76
+ . $_productData->getPrice() . ', '
77
+ . $_productData->getQty() .');'
78
+ );
79
+ }
80
+
81
+ return $orderItems;
82
+ }
83
+ }
app/code/community/Ampersand/RichRelevance/Block/Header.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Header extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Retrieve session id
6
+ *
7
+ * @return string
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ public function getSessionId()
11
+ {
12
+ $sessionId = Mage::getSingleton('core/session')->getData('visitor_data/session_id');
13
+
14
+ $log = Mage::helper('ampersand_richrelevance/log');
15
+ $log->addItem(
16
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
17
+ "R3_COMMON.setSessionId({$sessionId});"
18
+ );
19
+
20
+ return $sessionId;
21
+ }
22
+
23
+ /**
24
+ * Retrieve customer id
25
+ *
26
+ * @return int
27
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
28
+ */
29
+
30
+ public function getCustomerId()
31
+ {
32
+ if (!$customerId = Mage::getSingleton('customer/session')->getCustomer()->getId()) {
33
+ $customerId = $this->getSessionId();
34
+ }
35
+
36
+ $log = Mage::helper('ampersand_richrelevance/log');
37
+ $log->addItem(
38
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
39
+ "R3_COMMON.setUserId({$customerId});"
40
+ );
41
+
42
+ return $customerId;
43
+ }
44
+ }
app/code/community/Ampersand/RichRelevance/Block/Item.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Item extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Retrieve product from the Mage registry
6
+ *
7
+ * @return Mage_Catalog_Model_Product $product
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ public function getProduct()
11
+ {
12
+ $product = Mage::registry('current_product');
13
+
14
+ $log = Mage::helper('ampersand_richrelevance/log');
15
+ $log->addItem(
16
+ Ampersand_RichRelevance_Helper_Log::TYPE_ITEM,
17
+ "R3_ITEM.setId({$product->getSku()});"
18
+ );
19
+
20
+ return $product;
21
+ }
22
+ }
app/code/community/Ampersand/RichRelevance/Block/Placement.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Placement extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Set the template
6
+ *
7
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
8
+ */
9
+ public function __construct()
10
+ {
11
+ parent::__construct();
12
+ $this->setTemplate('ampersand_richrelevance/placement.phtml');
13
+ }
14
+ }
app/code/community/Ampersand/RichRelevance/Block/Search.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Block_Search extends Mage_Core_Block_Template
3
+ {
4
+ /**
5
+ * Retrieve search terms
6
+ *
7
+ * @return string
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ public function getTerms()
11
+ {
12
+ $terms = Mage::helper('catalogsearch')->getQueryText();
13
+
14
+ $log = Mage::helper('ampersand_richrelevance/log');
15
+ $log->addItem(
16
+ Ampersand_RichRelevance_Helper_Log::TYPE_SEARCH,
17
+ "R3_SEARCH.setTerms({$terms});"
18
+ );
19
+
20
+ return $terms;
21
+ }
22
+
23
+ /**
24
+ * Retrieves an array of SKUs from a search result
25
+ *
26
+ * @param int $limit
27
+ * @return array
28
+ */
29
+ public function getSkus($limit = Ampersand_RichRelevance_Helper_Data::SEARCH_RESULT_LIMIT)
30
+ {
31
+ $resultCollection = $this->getLayout()->getBlock('search_result_list')
32
+ ->getLoadedProductCollection();
33
+
34
+ $log = Mage::helper('ampersand_richrelevance/log');
35
+
36
+ $counter = 0;
37
+ $skus = array();
38
+ foreach ($resultCollection as $_result) {
39
+ $_sku = $_result->getSku();
40
+ $skus[] = $_sku;
41
+
42
+ $log->addItem(
43
+ Ampersand_RichRelevance_Helper_Log::TYPE_SEARCH,
44
+ "R3_SEARCH.addItemId({$_sku});"
45
+ );
46
+
47
+ /**
48
+ * Limiting this collection size will limit the actual search result set,
49
+ * so instead we must use a counter to break once we have enough results.
50
+ */
51
+ $counter++;
52
+ if ($counter >= $limit) {
53
+ break;
54
+ }
55
+ }
56
+
57
+ return $skus;
58
+ }
59
+ }
app/code/community/Ampersand/RichRelevance/Helper/Data.php ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Helper_Data extends Mage_Core_Helper_Abstract
3
+ {
4
+ const SEARCH_RESULT_LIMIT = 15;
5
+
6
+ const SESSION_KEY_LAST_ADDED_ITEM_ID = 'richrelevance_last_added_item_id';
7
+
8
+ const REGISTRY_KEY_ORDER_IDS = 'richrelevance_last_order_ids';
9
+
10
+ /**
11
+ * Retrieve directory separator constant not available to integration
12
+ * xml files
13
+ *
14
+ * @todo Find out if this is a mapper in the integration module
15
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.co.uk>
16
+ */
17
+ public function getDirectorySeparator()
18
+ {
19
+ return DS;
20
+ }
21
+
22
+ /**
23
+ * Retrieve the store config to check that RichRelevance is enabled
24
+ * for a particular store, also returns false if the API key is not
25
+ * set
26
+ *
27
+ * @param Mage_Core_Model_Store $store
28
+ * @return boolean
29
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
30
+ */
31
+ public function isEnabled($store = null)
32
+ {
33
+ if (!Mage::getStoreConfig('ampersand_richrelevance/general_settings/enabled', $store)) {
34
+ return false;
35
+ }
36
+
37
+ if (!Mage::getStoreConfig('ampersand_richrelevance/api_conn_settings/api_key', $store)) {
38
+ return false;
39
+ }
40
+
41
+ return true;
42
+ }
43
+
44
+ /**
45
+ * Retrieve the HTML for a placement specified in the parameter
46
+ *
47
+ * @param string $placementName
48
+ * @return string
49
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
50
+ */
51
+ public function getPlacement($placementName)
52
+ {
53
+ $block = Mage::app()->getLayout()->createBlock('ampersand_richrelevance/placement')
54
+ ->setPlacementName($placementName);
55
+
56
+ return $block->toHtml();
57
+ }
58
+
59
+ /**
60
+ * Retrieves an array of placements for a particular page type as
61
+ * specified in the admin panel
62
+ *
63
+ * @param string $pageType
64
+ * @return array
65
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
66
+ */
67
+ public function getPagePlacements($pageType)
68
+ {
69
+ $placements = Mage::getStoreConfig('ampersand_richrelevance/placement_settings/placements');
70
+ $placements = unserialize($placements);
71
+
72
+ $placementsArray = array();
73
+ $_placementObject = new Varien_Object();
74
+ foreach ($placements as $_placement) {
75
+ $_placementObject->setData($_placement);
76
+ $_placementType = $_placementObject->getPageType();
77
+ $_placementName = $_placementObject->getName();
78
+ if ($_placementType == $pageType) {
79
+ $placementsArray[] = $_placementName;
80
+ }
81
+ }
82
+
83
+ $log = Mage::helper('ampersand_richrelevance/log');
84
+ foreach ($placementsArray as $_pagePlacement) {
85
+ $log->addItem(
86
+ Ampersand_RichRelevance_Helper_Log::TYPE_PLACEMENT,
87
+ "R3_COMMON.addPlacementType({$pageType}.{$_pagePlacement});"
88
+ );
89
+ }
90
+
91
+ return $placementsArray;
92
+ }
93
+
94
+ /**
95
+ * Retrieve the FTP Host from the configuration file
96
+ *
97
+ * @return string
98
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
99
+ */
100
+ public function getFtpHost()
101
+ {
102
+ return Mage::app()->getConfig()->getNode('ampersand_richrelevance/ftp_host');
103
+ }
104
+
105
+ /**
106
+ * Retrieve the API key from the admin panel
107
+ *
108
+ * @return string
109
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
110
+ */
111
+ public function getApiKey()
112
+ {
113
+ $apiKey = Mage::getStoreConfig('ampersand_richrelevance/api_conn_settings/api_key');
114
+
115
+ $log = Mage::helper('ampersand_richrelevance/log');
116
+ $log->addItem(
117
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
118
+ "R3_COMMON.setApiKey({$apiKey});"
119
+ );
120
+
121
+ return $apiKey;
122
+ }
123
+
124
+ /**
125
+ * Determine whether developer mode is enabled
126
+ *
127
+ * @return boolean
128
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
129
+ */
130
+ public function getDeveloperMode()
131
+ {
132
+ $developerMode =
133
+ Mage::getStoreConfig('ampersand_richrelevance/developer_settings/developer_mode');
134
+
135
+ $log = Mage::helper('ampersand_richrelevance/log');
136
+ $developerModeVerbose = $developerMode ? 'true' : 'false';
137
+ $log->addItem(
138
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
139
+ "R3_COMMON.forceDevMode({$developerModeVerbose});"
140
+ );
141
+
142
+ return $developerMode;
143
+ }
144
+
145
+ /**
146
+ * Determine whether force display mode is enabled
147
+ *
148
+ * @return boolean
149
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
150
+ */
151
+ public function getForceDisplayMode()
152
+ {
153
+ $forceDisplayMode =
154
+ Mage::getStoreConfig('ampersand_richrelevance/developer_settings/display_mode');
155
+
156
+ $log = Mage::helper('ampersand_richrelevance/log');
157
+ $forceDisplayModeVerbose = $forceDisplayMode ? 'true' : 'false';
158
+ $log->addItem(
159
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
160
+ "R3_COMMON.forceDisplayMode({$forceDisplayModeVerbose});"
161
+ );
162
+
163
+ return $forceDisplayMode;
164
+ }
165
+
166
+ /**
167
+ * Determine whether dummy data mode is enabled
168
+ *
169
+ * @return boolean
170
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
171
+ */
172
+ public function getDummyDataMode()
173
+ {
174
+ $dummyDataMode =
175
+ Mage::getStoreConfig('ampersand_richrelevance/developer_settings/allow_dummy_products');
176
+
177
+ $log = Mage::helper('ampersand_richrelevance/log');
178
+ $dummyDataModeVerbose = $dummyDataMode ? 'true' : 'false';
179
+ $log->addItem(
180
+ Ampersand_RichRelevance_Helper_Log::TYPE_SETTINGS,
181
+ "R3_COMMON.useDummyData({$dummyDataModeVerbose});"
182
+ );
183
+
184
+ return $dummyDataMode;
185
+ }
186
+
187
+ /**
188
+ * Generate HTML for add to basket
189
+ *
190
+ * @return string
191
+ */
192
+ public function getAddToBasketBlock()
193
+ {
194
+ $block = Mage::app()->getLayout()->createBlock('ampersand_richrelevance/addToCart');
195
+
196
+ return $block;
197
+ }
198
+
199
+ /**
200
+ * Convert the price to a USD format with 2 decimal places
201
+ *
202
+ * @param string $price
203
+ * @return string
204
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
205
+ */
206
+ public function formatPrice($price)
207
+ {
208
+ return number_format($price, 2, '.', '');
209
+ }
210
+ }
app/code/community/Ampersand/RichRelevance/Helper/Feed.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Helper_Feed extends Mage_Core_Helper_Abstract
3
+ {
4
+ /**
5
+ * @todo These values should be in the transformations as subject to change
6
+ */
7
+ const RECOMMENDABLE_YES = 'y';
8
+ const RECOMMENDABLE_NO = 'n';
9
+
10
+ /**
11
+ * Retrieve whether a product is recommendable based on its recommendable
12
+ * settings, inclusion of out of stock products, and its availability
13
+ *
14
+ * @param Mage_Catalog_Model_Product $product
15
+ * @return string
16
+ */
17
+ public function getIsRecommendable($product)
18
+ {
19
+ // if the product is not recommendable, we don't need to check any further
20
+ if (!$product->getIsRecommendable()) {
21
+ return self::RECOMMENDABLE_NO;
22
+ }
23
+
24
+ // if we dont care about out of stock products, we don't need to check any further
25
+ $includeOutOfStockProducts =
26
+ 'ampersand_richrelevance/placement_settings/include_out_of_stock_products';
27
+ $store = Mage::helper('ampersand_richrelevance/service')->getCurrentStore();
28
+ if (Mage::getStoreConfig($includeOutOfStockProducts, $store)) {
29
+ return self::RECOMMENDABLE_YES;
30
+ }
31
+
32
+ // the final decision is based on whether this product is in stock
33
+ $stockItem = $product->getStockItem();
34
+ if (!is_object($stockItem)) {
35
+ // product is not under stock control
36
+ return self::RECOMMENDABLE_YES;
37
+ } elseif ($stockItem->getIsInStock() && $stockItem->getQty() > 0) {
38
+ // product is in stock and has quantity
39
+ return self::RECOMMENDABLE_YES;
40
+ } else {
41
+ // product is not in stock
42
+ return self::RECOMMENDABLE_NO;
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Retrieve the number of reviews for a specified product in the current store.
48
+ *
49
+ * @param int $productId
50
+ * @return int
51
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
52
+ */
53
+ public function getNumOfReviews($productId)
54
+ {
55
+ $store = Mage::helper('ampersand_richrelevance/service')->getCurrentStore();
56
+ $summaryData = $this->_getReviewSummary($productId, $store);
57
+ $noOfReviews = $summaryData->getReviewsCount();
58
+ return is_null($noOfReviews) ? '0' : $noOfReviews;
59
+ }
60
+
61
+ /**
62
+ * Retrieve the rating of a particular product as a percentage.
63
+ *
64
+ * @param int $productId
65
+ * @return string
66
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
67
+ */
68
+ public function getRating($productId)
69
+ {
70
+ $store = Mage::helper('ampersand_richrelevance/service')->getCurrentStore();
71
+ $summaryData = $this->_getReviewSummary($productId, $store);
72
+ return $summaryData->getRatingSummary();
73
+ }
74
+
75
+ /**
76
+ * Common functionality to retrieve review information for a product.
77
+ *
78
+ * @param type $productId
79
+ * @param type $storeId
80
+ * @return type
81
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
82
+ */
83
+ protected function _getReviewSummary($productId, $storeId = null)
84
+ {
85
+ $store = Mage::app()->getStore($storeId);
86
+ $summaryCollection = Mage::getResourceModel('review/review_summary_collection')
87
+ ->addStoreFilter($store->getId())
88
+ ->addEntityFilter($productId);
89
+
90
+ return $summaryCollection->getFirstItem();
91
+ }
92
+ }
app/code/community/Ampersand/RichRelevance/Helper/Log.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Helper_Log extends Mage_Core_Helper_Abstract
3
+ {
4
+ const TYPE_FEED = 'feed';
5
+
6
+ const TYPE_ITEM = 'item';
7
+
8
+ const TYPE_CATEGORY = 'category';
9
+
10
+ const TYPE_SEARCH = 'search';
11
+
12
+ const TYPE_ADDTOCART = 'addtocart';
13
+
14
+ const TYPE_CART = 'cart';
15
+
16
+ const TYPE_CHECKOUT = 'checkout';
17
+
18
+ const TYPE_PLACEMENT = 'placement';
19
+
20
+ const TYPE_SETTINGS = 'settings';
21
+
22
+ /**
23
+ * Adds a log message
24
+ *
25
+ * This needs to be refactored to push data in to the integration database table
26
+ *
27
+ * @param string $type
28
+ * @param string $message
29
+ * @param mixed $store
30
+ * @return Ampersand_RichRelevance_Helper_Log
31
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
32
+ */
33
+ public function addItem($type, $message, $storeId = null)
34
+ {
35
+ $store = Mage::app()->getStore($storeId);
36
+
37
+ if (!Mage::getStoreConfig("ampersand_richrelevance/log_settings/{$type}", $store)) {
38
+ return;
39
+ }
40
+
41
+ Mage::log($message, null, "richrelevance-{$store->getCode()}-{$type}.log");
42
+
43
+ return $this;
44
+ }
45
+ }
app/code/community/Ampersand/RichRelevance/Helper/Service.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Helper_Service extends Ampersand_Integration_Helper_ServiceAbstract
3
+ {
4
+ /**
5
+ * Retrieves service code for use in integration module
6
+ *
7
+ * @return string
8
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
9
+ */
10
+ protected function _getServiceCode()
11
+ {
12
+ return 'richrelevance';
13
+ }
14
+
15
+ /**
16
+ * Retrieves the store code for the current store as set in
17
+ * Ampersand_Integration_Helper_ServiceAbstract
18
+ *
19
+ * @return string
20
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
21
+ */
22
+ public function getCurrentStoreCode()
23
+ {
24
+ return $this->getCurrentStore()->getCode();
25
+ }
26
+
27
+ /**
28
+ * Executes the creation of the catalog feed using the integration
29
+ * module, returns the directory where the feed was placed
30
+ *
31
+ * @return string
32
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
33
+ */
34
+ public function exportCatalogData()
35
+ {
36
+ $currentStore = $this->getCurrentStore();
37
+
38
+ $maxProductsToSend =
39
+ Mage::app()->getConfig()->getNode('ampersand_richrelevance/max_products_to_send');
40
+
41
+ $productCollection = Mage::getModel('catalog/product')->getCollection()
42
+ ->addAttributeToSelect('*')
43
+ ->setStore($currentStore)
44
+ ->addAttributeToFilter('price', array('gt' => '0'))
45
+ ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
46
+ ->setPageSize($maxProductsToSend);
47
+
48
+ Mage::getModel('catalog/product_visibility')
49
+ ->addVisibleInSiteFilterToCollection($productCollection);
50
+
51
+ /**
52
+ * Really dirty, but we need to be absolutely sure each product is in the correct scope.
53
+ * Setting the scope of the collection above does not seem to be enough for product urls.
54
+ */
55
+ foreach ($productCollection as $_product) {
56
+ $_product->setStoreId($currentStore->getId());
57
+ }
58
+
59
+ $maxCategoriesToSend =
60
+ Mage::app()->getConfig()->getNode('ampersand_richrelevance/max_categories_to_send');
61
+
62
+ $rootCategory = $currentStore->getRootCategoryId();
63
+ $rootPath = Mage::getModel('catalog/category')->load($rootCategory)->getPath();
64
+ $categoryCollection = Mage::getModel('catalog/category')->getCollection()
65
+ ->addAttributeToSelect('*')
66
+ ->addAttributeToFilter('path', array('like' => "$rootPath%"))
67
+ ->addAttributeToFilter('level', array('gt' => '1'))
68
+ ->setPageSize($maxCategoriesToSend);
69
+
70
+ // we need to override the admin area for images to work
71
+ $currentArea = Mage::getDesign()->getArea();
72
+ Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
73
+
74
+ $filePath = $this->exportProducts($productCollection);
75
+ $this->exportCategories($categoryCollection);
76
+ $this->exportProductCategories($productCollection);
77
+
78
+ // set the current area back to what it was
79
+ Mage::getDesign()->setArea($currentArea);
80
+
81
+ return dirname($filePath);
82
+ }
83
+
84
+ /**
85
+ * Export the product feed specifically
86
+ *
87
+ * @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection $productCollection
88
+ * @return string
89
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
90
+ */
91
+ public function exportProducts($productCollection)
92
+ {
93
+ return $this->getService()->exportProducts($productCollection);
94
+ }
95
+
96
+ /**
97
+ * Export the category feed specifically
98
+ *
99
+ * @param Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection $categoryCollection
100
+ * @return string
101
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
102
+ */
103
+ public function exportCategories($categoryCollection)
104
+ {
105
+ return $this->getService()->exportCategories($categoryCollection);
106
+ }
107
+
108
+ /**
109
+ * Export the products in categories feed specifically
110
+ *
111
+ * @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection $productCollection
112
+ * @return string
113
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
114
+ */
115
+ public function exportProductCategories($productCollection)
116
+ {
117
+ $productCategories = array();
118
+
119
+ foreach ($productCollection as $_product) {
120
+ foreach ($_product->getCategoryIds() as $_categoryId)
121
+ $productCategories[] = array(
122
+ 'sku' => $_product->getSku(),
123
+ 'category_id' => $_categoryId,
124
+ );
125
+ }
126
+
127
+ return $this->getService()->exportProductCategories($productCategories);
128
+ }
129
+
130
+ /**
131
+ * Return whether a category is a root category for the current store.
132
+ *
133
+ * @param int $categoryId
134
+ * @return bool
135
+ * @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
136
+ */
137
+ public function getIsRootCategory($categoryId, $store = null)
138
+ {
139
+ if (!$store) {
140
+ $store = $this->getCurrentStore();
141
+ }
142
+
143
+ return ($categoryId == $store->getRootCategoryId()) ? true : false;
144
+ }
145
+ }
app/code/community/Ampersand/RichRelevance/Model/Cron.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Model_Cron
3
+ {
4
+ const KEEP_ZIP_INTERVAL_IN_SECONDS = 86400; // A day in seconds
5
+
6
+ /**
7
+ * For each store, create the feeds and push them to RichRelevance via FTP
8
+ *
9
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.co.uk>
10
+ */
11
+ public function run()
12
+ {
13
+ $stores = Mage::app()->getStores();
14
+
15
+ $richRelevanceAccounts = array();
16
+ foreach ($stores as $_store) {
17
+ $ftpUser = Mage::getStoreConfig(
18
+ 'ampersand_richrelevance/api_conn_settings/ftp_user',
19
+ $_store
20
+ );
21
+
22
+ if (!in_array($ftpUser, $richRelevanceAccounts)) {
23
+ $richRelevanceAccounts[] = $ftpUser;
24
+ Mage::getModel('ampersand_richrelevance/push')->pushToFtp($_store);
25
+ }
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Delete feed zip files that are more than x days old as specified
31
+ * in the admin panel
32
+ *
33
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.co.uk>
34
+ */
35
+ public function deleteOldZipFiles()
36
+ {
37
+ $log = Mage::helper('ampersand_richrelevance/log');
38
+
39
+ $zipFiles = Mage::getBaseDir('var') . DS . 'rich_relevance' . DS . 'zips';
40
+
41
+
42
+ if (!$handle = opendir($zipFiles)) {
43
+ return;
44
+ }
45
+
46
+ while (false !== ($file = readdir($handle))) {
47
+ if ($file == ".." || $file == ".") {
48
+ continue;
49
+ }
50
+
51
+ $zipKeepTimePath = 'ampersand_richrelevance/log_settings/time_to_keep_zip_files';
52
+ $zipKeepTime = Mage::getStoreConfig($zipKeepTimePath);
53
+ $deleteBefore = time() - ($zipKeepTime * self::KEEP_ZIP_INTERVAL_IN_SECONDS);
54
+
55
+ $filePath = $zipFiles . DS . $file;
56
+
57
+ if (filemtime($filePath) < $deleteBefore) {
58
+ try {
59
+ unlink($filePath);
60
+ $log->addItem(
61
+ Ampersand_RichRelevance_Helper_Log::TYPE_FEED,
62
+ "File successfully deleted: {$file}"
63
+ );
64
+ } catch (Exception $e) {
65
+ $log->addItem(
66
+ Ampersand_RichRelevance_Helper_Log::TYPE_FEED,
67
+ $e->getMessage()
68
+ );
69
+ Mage::throwException($e);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
app/code/community/Ampersand/RichRelevance/Model/Observer.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Model_Observer extends Mage_Core_Model_Abstract
3
+ {
4
+ /**
5
+ * Get the newly created order Ids from the even and set them in the registry
6
+ * to make them accessible from a block
7
+ *
8
+ * @param Varien_Event_Observer $observer
9
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
10
+ */
11
+ public function getOrderData(Varien_Event_Observer $observer)
12
+ {
13
+ $orderIds = $observer->getEvent()->getData('order_ids');
14
+ Mage::register(Ampersand_RichRelevance_Helper_Data::REGISTRY_KEY_ORDER_IDS, $orderIds);
15
+ }
16
+
17
+ /**
18
+ * Retrieve the SKU of the product that was last added to the cart and
19
+ * set it as a session variable
20
+ *
21
+ * @param Varien_Event_Observer $observer
22
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
23
+ */
24
+ public function getJustAddedProductSku(Varien_Event_Observer $observer)
25
+ {
26
+ $product = $observer->getEvent()->getProduct();
27
+
28
+ Mage::getSingleton('core/session')->setData(
29
+ Ampersand_RichRelevance_Helper_Data::SESSION_KEY_LAST_ADDED_ITEM_ID,
30
+ $product->getSku()
31
+ );
32
+ }
33
+ }
app/code/community/Ampersand/RichRelevance/Model/Push.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Model_Push extends Mage_Core_Model_Abstract
3
+ {
4
+ /**
5
+ * Checks RichRelevance is enabled for a particular store, if it is then
6
+ * send all the feeds via FTP
7
+ *
8
+ * @param Mage_Core_Model_Store $store
9
+ * @return Ampersand_RichRelevance_Model_Push
10
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
11
+ */
12
+ public function pushToFtp($store)
13
+ {
14
+ $log = Mage::helper('ampersand_richrelevance/log');
15
+ $enabled = Mage::helper('ampersand_richrelevance')->isEnabled($store);
16
+ if (!$enabled) {
17
+ return;
18
+ }
19
+ try {
20
+ Mage::helper('ampersand_richrelevance/service')->setCurrentStore($store);
21
+ Mage::helper('ampersand_richrelevance/service')->getService()->sendAll();
22
+ $log->addItem(
23
+ Ampersand_RichRelevance_Helper_Log::TYPE_FEED,
24
+ 'Successfully transmitted feeds',
25
+ $store
26
+ );
27
+ } catch (Exception $e) {
28
+ $log->addItem(
29
+ Ampersand_RichRelevance_Helper_Log::TYPE_FEED,
30
+ $e->getMessage(),
31
+ $store
32
+ );
33
+ Mage::throwException($e);
34
+ }
35
+
36
+ return $this;
37
+ }
38
+ }
app/code/community/Ampersand/RichRelevance/changelog.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ 27/09/2011 - v0.1.2 - Corrected bug from v0.1.1 where Ampersand_RichRelevance_Helper_Service::getCurrentStoreCode() was incorrectly removed. This was uncovered in Magento RichRelevance error logs rather than test suite exceptions due to try/catch in Push::pushToFtp() not re-throwing exceptions after logging.
2
+
3
+ 23/09/2011 - v0.1.1 - When exporting catalog data to RichRelevance, ensure product urls are generated in the correct store scope.
4
+
5
+ 22/09/2011 - v0.1.0 - Initial release.
app/code/community/Ampersand/RichRelevance/controllers/Adminhtml/RequestController.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Ampersand_RichRelevance_Adminhtml_RequestController extends Mage_Adminhtml_Controller_Action
3
+ {
4
+ /**
5
+ * Prepare feeds for download and send download headers
6
+ *
7
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
8
+ */
9
+ public function downloadAction()
10
+ {
11
+ $storeCode = $this->getRequest()->getParam('store_id');
12
+ Mage::helper('ampersand_richrelevance/service')->setCurrentStore($storeCode);
13
+
14
+ Mage::helper('ampersand_richrelevance/service')->getService()->exportAll();
15
+
16
+ $uriData = array(
17
+ 'type' => 'filename',
18
+ 'value' => Mage::getBaseDir('var') . DS . 'rich_relevance' . DS . 'catalog.zip',
19
+ );
20
+
21
+ // buffer output to prevent 'Headers already sent' warnings
22
+ ob_start();
23
+
24
+ $this->_prepareDownloadResponse($storeCode . '_catalog.zip', $uriData);
25
+ }
26
+
27
+ /*
28
+ * Push feeds to FTP host and redirect back to the admin panel
29
+ *
30
+ * @author Matthew Haworth <matthew.haworth@ampersandcommerce.com>
31
+ */
32
+ public function pushAction()
33
+ {
34
+ $storeId = $this->getRequest()->getParam('store_id');
35
+
36
+ Mage::getModel('ampersand_richrelevance/push')->pushToFtp($storeId);
37
+
38
+ $store = Mage::app()->getStore($storeId);
39
+ $website = $store->getWebsite();
40
+ $this->_redirect(
41
+ "adminhtml/system_config/edit",
42
+ array('section' => 'ampersand_richrelevance',
43
+ 'website' => $website->getCode(),
44
+ 'store' => $store->getCode(),
45
+ )
46
+ );
47
+ }
48
+ }
app/code/community/Ampersand/RichRelevance/etc/adminhtml.xml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <adminhtml>
3
+ <acl>
4
+ <resources>
5
+ <admin>
6
+ <children>
7
+ <system>
8
+ <children>
9
+ <config>
10
+ <children>
11
+ <ampersand_richrelevance translate="title" module="ampersand_richrelevance">
12
+ <title>RichRelevance</title>
13
+ </ampersand_richrelevance>
14
+ </children>
15
+ </config>
16
+ </children>
17
+ </system>
18
+ </children>
19
+ </admin>
20
+ </resources>
21
+ </acl>
22
+ </adminhtml>
app/code/community/Ampersand/RichRelevance/etc/config.xml ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <modules>
4
+ <Ampersand_RichRelevance>
5
+ <version>0.1.2</version>
6
+ </Ampersand_RichRelevance>
7
+ </modules>
8
+ <global>
9
+ <blocks>
10
+ <ampersand_richrelevance>
11
+ <class>Ampersand_RichRelevance_Block</class>
12
+ </ampersand_richrelevance>
13
+ </blocks>
14
+ <models>
15
+ <ampersand_richrelevance>
16
+ <class>Ampersand_RichRelevance_Model</class>
17
+ </ampersand_richrelevance>
18
+ </models>
19
+ <events>
20
+ <checkout_onepage_controller_success_action>
21
+ <observers>
22
+ <ampersand_richrelevance_product>
23
+ <type>singleton</type>
24
+ <class>ampersand_richrelevance/observer</class>
25
+ <method>getProductData</method>
26
+ </ampersand_richrelevance_product>
27
+ <ampersand_richrelevance_order>
28
+ <type>singleton</type>
29
+ <class>ampersand_richrelevance/observer</class>
30
+ <method>getOrderData</method>
31
+ </ampersand_richrelevance_order>
32
+ </observers>
33
+ </checkout_onepage_controller_success_action>
34
+ <checkout_multishipping_controller_success_action>
35
+ <observers>
36
+ <ampersand_richrelevance_product>
37
+ <type>singleton</type>
38
+ <class>ampersand_richrelevance/observer</class>
39
+ <method>getProductData</method>
40
+ </ampersand_richrelevance_product>
41
+ <ampersand_richrelevance_order>
42
+ <type>singleton</type>
43
+ <class>ampersand_richrelevance/observer</class>
44
+ <method>getOrderData</method>
45
+ </ampersand_richrelevance_order>
46
+ </observers>
47
+ </checkout_multishipping_controller_success_action>
48
+ <checkout_cart_product_add_after>
49
+ <observers>
50
+ <ampersand_richrelevance>
51
+ <type>singleton</type>
52
+ <class>ampersand_richrelevance/observer</class>
53
+ <method>getJustAddedProductSku</method>
54
+ </ampersand_richrelevance>
55
+ </observers>
56
+ </checkout_cart_product_add_after>
57
+ </events>
58
+ <resources>
59
+ <ampersand_richrelevance_setup>
60
+ <setup>
61
+ <module>Ampersand_RichRelevance</module>
62
+ </setup>
63
+ <connection>
64
+ <use>core_setup</use>
65
+ </connection>
66
+ </ampersand_richrelevance_setup>
67
+ </resources>
68
+ <helpers>
69
+ <ampersand_richrelevance>
70
+ <class>Ampersand_RichRelevance_Helper</class>
71
+ </ampersand_richrelevance>
72
+ </helpers>
73
+ </global>
74
+ <frontend>
75
+ <layout>
76
+ <updates>
77
+ <ampersand_richrelevance module="Ampersand_RichRelevance">
78
+ <file>ampersand_richrelevance.xml</file>
79
+ </ampersand_richrelevance>
80
+ </updates>
81
+ </layout>
82
+ </frontend>
83
+ <admin>
84
+ <routers>
85
+ <ampersand_richrelevance_admin>
86
+ <use>admin</use>
87
+ <args>
88
+ <module>Ampersand_RichRelevance_Adminhtml</module>
89
+ <frontName>ampersand-richrelevance-admin</frontName>
90
+ </args>
91
+ </ampersand_richrelevance_admin>
92
+ </routers>
93
+ </admin>
94
+ <crontab>
95
+ <jobs>
96
+ <ampersand_richrelevance_cron_run>
97
+ <schedule>
98
+ <cron_expr>0 2 * * *</cron_expr>
99
+ </schedule>
100
+ <run>
101
+ <model>ampersand_richrelevance/cron::run</model>
102
+ </run>
103
+ </ampersand_richrelevance_cron_run>
104
+ <ampersand_richrelevance_cron_deleteOldZips>
105
+ <schedule>
106
+ <cron_expr>0 1 * * *</cron_expr>
107
+ </schedule>
108
+ <run>
109
+ <model>ampersand_richrelevance/cron::deleteOldZipFiles</model>
110
+ </run>
111
+ </ampersand_richrelevance_cron_deleteOldZips>
112
+ </jobs>
113
+ </crontab>
114
+ <ampersand_richrelevance>
115
+ <max_products_to_send>25000</max_products_to_send>
116
+ <max_categories_to_send>5000</max_categories_to_send>
117
+ <ftp_host>dashboard.richrelevance.com</ftp_host>
118
+ </ampersand_richrelevance>
119
+ <default>
120
+ <ampersand_richrelevance>
121
+ <placement_settings>
122
+ <placements><![CDATA[a:6:{i:0;a:2:{s:9:"page_type";s:9:"cart_page";s:4:"name";s:10:"placement1";}i:1;a:2:{s:9:"page_type";s:13:"category_page";s:4:"name";s:10:"placement1";}i:2;a:2:{s:9:"page_type";s:9:"home_page";s:4:"name";s:10:"placement1";}i:3;a:2:{s:9:"page_type";s:9:"item_page";s:4:"name";s:10:"placement1";}i:4;a:2:{s:9:"page_type";s:9:"item_page";s:4:"name";s:10:"placement2";}i:5;a:2:{s:9:"page_type";s:11:"search_page";s:4:"name";s:10:"placement1";}}]]></placements>
123
+ </placement_settings>
124
+ <log_settings>
125
+ <feed>1</feed>
126
+ <checkout>1</checkout>
127
+ <time_to_keep_zip_files>10</time_to_keep_zip_files>
128
+ </log_settings>
129
+ </ampersand_richrelevance>
130
+ </default>
131
+ </config>
app/code/community/Ampersand/RichRelevance/etc/integration/out.messages.xml ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <integration xmlns:richrelevance="http://www.ampersandit.co.uk/richrelevance">
3
+ <richrelevance:export>
4
+ <transport>
5
+ <type>file</type>
6
+ <config>
7
+ <base_directory_path mapper="method">
8
+ <_class>Mage</_class>
9
+ <_method>getBaseDir</_method>
10
+ <_params>
11
+ <type>var</type>
12
+ </_params>
13
+ </base_directory_path>
14
+ <directory_path>rich_relevance/zip_data</directory_path>
15
+ <filename_extension>tsv</filename_extension>
16
+ <on_file_exists>truncate</on_file_exists>
17
+ </config>
18
+ </transport>
19
+ <response_handlers>
20
+ <get_file_path>
21
+ <type>filter</type>
22
+ <input_key>response/file_path</input_key>
23
+ <output_key>output</output_key>
24
+ </get_file_path>
25
+ </response_handlers>
26
+ </richrelevance:export>
27
+
28
+ <richrelevance:exportAll>
29
+ <transport>
30
+ <type>file</type>
31
+ <config>
32
+ <base_directory_path mapper="method">
33
+ <_class>Mage</_class>
34
+ <_method>getBaseDir</_method>
35
+ <_params>
36
+ <type>var</type>
37
+ </_params>
38
+ </base_directory_path>
39
+ <directory_path>rich_relevance</directory_path>
40
+ <filename>catalog</filename>
41
+ <filename_extension>zip</filename_extension>
42
+ <on_file_exists>truncate</on_file_exists>
43
+ </config>
44
+ </transport>
45
+ <request_handlers>
46
+ <export_catalog>
47
+ <type>callback</type>
48
+ <output_key>export_directory_path</output_key>
49
+ <config>
50
+ <object mapper="method">
51
+ <_class>Mage</_class>
52
+ <_method>helper</_method>
53
+ <_params>
54
+ <helper>ampersand_richrelevance/service</helper>
55
+ </_params>
56
+ </object>
57
+ <method>exportCatalogData</method>
58
+ </config>
59
+ </export_catalog>
60
+ <zip_content>
61
+ <type>filter</type>
62
+ <input_key>export_directory_path</input_key>
63
+ <output_key>request/content</output_key>
64
+ <after>export_catalog</after>
65
+ <config>
66
+ <type>compress_dir</type>
67
+ <config>
68
+ <adapter>zip</adapter>
69
+ </config>
70
+ </config>
71
+ </zip_content>
72
+ </request_handlers>
73
+ </richrelevance:exportAll>
74
+
75
+ <richrelevance:sendAll>
76
+ <transport>
77
+ <type>ftp</type>
78
+ <config>
79
+ <host mapper="mage_helper">
80
+ <_helper>ampersand_richrelevance/data</_helper>
81
+ <_method>getFtpHost</_method>
82
+ </host>
83
+ <user mapper="mage_store_config">
84
+ <_path>ampersand_richrelevance/api_conn_settings/ftp_user</_path>
85
+ <_store mapper="mage_helper">
86
+ <_helper>ampersand_richrelevance/service</_helper>
87
+ <_method>getCurrentStoreCode</_method>
88
+ </_store>
89
+ </user>
90
+ <password mapper="mage_store_config">
91
+ <_path>ampersand_richrelevance/api_conn_settings/ftp_password</_path>
92
+ <_store mapper="mage_helper">
93
+ <_helper>ampersand_richrelevance/service</_helper>
94
+ <_method>getCurrentStoreCode</_method>
95
+ </_store>
96
+ </password>
97
+ <filename>catalog</filename>
98
+ <filename mapper="concatenate">
99
+ <storeCode mapper="mage_helper">
100
+ <_helper>ampersand_richrelevance/service</_helper>
101
+ <_method>getCurrentStoreCode</_method>
102
+ </storeCode>
103
+ <catalog>_catalog</catalog>
104
+ </filename>
105
+ <filename_extension>zip</filename_extension>
106
+ <on_file_exists>truncate</on_file_exists>
107
+ </config>
108
+ </transport>
109
+ <request_handlers>
110
+ <export_catalog>
111
+ <type>callback</type>
112
+ <output_key>export_directory_path</output_key>
113
+ <config>
114
+ <object mapper="method">
115
+ <_class>Mage</_class>
116
+ <_method>helper</_method>
117
+ <_params>
118
+ <helper>ampersand_richrelevance/service</helper>
119
+ </_params>
120
+ </object>
121
+ <method>exportCatalogData</method>
122
+ </config>
123
+ </export_catalog>
124
+ <zip_content>
125
+ <type>filter</type>
126
+ <input_key>export_directory_path</input_key>
127
+ <output_key>request/content</output_key>
128
+ <after>export_catalog</after>
129
+ <config>
130
+ <type>compress_dir</type>
131
+ <config>
132
+ <adapter>zip</adapter>
133
+ <adapterOptions>
134
+ <archive mapper="concatenate">
135
+ <fromRootDirectory mapper="method">
136
+ <_object>Mage</_object>
137
+ <_method>getBaseDir</_method>
138
+ <_params>
139
+ <var>var</var>
140
+ </_params>
141
+ </fromRootDirectory>
142
+ <directory_sep mapper="mage_helper">
143
+ <_helper>ampersand_richrelevance/data</_helper>
144
+ <_method>getDirectorySeparator</_method>
145
+ </directory_sep>
146
+ <richrelevance>rich_relevance</richrelevance>
147
+ <directory_sep mapper="mage_helper">
148
+ <_helper>ampersand_richrelevance/data</_helper>
149
+ <_method>getDirectorySeparator</_method>
150
+ </directory_sep>
151
+ <zips>zips</zips>
152
+ <directory_sep mapper="mage_helper">
153
+ <_helper>ampersand_richrelevance/data</_helper>
154
+ <_method>getDirectorySeparator</_method>
155
+ </directory_sep>
156
+ <filename mapper="concatenate">
157
+ <storeCode mapper="mage_helper">
158
+ <_helper>ampersand_richrelevance/service</_helper>
159
+ <_method>getCurrentStoreCode</_method>
160
+ </storeCode>
161
+ <catalog>-catalog-</catalog>
162
+ <time mapper="function">
163
+ <_function>time</_function>
164
+ </time>
165
+ <fileExtension>.zip</fileExtension>
166
+ </filename>
167
+ </archive>
168
+ </adapterOptions>
169
+ </config>
170
+ </config>
171
+ </zip_content>
172
+ </request_handlers>
173
+ </richrelevance:sendAll>
174
+
175
+ <richrelevance:exportProducts extends="richrelevance:export">
176
+ <transport>
177
+ <config>
178
+ <filename>products_full</filename>
179
+ </config>
180
+ </transport>
181
+ <request_handlers>
182
+ <map_order>
183
+ <type>transform</type>
184
+ <input_key>input</input_key>
185
+ <output_key>request/content</output_key>
186
+ <config>
187
+ <type>richrelevance:products_full</type>
188
+ </config>
189
+ </map_order>
190
+ </request_handlers>
191
+ </richrelevance:exportProducts>
192
+
193
+ <richrelevance:exportCategories extends="richrelevance:export">
194
+ <transport>
195
+ <config>
196
+ <filename>categories_full</filename>
197
+ </config>
198
+ </transport>
199
+ <request_handlers>
200
+ <map_order>
201
+ <type>transform</type>
202
+ <input_key>input</input_key>
203
+ <output_key>request/content</output_key>
204
+ <config>
205
+ <type>richrelevance:categories_full</type>
206
+ </config>
207
+ </map_order>
208
+ </request_handlers>
209
+ </richrelevance:exportCategories>
210
+
211
+ <richrelevance:exportProductCategories extends="richrelevance:export">
212
+ <transport>
213
+ <config>
214
+ <filename>products_in_categories_full</filename>
215
+ </config>
216
+ </transport>
217
+ <request_handlers>
218
+ <map_order>
219
+ <type>transform</type>
220
+ <input_key>input</input_key>
221
+ <output_key>request/content</output_key>
222
+ <config>
223
+ <type>richrelevance:products_in_categories_full</type>
224
+ </config>
225
+ </map_order>
226
+ </request_handlers>
227
+ </richrelevance:exportProductCategories>
228
+ </integration>
app/code/community/Ampersand/RichRelevance/etc/integration/out.types.xml ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <integration xmlns:richrelevance="http://www.ampersandit.co.uk/richrelevance">
3
+ <richrelevance_tsv renderer="xsv" value_separator="\t" value_delimiter="" line_separator="\n"/>
4
+ <richrelevance:products_full extends="richrelevance_tsv">
5
+ <_iterate>
6
+ <product>
7
+ <product_id mapper="accessor">sku</product_id>
8
+ <name mapper="accessor">name</name>
9
+ <price mapper="mage_helper">
10
+ <_helper>ampersand_richrelevance/data</_helper>
11
+ <_method>formatPrice</_method>
12
+ <_params>
13
+ <price mapper="accessor">price</price>
14
+ </_params>
15
+ </price>
16
+ <price_display mapper="mage_helper">
17
+ <_helper>core</_helper>
18
+ <_method>formatPrice</_method>
19
+ <_params>
20
+ <price mapper="accessor">price</price>
21
+ </_params>
22
+ </price_display>
23
+ <recommendable mapper="mage_helper">
24
+ <_helper>ampersand_richrelevance/feed</_helper>
25
+ <_method>getIsRecommendable</_method>
26
+ <_params>
27
+ <product mapper="all_data" />
28
+ </_params>
29
+ </recommendable>
30
+ <brand mapper="accessor">brand</brand>
31
+ <image_url mapper="accessor">image_url</image_url>
32
+ <link_url mapper="accessor">product_url</link_url>
33
+ <rating mapper="mage_helper">
34
+ <_helper>ampersand_richrelevance/feed</_helper>
35
+ <_method>getRating</_method>
36
+ <_params>
37
+ <productId mapper="accessor">entity_id</productId>
38
+ </_params>
39
+ </rating>
40
+ <rating_image_url/>
41
+ <num_reviews mapper="mage_helper">
42
+ <_helper>ampersand_richrelevance/feed</_helper>
43
+ <_method>getNumOfReviews</_method>
44
+ <_params>
45
+ <productId mapper="accessor">entity_id</productId>
46
+ </_params>
47
+ </num_reviews>
48
+ </product>
49
+ </_iterate>
50
+ </richrelevance:products_full>
51
+
52
+ <richrelevance:categories_full extends="richrelevance_tsv">
53
+ <_iterate>
54
+ <category>
55
+ <category_id mapper="accessor">entity_id</category_id>
56
+ <_if>
57
+ <_condition mapper="mage_helper" type="bool">
58
+ <_helper>ampersand_richrelevance/service</_helper>
59
+ <_method>getIsRootCategory</_method>
60
+ <_params>
61
+ <category_id mapper="accessor">parent_id</category_id>
62
+ </_params>
63
+ </_condition>
64
+ <_then>
65
+ <parent_id/>
66
+ </_then>
67
+ <_else>
68
+ <parent_id mapper="accessor">parent_id</parent_id>
69
+ </_else>
70
+ </_if>
71
+ <name mapper="accessor">name</name>
72
+ </category>
73
+ </_iterate>
74
+ </richrelevance:categories_full>
75
+
76
+ <richrelevance:products_in_categories_full extends="richrelevance_tsv">
77
+ <_iterate>
78
+ <product_category>
79
+ <product_id mapper="array">sku</product_id>
80
+ <category_id mapper="array">category_id</category_id>
81
+ </product_category>
82
+ </_iterate>
83
+ </richrelevance:products_in_categories_full>
84
+ </integration>
app/code/community/Ampersand/RichRelevance/etc/system.xml ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <tabs>
4
+ <tabname translate="label" module="ampersand_richrelevance">
5
+ <label>Integration</label>
6
+ <sort_order>100</sort_order>
7
+ </tabname>
8
+ </tabs>
9
+ <sections>
10
+ <ampersand_richrelevance translate="label" module="ampersand_richrelevance">
11
+ <label>RichRelevance</label>
12
+ <tab>tabname</tab>
13
+ <frontend_type>text</frontend_type>
14
+ <sort_order>20</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
+ <general_settings>
20
+ <label>General Settings</label>
21
+ <sort_order>100</sort_order>
22
+ <show_in_default>1</show_in_default>
23
+ <show_in_website>1</show_in_website>
24
+ <show_in_store>1</show_in_store>
25
+ <fields>
26
+ <enabled translate="label">
27
+ <label><![CDATA[Enable RichRecs Express<sup>TM</sup>]]>
28
+ </label>
29
+ <frontend_type>select</frontend_type>
30
+ <source_model>adminhtml/system_config_source_yesno</source_model>
31
+ <comment></comment>
32
+ <sort_order>10</sort_order>
33
+ <show_in_default>1</show_in_default>
34
+ <show_in_website>1</show_in_website>
35
+ <show_in_store>1</show_in_store>
36
+ </enabled>
37
+ </fields>
38
+ </general_settings>
39
+ <manual_download translate="label">
40
+ <label>Manual Feed Download and Push</label>
41
+ <sort_order>120</sort_order>
42
+ <show_in_default>0</show_in_default>
43
+ <show_in_website>0</show_in_website>
44
+ <show_in_store>1</show_in_store>
45
+ <fields>
46
+ <download_button>
47
+ <label>Download feed file</label>
48
+ <frontend_type>button</frontend_type>
49
+ <frontend_model>ampersand_richrelevance/adminhtml_downloadButton</frontend_model>
50
+ <sort_order>10</sort_order>
51
+ <show_in_default>0</show_in_default>
52
+ <show_in_website>0</show_in_website>
53
+ <show_in_store>1</show_in_store>
54
+ <comment>Click this button to manually generate and download the catalog feed for the current store</comment>
55
+ </download_button>
56
+ <push_button>
57
+ <label>Push feed file to RichRelevance</label>
58
+ <frontend_type>button</frontend_type>
59
+ <frontend_model>ampersand_richrelevance/adminhtml_pushButton</frontend_model>
60
+ <sort_order>12</sort_order>
61
+ <show_in_default>0</show_in_default>
62
+ <show_in_website>0</show_in_website>
63
+ <show_in_store>1</show_in_store>
64
+ <comment>Click this button to manually generate the catalog feed for the current store and push to RichRelevance</comment>
65
+ </push_button>
66
+ </fields>
67
+ </manual_download>
68
+ <api_conn_settings translate="label">
69
+ <label>API Data</label>
70
+ <sort_order>140</sort_order>
71
+ <show_in_default>1</show_in_default>
72
+ <show_in_website>1</show_in_website>
73
+ <show_in_store>1</show_in_store>
74
+ <fields>
75
+ <api_key translate="label">
76
+ <label>API Key</label>
77
+ <frontend_type>text</frontend_type>
78
+ <sort_order>10</sort_order>
79
+ <show_in_default>1</show_in_default>
80
+ <show_in_website>1</show_in_website>
81
+ <show_in_store>1</show_in_store>
82
+ </api_key>
83
+ <ftp_user>
84
+ <label>FTP User</label>
85
+ <frontend_type>text</frontend_type>
86
+ <sort_order>30</sort_order>
87
+ <show_in_default>1</show_in_default>
88
+ <show_in_website>1</show_in_website>
89
+ <show_in_store>1</show_in_store>
90
+ </ftp_user>
91
+ <ftp_password>
92
+ <label>FTP Password</label>
93
+ <frontend_type>password</frontend_type>
94
+ <sort_order>40</sort_order>
95
+ <show_in_default>1</show_in_default>
96
+ <show_in_website>1</show_in_website>
97
+ <show_in_store>1</show_in_store>
98
+ </ftp_password>
99
+ </fields>
100
+ </api_conn_settings>
101
+ <placement_settings translate="label">
102
+ <label>Placement Settings</label>
103
+ <sort_order>200</sort_order>
104
+ <show_in_default>1</show_in_default>
105
+ <show_in_website>1</show_in_website>
106
+ <show_in_store>1</show_in_store>
107
+ <fields>
108
+ <placements translate="label">
109
+ <label>Placements</label>
110
+ <frontend_model>ampersand_richrelevance/adminhtml_system_config_renderer_placements</frontend_model>
111
+ <backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
112
+ <sort_order>10</sort_order>
113
+ <comment><![CDATA[This must be kept in sync with the placements table on your <a href='http://dashboard.richrelevance.com'>RichRelevance dashboard</a>]]>
114
+ </comment>
115
+ <show_in_default>1</show_in_default>
116
+ <show_in_website>1</show_in_website>
117
+ <show_in_store>1</show_in_store>
118
+ </placements>
119
+ <include_out_of_stock_products>
120
+ <label>Include Out of Stock Products In Feed</label>
121
+ <frontend_type>select</frontend_type>
122
+ <source_model>adminhtml/system_config_source_yesno</source_model>
123
+ <sort_order>20</sort_order>
124
+ <comment>If not enabled, the recommendable flag will be set to 'n' on feed outputs</comment>
125
+ <show_in_default>1</show_in_default>
126
+ <show_in_website>1</show_in_website>
127
+ <show_in_store>1</show_in_store>
128
+ </include_out_of_stock_products>
129
+ </fields>
130
+ </placement_settings>
131
+ <developer_settings>
132
+ <label>Developer Settings</label>
133
+ <sort_order>300</sort_order>
134
+ <show_in_default>1</show_in_default>
135
+ <show_in_website>1</show_in_website>
136
+ <show_in_store>1</show_in_store>
137
+ <fields>
138
+ <developer_mode translate="label">
139
+ <label>Developer Mode</label>
140
+ <frontend_type>select</frontend_type>
141
+ <source_model>adminhtml/system_config_source_yesno</source_model>
142
+ <comment>When enabled RichRelevance ignores the user data</comment>
143
+ <sort_order>12</sort_order>
144
+ <show_in_default>1</show_in_default>
145
+ <show_in_website>1</show_in_website>
146
+ <show_in_store>1</show_in_store>
147
+ </developer_mode>
148
+ <display_mode translate="label">
149
+ <label>Force Display Mode</label>
150
+ <frontend_type>select</frontend_type>
151
+ <source_model>adminhtml/system_config_source_yesno</source_model>
152
+ <sort_order>13</sort_order>
153
+ <comment>Override RichRelevance's display mode</comment>
154
+ <show_in_default>1</show_in_default>
155
+ <show_in_website>1</show_in_website>
156
+ <show_in_store>1</show_in_store>
157
+ </display_mode>
158
+ <allow_dummy_products translate="label">
159
+ <label>Allow Dummy Products</label>
160
+ <frontend_type>select</frontend_type>
161
+ <source_model>adminhtml/system_config_source_yesno</source_model>
162
+ <sort_order>14</sort_order>
163
+ <show_in_default>1</show_in_default>
164
+ <show_in_website>1</show_in_website>
165
+ <show_in_store>1</show_in_store>
166
+ </allow_dummy_products>
167
+ </fields>
168
+ </developer_settings>
169
+ <log_settings>
170
+ <label>Log Settings</label>
171
+ <sort_order>400</sort_order>
172
+ <show_in_default>1</show_in_default>
173
+ <show_in_website>1</show_in_website>
174
+ <show_in_store>1</show_in_store>
175
+ <fields>
176
+ <time_to_keep_zip_files translate="label">
177
+ <label>Feed file retention</label>
178
+ <frontend_type>text</frontend_type>
179
+ <comment></comment>
180
+ <sort_order>5</sort_order>
181
+ <show_in_default>1</show_in_default>
182
+ <show_in_website>0</show_in_website>
183
+ <show_in_store>0</show_in_store>
184
+ <comment>Number of days to retain Feed zip files that have been transmitted to RichRelevance</comment>
185
+ </time_to_keep_zip_files>
186
+ <feed translate="label">
187
+ <label>Feed transmission</label>
188
+ <frontend_type>select</frontend_type>
189
+ <source_model>adminhtml/system_config_source_yesno</source_model>
190
+ <comment>Success or failure of catalog feed transmission (recommended)</comment>
191
+ <sort_order>10</sort_order>
192
+ <show_in_default>1</show_in_default>
193
+ <show_in_website>1</show_in_website>
194
+ <show_in_store>1</show_in_store>
195
+ </feed>
196
+ <checkout translate="label">
197
+ <label>Checkout information</label>
198
+ <frontend_type>select</frontend_type>
199
+ <source_model>adminhtml/system_config_source_yesno</source_model>
200
+ <comment>Order and item information on successful orders (recommended)</comment>
201
+ <sort_order>20</sort_order>
202
+ <show_in_default>1</show_in_default>
203
+ <show_in_website>1</show_in_website>
204
+ <show_in_store>1</show_in_store>
205
+ </checkout>
206
+ <item translate="label">
207
+ <label>Item information</label>
208
+ <frontend_type>select</frontend_type>
209
+ <source_model>adminhtml/system_config_source_yesno</source_model>
210
+ <comment>Item information being transmitted to RichRelevance on each product view</comment>
211
+ <sort_order>30</sort_order>
212
+ <show_in_default>1</show_in_default>
213
+ <show_in_website>1</show_in_website>
214
+ <show_in_store>1</show_in_store>
215
+ </item>
216
+ <category translate="label">
217
+ <label>Category information</label>
218
+ <frontend_type>select</frontend_type>
219
+ <source_model>adminhtml/system_config_source_yesno</source_model>
220
+ <comment>Category information being transmitted to RichRelevance on each category view</comment>
221
+ <sort_order>40</sort_order>
222
+ <show_in_default>1</show_in_default>
223
+ <show_in_website>1</show_in_website>
224
+ <show_in_store>1</show_in_store>
225
+ </category>
226
+ <search translate="label">
227
+ <label>Search information</label>
228
+ <frontend_type>select</frontend_type>
229
+ <source_model>adminhtml/system_config_source_yesno</source_model>
230
+ <comment>Search information being transmitted to RichRelevance on each Magento search</comment>
231
+ <sort_order>50</sort_order>
232
+ <show_in_default>1</show_in_default>
233
+ <show_in_website>1</show_in_website>
234
+ <show_in_store>1</show_in_store>
235
+ </search>
236
+ <addtocart translate="label">
237
+ <label>Add to cart information</label>
238
+ <frontend_type>select</frontend_type>
239
+ <source_model>adminhtml/system_config_source_yesno</source_model>
240
+ <comment>Item information being transmitted to RichRelevance when a product is added to the basket</comment>
241
+ <sort_order>60</sort_order>
242
+ <show_in_default>1</show_in_default>
243
+ <show_in_website>1</show_in_website>
244
+ <show_in_store>1</show_in_store>
245
+ </addtocart>
246
+ <cart translate="label">
247
+ <label>Cart information</label>
248
+ <frontend_type>select</frontend_type>
249
+ <source_model>adminhtml/system_config_source_yesno</source_model>
250
+ <comment>Item information being transmitted to RichRelevance on each cart view</comment>
251
+ <sort_order>70</sort_order>
252
+ <show_in_default>1</show_in_default>
253
+ <show_in_website>1</show_in_website>
254
+ <show_in_store>1</show_in_store>
255
+ </cart>
256
+ <placement translate="label">
257
+ <label>Placement information</label>
258
+ <frontend_type>select</frontend_type>
259
+ <source_model>adminhtml/system_config_source_yesno</source_model>
260
+ <comment>Information on placements being included on your Magento pages</comment>
261
+ <sort_order>80</sort_order>
262
+ <show_in_default>1</show_in_default>
263
+ <show_in_website>1</show_in_website>
264
+ <show_in_store>1</show_in_store>
265
+ </placement>
266
+ <settings translate="label">
267
+ <label>Setting information</label>
268
+ <frontend_type>select</frontend_type>
269
+ <source_model>adminhtml/system_config_source_yesno</source_model>
270
+ <comment>Settings that are currently in use such as API key, developer mode, etc.</comment>
271
+ <sort_order>90</sort_order>
272
+ <show_in_default>1</show_in_default>
273
+ <show_in_website>1</show_in_website>
274
+ <show_in_store>1</show_in_store>
275
+ </settings>
276
+ </fields>
277
+ </log_settings>
278
+ </groups>
279
+ </ampersand_richrelevance>
280
+ </sections>
281
+ </config>
app/code/community/Ampersand/RichRelevance/sql/ampersand_richrelevance_setup/mysql4-install-0.0.1.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $this->startSetup();
3
+ $setup = new Mage_Catalog_Model_Resource_Eav_Mysql4_Setup();
4
+
5
+ $setup->addAttributeGroup('catalog_product', 'Default', 'RichRelevance');
6
+
7
+ $setup->addAttribute(
8
+ 'catalog_product',
9
+ 'is_recommendable',
10
+ array(
11
+ 'group' => 'RichRelevance',
12
+ 'type' => 'int',
13
+ 'input' => 'select',
14
+ 'default' => '1',
15
+ 'required' => false,
16
+ 'source' => 'eav/entity_attribute_source_boolean',
17
+ 'label' => Mage::helper('core')->__('Recommendable'),
18
+ 'note' => Mage::helper('core')
19
+ ->__("Choose 'No' to prevent RichRelevance from recommending this product."),
20
+ )
21
+ );
22
+
23
+ $setup->addAttributeToGroup(
24
+ 'catalog_product', 'Default', 'RichRelevance', 'is_recommendable'
25
+ );
26
+
27
+ $this->endSetup();
app/design/frontend/base/default/layout/ampersand_richrelevance.xml ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <layout>
3
+ <_rr_init>
4
+ <reference name="head">
5
+ <action method="addCss"><link>ampersand_richrelevance/css/default.css</link></action>
6
+ </reference>
7
+ <reference name="content">
8
+ <block type="ampersand_richrelevance/header" name="richrelevance_header" before="-" template="ampersand_richrelevance/header.phtml"/>
9
+ </reference>
10
+ <reference name="before_body_end">
11
+ <block type="core/template" name="richrelevance_footer" after="-" template="ampersand_richrelevance/footer.phtml" />
12
+ </reference>
13
+ </_rr_init>
14
+
15
+ <cms_index_index>
16
+ <update handle="_rr_init"/>
17
+ <reference name="richrelevance_header">
18
+ <block type="core/template" name="richrelevance_page_type" template="ampersand_richrelevance/types/home.phtml" />
19
+ </reference>
20
+ </cms_index_index>
21
+
22
+ <catalogsearch_result_index>
23
+ <update handle="_rr_init"/>
24
+ <reference name="richrelevance_header">
25
+ <block type="ampersand_richrelevance/search" name="richrelevance_page_type" template="ampersand_richrelevance/types/search.phtml"/>
26
+ </reference>
27
+ </catalogsearch_result_index>
28
+
29
+ <catalog_category_view>
30
+ <update handle="_rr_init" />
31
+ <reference name="richrelevance_header">
32
+ <block type="ampersand_richrelevance/category" name="richrelevance_page_type" template="ampersand_richrelevance/types/category.phtml"/>
33
+ </reference>
34
+ </catalog_category_view>
35
+
36
+ <catalog_product_view>
37
+ <update handle="_rr_init" />
38
+ <reference name="richrelevance_header">
39
+ <block type="ampersand_richrelevance/item" name="richrelevance_page_type" template="ampersand_richrelevance/types/item.phtml"/>
40
+ </reference>
41
+ </catalog_product_view>
42
+
43
+ <checkout_cart_index>
44
+ <update handle="_rr_init" />
45
+ <reference name="richrelevance_header">
46
+ <block type="ampersand_richrelevance/cart" name="richrelevance_page_type" template="ampersand_richrelevance/types/cart.phtml"/>
47
+ </reference>
48
+ </checkout_cart_index>
49
+
50
+ <checkout_onepage_success>
51
+ <update handle="_rr_init" />
52
+ <reference name="richrelevance_header">
53
+ <block type="ampersand_richrelevance/checkout" name="richrelevance_page_type" template="ampersand_richrelevance/types/checkout.phtml"/>
54
+ </reference>
55
+ </checkout_onepage_success>
56
+
57
+ <checkout_multishipping_success>
58
+ <update handle="_rr_init" />
59
+ <reference name="richrelevance_header">
60
+ <block type="ampersand_richrelevance/checkout" name="richrelevance_page_type" template="ampersand_richrelevance/types/checkout.phtml"/>
61
+ </reference>
62
+ </checkout_multishipping_success>
63
+
64
+ <!-- Start of example placements
65
+
66
+ <cms_index_index>
67
+ <reference name="content">
68
+ <block type="ampersand_richrelevance/placement" name="richrelevance_home_placement1">
69
+ <action method="setPlacementName"><name>home_page.placement1</name></action>
70
+ </block>
71
+ </reference>
72
+ </cms_index_index>
73
+ <catalogsearch_result_index>
74
+ <reference name="content">
75
+ <block type="ampersand_richrelevance/placement" name="richrelevance_search_placement1">
76
+ <action method="setPlacementName"><name>search_page.placement1</name></action>
77
+ </block>
78
+ </reference>
79
+ </catalogsearch_result_index>
80
+ <catalog_category_view>
81
+ <reference name="content">
82
+ <block type="ampersand_richrelevance/placement" name="richrelevance_category_placement1">
83
+ <action method="setPlacementName"><name>category_page.placement1</name></action>
84
+ </block>
85
+ </reference>
86
+ </catalog_category_view>
87
+ <catalog_product_view>
88
+ <reference name="content">
89
+ <block type="ampersand_richrelevance/placement" name="richrelevance_item_placement1">
90
+ <action method="setPlacementName"><name>item_page.placement1</name></action>
91
+ </block>
92
+ <block type="ampersand_richrelevance/placement" name="richrelevance_item_placement2">
93
+ <action method="setPlacementName"><name>item_page.placement2</name></action>
94
+ </block>
95
+ </reference>
96
+ </catalog_product_view>
97
+ <checkout_cart_index>
98
+ <reference name="content">
99
+ <block type="ampersand_richrelevance/placement" name="richrelevance_cart_placement1">
100
+ <action method="setPlacementName"><name>cart_page.placement1</name></action>
101
+ </block>
102
+ </reference>
103
+ </checkout_cart_index>
104
+
105
+ End of example placements -->
106
+
107
+ </layout>
app/design/frontend/base/default/template/ampersand_richrelevance/footer.phtml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php if($this->helper('ampersand_richrelevance')->isEnabled()): ?>
2
+ <script charset="utf-8" type="text/javascript">
3
+ //<![CDATA[
4
+ rr_flush_onload();
5
+ //]]>
6
+ </script>
7
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/header.phtml ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if($this->helper('ampersand_richrelevance')->isEnabled()): ?>
2
+ <?php $helper = $this->helper('ampersand_richrelevance') ?>
3
+
4
+ <script charset="utf-8" type="text/javascript" src="//media.richrelevance.com/rrserver/js/1.0/p13n.js"></script>
5
+ <script charset="utf-8" type="text/javascript">
6
+ //<![CDATA[
7
+ var R3_COMMON = new r3_common();
8
+ R3_COMMON.setApiKey("<?php echo $helper->getApiKey() ?>");
9
+ R3_COMMON.setBaseUrl(window.location.protocol + "//recs.richrelevance.com/rrserver/");
10
+ R3_COMMON.setSessionId("<?php echo $this->getSessionId() ?>");
11
+ R3_COMMON.setUserId("<?php echo $this->getCustomerId() ?>");
12
+ //]]>
13
+ </script>
14
+
15
+ <?php echo $this->getChildHtml('richrelevance_page_type') ?>
16
+
17
+ <script charset="utf-8" type="text/javascript">
18
+ //<![CDATA[
19
+ <?php if ($helper->getDeveloperMode()): ?>
20
+ R3_COMMON.forceDevMode();
21
+ <?php endif; ?>
22
+
23
+ <?php if ($helper->getForceDisplayMode()): ?>
24
+ R3_COMMON.forceDisplayMode();
25
+ <?php endif; ?>
26
+
27
+ <?php if ($helper->getDummyDataMode()): ?>
28
+ R3_COMMON.useDummyData();
29
+ R3_COMMON.debugMode = 't';
30
+ <?php endif; ?>
31
+
32
+ r3();
33
+ //]]>
34
+ </script>
35
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/placement.phtml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php if($this->helper('ampersand_richrelevance')->isEnabled()): ?>
2
+ <script charset="utf-8" type="text/javascript">
3
+ //<![CDATA[
4
+ r3_placement("<?php echo $this->getPlacementName() ?>");
5
+ //]]>
6
+ </script>
7
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/types/add-to-cart.phtml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php if ($itemId = $this->getAddedToCartItemId()): ?>
2
+ <script charset="utf-8" type="text/javascript">
3
+ //<![CDATA[
4
+ var R3_ADDTOCART = new r3_addtocart();
5
+ R3_ADDTOCART.addItemIdToCart("<?php echo $itemId ?>");
6
+ //]]>
7
+ </script>
8
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/types/cart.phtml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script charset="utf-8" type="text/javascript">
2
+ //<![CDATA[
3
+ <?php $placements = Mage::helper('ampersand_richrelevance')->getPagePlacements('cart_page'); ?>
4
+ <?php foreach ($placements as $_placement): ?>
5
+ R3_COMMON.addPlacementType("cart_page.<?php echo $_placement ?>");
6
+ <?php endforeach; ?>
7
+
8
+ var R3_CART = new r3_cart();
9
+ <?php foreach ($this->getCartItemIds() as $_itemId): ?>
10
+ R3_CART.addItemId("<?php echo $_itemId; ?>");
11
+ <?php endforeach; ?>
12
+ //]]>
13
+ </script>
14
+ <?php if ($this->helper('checkout/cart')->getShouldRedirectToCart()): ?>
15
+ <?php echo $this->helper('ampersand_richrelevance')->getAddToBasketBlock()->toHtml() ?>
16
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/types/category.phtml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script charset="utf-8" type="text/javascript">
2
+ //<![CDATA[
3
+ <?php $placements = $this->helper('ampersand_richrelevance')->getPagePlacements('category_page'); ?>
4
+ <?php foreach ($placements as $_placement): ?>
5
+ R3_COMMON.addPlacementType("category_page.<?php echo $_placement ?>");
6
+ <?php endforeach; ?>
7
+
8
+ var R3_CATEGORY = new r3_category();
9
+ <?php $category = $this->getCategory() ?>
10
+ R3_CATEGORY.setId("<?php echo $category->getId(); ?>");
11
+ R3_CATEGORY.setName("<?php echo $category->getName(); ?>");
12
+ //]]>
13
+ </script>
app/design/frontend/base/default/template/ampersand_richrelevance/types/checkout.phtml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ($orderNumber = $this->getOrderNumber()): ?>
2
+ <script charset="utf-8" type="text/javascript">
3
+ //<![CDATA[
4
+ var R3_PURCHASED = new r3_purchased();
5
+ R3_PURCHASED.setOrderNumber("<?php echo $orderNumber ?>");
6
+
7
+ <?php foreach($this->getOrderItems() as $_item): ?>
8
+ R3_PURCHASED.addItemIdPriceQuantity("<?php echo $_item->getSku() ?>", "<?php echo $_item->getPrice() ?>", "<?php echo $_item->getQty() ?>");
9
+ <?php endforeach; ?>
10
+ //]]>
11
+ </script>
12
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/types/home.phtml ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <script charset="utf-8" type="text/javascript">
2
+ //<![CDATA[
3
+ <?php $placements = Mage::helper('ampersand_richrelevance')->getPagePlacements('home_page'); ?>
4
+ <?php foreach ($placements as $_placement): ?>
5
+ R3_COMMON.addPlacementType("home_page.<?php echo $_placement ?>");
6
+ <?php endforeach; ?>
7
+
8
+ var R3_HOME = new r3_home();
9
+ //]]>
10
+ </script>
app/design/frontend/base/default/template/ampersand_richrelevance/types/item.phtml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script charset="utf-8" type="text/javascript">
2
+ //<![CDATA[
3
+ <?php $placements = Mage::helper('ampersand_richrelevance')->getPagePlacements('item_page'); ?>
4
+ <?php foreach ($placements as $_placement): ?>
5
+ R3_COMMON.addPlacementType("item_page.<?php echo $_placement ?>");
6
+ <?php endforeach; ?>
7
+
8
+ var R3_ITEM = new r3_item();
9
+ <?php $product = $this->getProduct() ?>
10
+ R3_ITEM.setId("<?php echo $product->getSku(); ?>");
11
+ //]]>
12
+ </script>
13
+ <?php if (!$this->helper('checkout/cart')->getShouldRedirectToCart()): ?>
14
+ <?php echo $this->helper('ampersand_richrelevance')->getAddToBasketBlock()->toHtml() ?>
15
+ <?php endif; ?>
app/design/frontend/base/default/template/ampersand_richrelevance/types/search.phtml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script charset="utf-8" type="text/javascript">
2
+ //<![CDATA[
3
+ <?php $placements = Mage::helper('ampersand_richrelevance')->getPagePlacements('search_page'); ?>
4
+ <?php foreach ($placements as $_placement): ?>
5
+ R3_COMMON.addPlacementType("search_page.<?php echo $_placement ?>");
6
+ <?php endforeach; ?>
7
+
8
+ var R3_SEARCH = new r3_search();
9
+ R3_SEARCH.setTerms("<?php echo $this->getTerms() ?>");
10
+
11
+ <?php foreach ($this->getSkus() as $_itemSku): ?>
12
+ R3_SEARCH.addItemId("<?php echo $_itemSku ?>");
13
+ <?php endforeach; ?>
14
+ //]]>
15
+ </script>
app/etc/modules/Ampersand_RichRelevance.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <modules>
4
+ <Ampersand_RichRelevance>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ <depends>
8
+ <Ampersand_Integration/>
9
+ </depends>
10
+ </Ampersand_RichRelevance>
11
+ </modules>
12
+ </config>
lib/licenses/service_richrelevance.lic ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ message,outgoing,richrelevance:export,6e5631ab46e48c2138646817d8abcbd62af4ccf2
2
+ message,outgoing,richrelevance:exportAll,dcba520073989cf51e528766d75c1a3087ab17ee
3
+ message,outgoing,richrelevance:sendAll,5bb4d1566b4d329bedea34f8b173433f1f9a2bc0
4
+ message,outgoing,richrelevance:exportProducts,67665ed6783e12571e9c35cac3f6b36e1bb331ac
5
+ message,outgoing,richrelevance:exportCategories,d880b1db67d851ddaa071e1be56b6a04b4d4b43e
6
+ message,outgoing,richrelevance:exportProductCategories,c2a76e81341a7a41afab80b776f724c871175ad4
7
+
8
+ $ϯf�� aS��k�'�D��G��v�N�ܡ[x�11)�+w�8y���0��)�2W��ܬ+"A�x�|X���ԿE��Y�S;�n�~3��&��]�o��%Z�5$�Bf��^쩖��
9
+ ��]$
10
+ 8ȸ������
package.xml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Ampersand_RichRelevance</name>
4
+ <version>0.1.3</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.ampersandcommerce.com">GNU General Public License (GPL)</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Seamlessly integrate Magento with the RichRelevance recommendations engine.</summary>
10
+ <description>&lt;p&gt;RichRelevance powers personalized shopping experiences for the world's largest and most innovative retail brands, helping retailers increase average order values and conversion rates by providing more relevant product suggestions and cross sell opportunities.&lt;/p&gt;&#xD;
11
+ &lt;p&gt;Ampersand have developed an exclusive Magento package extension that provides a sophisticated interface with RichRelevance's RichRecs Express recommendation engine. It is built using our innovative integration framework that allows us to deliver robust integrations between Magento and other systems.&lt;/p&gt;&#xD;
12
+ &lt;p&gt;This module gives small to mid-size retailers easy access to the leading personalized recommendations solution used by some of the worlds largest retail brands.&lt;/p&gt;&#xD;
13
+ &lt;p&gt;The RichRecs Express integration module is able to:&lt;/p&gt;&#xD;
14
+ &lt;ul&gt;&#xD;
15
+ &lt;li&gt;Display product recommendations to your customers throughout your Magento website&lt;/li&gt;&#xD;
16
+ &lt;li&gt;Customise the appearance of the RichRecs Express recommendations via CSS stylesheets&lt;/li&gt;&#xD;
17
+ &lt;li&gt;Transmit visitor information to RichRecs Express for recommendation building&lt;/li&gt;&#xD;
18
+ &lt;li&gt;Generate a feed of the Magento product catalog and transmit to RichRecs Express via FTP&lt;/li&gt;&#xD;
19
+ &lt;/ul&gt;&#xD;
20
+ &lt;p&gt;Ampersand's comprehensive integration framework combined with the power of Magento and intuitive product recommendations from RichRelevance will increase sales and effectively monetize your site traffic by providing the most relevant products, content and offers to shoppers.&lt;/p&gt;</description>
21
+ <notes>Ampersand Commerce RichRelevance v0.1.3</notes>
22
+ <authors><author><name>Ampersand Commerce</name><user>ampersandhq</user><email>integrations@ampersandit.co.uk</email></author></authors>
23
+ <date>2011-09-28</date>
24
+ <time>12:53:26</time>
25
+ <contents><target name="magecommunity"><dir name="Ampersand"><dir name="RichRelevance"><dir name="Block"><file name="AddToCart.php" hash="dca0bb04e5a664f8886f34aa217369ea"/><dir name="Adminhtml"><file name="DownloadButton.php" hash="e5dad6b11ceef0223aca77b7e8e791b7"/><file name="PushButton.php" hash="fc41b65b21a32f61e1439a56cf758367"/><dir name="System"><dir name="Config"><dir name="Renderer"><file name="Placements.php" hash="3ca310798640845081a2efbc2856e147"/></dir></dir></dir></dir><file name="Cart.php" hash="da8e94020311b1367f2fbc9b2a83cddc"/><file name="Category.php" hash="7fb509517ce4f59e132e67d7df0f1bf0"/><file name="Checkout.php" hash="78197cb56ac6b40a5820529ff0957a73"/><file name="Header.php" hash="da1d24347127d28104a4bb008164c7b4"/><file name="Item.php" hash="a1ecd280716dde630d99260de4d3c3bb"/><file name="Placement.php" hash="395f65115180040d3437883ab4b18dae"/><file name="Search.php" hash="a7bb306d60de4ea742a7c189845b0cd2"/></dir><dir name="Helper"><file name="Data.php" hash="de094c2458c0721f043a0bc81772dbce"/><file name="Feed.php" hash="4fe289a45fc824c6af26e427857c6e16"/><file name="Log.php" hash="0eeb4070f067f63c934a15d797383644"/><file name="Service.php" hash="84bd3594fee23fd1d6112504d450e221"/></dir><dir name="Model"><file name="Cron.php" hash="98cab9a04d857caf0cbb865b1475012b"/><file name="Observer.php" hash="82898ec6f993e6a38737fb97ff7bdedf"/><file name="Push.php" hash="1e820036c18aa111597bf5748fa1a669"/></dir><file name="changelog.txt" hash="ae981eeb5480a8be4e6e40d9c3110e82"/><dir name="controllers"><dir name="Adminhtml"><file name="RequestController.php" hash="922bb5af6c2971e5e992ebae6f307d1c"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="9284e3e9ce1e209c8361c8fd40338420"/><file name="config.xml" hash="82bd8ccf423b56966cd525397a17856d"/><dir name="integration"><file name="out.messages.xml" hash="2f105b3ce9ba85ce12b64700d60828f8"/><file name="out.types.xml" hash="7c0a9a10a1918a72a2faa028f8b934a2"/></dir><file name="system.xml" hash="4d3c3476490d359186ee603b76046685"/></dir><dir name="sql"><dir name="ampersand_richrelevance_setup"><file name="mysql4-install-0.0.1.php" hash="ce0205e4eed85a7a4436f7097f0d6125"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="ampersand_richrelevance.xml" hash="83cd1bd9bf91f9cb2573ab308c491345"/></dir><dir name="template"><dir name="ampersand_richrelevance"><file name="footer.phtml" hash="1ea8c0e094a530e35fe8a30c9c5c5427"/><file name="header.phtml" hash="6306c4e06d61815638442a42612a97f3"/><file name="placement.phtml" hash="af1df8e0bc7caf63d743346458cd751f"/><dir name="types"><file name="add-to-cart.phtml" hash="de7367c164830190f21825c686553c72"/><file name="cart.phtml" hash="fed0ebe8109743844a685116ca380de1"/><file name="category.phtml" hash="a4709fcc8de432a29ffb755389ec8bbd"/><file name="checkout.phtml" hash="8a27f51b408ff66434982b763c2a8d06"/><file name="home.phtml" hash="59a73aea2f906f8d7fb05f760125d6e3"/><file name="item.phtml" hash="985f897a03bdf59b5561aa7c74b44bf8"/><file name="search.phtml" hash="1a22e4b691707d5ca424ab8e5144d965"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Ampersand_RichRelevance.xml" hash="e5d4065dcfb79225759dc9625c4587fc"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="ampersand_richrelevance"><dir name="css"><file name="default.css" hash="3acf622ae4e43e4896bf787743f1ebe6"/></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="licenses"><file name="service_richrelevance.lic" hash="b223e585d88c5c9f872402e3845897db"/></dir></target></contents>
26
+ <compatible/>
27
+ <dependencies><required><php><min>5.0.0</min><max>5.9.9</max></php></required></dependencies>
28
+ </package>
skin/frontend/base/default/ampersand_richrelevance/css/default.css ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Document : home_page
3
+ Created on : 19-Aug-2011, 16:03:16
4
+ Author : Matthew Haworth
5
+ Description:
6
+ Styles placements in Magento module RichRelevance
7
+ */
8
+
9
+
10
+ .rr_strategy_message{
11
+ font-weight: bold;
12
+ font-size: 14px;
13
+ color: black;
14
+ }
15
+ .rr_list{
16
+ list-style: none;
17
+ margin: 0;
18
+ padding: 0;
19
+ display: inline-block
20
+ }
21
+ .rr_item{
22
+ list-style: none;
23
+ float: left;
24
+ width: 150px;
25
+ border: 1px solid silver;
26
+ padding: 10px;
27
+ margin-top: 10px;
28
+ }
29
+ .rr_image{
30
+ border: 0;
31
+ width: 150px;
32
+ }
33
+ .rr_divider {
34
+ float: left;
35
+ }
36
+ .rr_divider div{
37
+ float: left;
38
+ width: 10px;
39
+ height: 1px;
40
+ }
41
+ .rr_product_name{
42
+ display: block;
43
+ }