Nosto_Tagging - Version 2.6.0

Version Notes

* Add better error handling and notifications to Nosto account OAuth cycle
* Add support for bundle products with fixed pricing
* Add support for using "tag1", "tag2" and "tag3" properties in Nosto product
tagging and product update API
* Add support for Nosto partner code in account creation API
* Add support for overriding meta data models
* Fix bug in cart/order item name tagging while running Magento Dev Mode
* Fix bug in product export while having product flat tables enabled
* Fix bug in order confirmation API when payment provider is no longer available

Download this release

Release Info

Developer Nosto
Extension Nosto_Tagging
Version 2.6.0
Comparing to
See all releases


Code changes from version 2.5.1 to 2.6.0

Files changed (32) hide show
  1. app/code/community/Nosto/Tagging/Block/Adminhtml/Iframe.php +4 -1
  2. app/code/community/Nosto/Tagging/Block/Cart.php +9 -37
  3. app/code/community/Nosto/Tagging/Block/Order.php +3 -4
  4. app/code/community/Nosto/Tagging/Block/Product.php +4 -5
  5. app/code/community/Nosto/Tagging/Helper/Account.php +4 -2
  6. app/code/community/Nosto/Tagging/Helper/Data.php +11 -0
  7. app/code/community/Nosto/Tagging/Helper/Oauth.php +2 -1
  8. app/code/community/Nosto/Tagging/Helper/Price.php +13 -8
  9. app/code/community/Nosto/Tagging/Model/Meta/Account.php +21 -63
  10. app/code/community/Nosto/Tagging/Model/Meta/Account/Billing.php +0 -10
  11. app/code/community/Nosto/Tagging/Model/Meta/Account/Iframe.php +0 -40
  12. app/code/community/Nosto/Tagging/Model/Meta/Account/Owner.php +0 -30
  13. app/code/community/Nosto/Tagging/Model/Meta/Oauth.php +0 -20
  14. app/code/community/Nosto/Tagging/Model/Meta/Order.php +54 -57
  15. app/code/community/Nosto/Tagging/Model/Meta/Order/Buyer.php +12 -12
  16. app/code/community/Nosto/Tagging/Model/Meta/Order/Item.php +78 -108
  17. app/code/community/Nosto/Tagging/Model/Meta/Product.php +203 -139
  18. app/code/community/Nosto/Tagging/Model/Observer.php +6 -3
  19. app/code/community/Nosto/Tagging/Model/Product.php +45 -0
  20. app/code/community/Nosto/Tagging/Model/Resource/Product/Collection.php +46 -0
  21. app/code/community/Nosto/Tagging/controllers/Adminhtml/NostoController.php +2 -0
  22. app/code/community/Nosto/Tagging/controllers/ExportController.php +10 -8
  23. app/code/community/Nosto/Tagging/controllers/OauthController.php +2 -1
  24. app/code/community/Nosto/Tagging/etc/config.xml +1 -1
  25. app/code/community/Nosto/Tagging/etc/system.xml +2 -2
  26. app/design/frontend/base/default/template/nostotagging/product.phtml +16 -9
  27. lib/nosto/php-sdk/src/classes/NostoAccount.php +15 -3
  28. lib/nosto/php-sdk/src/classes/export/NostoExportProductCollection.php +23 -6
  29. lib/nosto/php-sdk/src/classes/operation/NostoOperationProduct.php +43 -6
  30. lib/nosto/php-sdk/src/interfaces/NostoProductInterface.php +9 -1
  31. lib/nosto/php-sdk/src/interfaces/account/NostoAccountMetaDataInterface.php +8 -0
  32. package.xml +13 -5
app/code/community/Nosto/Tagging/Block/Adminhtml/Iframe.php CHANGED
@@ -66,10 +66,13 @@ class Nosto_Tagging_Block_Adminhtml_Iframe extends Mage_Adminhtml_Block_Template
66
  $session = Mage::getSingleton('adminhtml/session');
67
  if ($session !== null) {
68
  $nostoMessage = $session->getData('nosto_message');
69
- if (is_array($nostoMessage)) {
70
  if (isset($nostoMessage['type'], $nostoMessage['code'])) {
71
  $params['message_type'] = $nostoMessage['type'];
72
  $params['message_code'] = $nostoMessage['code'];
 
 
 
73
  }
74
  $session->setData('nosto_message', null);
75
  }
66
  $session = Mage::getSingleton('adminhtml/session');
67
  if ($session !== null) {
68
  $nostoMessage = $session->getData('nosto_message');
69
+ if (!empty($nostoMessage)) {
70
  if (isset($nostoMessage['type'], $nostoMessage['code'])) {
71
  $params['message_type'] = $nostoMessage['type'];
72
  $params['message_code'] = $nostoMessage['code'];
73
+ if (isset($nostoMessage['text'])) {
74
+ $params['message_text'] = $nostoMessage['text'];
75
+ }
76
  }
77
  $session->setData('nosto_message', null);
78
  }
app/code/community/Nosto/Tagging/Block/Cart.php CHANGED
@@ -35,11 +35,6 @@
35
  */
36
  class Nosto_Tagging_Block_Cart extends Mage_Checkout_Block_Cart_Abstract
37
  {
38
- /**
39
- * @var Mage_Sales_Model_Quote_Item[] Cached items in cart.
40
- */
41
- protected $_items;
42
-
43
  /**
44
  * Render shopping cart content as hidden meta data if the module is
45
  * enabled for the current store.
@@ -72,31 +67,6 @@ class Nosto_Tagging_Block_Cart extends Mage_Checkout_Block_Cart_Abstract
72
  return parent::_toHtml();
73
  }
74
 
75
- /**
76
- * Returns all visible cart items.
77
- * Fixed price bundle products are not supported.
78
- *
79
- * @return Mage_Sales_Model_Quote_Item[]
80
- */
81
- public function getItems()
82
- {
83
- if (!$this->_items) {
84
- $items = array();
85
- foreach (parent::getItems() as $item) {
86
- /** @var Mage_Sales_Model_Quote_Item $item */
87
- $product = $item->getProduct();
88
- if ($product->getTypeId() === Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
89
- && (int)$product->getPriceType() === Mage_Bundle_Model_Product_Price::PRICE_TYPE_FIXED
90
- ) {
91
- continue;
92
- }
93
- $items[] = $item;
94
- }
95
- $this->_items = $items;
96
- }
97
- return $this->_items;
98
- }
99
-
100
  /**
101
  * Returns the product id for a quote item.
102
  * Always try to find the "parent" product ID if the product is a child of
@@ -154,13 +124,15 @@ class Nosto_Tagging_Block_Cart extends Mage_Checkout_Block_Cart_Abstract
154
  // products own name alone.
155
  if (count($parentIds) === 1) {
156
  $attributes = $item->getBuyRequest()->getData('super_attribute');
157
- foreach ($attributes as $id => $value) {
158
- /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
159
- $attribute = Mage::getModel('catalog/resource_eav_attribute')
160
- ->load($id);
161
- $label = $attribute->getSource()->getOptionText($value);
162
- if (!empty($label)) {
163
- $optNames[] = $label;
 
 
164
  }
165
  }
166
  }
35
  */
36
  class Nosto_Tagging_Block_Cart extends Mage_Checkout_Block_Cart_Abstract
37
  {
 
 
 
 
 
38
  /**
39
  * Render shopping cart content as hidden meta data if the module is
40
  * enabled for the current store.
67
  return parent::_toHtml();
68
  }
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  /**
71
  * Returns the product id for a quote item.
72
  * Always try to find the "parent" product ID if the product is a child of
124
  // products own name alone.
125
  if (count($parentIds) === 1) {
126
  $attributes = $item->getBuyRequest()->getData('super_attribute');
127
+ if (is_array($attributes)) {
128
+ foreach ($attributes as $id => $value) {
129
+ /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
130
+ $attribute = Mage::getModel('catalog/resource_eav_attribute')
131
+ ->load($id);
132
+ $label = $attribute->getSource()->getOptionText($value);
133
+ if (!empty($label)) {
134
+ $optNames[] = $label;
135
+ }
136
  }
137
  }
138
  }
app/code/community/Nosto/Tagging/Block/Order.php CHANGED
@@ -62,10 +62,9 @@ class Nosto_Tagging_Block_Order extends Mage_Checkout_Block_Success
62
  $orderId = Mage::getSingleton('checkout/session')->getLastOrderId();
63
  /** @var Mage_Sales_Model_Order $order */
64
  $order = Mage::getModel('sales/order')->load($orderId);
65
- $meta = new Nosto_Tagging_Model_Meta_Order();
66
- if ($order instanceof Mage_Sales_Model_Order) {
67
- $meta->loadData($order);
68
- }
69
  return $meta;
70
  }
71
  }
62
  $orderId = Mage::getSingleton('checkout/session')->getLastOrderId();
63
  /** @var Mage_Sales_Model_Order $order */
64
  $order = Mage::getModel('sales/order')->load($orderId);
65
+ /** @var Nosto_Tagging_Model_Meta_Order $meta */
66
+ $meta = Mage::getModel('nosto_tagging/meta_order');
67
+ $meta->loadData($order);
 
68
  return $meta;
69
  }
70
  }
app/code/community/Nosto/Tagging/Block/Product.php CHANGED
@@ -56,11 +56,8 @@ class Nosto_Tagging_Block_Product extends Mage_Catalog_Block_Product_Abstract
56
  */
57
  protected function _toHtml()
58
  {
59
- $product = $this->getProduct();
60
  if (!Mage::helper('nosto_tagging')->isModuleEnabled()
61
  || !Mage::helper('nosto_tagging/account')->existsAndIsConnected()
62
- || ($product->getTypeId() === Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
63
- && (int)$product->getPriceType() === Mage_Bundle_Model_Product_Price::PRICE_TYPE_FIXED)
64
  ) {
65
  return '';
66
  }
@@ -76,8 +73,10 @@ class Nosto_Tagging_Block_Product extends Mage_Catalog_Block_Product_Abstract
76
  public function getMetaProduct()
77
  {
78
  if ($this->_product === null) {
79
- $this->_product = new Nosto_Tagging_Model_Meta_Product();
80
- $this->_product->loadData($this->getProduct());
 
 
81
  }
82
  return $this->_product;
83
  }
56
  */
57
  protected function _toHtml()
58
  {
 
59
  if (!Mage::helper('nosto_tagging')->isModuleEnabled()
60
  || !Mage::helper('nosto_tagging/account')->existsAndIsConnected()
 
 
61
  ) {
62
  return '';
63
  }
73
  public function getMetaProduct()
74
  {
75
  if ($this->_product === null) {
76
+ /** @var Nosto_Tagging_Model_Meta_Product $model */
77
+ $model = Mage::getModel('nosto_tagging/meta_product');
78
+ $model->loadData($this->getProduct());
79
+ $this->_product = $model;
80
  }
81
  return $this->_product;
82
  }
app/code/community/Nosto/Tagging/Helper/Account.php CHANGED
@@ -173,7 +173,8 @@ class Nosto_Tagging_Helper_Account extends Mage_Core_Helper_Abstract
173
  */
174
  public function getMetaData(Mage_Core_Model_Store $store)
175
  {
176
- $meta = new Nosto_Tagging_Model_Meta_Account();
 
177
  $meta->loadData($store);
178
  return $meta;
179
  }
@@ -191,7 +192,8 @@ class Nosto_Tagging_Helper_Account extends Mage_Core_Helper_Abstract
191
  */
192
  public function getIframeUrl(Mage_Core_Model_Store $store, NostoAccount $account = null, array $params = array())
193
  {
194
- $meta = new Nosto_Tagging_Model_Meta_Account_Iframe();
 
195
  $meta->loadData($store);
196
  return Nosto::helper('iframe')->getUrl($meta, $account, $params);
197
  }
173
  */
174
  public function getMetaData(Mage_Core_Model_Store $store)
175
  {
176
+ /** @var Nosto_Tagging_Model_Meta_Account $meta */
177
+ $meta = Mage::getModel('nosto_tagging/meta_account');
178
  $meta->loadData($store);
179
  return $meta;
180
  }
192
  */
193
  public function getIframeUrl(Mage_Core_Model_Store $store, NostoAccount $account = null, array $params = array())
194
  {
195
+ /** @var Nosto_Tagging_Model_Meta_Account_Iframe $meta */
196
+ $meta = Mage::getModel('nosto_tagging/meta_account_iframe');
197
  $meta->loadData($store);
198
  return Nosto::helper('iframe')->getUrl($meta, $account, $params);
199
  }
app/code/community/Nosto/Tagging/Helper/Data.php CHANGED
@@ -44,6 +44,17 @@ class Nosto_Tagging_Helper_Data extends Mage_Core_Helper_Abstract
44
  */
45
  const XML_PATH_IMAGE_VERSION = 'nosto_tagging/image_options/image_version';
46
 
 
 
 
 
 
 
 
 
 
 
 
47
  /**
48
  * Builds a tagging string of the given category including all its parent
49
  * categories.
44
  */
45
  const XML_PATH_IMAGE_VERSION = 'nosto_tagging/image_options/image_version';
46
 
47
+ /**
48
+ * @inheritdoc
49
+ */
50
+ public function quoteEscape($data, $addSlashes = false)
51
+ {
52
+ if ($addSlashes === true) {
53
+ $data = addslashes($data);
54
+ }
55
+ return htmlspecialchars($data, ENT_QUOTES, null, false);
56
+ }
57
+
58
  /**
59
  * Builds a tagging string of the given category including all its parent
60
  * categories.
app/code/community/Nosto/Tagging/Helper/Oauth.php CHANGED
@@ -46,7 +46,8 @@ class Nosto_Tagging_Helper_Oauth extends Mage_Core_Helper_Abstract
46
  */
47
  public function getMetaData(Mage_Core_Model_Store $store)
48
  {
49
- $meta = new Nosto_Tagging_Model_Meta_Oauth();
 
50
  $meta->loadData($store);
51
  return $meta;
52
  }
46
  */
47
  public function getMetaData(Mage_Core_Model_Store $store)
48
  {
49
+ /** @var Nosto_Tagging_Model_Meta_Oauth $meta */
50
+ $meta = Mage::getModel('nosto_tagging/meta_oauth');
51
  $meta->loadData($store);
52
  return $meta;
53
  }
app/code/community/Nosto/Tagging/Helper/Price.php CHANGED
@@ -47,27 +47,27 @@ class Nosto_Tagging_Helper_Price extends Mage_Core_Helper_Abstract
47
  }
48
 
49
  /**
50
- * Gets the unit price for a product model.
51
  *
52
  * @param Mage_Catalog_Model_Product $product the product model.
53
  *
54
  * @return float
55
  */
56
- public function getProductPrice($product)
57
  {
58
- return $this->_getProductPrice($product);
59
  }
60
 
61
  /**
62
- * Get the final price for a product model.
63
  *
64
  * @param Mage_Catalog_Model_Product $product the product model.
65
  *
66
  * @return float
67
  */
68
- public function getProductFinalPrice($product)
69
  {
70
- return $this->_getProductPrice($product, true);
71
  }
72
 
73
  /**
@@ -75,10 +75,11 @@ class Nosto_Tagging_Helper_Price extends Mage_Core_Helper_Abstract
75
  *
76
  * @param Mage_Catalog_Model_Product $product the product model.
77
  * @param bool $finalPrice if final price.
 
78
  *
79
  * @return float
80
  */
81
- protected function _getProductPrice($product, $finalPrice = false)
82
  {
83
  $price = 0;
84
 
@@ -118,6 +119,10 @@ class Nosto_Tagging_Helper_Price extends Mage_Core_Helper_Abstract
118
  break;
119
  }
120
 
121
- return (float)$price;
 
 
 
 
122
  }
123
  }
47
  }
48
 
49
  /**
50
+ * Gets the unit price for a product model including taxes.
51
  *
52
  * @param Mage_Catalog_Model_Product $product the product model.
53
  *
54
  * @return float
55
  */
56
+ public function getProductPriceInclTax($product)
57
  {
58
+ return $this->_getProductPrice($product, false, true);
59
  }
60
 
61
  /**
62
+ * Get the final price for a product model including taxes.
63
  *
64
  * @param Mage_Catalog_Model_Product $product the product model.
65
  *
66
  * @return float
67
  */
68
+ public function getProductFinalPriceInclTax($product)
69
  {
70
+ return $this->_getProductPrice($product, true, true);
71
  }
72
 
73
  /**
75
  *
76
  * @param Mage_Catalog_Model_Product $product the product model.
77
  * @param bool $finalPrice if final price.
78
+ * @param bool $inclTax if tax is to be included.
79
  *
80
  * @return float
81
  */
82
+ protected function _getProductPrice($product, $finalPrice = false, $inclTax = true)
83
  {
84
  $price = 0;
85
 
119
  break;
120
  }
121
 
122
+ if ($inclTax) {
123
+ return Mage::helper('tax')->getPrice($product, $price, true);
124
+ } else {
125
+ return $price;
126
+ }
127
  }
128
  }
app/code/community/Nosto/Tagging/Model/Meta/Account.php CHANGED
@@ -113,20 +113,16 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
113
  $this->_ownerLanguageCode = substr(
114
  Mage::app()->getLocale()->getLocaleCode(), 0, 2
115
  );
116
- $this->_owner = new Nosto_Tagging_Model_Meta_Account_Owner();
117
- $this->_owner->loadData($store);
118
- $this->_billing = new Nosto_Tagging_Model_Meta_Account_Billing();
119
- $this->_billing->loadData($store);
120
- }
121
 
122
- /**
123
- * Sets the store title.
124
- *
125
- * @param string $title the store title.
126
- */
127
- public function setTitle($title)
128
- {
129
- $this->_title = $title;
 
130
  }
131
 
132
  /**
@@ -139,16 +135,6 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
139
  return $this->_title;
140
  }
141
 
142
- /**
143
- * Sets the account name.
144
- *
145
- * @param string $name the account name.
146
- */
147
- public function setName($name)
148
- {
149
- $this->_name = $name;
150
- }
151
-
152
  /**
153
  * The name of the account to create.
154
  * This has to follow the pattern of
@@ -172,16 +158,6 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
172
  return 'magento';
173
  }
174
 
175
- /**
176
- * Sets the store front page url.
177
- *
178
- * @param string $url the front page url.
179
- */
180
- public function setFrontPageUrl($url)
181
- {
182
- $this->_frontPageUrl = $url;
183
- }
184
-
185
  /**
186
  * Absolute url to the front page of the shop for which the account is
187
  * created for.
@@ -193,16 +169,6 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
193
  return $this->_frontPageUrl;
194
  }
195
 
196
- /**
197
- * Sets the store currency ISO (ISO 4217) code.
198
- *
199
- * @param string $code the currency ISO code.
200
- */
201
- public function setCurrencyCode($code)
202
- {
203
- $this->_currencyCode = $code;
204
- }
205
-
206
  /**
207
  * The 3-letter ISO code (ISO 4217) for the currency used by the shop for
208
  * which the account is created for.
@@ -214,16 +180,6 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
214
  return $this->_currencyCode;
215
  }
216
 
217
- /**
218
- * Sets the store language ISO (ISO 639-1) code.
219
- *
220
- * @param string $languageCode the language ISO code.
221
- */
222
- public function setLanguageCode($languageCode)
223
- {
224
- $this->_languageCode = $languageCode;
225
- }
226
-
227
  /**
228
  * The 2-letter ISO code (ISO 639-1) for the language used by the shop for
229
  * which the account is created for.
@@ -235,16 +191,6 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
235
  return $this->_languageCode;
236
  }
237
 
238
- /**
239
- * Sets the owner language ISO (ISO 639-1) code.
240
- *
241
- * @param string $languageCode the language ISO code.
242
- */
243
- public function setOwnerLanguageCode($languageCode)
244
- {
245
- $this->_ownerLanguageCode = $languageCode;
246
- }
247
-
248
  /**
249
  * The 2-letter ISO code (ISO 639-1) for the language of the account owner
250
  * who is creating the account.
@@ -286,4 +232,16 @@ class Nosto_Tagging_Model_Meta_Account extends Mage_Core_Model_Abstract implemen
286
  {
287
  return $this->_signUpApiToken;
288
  }
 
 
 
 
 
 
 
 
 
 
 
 
289
  }
113
  $this->_ownerLanguageCode = substr(
114
  Mage::app()->getLocale()->getLocaleCode(), 0, 2
115
  );
 
 
 
 
 
116
 
117
+ /** @var Nosto_Tagging_Model_Meta_Account_Owner $owner */
118
+ $owner = Mage::getModel('nosto_tagging/meta_account_owner');
119
+ $owner->loadData($store);
120
+ $this->_owner = $owner;
121
+
122
+ /** @var Nosto_Tagging_Model_Meta_Account_Billing $billing */
123
+ $billing = Mage::getModel('nosto_tagging/meta_account_billing');
124
+ $billing->loadData($store);
125
+ $this->_billing = $billing;
126
  }
127
 
128
  /**
135
  return $this->_title;
136
  }
137
 
 
 
 
 
 
 
 
 
 
 
138
  /**
139
  * The name of the account to create.
140
  * This has to follow the pattern of
158
  return 'magento';
159
  }
160
 
 
 
 
 
 
 
 
 
 
 
161
  /**
162
  * Absolute url to the front page of the shop for which the account is
163
  * created for.
169
  return $this->_frontPageUrl;
170
  }
171
 
 
 
 
 
 
 
 
 
 
 
172
  /**
173
  * The 3-letter ISO code (ISO 4217) for the currency used by the shop for
174
  * which the account is created for.
180
  return $this->_currencyCode;
181
  }
182
 
 
 
 
 
 
 
 
 
 
 
183
  /**
184
  * The 2-letter ISO code (ISO 639-1) for the language used by the shop for
185
  * which the account is created for.
191
  return $this->_languageCode;
192
  }
193
 
 
 
 
 
 
 
 
 
 
 
194
  /**
195
  * The 2-letter ISO code (ISO 639-1) for the language of the account owner
196
  * who is creating the account.
232
  {
233
  return $this->_signUpApiToken;
234
  }
235
+
236
+ /**
237
+ * Optional partner code for Nosto partners.
238
+ * The code is issued by Nosto to partners only.
239
+ *
240
+ * @return string|null the partner code or null if none exist.
241
+ */
242
+ public function getPartnerCode()
243
+ {
244
+ // todo: implement partner code storage.
245
+ return null;
246
+ }
247
  }
app/code/community/Nosto/Tagging/Model/Meta/Account/Billing.php CHANGED
@@ -58,16 +58,6 @@ class Nosto_Tagging_Model_Meta_Account_Billing extends Mage_Core_Model_Abstract
58
  $this->_country = $store->getConfig('general/country/default');
59
  }
60
 
61
- /**
62
- * Sets the account billing details country ISO (ISO 3166-1 alpha-2) code.
63
- *
64
- * @param string $country the country ISO code.
65
- */
66
- public function setCountry($country)
67
- {
68
- $this->_country = $country;
69
- }
70
-
71
  /**
72
  * The 2-letter ISO code (ISO 3166-1 alpha-2) for billing details country.
73
  *
58
  $this->_country = $store->getConfig('general/country/default');
59
  }
60
 
 
 
 
 
 
 
 
 
 
 
61
  /**
62
  * The 2-letter ISO code (ISO 3166-1 alpha-2) for billing details country.
63
  *
app/code/community/Nosto/Tagging/Model/Meta/Account/Iframe.php CHANGED
@@ -151,16 +151,6 @@ class Nosto_Tagging_Model_Meta_Account_Iframe extends Mage_Core_Model_Abstract i
151
  return $this->_platform;
152
  }
153
 
154
- /**
155
- * Sets the first name of the admin user.
156
- *
157
- * @param string $firstName the first name.
158
- */
159
- public function setFirstName($firstName)
160
- {
161
- $this->_firstName = $firstName;
162
- }
163
-
164
  /**
165
  * The first name of the user who is loading the config iframe.
166
  *
@@ -171,16 +161,6 @@ class Nosto_Tagging_Model_Meta_Account_Iframe extends Mage_Core_Model_Abstract i
171
  return $this->_firstName;
172
  }
173
 
174
- /**
175
- * Sets the last name of the admin user.
176
- *
177
- * @param string $lastName the last name.
178
- */
179
- public function setLastName($lastName)
180
- {
181
- $this->_lastName = $lastName;
182
- }
183
-
184
  /**
185
  * The last name of the user who is loading the config iframe.
186
  *
@@ -191,16 +171,6 @@ class Nosto_Tagging_Model_Meta_Account_Iframe extends Mage_Core_Model_Abstract i
191
  return $this->_lastName;
192
  }
193
 
194
- /**
195
- * Sets the email address of the admin user.
196
- *
197
- * @param string $email the email address.
198
- */
199
- public function setEmail($email)
200
- {
201
- $this->_email = $email;
202
- }
203
-
204
  /**
205
  * The email address of the user who is loading the config iframe.
206
  *
@@ -211,16 +181,6 @@ class Nosto_Tagging_Model_Meta_Account_Iframe extends Mage_Core_Model_Abstract i
211
  return $this->_email;
212
  }
213
 
214
- /**
215
- * Sets the language ISO code.
216
- *
217
- * @param string $code the ISO code.
218
- */
219
- public function setLanguageIsoCode($code)
220
- {
221
- $this->_languageIsoCode = $code;
222
- }
223
-
224
  /**
225
  * The 2-letter ISO code (ISO 639-1) for the language of the user who is
226
  * loading the config iframe.
151
  return $this->_platform;
152
  }
153
 
 
 
 
 
 
 
 
 
 
 
154
  /**
155
  * The first name of the user who is loading the config iframe.
156
  *
161
  return $this->_firstName;
162
  }
163
 
 
 
 
 
 
 
 
 
 
 
164
  /**
165
  * The last name of the user who is loading the config iframe.
166
  *
171
  return $this->_lastName;
172
  }
173
 
 
 
 
 
 
 
 
 
 
 
174
  /**
175
  * The email address of the user who is loading the config iframe.
176
  *
181
  return $this->_email;
182
  }
183
 
 
 
 
 
 
 
 
 
 
 
184
  /**
185
  * The 2-letter ISO code (ISO 639-1) for the language of the user who is
186
  * loading the config iframe.
app/code/community/Nosto/Tagging/Model/Meta/Account/Owner.php CHANGED
@@ -72,16 +72,6 @@ class Nosto_Tagging_Model_Meta_Account_Owner extends Mage_Core_Model_Abstract im
72
  $this->_email = $user->getEmail();
73
  }
74
 
75
- /**
76
- * Sets the first name of the account owner.
77
- *
78
- * @param string $firstName the first name.
79
- */
80
- public function setFirstName($firstName)
81
- {
82
- $this->_firstName = $firstName;
83
- }
84
-
85
  /**
86
  * The first name of the account owner.
87
  *
@@ -92,16 +82,6 @@ class Nosto_Tagging_Model_Meta_Account_Owner extends Mage_Core_Model_Abstract im
92
  return $this->_firstName;
93
  }
94
 
95
- /**
96
- * Sets the last name of the account owner.
97
- *
98
- * @param string $lastName the last name.
99
- */
100
- public function setLastName($lastName)
101
- {
102
- $this->_lastName = $lastName;
103
- }
104
-
105
  /**
106
  * The last name of the account owner.
107
  *
@@ -112,16 +92,6 @@ class Nosto_Tagging_Model_Meta_Account_Owner extends Mage_Core_Model_Abstract im
112
  return $this->_lastName;
113
  }
114
 
115
- /**
116
- * Sets the email address of the account owner.
117
- *
118
- * @param string $email the email address.
119
- */
120
- public function setEmail($email)
121
- {
122
- $this->_email = $email;
123
- }
124
-
125
  /**
126
  * The email address of the account owner.
127
  *
72
  $this->_email = $user->getEmail();
73
  }
74
 
 
 
 
 
 
 
 
 
 
 
75
  /**
76
  * The first name of the account owner.
77
  *
82
  return $this->_firstName;
83
  }
84
 
 
 
 
 
 
 
 
 
 
 
85
  /**
86
  * The last name of the account owner.
87
  *
92
  return $this->_lastName;
93
  }
94
 
 
 
 
 
 
 
 
 
 
 
95
  /**
96
  * The email address of the account owner.
97
  *
app/code/community/Nosto/Tagging/Model/Meta/Oauth.php CHANGED
@@ -120,16 +120,6 @@ class Nosto_Tagging_Model_Meta_Oauth extends Mage_Core_Model_Abstract implements
120
  return $this->_redirectUrl;
121
  }
122
 
123
- /**
124
- * Sets the redirect url.
125
- *
126
- * @param string $url the url.
127
- */
128
- public function setRedirectUrl($url)
129
- {
130
- $this->_redirectUrl = $url;
131
- }
132
-
133
  /**
134
  * The 2-letter ISO code (ISO 639-1) for the language the OAuth2 server
135
  * uses for UI localization.
@@ -140,14 +130,4 @@ class Nosto_Tagging_Model_Meta_Oauth extends Mage_Core_Model_Abstract implements
140
  {
141
  return $this->_languageIsoCode;
142
  }
143
-
144
- /**
145
- * Sets the language ISO code.
146
- *
147
- * @param string $code the ISO code.
148
- */
149
- public function setLanguageIsoCode($code)
150
- {
151
- $this->_languageIsoCode = $code;
152
- }
153
  }
120
  return $this->_redirectUrl;
121
  }
122
 
 
 
 
 
 
 
 
 
 
 
123
  /**
124
  * The 2-letter ISO code (ISO 639-1) for the language the OAuth2 server
125
  * uses for UI localization.
130
  {
131
  return $this->_languageIsoCode;
132
  }
 
 
 
 
 
 
 
 
 
 
133
  }
app/code/community/Nosto/Tagging/Model/Meta/Order.php CHANGED
@@ -82,6 +82,60 @@ class Nosto_Tagging_Model_Meta_Order extends Mage_Core_Model_Abstract implements
82
  $this->_init('nosto_tagging/meta_order');
83
  }
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  /**
86
  * The unique order number identifying the order.
87
  *
@@ -142,61 +196,4 @@ class Nosto_Tagging_Model_Meta_Order extends Mage_Core_Model_Abstract implements
142
  {
143
  return $this->_orderStatus;
144
  }
145
-
146
- /**
147
- * Loads the order info from a Magento order model.
148
- *
149
- * @param Mage_Sales_Model_Order $order the order model.
150
- */
151
- public function loadData(Mage_Sales_Model_Order $order)
152
- {
153
- $this->_orderNumber = $order->getId();
154
- $this->_createdDate = $order->getCreatedAt();
155
-
156
- $method = $order->getPayment()->getMethodInstance();
157
- $this->_paymentProvider = $method->getCode();
158
-
159
- $this->_orderStatus = new Nosto_Tagging_Model_Meta_Order_Status();
160
- $this->_orderStatus->loadData($order);
161
-
162
- $this->_buyer = new Nosto_Tagging_Model_Meta_Order_Buyer();
163
- $this->_buyer->loadData($order);
164
-
165
- /** @var $item Mage_Sales_Model_Order_Item */
166
- foreach ($order->getAllVisibleItems() as $item) {
167
- /** @var Mage_Catalog_Model_Product $product */
168
- $product = Mage::getModel('catalog/product')
169
- ->load($item->getProductId());
170
- if ($product->getTypeId() === Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
171
- && (int)$product->getPriceType() === Mage_Bundle_Model_Product_Price::PRICE_TYPE_FIXED
172
- ) {
173
- continue;
174
- }
175
- $orderItem = new Nosto_Tagging_Model_Meta_Order_Item();
176
- $orderItem->loadData($item);
177
- $this->_items[] = $orderItem;
178
- }
179
-
180
- if ($this->includeSpecialItems) {
181
- if (($discount = $order->getDiscountAmount()) > 0) {
182
- $orderItem = new Nosto_Tagging_Model_Meta_Order_Item();
183
- $orderItem->setProductId(-1);
184
- $orderItem->setQuantity(1);
185
- $orderItem->setName('Discount');
186
- $orderItem->setUnitPrice($discount);
187
- $orderItem->setCurrencyCode($order->getOrderCurrencyCode());
188
- $this->_items[] = $orderItem;
189
- }
190
-
191
- if (($shippingInclTax = $order->getShippingInclTax()) > 0) {
192
- $orderItem = new Nosto_Tagging_Model_Meta_Order_Item();
193
- $orderItem->setProductId(-1);
194
- $orderItem->setQuantity(1);
195
- $orderItem->setName('Shipping and handling');
196
- $orderItem->setUnitPrice($shippingInclTax);
197
- $orderItem->setCurrencyCode($order->getOrderCurrencyCode());
198
- $this->_items[] = $orderItem;
199
- }
200
- }
201
- }
202
  }
82
  $this->_init('nosto_tagging/meta_order');
83
  }
84
 
85
+ /**
86
+ * Loads the order info from a Magento order model.
87
+ *
88
+ * @param Mage_Sales_Model_Order $order the order model.
89
+ */
90
+ public function loadData(Mage_Sales_Model_Order $order)
91
+ {
92
+ $this->_orderNumber = $order->getId();
93
+ $this->_createdDate = $order->getCreatedAt();
94
+ $this->_paymentProvider = $order->getPayment()->getMethod();
95
+
96
+ /** @var Nosto_Tagging_Model_Meta_Order_Status $orderStatus */
97
+ $orderStatus = Mage::getModel('nosto_tagging/meta_order_status');
98
+ $orderStatus->loadData($order);
99
+ $this->_orderStatus = $orderStatus;
100
+
101
+ /** @var Nosto_Tagging_Model_Meta_Order_Buyer $orderBuyer */
102
+ $orderBuyer = Mage::getModel('nosto_tagging/meta_order_buyer');
103
+ $orderBuyer->loadData($order);
104
+ $this->_buyer = $orderBuyer;
105
+
106
+ /** @var $item Mage_Sales_Model_Order_Item */
107
+ foreach ($order->getAllVisibleItems() as $item) {
108
+ /** @var Nosto_Tagging_Model_Meta_Order_Item $orderItem */
109
+ $orderItem = Mage::getModel('nosto_tagging/meta_order_item');
110
+ $orderItem->loadData($item);
111
+ $this->_items[] = $orderItem;
112
+ }
113
+
114
+ if ($this->includeSpecialItems) {
115
+ if (($discount = $order->getDiscountAmount()) > 0) {
116
+ /** @var Nosto_Tagging_Model_Meta_Order_Item $orderItem */
117
+ $orderItem = Mage::getModel('nosto_tagging/meta_order_item');
118
+ $orderItem->loadSpecialItemData(
119
+ 'Discount',
120
+ $discount,
121
+ $order->getOrderCurrencyCode()
122
+ );
123
+ $this->_items[] = $orderItem;
124
+ }
125
+
126
+ if (($shippingInclTax = $order->getShippingInclTax()) > 0) {
127
+ /** @var Nosto_Tagging_Model_Meta_Order_Item $orderItem */
128
+ $orderItem = Mage::getModel('nosto_tagging/meta_order_item');
129
+ $orderItem->loadSpecialItemData(
130
+ 'Shipping and handling',
131
+ $shippingInclTax,
132
+ $order->getOrderCurrencyCode()
133
+ );
134
+ $this->_items[] = $orderItem;
135
+ }
136
+ }
137
+ }
138
+
139
  /**
140
  * The unique order number identifying the order.
141
  *
196
  {
197
  return $this->_orderStatus;
198
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  }
app/code/community/Nosto/Tagging/Model/Meta/Order/Buyer.php CHANGED
@@ -59,6 +59,18 @@ class Nosto_Tagging_Model_Meta_Order_Buyer extends Mage_Core_Model_Abstract impl
59
  $this->_init('nosto_tagging/meta_order_buyer');
60
  }
61
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  /**
63
  * Gets the first name of the user who placed the order.
64
  *
@@ -88,16 +100,4 @@ class Nosto_Tagging_Model_Meta_Order_Buyer extends Mage_Core_Model_Abstract impl
88
  {
89
  return $this->_email;
90
  }
91
-
92
- /**
93
- * Loads the buyer info from a Magento order model.
94
- *
95
- * @param Mage_Sales_Model_Order $order the order model.
96
- */
97
- public function loadData(Mage_Sales_Model_Order $order)
98
- {
99
- $this->_firstName = $order->getCustomerFirstname();
100
- $this->_lastName = $order->getCustomerLastname();
101
- $this->_email = $order->getCustomerEmail();
102
- }
103
  }
59
  $this->_init('nosto_tagging/meta_order_buyer');
60
  }
61
 
62
+ /**
63
+ * Loads the buyer info from a Magento order model.
64
+ *
65
+ * @param Mage_Sales_Model_Order $order the order model.
66
+ */
67
+ public function loadData(Mage_Sales_Model_Order $order)
68
+ {
69
+ $this->_firstName = $order->getCustomerFirstname();
70
+ $this->_lastName = $order->getCustomerLastname();
71
+ $this->_email = $order->getCustomerEmail();
72
+ }
73
+
74
  /**
75
  * Gets the first name of the user who placed the order.
76
  *
100
  {
101
  return $this->_email;
102
  }
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
app/code/community/Nosto/Tagging/Model/Meta/Order/Item.php CHANGED
@@ -70,107 +70,6 @@ class Nosto_Tagging_Model_Meta_Order_Item extends Mage_Core_Model_Abstract imple
70
  $this->_init('nosto_tagging/meta_order_item');
71
  }
72
 
73
- /**
74
- * The unique identifier of the purchased item.
75
- * If this item is for discounts or shipping cost, the id can be 0.
76
- *
77
- * @return string|int
78
- */
79
- public function getProductId()
80
- {
81
- return $this->_productId;
82
- }
83
-
84
- /**
85
- * Sets the unique identifier for the item.
86
- *
87
- * @param string|int $id the product id.
88
- */
89
- public function setProductId($id)
90
- {
91
- $this->_productId = $id;
92
- }
93
-
94
- /**
95
- * The quantity of the item included in the order.
96
- *
97
- * @return int the quantity.
98
- */
99
- public function getQuantity()
100
- {
101
- return $this->_quantity;
102
- }
103
-
104
- /**
105
- * Sets the item quantity.
106
- *
107
- * @param int $qty the quantity.
108
- */
109
- public function setQuantity($qty)
110
- {
111
- $this->_quantity = $qty;
112
- }
113
-
114
- /**
115
- * The name of the item included in the order.
116
- *
117
- * @return string the name.
118
- */
119
- public function getName()
120
- {
121
- return $this->_name;
122
- }
123
-
124
- /**
125
- * Sets the item name.
126
- *
127
- * @param string $name the item name.
128
- */
129
- public function setName($name)
130
- {
131
- $this->_name = $name;
132
- }
133
-
134
- /**
135
- * The unit price of the item included in the order.
136
- *
137
- * @return float the unit price.
138
- */
139
- public function getUnitPrice()
140
- {
141
- return $this->_unitPrice;
142
- }
143
-
144
- /**
145
- * Sets the item unit price.
146
- *
147
- * @param float $price the item unit price.
148
- */
149
- public function setUnitPrice($price)
150
- {
151
- $this->_unitPrice = $price;
152
- }
153
-
154
- /**
155
- * The 3-letter ISO code (ISO 4217) for the item currency.
156
- *
157
- * @return string the currency ISO code.
158
- */
159
- public function getCurrencyCode()
160
- {
161
- return $this->_currencyCode;
162
- }
163
-
164
- /**
165
- * Sets the items currency code (ISO 4217).
166
- *
167
- * @param string $code the currency ISO code.
168
- */
169
- public function setCurrencyCode($code)
170
- {
171
- $this->_currencyCode = $code;
172
- }
173
-
174
  /**
175
  * Loads the item info from the Magento order item model.
176
  *
@@ -186,6 +85,24 @@ class Nosto_Tagging_Model_Meta_Order_Item extends Mage_Core_Model_Abstract imple
186
  $this->_currencyCode = strtoupper($order->getOrderCurrencyCode());
187
  }
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  /**
190
  * Returns the product id for a quote item.
191
  * Always try to find the "parent" product ID if the product is a child of
@@ -243,13 +160,15 @@ class Nosto_Tagging_Model_Meta_Order_Item extends Mage_Core_Model_Abstract imple
243
  // products own name alone.
244
  if (count($parentIds) === 1) {
245
  $attributes = $item->getBuyRequest()->getData('super_attribute');
246
- foreach ($attributes as $id => $value) {
247
- /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
248
- $attribute = Mage::getModel('catalog/resource_eav_attribute')
249
- ->load($id);
250
- $label = $attribute->getSource()->getOptionText($value);
251
- if (!empty($label)) {
252
- $optNames[] = $label;
 
 
253
  }
254
  }
255
  }
@@ -298,4 +217,55 @@ class Nosto_Tagging_Model_Meta_Order_Item extends Mage_Core_Model_Abstract imple
298
 
299
  return $name;
300
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  }
70
  $this->_init('nosto_tagging/meta_order_item');
71
  }
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  /**
74
  * Loads the item info from the Magento order item model.
75
  *
85
  $this->_currencyCode = strtoupper($order->getOrderCurrencyCode());
86
  }
87
 
88
+ /**
89
+ * Loads the "special item" info from provided data.
90
+ * A "special item" is an item that is included in an order but does not
91
+ * represent an item being bough, e.g. shipping fees, discounts etc.
92
+ *
93
+ * @param string $name the name of the item.
94
+ * @param float|int|string $unitPrice the unit price of the item.
95
+ * @param string $currencyCode the currency code for the item unit price.
96
+ */
97
+ public function loadSpecialItemData($name, $unitPrice, $currencyCode)
98
+ {
99
+ $this->_productId = -1;
100
+ $this->_quantity = 1;
101
+ $this->_name = (string)$name;
102
+ $this->_unitPrice = $unitPrice;
103
+ $this->_currencyCode = strtoupper($currencyCode);
104
+ }
105
+
106
  /**
107
  * Returns the product id for a quote item.
108
  * Always try to find the "parent" product ID if the product is a child of
160
  // products own name alone.
161
  if (count($parentIds) === 1) {
162
  $attributes = $item->getBuyRequest()->getData('super_attribute');
163
+ if (is_array($attributes)) {
164
+ foreach ($attributes as $id => $value) {
165
+ /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
166
+ $attribute = Mage::getModel('catalog/resource_eav_attribute')
167
+ ->load($id);
168
+ $label = $attribute->getSource()->getOptionText($value);
169
+ if (!empty($label)) {
170
+ $optNames[] = $label;
171
+ }
172
  }
173
  }
174
  }
217
 
218
  return $name;
219
  }
220
+
221
+ /**
222
+ * The unique identifier of the purchased item.
223
+ * If this item is for discounts or shipping cost, the id can be 0.
224
+ *
225
+ * @return string|int
226
+ */
227
+ public function getProductId()
228
+ {
229
+ return $this->_productId;
230
+ }
231
+
232
+ /**
233
+ * The quantity of the item included in the order.
234
+ *
235
+ * @return int the quantity.
236
+ */
237
+ public function getQuantity()
238
+ {
239
+ return $this->_quantity;
240
+ }
241
+
242
+ /**
243
+ * The name of the item included in the order.
244
+ *
245
+ * @return string the name.
246
+ */
247
+ public function getName()
248
+ {
249
+ return $this->_name;
250
+ }
251
+
252
+ /**
253
+ * The unit price of the item included in the order.
254
+ *
255
+ * @return float the unit price.
256
+ */
257
+ public function getUnitPrice()
258
+ {
259
+ return $this->_unitPrice;
260
+ }
261
+
262
+ /**
263
+ * The 3-letter ISO code (ISO 4217) for the item currency.
264
+ *
265
+ * @return string the currency ISO code.
266
+ */
267
+ public function getCurrencyCode()
268
+ {
269
+ return $this->_currencyCode;
270
+ }
271
  }
app/code/community/Nosto/Tagging/Model/Meta/Product.php CHANGED
@@ -94,7 +94,11 @@ class Nosto_Tagging_Model_Meta_Product extends Nosto_Tagging_Model_Base implemen
94
  /**
95
  * @var array the tags for the product.
96
  */
97
- protected $_tags = array();
 
 
 
 
98
 
99
  /**
100
  * @var array the categories the product is located in.
@@ -151,6 +155,193 @@ class Nosto_Tagging_Model_Meta_Product extends Nosto_Tagging_Model_Base implemen
151
  );
152
  }
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  /**
155
  * Returns the absolute url to the product page in the shop frontend.
156
  *
@@ -244,7 +435,7 @@ class Nosto_Tagging_Model_Meta_Product extends Nosto_Tagging_Model_Base implemen
244
  /**
245
  * Returns the tags for the product.
246
  *
247
- * @return array the tags array, e.g. array("winter", "shoe").
248
  */
249
  public function getTags()
250
  {
@@ -302,147 +493,20 @@ class Nosto_Tagging_Model_Meta_Product extends Nosto_Tagging_Model_Base implemen
302
  }
303
 
304
  /**
305
- * Loads the product info from a Magento product model.
306
- *
307
- * @param Mage_Catalog_Model_Product $product the product model.
308
- * @param Mage_Core_Model_Store|null $store the store to get the product data for.
309
- */
310
- public function loadData(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store = null)
311
- {
312
- if (is_null($store)) {
313
- $store = Mage::app()->getStore();
314
- }
315
-
316
- // Unset the cached url first, as it won't include the `___store` param
317
- // if it's cached. We need to define the specific store view in the url
318
- // in case the same domain is used for all sites.
319
- $this->_url = $product
320
- ->unsetData('url')
321
- ->getUrlInStore(
322
- array(
323
- '_nosid' => true,
324
- '_ignore_category' => true,
325
- '_store' => $store->getCode(),
326
- )
327
- );
328
-
329
- $this->_productId = $product->getId();
330
- $this->_name = $product->getName();
331
- $this->_imageUrl = $this->buildImageUrl($product, $store);
332
-
333
- $this->_price = Mage::helper('tax')->getPrice(
334
- $product,
335
- Mage::helper('nosto_tagging/price')->getProductFinalPrice($product),
336
- true
337
- );
338
- $this->_listPrice = Mage::helper('tax')->getPrice(
339
- $product,
340
- Mage::helper('nosto_tagging/price')->getProductPrice($product),
341
- true
342
- );
343
- $this->_currencyCode = $store->getCurrentCurrencyCode();
344
- $this->_availability = $product->isAvailable()
345
- ? self::PRODUCT_IN_STOCK
346
- : self::PRODUCT_OUT_OF_STOCK;
347
-
348
- if (Mage::helper('core')->isModuleEnabled('Mage_Tag')) {
349
- $tagCollection = Mage::getModel('tag/tag')
350
- ->getCollection()
351
- ->addPopularity()
352
- ->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED)
353
- ->addProductFilter($product->getId())
354
- ->setFlag('relation', true)
355
- ->addStoreFilter($store->getId())
356
- ->setActiveFilter();
357
- foreach ($tagCollection as $tag) {
358
- $this->_tags[] = $tag->getName();
359
- }
360
- }
361
-
362
- if (!$product->canConfigure()) {
363
- $this->_tags[] = self::PRODUCT_ADD_TO_CART;
364
- }
365
-
366
- $this->_categories = $this->getProductCategories($product);
367
- $this->_shortDescription = (string)$product->getShortDescription();
368
- $this->_description = (string)$product->getDescription();
369
- $this->_brand = $product->getManufacturer()
370
- ? (string)$product->getAttributeText('manufacturer')
371
- : '';
372
-
373
- $this->_datePublished = $product->getCreatedAt();
374
- }
375
-
376
- /**
377
- * Return array of categories for the product.
378
- * The items in the array are strings combined of the complete category
379
- * path to the products own category.
380
- *
381
- * Structure:
382
- * array (
383
- * /Electronics/Computers
384
- * )
385
- *
386
- * @param Mage_Catalog_Model_Product $product the product model.
387
  *
388
- * @return array
389
  */
390
- public function getProductCategories(Mage_Catalog_Model_Product $product)
391
  {
392
- $data = array();
393
-
394
- if ($product instanceof Mage_Catalog_Model_Product) {
395
- $categoryCollection = $product->getCategoryCollection();
396
- foreach ($categoryCollection as $category) {
397
- $categoryString = Mage::helper('nosto_tagging')
398
- ->buildCategoryString($category);
399
- if (!empty($categoryString)) {
400
- $data[] = $categoryString;
401
- }
402
- }
403
  }
404
-
405
- return $data;
406
- }
407
-
408
- /**
409
- * Builds the product absolute image url for the store and returns it.
410
- * The image version is primarily taken from the store config, but falls
411
- * back the the base image if nothing is configured.
412
- *
413
- * @param Mage_Catalog_Model_Product $product the product model.
414
- * @param Mage_Core_Model_Store $store the store model.
415
- *
416
- * @return null|string
417
- */
418
- protected function buildImageUrl(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store)
419
- {
420
- $url = null;
421
- /** @var Nosto_Tagging_Helper_Data $helper */
422
- $helper = Mage::helper('nosto_tagging');
423
- $imageVersion = $helper->getProductImageVersion($store);
424
- $img = $product->getData($imageVersion);
425
- $img = $this->isValidImage($img) ? $img : $product->getData('image');
426
- if ($this->isValidImage($img)) {
427
- // We build the image url manually in order get the correct base
428
- // url, even if this product is populated in the backend.
429
- $baseUrl = rtrim($store->getBaseUrl('media'), '/');
430
- $file = str_replace(DS, '/', $img);
431
- $file = ltrim($file, '/');
432
- $url = $baseUrl.'/catalog/product/'.$file;
433
  }
434
- return $url;
435
- }
436
-
437
- /**
438
- * Checks if the given image file path is valid.
439
- *
440
- * @param string $image the image file path.
441
- *
442
- * @return bool
443
- */
444
- protected function isValidImage($image)
445
- {
446
- return (!empty($image) && $image !== 'no_selection');
447
  }
448
  }
94
  /**
95
  * @var array the tags for the product.
96
  */
97
+ protected $_tags = array(
98
+ 'tag1' => array(),
99
+ 'tag2' => array(),
100
+ 'tag3' => array(),
101
+ );
102
 
103
  /**
104
  * @var array the categories the product is located in.
155
  );
156
  }
157
 
158
+ /**
159
+ * Loads the product info from a Magento product model.
160
+ *
161
+ * @param Mage_Catalog_Model_Product $product the product model.
162
+ * @param Mage_Core_Model_Store|null $store the store to get the product data for.
163
+ */
164
+ public function loadData(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store = null)
165
+ {
166
+ if (is_null($store)) {
167
+ $store = Mage::app()->getStore();
168
+ }
169
+
170
+ /** @var Nosto_Tagging_Helper_Price $priceHelper */
171
+ $priceHelper = Mage::helper('nosto_tagging/price');
172
+
173
+ $this->_url = $this->buildUrl($product, $store);
174
+ $this->_productId = $product->getId();
175
+ $this->_name = $product->getName();
176
+ $this->_imageUrl = $this->buildImageUrl($product, $store);
177
+ $this->_price = $priceHelper->getProductFinalPriceInclTax($product);
178
+ $this->_listPrice = $priceHelper->getProductPriceInclTax($product);
179
+ $this->_currencyCode = $store->getCurrentCurrencyCode();
180
+ $this->_availability = $product->isAvailable()
181
+ ? self::PRODUCT_IN_STOCK
182
+ : self::PRODUCT_OUT_OF_STOCK;
183
+ $this->_categories = $this->buildCategories($product);
184
+
185
+ // Optional properties.
186
+
187
+ if ($product->hasData('short_description')) {
188
+ $this->_shortDescription = $product->getData('short_description');
189
+ }
190
+ if ($product->hasData('description')) {
191
+ $this->_description = $product->getData('description');
192
+ }
193
+ if ($product->hasData('manufacturer')) {
194
+ $this->_brand = $product->getAttributeText('manufacturer');
195
+ }
196
+ if (($tags = $this->buildTags($product, $store)) !== array()) {
197
+ $this->_tags['tag1'] = $tags;
198
+ }
199
+ if ($product->hasData('created_at')) {
200
+ $this->_datePublished = $product->getData('created_at');
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Builds the "tag1" tags.
206
+ *
207
+ * These include any "tag/tag" model names linked to the product, as well
208
+ * as a special "add-to-cart" tag if the product can be added to the
209
+ * cart directly without any choices, i.e. it is a non-configurable simple
210
+ * product.
211
+ * This special tag can then be used in the store frontend to enable a
212
+ * "add to cart" button in the product recommendations.
213
+ *
214
+ * @param Mage_Catalog_Model_Product $product the product model.
215
+ * @param Mage_Core_Model_Store $store the store model.
216
+ *
217
+ * @return array
218
+ */
219
+ protected function buildTags(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store)
220
+ {
221
+ $tags = array();
222
+
223
+ if (Mage::helper('core')->isModuleEnabled('Mage_Tag')) {
224
+ $tagCollection = Mage::getModel('tag/tag')
225
+ ->getCollection()
226
+ ->addPopularity()
227
+ ->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED)
228
+ ->addProductFilter($product->getId())
229
+ ->setFlag('relation', true)
230
+ ->addStoreFilter($store->getId())
231
+ ->setActiveFilter();
232
+ foreach ($tagCollection as $tag) {
233
+ /** @var Mage_Tag_Model_Tag $tag */
234
+ $tags[] = $tag->getName();
235
+ }
236
+ }
237
+
238
+ if (!$product->canConfigure()) {
239
+ $tags[] = self::PRODUCT_ADD_TO_CART;
240
+ }
241
+
242
+ return $tags;
243
+ }
244
+
245
+ /**
246
+ * Builds the absolute store front url for the product page.
247
+ *
248
+ * The url includes the "___store" GET parameter in order for the Nosto
249
+ * crawler to distinguish between stores that do not have separate domains
250
+ * or paths.
251
+ *
252
+ * @param Mage_Catalog_Model_Product $product the product model.
253
+ * @param Mage_Core_Model_Store $store the store model.
254
+ *
255
+ * @return string
256
+ */
257
+ protected function buildUrl(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store)
258
+ {
259
+ // Unset the cached url first, as it won't include the `___store` param
260
+ // if it's cached. We need to define the specific store view in the url
261
+ // in case the same domain is used for all sites.
262
+ $product->unsetData('url');
263
+ return $product
264
+ ->getUrlInStore(
265
+ array(
266
+ '_nosid' => true,
267
+ '_ignore_category' => true,
268
+ '_store' => $store->getCode(),
269
+ )
270
+ );
271
+ }
272
+
273
+ /**
274
+ * Builds the product absolute image url for the store and returns it.
275
+ * The image version is primarily taken from the store config, but falls
276
+ * back the the base image if nothing is configured.
277
+ *
278
+ * @param Mage_Catalog_Model_Product $product the product model.
279
+ * @param Mage_Core_Model_Store $store the store model.
280
+ *
281
+ * @return null|string
282
+ */
283
+ protected function buildImageUrl(Mage_Catalog_Model_Product $product, Mage_Core_Model_Store $store)
284
+ {
285
+ $url = null;
286
+ /** @var Nosto_Tagging_Helper_Data $helper */
287
+ $helper = Mage::helper('nosto_tagging');
288
+ $imageVersion = $helper->getProductImageVersion($store);
289
+ $img = $product->getData($imageVersion);
290
+ $img = $this->isValidImage($img) ? $img : $product->getData('image');
291
+ if ($this->isValidImage($img)) {
292
+ // We build the image url manually in order get the correct base
293
+ // url, even if this product is populated in the backend.
294
+ $baseUrl = rtrim($store->getBaseUrl('media'), '/');
295
+ $file = str_replace(DS, '/', $img);
296
+ $file = ltrim($file, '/');
297
+ $url = $baseUrl.'/catalog/product/'.$file;
298
+ }
299
+ return $url;
300
+ }
301
+
302
+ /**
303
+ * Return array of categories for the product.
304
+ * The items in the array are strings combined of the complete category
305
+ * path to the products own category.
306
+ *
307
+ * Structure:
308
+ * array (
309
+ * /Electronics/Computers
310
+ * )
311
+ *
312
+ * @param Mage_Catalog_Model_Product $product the product model.
313
+ *
314
+ * @return array
315
+ */
316
+ protected function buildCategories(Mage_Catalog_Model_Product $product)
317
+ {
318
+ $data = array();
319
+
320
+ /** @var Nosto_Tagging_Helper_Data $helper */
321
+ $helper = Mage::helper('nosto_tagging');
322
+ $categoryCollection = $product->getCategoryCollection();
323
+ foreach ($categoryCollection as $category) {
324
+ $categoryString = $helper->buildCategoryString($category);
325
+ if (!empty($categoryString)) {
326
+ $data[] = $categoryString;
327
+ }
328
+ }
329
+
330
+ return $data;
331
+ }
332
+
333
+ /**
334
+ * Checks if the given image file path is valid.
335
+ *
336
+ * @param string $image the image file path.
337
+ *
338
+ * @return bool
339
+ */
340
+ protected function isValidImage($image)
341
+ {
342
+ return (!empty($image) && $image !== 'no_selection');
343
+ }
344
+
345
  /**
346
  * Returns the absolute url to the product page in the shop frontend.
347
  *
435
  /**
436
  * Returns the tags for the product.
437
  *
438
+ * @return array the tags array, e.g. array('tag1' => array("winter", "shoe")).
439
  */
440
  public function getTags()
441
  {
493
  }
494
 
495
  /**
496
+ * Returns the full product description,
497
+ * i.e. both the "short" and "normal" descriptions concatenated.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
  *
499
+ * @return string the full descriptions.
500
  */
501
+ public function getFullDescription()
502
  {
503
+ $descriptions = array();
504
+ if (!empty($this->_shortDescription)) {
505
+ $descriptions[] = $this->_shortDescription;
 
 
 
 
 
 
 
 
506
  }
507
+ if (!empty($this->_description)) {
508
+ $descriptions[] = $this->_description;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  }
510
+ return implode(' ', $descriptions);
 
 
 
 
 
 
 
 
 
 
 
 
511
  }
512
  }
app/code/community/Nosto/Tagging/Model/Observer.php CHANGED
@@ -100,7 +100,8 @@ class Nosto_Tagging_Model_Observer
100
  continue;
101
  }
102
 
103
- $model = new Nosto_Tagging_Model_Meta_Product();
 
104
  $model->loadData($product, $store);
105
 
106
  // Only send product update if we have all required
@@ -146,7 +147,8 @@ class Nosto_Tagging_Model_Observer
146
  continue;
147
  }
148
 
149
- $model = new Nosto_Tagging_Model_Meta_Product();
 
150
  $model->setProductId($product->getId());
151
 
152
  try {
@@ -177,7 +179,8 @@ class Nosto_Tagging_Model_Observer
177
  try {
178
  /** @var Mage_Sales_Model_Order $mageOrder */
179
  $mageOrder = $observer->getEvent()->getOrder();
180
- $order = new Nosto_Tagging_Model_Meta_Order();
 
181
  $order->loadData($mageOrder);
182
  /** @var NostoAccount $account */
183
  $account = Mage::helper('nosto_tagging/account')
100
  continue;
101
  }
102
 
103
+ /** @var Nosto_Tagging_Model_Meta_Product $model */
104
+ $model = Mage::getModel('nosto_tagging/meta_product');
105
  $model->loadData($product, $store);
106
 
107
  // Only send product update if we have all required
147
  continue;
148
  }
149
 
150
+ /** @var Nosto_Tagging_Model_Meta_Product $model */
151
+ $model = Mage::getModel('nosto_tagging/meta_product');
152
  $model->setProductId($product->getId());
153
 
154
  try {
179
  try {
180
  /** @var Mage_Sales_Model_Order $mageOrder */
181
  $mageOrder = $observer->getEvent()->getOrder();
182
+ /** @var Nosto_Tagging_Model_Meta_Order $order */
183
+ $order = Mage::getModel('nosto_tagging/meta_order');
184
  $order->loadData($mageOrder);
185
  /** @var NostoAccount $account */
186
  $account = Mage::helper('nosto_tagging/account')
app/code/community/Nosto/Tagging/Model/Product.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Nosto
22
+ * @package Nosto_Tagging
23
+ * @author Nosto Solutions Ltd <magento@nosto.com>
24
+ * @copyright Copyright (c) 2013-2015 Nosto Solutions Ltd (http://www.nosto.com)
25
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
26
+ */
27
+
28
+ /**
29
+ * Product model that extends the Magento catalog product model.
30
+ * Used to define custom product collection in product exports to Nosto.
31
+ *
32
+ * @category Nosto
33
+ * @package Nosto_Tagging
34
+ * @author Nosto Solutions Ltd <magento@nosto.com>
35
+ */
36
+ class Nosto_Tagging_Model_Product extends Mage_Catalog_Model_Product
37
+ {
38
+ /**
39
+ * @inheritdoc
40
+ */
41
+ protected function _construct()
42
+ {
43
+ $this->_init('nosto_tagging/product');
44
+ }
45
+ }
app/code/community/Nosto/Tagging/Model/Resource/Product/Collection.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Nosto
22
+ * @package Nosto_Tagging
23
+ * @author Nosto Solutions Ltd <magento@nosto.com>
24
+ * @copyright Copyright (c) 2013-2015 Nosto Solutions Ltd (http://www.nosto.com)
25
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
26
+ */
27
+
28
+ /**
29
+ * Product collection that extends the Magento catalog product collection.
30
+ * Used to disable flat collections in product exports to Nosto.
31
+ *
32
+ * @category Nosto
33
+ * @package Nosto_Tagging
34
+ * @author Nosto Solutions Ltd <magento@nosto.com>
35
+ */
36
+ class Nosto_Tagging_Model_Resource_Product_Collection extends Mage_Catalog_Model_Resource_Product_Collection
37
+ {
38
+ /**
39
+ * @inheritdoc
40
+ */
41
+ public function isEnabledFlat()
42
+ {
43
+ // Never use the flat collection.
44
+ return false;
45
+ }
46
+ }
app/code/community/Nosto/Tagging/controllers/Adminhtml/NostoController.php CHANGED
@@ -57,10 +57,12 @@ class Nosto_Tagging_Adminhtml_NostoController extends Mage_Adminhtml_Controller_
57
  if ($session !== null) {
58
  $type = $this->getRequest()->getParam('message_type');
59
  $code = $this->getRequest()->getParam('message_code');
 
60
  if ($type !== null && $code !== null) {
61
  $session->setData('nosto_message', array(
62
  'type' => $type,
63
  'code' => $code,
 
64
  ));
65
  }
66
  }
57
  if ($session !== null) {
58
  $type = $this->getRequest()->getParam('message_type');
59
  $code = $this->getRequest()->getParam('message_code');
60
+ $text = $this->getRequest()->getParam('message_text');
61
  if ($type !== null && $code !== null) {
62
  $session->setData('nosto_message', array(
63
  'type' => $type,
64
  'code' => $code,
65
+ 'text' => $text,
66
  ));
67
  }
68
  }
app/code/community/Nosto/Tagging/controllers/ExportController.php CHANGED
@@ -49,6 +49,7 @@ class Nosto_tagging_ExportController extends Mage_Core_Controller_Front_Action
49
  $pageSize = (int)$this->getRequest()->getParam('limit', 100);
50
  $currentOffset = (int)$this->getRequest()->getParam('offset', 0);
51
  $currentPage = ($currentOffset / $pageSize) + 1;
 
52
  $orders = Mage::getModel('sales/order')
53
  ->getCollection()
54
  ->addFieldToFilter('store_id', Mage::app()->getStore()->getId())
@@ -59,7 +60,8 @@ class Nosto_tagging_ExportController extends Mage_Core_Controller_Front_Action
59
  }
60
  $collection = new NostoExportOrderCollection();
61
  foreach ($orders as $order) {
62
- $meta = new Nosto_Tagging_Model_Meta_Order();
 
63
  // We don't need special items like shipping cost and discounts.
64
  $meta->includeSpecialItems = false;
65
  $meta->loadData($order);
@@ -79,7 +81,10 @@ class Nosto_tagging_ExportController extends Mage_Core_Controller_Front_Action
79
  $pageSize = (int)$this->getRequest()->getParam('limit', 100);
80
  $currentOffset = (int)$this->getRequest()->getParam('offset', 0);
81
  $currentPage = ($currentOffset / $pageSize) + 1;
82
- $products = Mage::getModel('catalog/product')
 
 
 
83
  ->getCollection()
84
  ->addStoreFilter(Mage::app()->getStore()->getId())
85
  ->addAttributeToSelect('*')
@@ -99,12 +104,9 @@ class Nosto_tagging_ExportController extends Mage_Core_Controller_Front_Action
99
  }
100
  $collection = new NostoExportProductCollection();
101
  foreach ($products as $product) {
102
- if ($product->getTypeId() === Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
103
- && (int)$product->getPriceType() === Mage_Bundle_Model_Product_Price::PRICE_TYPE_FIXED
104
- ) {
105
- continue;
106
- }
107
- $meta = new Nosto_Tagging_Model_Meta_Product();
108
  $meta->loadData($product);
109
  $validator = new NostoValidator($meta);
110
  if ($validator->validate()) {
49
  $pageSize = (int)$this->getRequest()->getParam('limit', 100);
50
  $currentOffset = (int)$this->getRequest()->getParam('offset', 0);
51
  $currentPage = ($currentOffset / $pageSize) + 1;
52
+ /** @var Mage_Sales_Model_Resource_Order_Collection $orders */
53
  $orders = Mage::getModel('sales/order')
54
  ->getCollection()
55
  ->addFieldToFilter('store_id', Mage::app()->getStore()->getId())
60
  }
61
  $collection = new NostoExportOrderCollection();
62
  foreach ($orders as $order) {
63
+ /** @var Nosto_Tagging_Model_Meta_Order $meta */
64
+ $meta = Mage::getModel('nosto_tagging/meta_order');
65
  // We don't need special items like shipping cost and discounts.
66
  $meta->includeSpecialItems = false;
67
  $meta->loadData($order);
81
  $pageSize = (int)$this->getRequest()->getParam('limit', 100);
82
  $currentOffset = (int)$this->getRequest()->getParam('offset', 0);
83
  $currentPage = ($currentOffset / $pageSize) + 1;
84
+ // We use our own collection object to avoid issues with the product
85
+ // flat collection. It's missing required data by default.
86
+ /** @var Nosto_Tagging_Model_Resource_Product_Collection $products */
87
+ $products = Mage::getModel('nosto_tagging/product')
88
  ->getCollection()
89
  ->addStoreFilter(Mage::app()->getStore()->getId())
90
  ->addAttributeToSelect('*')
104
  }
105
  $collection = new NostoExportProductCollection();
106
  foreach ($products as $product) {
107
+ /** @var Mage_Catalog_Model_Product $product */
108
+ /** @var Nosto_Tagging_Model_Meta_Product $meta */
109
+ $meta = Mage::getModel('nosto_tagging/meta_product');
 
 
 
110
  $meta->loadData($product);
111
  $validator = new NostoValidator($meta);
112
  if ($validator->validate()) {
app/code/community/Nosto/Tagging/controllers/OauthController.php CHANGED
@@ -103,7 +103,8 @@ class Nosto_tagging_OauthController extends Mage_Core_Controller_Front_Action
103
  $this->_redirect(
104
  'adminhtml/nosto/redirectProxy', array(
105
  'message_type' => NostoMessage::TYPE_ERROR,
106
- 'message_code' => !empty($reason) ? $reason : NostoMessage::CODE_ACCOUNT_CONNECT,
 
107
  'store' => (int)Mage::app()->getStore()->getId(),
108
  )
109
  );
103
  $this->_redirect(
104
  'adminhtml/nosto/redirectProxy', array(
105
  'message_type' => NostoMessage::TYPE_ERROR,
106
+ 'message_code' => NostoMessage::CODE_ACCOUNT_CONNECT,
107
+ 'message_text' => $desc,
108
  'store' => (int)Mage::app()->getStore()->getId(),
109
  )
110
  );
app/code/community/Nosto/Tagging/etc/config.xml CHANGED
@@ -29,7 +29,7 @@
29
  <config>
30
  <modules>
31
  <Nosto_Tagging>
32
- <version>2.5.1</version>
33
  </Nosto_Tagging>
34
  </modules>
35
  <global>
29
  <config>
30
  <modules>
31
  <Nosto_Tagging>
32
+ <version>2.6.0</version>
33
  </Nosto_Tagging>
34
  </modules>
35
  <global>
app/code/community/Nosto/Tagging/etc/system.xml CHANGED
@@ -39,11 +39,11 @@
39
  <image_options translate="label">
40
  <label>Image Options</label>
41
  <frontend_type>text</frontend_type>
42
- <sort_order>10</sort_order>
43
  <show_in_default>1</show_in_default>
44
  <show_in_website>1</show_in_website>
45
  <show_in_store>1</show_in_store>
46
- <expanded>1</expanded>
47
  <fields>
48
  <image_version translate="label">
49
  <label>Image Version</label>
39
  <image_options translate="label">
40
  <label>Image Options</label>
41
  <frontend_type>text</frontend_type>
42
+ <sort_order>20</sort_order>
43
  <show_in_default>1</show_in_default>
44
  <show_in_website>1</show_in_website>
45
  <show_in_store>1</show_in_store>
46
+ <expanded>0</expanded>
47
  <fields>
48
  <image_version translate="label">
49
  <label>Image Version</label>
app/design/frontend/base/default/template/nostotagging/product.phtml CHANGED
@@ -34,7 +34,6 @@
34
  * @var $dateHelper Nosto_Tagging_Helper_Date
35
  */
36
  $product = $this->getMetaProduct();
37
- $currentCategory = $this->getCurrentCategory();
38
  $helper = Mage::helper('nosto_tagging');
39
  $priceHelper = Mage::helper('nosto_tagging/price');
40
  $dateHelper = Mage::helper('nosto_tagging/date');
@@ -52,16 +51,24 @@ $dateHelper = Mage::helper('nosto_tagging/date');
52
  <?php foreach ($product->getCategories() as $category): ?>
53
  <span class="category"><?php echo $helper->escapeHtml($category); ?></span>
54
  <?php endforeach; ?>
55
- <span class="description"><?php echo $helper->escapeHtml($product->getDescription()); ?></span>
56
- <span class="list_price"><?php echo $priceHelper->getFormattedPrice($product->getListPrice()); ?></span>
57
- <?php if ($product->getBrand() !== ""): ?>
 
 
 
 
58
  <span class="brand"><?php echo $helper->escapeHtml($product->getBrand()); ?></span>
59
  <?php endif; ?>
60
- <span class="date_published"><?php echo $dateHelper->getFormattedDate($product->getDatePublished()); ?></span>
61
- <?php foreach ($product->getTags() as $tag): ?>
62
- <span class="tag1"><?php echo $helper->escapeHtml($tag); ?></span>
 
63
  <?php endforeach; ?>
 
 
 
64
  </div>
65
- <?php if (!empty($currentCategory)): ?>
66
- <div class="nosto_category" style="display:none"><?php echo $helper->escapeHtml($currentCategory); ?></div>
67
  <?php endif; ?>
34
  * @var $dateHelper Nosto_Tagging_Helper_Date
35
  */
36
  $product = $this->getMetaProduct();
 
37
  $helper = Mage::helper('nosto_tagging');
38
  $priceHelper = Mage::helper('nosto_tagging/price');
39
  $dateHelper = Mage::helper('nosto_tagging/date');
51
  <?php foreach ($product->getCategories() as $category): ?>
52
  <span class="category"><?php echo $helper->escapeHtml($category); ?></span>
53
  <?php endforeach; ?>
54
+ <?php if ($product->getFullDescription()): ?>
55
+ <span class="description"><?php echo $helper->escapeHtml($product->getFullDescription()); ?></span>
56
+ <?php endif; ?>
57
+ <?php if ($product->getListPrice()): ?>
58
+ <span class="list_price"><?php echo $priceHelper->getFormattedPrice($product->getListPrice()); ?></span>
59
+ <?php endif; ?>
60
+ <?php if ($product->getBrand()): ?>
61
  <span class="brand"><?php echo $helper->escapeHtml($product->getBrand()); ?></span>
62
  <?php endif; ?>
63
+ <?php foreach ($product->getTags() as $type => $tags): ?>
64
+ <?php foreach ($tags as $tag): ?>
65
+ <span class="<?php echo $helper->quoteEscape($type); ?>"><?php echo $helper->escapeHtml($tag); ?></span>
66
+ <?php endforeach; ?>
67
  <?php endforeach; ?>
68
+ <?php if ($product->getDatePublished()): ?>
69
+ <span class="date_published"><?php echo $dateHelper->getFormattedDate($product->getDatePublished()); ?></span>
70
+ <?php endif; ?>
71
  </div>
72
+ <?php if ($this->getCurrentCategory()): ?>
73
+ <div class="nosto_category" style="display:none"><?php echo $helper->escapeHtml($this->getCurrentCategory()); ?></div>
74
  <?php endif; ?>
lib/nosto/php-sdk/src/classes/NostoAccount.php CHANGED
@@ -87,12 +87,24 @@ class NostoAccount extends NostoObject implements NostoAccountInterface, NostoVa
87
  'last_name' => $meta->getOwner()->getLastName(),
88
  'email' => $meta->getOwner()->getEmail(),
89
  ),
90
- 'billing_details' => array(
91
- 'country' => strtoupper($meta->getBillingDetails()->getCountry()),
92
- ),
93
  'api_tokens' => array(),
94
  );
95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  foreach (NostoApiToken::$tokenNames as $name) {
97
  $params['api_tokens'][] = 'api_'.$name;
98
  }
87
  'last_name' => $meta->getOwner()->getLastName(),
88
  'email' => $meta->getOwner()->getEmail(),
89
  ),
 
 
 
90
  'api_tokens' => array(),
91
  );
92
 
93
+ // Add optional billing details if the required data is set.
94
+ $billingDetails = array(
95
+ 'country' => strtoupper($meta->getBillingDetails()->getCountry())
96
+ );
97
+ if (!empty($billingDetails['country'])) {
98
+ $params['billing_details'] = $billingDetails;
99
+ }
100
+
101
+ // Add optional partner code if one is set.
102
+ $partnerCode = $meta->getPartnerCode();
103
+ if (!empty($partnerCode)) {
104
+ $params['partner_code'] = $partnerCode;
105
+ }
106
+
107
+ // Request all available API tokens for the account.
108
  foreach (NostoApiToken::$tokenNames as $name) {
109
  $params['api_tokens'][] = 'api_'.$name;
110
  }
lib/nosto/php-sdk/src/classes/export/NostoExportProductCollection.php CHANGED
@@ -47,21 +47,38 @@ class NostoExportProductCollection extends NostoProductCollection implements Nos
47
  $array = array();
48
  /** @var NostoProductInterface $item */
49
  foreach ($this->getArrayCopy() as $item) {
50
- $array[] = array(
51
  'url' => $item->getUrl(),
52
  'product_id' => $item->getProductId(),
53
  'name' => $item->getName(),
54
  'image_url' => $item->getImageUrl(),
55
  'price' => Nosto::helper('price')->format($item->getPrice()),
56
- 'list_price' => Nosto::helper('price')->format($item->getListPrice()),
57
  'price_currency_code' => strtoupper($item->getCurrencyCode()),
58
  'availability' => $item->getAvailability(),
59
- 'tags' => $item->getTags(),
60
  'categories' => $item->getCategories(),
61
- 'description' => $item->getShortDescription().'<br/>'.$item->getDescription(),
62
- 'brand' => $item->getBrand(),
63
- 'date_published' => Nosto::helper('date')->format($item->getDatePublished()),
64
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
  return json_encode($array);
67
  }
47
  $array = array();
48
  /** @var NostoProductInterface $item */
49
  foreach ($this->getArrayCopy() as $item) {
50
+ $data = array(
51
  'url' => $item->getUrl(),
52
  'product_id' => $item->getProductId(),
53
  'name' => $item->getName(),
54
  'image_url' => $item->getImageUrl(),
55
  'price' => Nosto::helper('price')->format($item->getPrice()),
 
56
  'price_currency_code' => strtoupper($item->getCurrencyCode()),
57
  'availability' => $item->getAvailability(),
 
58
  'categories' => $item->getCategories(),
 
 
 
59
  );
60
+
61
+ // Optional properties.
62
+
63
+ if ($item->getFullDescription()) {
64
+ $data['description'] = $item->getFullDescription();
65
+ }
66
+ if ($item->getListPrice()) {
67
+ $data['list_price'] = Nosto::helper('price')->format($item->getListPrice());
68
+ }
69
+ if ($item->getBrand()) {
70
+ $data['brand'] = $item->getBrand();
71
+ }
72
+ foreach ($item->getTags() as $type => $tags) {
73
+ if (is_array($tags) && count($tags) > 0) {
74
+ $data[$type] = $tags;
75
+ }
76
+ }
77
+ if ($item->getDatePublished()) {
78
+ $data['date_published'] = Nosto::helper('date')->format($item->getDatePublished());
79
+ }
80
+
81
+ $array[] = $data;
82
  }
83
  return json_encode($array);
84
  }
lib/nosto/php-sdk/src/classes/operation/NostoOperationProduct.php CHANGED
@@ -163,26 +163,63 @@ class NostoOperationProduct
163
  /**
164
  * Converts the product object into an array and returns it.
165
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  * @param NostoProductInterface $product the object.
167
  * @return array the newly created array.
168
  */
169
  protected function getProductAsArray(NostoProductInterface $product)
170
  {
171
- return array(
172
  'url' => $product->getUrl(),
173
  'product_id' => $product->getProductId(),
174
  'name' => $product->getName(),
175
  'image_url' => $product->getImageUrl(),
176
  'price' => Nosto::helper('price')->format($product->getPrice()),
177
- 'list_price' => Nosto::helper('price')->format($product->getListPrice()),
178
  'price_currency_code' => strtoupper($product->getCurrencyCode()),
179
  'availability' => $product->getAvailability(),
180
- 'tag1' => $product->getTags(),
181
  'categories' => $product->getCategories(),
182
- 'description' => $product->getShortDescription().'<br/>'.$product->getDescription(),
183
- 'brand' => $product->getBrand(),
184
- 'date_published' => Nosto::helper('date')->format($product->getDatePublished()),
185
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  }
187
 
188
  /**
163
  /**
164
  * Converts the product object into an array and returns it.
165
  *
166
+ * Example:
167
+ *
168
+ * array(
169
+ * 'url' => 'http://www.example.com/product/CANOE123',
170
+ * 'product_id' => 'CANOE123',
171
+ * 'name' => 'ACME Foldable Canoe',
172
+ * 'image_url' => 'http://www.example.com/product/images/CANOE123.jpg',
173
+ * 'price' => '1269.00',
174
+ * 'price_currency_code' => 'EUR',
175
+ * 'availability' => 'InStock',
176
+ * 'categories' => array('/Outdoor/Boats/Canoes', '/Sales/Boats'),
177
+ * 'description' => 'This foldable canoe is easy to travel with.',
178
+ * 'list_price' => '1299.00',
179
+ * 'brand' => 'ACME',
180
+ * 'tag1' => array('Men'),
181
+ * 'tag2' => array('Foldable'),
182
+ * 'tag3' => array('Brown', 'Black', 'Orange'),
183
+ * 'date_published' => '2011-12-31'
184
+ * )
185
+ *
186
  * @param NostoProductInterface $product the object.
187
  * @return array the newly created array.
188
  */
189
  protected function getProductAsArray(NostoProductInterface $product)
190
  {
191
+ $data = array(
192
  'url' => $product->getUrl(),
193
  'product_id' => $product->getProductId(),
194
  'name' => $product->getName(),
195
  'image_url' => $product->getImageUrl(),
196
  'price' => Nosto::helper('price')->format($product->getPrice()),
 
197
  'price_currency_code' => strtoupper($product->getCurrencyCode()),
198
  'availability' => $product->getAvailability(),
 
199
  'categories' => $product->getCategories(),
 
 
 
200
  );
201
+
202
+ // Optional properties.
203
+
204
+ if ($product->getFullDescription()) {
205
+ $data['description'] = $product->getFullDescription();
206
+ }
207
+ if ($product->getListPrice()) {
208
+ $data['list_price'] = Nosto::helper('price')->format($product->getListPrice());
209
+ }
210
+ if ($product->getBrand()) {
211
+ $data['brand'] = $product->getBrand();
212
+ }
213
+ foreach ($product->getTags() as $type => $tags) {
214
+ if (is_array($tags) && count($tags) > 0) {
215
+ $data[$type] = $tags;
216
+ }
217
+ }
218
+ if ($product->getDatePublished()) {
219
+ $data['date_published'] = Nosto::helper('date')->format($product->getDatePublished());
220
+ }
221
+
222
+ return $data;
223
  }
224
 
225
  /**
lib/nosto/php-sdk/src/interfaces/NostoProductInterface.php CHANGED
@@ -98,7 +98,7 @@ interface NostoProductInterface
98
  /**
99
  * Returns the tags for the product.
100
  *
101
- * @return array the tags array, e.g. array("winter", "shoe").
102
  */
103
  public function getTags();
104
 
@@ -123,6 +123,14 @@ interface NostoProductInterface
123
  */
124
  public function getDescription();
125
 
 
 
 
 
 
 
 
 
126
  /**
127
  * Returns the product brand name.
128
  *
98
  /**
99
  * Returns the tags for the product.
100
  *
101
+ * @return array the tags array, e.g. array('tag1' => array("winter", "shoe")).
102
  */
103
  public function getTags();
104
 
123
  */
124
  public function getDescription();
125
 
126
+ /**
127
+ * Returns the full product description,
128
+ * i.e. both the "short" and "normal" descriptions concatenated.
129
+ *
130
+ * @return string the full descriptions.
131
+ */
132
+ public function getFullDescription();
133
+
134
  /**
135
  * Returns the product brand name.
136
  *
lib/nosto/php-sdk/src/interfaces/account/NostoAccountMetaDataInterface.php CHANGED
@@ -110,4 +110,12 @@ interface NostoAccountMetaDataInterface
110
  * @return string the API token.
111
  */
112
  public function getSignUpApiToken();
 
 
 
 
 
 
 
 
113
  }
110
  * @return string the API token.
111
  */
112
  public function getSignUpApiToken();
113
+
114
+ /**
115
+ * Optional partner code for Nosto partners.
116
+ * The code is issued by Nosto to partners only.
117
+ *
118
+ * @return string|null the partner code or null if none exist.
119
+ */
120
+ public function getPartnerCode();
121
  }
package.xml CHANGED
@@ -1,18 +1,26 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Nosto_Tagging</name>
4
- <version>2.5.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Personalization for Magento</summary>
10
  <description>Increase your conversion rate and average order value by delivering your customers personalized product recommendations throughout their shopping journey.</description>
11
- <notes>* Adds support for Magento 1.9.2.</notes>
 
 
 
 
 
 
 
 
12
  <authors><author><name>Nosto</name><user>nosto</user><email>magento@nosto.com</email></author></authors>
13
- <date>2015-07-14</date>
14
- <time>08:55:42</time>
15
- <contents><target name="magecommunity"><dir name="Nosto"><dir name="Tagging"><dir name="Block"><file name="Addtocart.php" hash="61d645e5cc9e54a5170ae03797f0426a"/><dir name="Adminhtml"><file name="Iframe.php" hash="9b089bb3cd733de7a9e7caf2b46793c2"/><file name="Wizard.php" hash="f98931a1a6e327c0d05e43b73063f672"/></dir><file name="Cart.php" hash="9f4a64499d572780d82d4a1d50cb7880"/><file name="Category.php" hash="177a5d8d9f1ba9e246d149c228c3aec8"/><file name="Customer.php" hash="d35777ca399244e4fb441456320f8ad7"/><file name="Element.php" hash="e5b12bb118b92eb7075ff7a6e16e0eba"/><file name="Embed.php" hash="e8b628b6bc49fb865697552300d08526"/><file name="Meta.php" hash="1f761e731214b7572ef139d9e0577ea1"/><file name="Order.php" hash="1666d552e61768cfd35860b9472feced"/><file name="Product.php" hash="261cd58ad94daa82d1cf2188179278c0"/></dir><dir name="Helper"><file name="Account.php" hash="631bc5302664889d6784270a1b129f2e"/><file name="Customer.php" hash="92da4f0ae6c2aef635b837635cd74238"/><file name="Data.php" hash="9fcbd75579c671f1ae84d989f936755a"/><file name="Date.php" hash="1a108a4ec8169b73411b6c11b86a1d80"/><file name="Oauth.php" hash="08f096ef785d64225ec71d7e2e99f534"/><file name="Price.php" hash="4c21321d10f40c6f985bd934b174a17c"/><file name="Url.php" hash="289294904d246c56e4de96798927a7f6"/></dir><dir name="Model"><file name="Base.php" hash="c0b3c4a6f68a0b707bf85ceff50e3c4b"/><dir name="Container"><file name="Cart.php" hash="20d2936693361999575f1e6ac56f2e40"/><file name="Customer.php" hash="b03bca89845b6c939521add8df1f7e9a"/></dir><file name="Customer.php" hash="6d992a43a75f29836ed1450e130df560"/><dir name="Meta"><dir name="Account"><file name="Billing.php" hash="d09b6b6ddc543201ec9485db9bb0a260"/><file name="Iframe.php" hash="f26a7ef337d86cb83c687ba2e0beb45b"/><file name="Owner.php" hash="801c33bbf04bcfbe133654770909d1df"/></dir><file name="Account.php" hash="c01a324111528339ddd71f0046b95ecc"/><file name="Oauth.php" hash="761b0dd6cede8122c715d077b010b927"/><dir name="Order"><file name="Buyer.php" hash="633c6de58a46128bb594d6580d3ffa46"/><file name="Item.php" hash="ba8a2782d3e7ef577deb47a0c9825afa"/><file name="Status.php" hash="37520c32630aa4bf14d8213f39e80a4b"/></dir><file name="Order.php" hash="1f166cb28ff71ea092203f6fd0c91696"/><file name="Product.php" hash="9cdb3f3980a66167f83f4ea643d82566"/></dir><file name="Observer.php" hash="64b7cf2c54b7322839570c039de29911"/><dir name="Resource"><dir name="Customer"><file name="Collection.php" hash="0c99b46d5108a6fe31cad1190d8ef47c"/></dir><file name="Customer.php" hash="f92e4e5334b5e3493e8f04664b20f105"/><file name="Setup.php" hash="506b08bcb10cbe74e95812c5f646429f"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="Image.php" hash="d1fcc96aab01342627b96edf6fad1dd1"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="NostoController.php" hash="6d0825f3190db7734637368c262d3c83"/></dir><file name="ExportController.php" hash="2de4f180d194344563dbfb4e53a80958"/><file name="OauthController.php" hash="e57a2578535e711ce1bdcb78e3fa1983"/></dir><dir name="etc"><file name="adminhtml.xml" hash="7ea210738a77630f299a14b442f3b8d0"/><file name="cache.xml" hash="e874fbbf2eb89b325deb1a62afbcfb4d"/><file name="config.xml" hash="3c8a5bc333c1145e4055204ad9508dec"/><file name="system.xml" hash="1c96c631b30ae296bb23a4f87137de77"/></dir><dir name="sql"><dir name="tagging_setup"><file name="mysql4-install-1.2.0.php" hash="3cbc52834c44870859562eec7969b9fd"/><file name="mysql4-upgrade-1.1.7-1.2.0.php" hash="0d8eb7990461a9d4b74b479120067aeb"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="nostotagging"><file name="iframe.phtml" hash="c81931adf855a4893e0cf2dc60c390cb"/><file name="wizard.phtml" hash="3f92e94e5ee3d3cd9906a6b0942a3a1b"/></dir></dir><dir name="layout"><file name="nostotagging.xml" hash="29eb82c1a28e9c4d398239c765a3f5fd"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="nostotagging"><file name="addtocart.phtml" hash="e8776f59ec4c7c7b6eea2fae9d56e2a4"/><file name="cart.phtml" hash="3c4e80cdcebf63c56dc14a6594e167b8"/><dir name="category"><file name="view.phtml" hash="fc09e2770ad6281ec96c8e92accc01f1"/></dir><file name="category.phtml" hash="81f36742cb4e3adbf9f692cc8f0ea8a8"/><file name="customer.phtml" hash="e9bc92bb7f7df989cc706c7eaee3614a"/><file name="element.phtml" hash="e1d38981789e632a3607ccf2e171f0cb"/><file name="embed.phtml" hash="9193ddd1ae373b68c53f8364f511b0a5"/><file name="meta.phtml" hash="c1b862a4993503fae420fb0eba194b00"/><file name="order.phtml" hash="e15b11ff1cb20aafaab0dc134ddd1a9b"/><file name="product.phtml" hash="412b7bd9ed43981f056132ea37719aab"/></dir></dir><dir name="layout"><file name="nostotagging.xml" hash="8adc3eecf5f90feffabee29d6308912b"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Nosto_Tagging.xml" hash="1705cb7e6db28388662ef52882d61701"/></dir></target><target name="magelib"><dir name="nosto"><dir name="php-sdk"><dir name="src"><dir name="classes"><file name="Nosto.php" hash="c595c5f646f6e513b6604848f8d10118"/><file name="NostoAccount.php" hash="3c7a82174cf700370e144c79573c7fd9"/><file name="NostoCipher.php" hash="a3d7d148311aa0319387c0918e5e26dc"/><file name="NostoDotEnv.php" hash="90b23c1b02095c9368372f1d5346c3f9"/><file name="NostoMessage.php" hash="5933eadd2ad08427010b0bf16657266b"/><file name="NostoObject.php" hash="187808f0c55d02294d41e9395f4c5d58"/><file name="NostoOrderConfirmation.php" hash="2a3fd5efb196bc0dcb7ad57fb61a81d0"/><file name="NostoProductReCrawl.php" hash="f370c539409dd74fc98b7aa1ea0f6387"/><file name="NostoValidator.php" hash="2096ddc9979ec77f8f0b1ec58b459329"/><dir name="api"><file name="NostoApiRequest.php" hash="37db50c0d35ff9a848afe6a4bb871b6f"/><file name="NostoApiToken.php" hash="2febdbec0fd3609162845aa678b36b38"/></dir><dir name="collection"><file name="NostoCollection.php" hash="35cea0282628354413f629062b58663a"/><file name="NostoOrderCollection.php" hash="db6f517948c1258e1521ceb1ce49d477"/><file name="NostoProductCollection.php" hash="3ae29dbbcb7effa234fa83461d3e6901"/></dir><dir name="exception"><file name="NostoException.php" hash="c4610fb70278d01bd85bc83b8e74df30"/><file name="NostoHttpException.php" hash="dabf4298746db898c8fe709ea9e25818"/></dir><dir name="export"><file name="NostoExportOrderCollection.php" hash="91bdd99a2be75be062fe5c7cde1803e4"/><file name="NostoExportProductCollection.php" hash="84349c0a7080a4f154c2d9e29d4e621f"/><file name="NostoExporter.php" hash="72ad0af4bce8e57ada5a29e3634df94f"/></dir><dir name="helper"><file name="NostoHelper.php" hash="f4ca6c78e047fec93c32b7eb822b0692"/><file name="NostoHelperDate.php" hash="081a2d8bfec710f2baa52192a99a2658"/><file name="NostoHelperIframe.php" hash="303668f25103c245396b43811a15c28d"/><file name="NostoHelperPrice.php" hash="ee9f217dc1b8e0fc679fb56ca3fd3ca1"/></dir><dir name="http"><file name="NostoHttpRequest.php" hash="2c5b96a56d33b33e334d4d3772c2b14d"/><file name="NostoHttpRequestAdapter.php" hash="d8bf8e5db44ad982b655372529f4d88c"/><file name="NostoHttpRequestAdapterCurl.php" hash="945a4357578f91291d09f1e2850da580"/><file name="NostoHttpRequestAdapterSocket.php" hash="88f57e6d98de2ac652a235e2786f0be7"/><file name="NostoHttpResponse.php" hash="9982d3ed15bfcc8f0147b2b4cc400223"/></dir><dir name="oauth"><file name="NostoOAuthClient.php" hash="2672d9de80d23c91776d97b9803d01b4"/><file name="NostoOAuthToken.php" hash="f81c1c1e5c4fc2010162d8f69de2cb33"/></dir><dir name="operation"><file name="NostoOperationProduct.php" hash="cd305ae242e6c79d8ec1ed77c316f52b"/></dir></dir><file name="config.inc.php" hash="b46a56f8d61ff2cf69cedb4281719e00"/><dir name="interfaces"><file name="NostoExportCollectionInterface.php" hash="63c833c17fe43ce48b45e0f552313a8b"/><file name="NostoOAuthClientMetaDataInterface.php" hash="75a82417bfc27cd82e41ea9810d31428"/><file name="NostoProductInterface.php" hash="110aabc704bed12ddacc304d6d1e1529"/><file name="NostoValidatableInterface.php" hash="57ad8b28225344127843b97049f5868d"/><dir name="account"><file name="NostoAccountInterface.php" hash="063da0d25a5420f4e727938467c078f3"/><file name="NostoAccountMetaDataBillingDetailsInterface.php" hash="ef31f0c3b41591fd76f85a25021f0fe4"/><file name="NostoAccountMetaDataIframeInterface.php" hash="c739e6a3ef39a308df6852361f2fd1d7"/><file name="NostoAccountMetaDataInterface.php" hash="7395de56fb4e3a1831bc5f7cfeffed8d"/><file name="NostoAccountMetaDataOwnerInterface.php" hash="4c037b8cb1b529c16c91f25cce2b0ed7"/></dir><dir name="order"><file name="NostoOrderBuyerInterface.php" hash="890884e45bcca61f96f0f98cda40b6c1"/><file name="NostoOrderInterface.php" hash="d341b4faf020bfca01336c5d60ca5e48"/><file name="NostoOrderPurchasedItemInterface.php" hash="e33b94290465eea80d614db35144b75a"/><file name="NostoOrderStatusInterface.php" hash="8c89cf4296629b635f52b53a9b800b1f"/></dir></dir><dir name="js"><file name="NostoIframe.min.js" hash="5fd9f5b418dd796c469aaa0c58b34aaa"/><dir name="src"><file name="NostoIframe.js" hash="ca03585215f846258d2dbb58724e48fa"/></dir></dir><dir name="libs"><dir name="phpseclib"><dir name="crypt"><file name="NostoCryptAES.php" hash="7f16ec6fa7eefa011a27acf4506a3b57"/><file name="NostoCryptBase.php" hash="c78432d428ad8a70be832f91261d4c42"/><file name="NostoCryptRandom.php" hash="eb21a56b9cf6e6ef0b220620dd4d0ebe"/><file name="NostoCryptRijndael.php" hash="9c728d06c0249f8bc24a7c61606ccc89"/></dir></dir></dir><file name=".env.example" hash="42aa9514d8b3f65e9df96b0df601f63c"/></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="nosto"><file name="NostoAdmin.js" hash="0119fb333233f1f0fa70f4167fb014ef"/><file name="NostoIframe.min.js" hash="5fd9f5b418dd796c469aaa0c58b34aaa"/><file name="iframeresizer.min.js" hash="163b065c9dd702dc364913a951b81fee"/></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><package><name>Mage_Core_Modules</name><channel>community</channel><min>1.6.0.0</min><max>1.9.2.0</max></package></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Nosto_Tagging</name>
4
+ <version>2.6.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Personalization for Magento</summary>
10
  <description>Increase your conversion rate and average order value by delivering your customers personalized product recommendations throughout their shopping journey.</description>
11
+ <notes>* Add better error handling and notifications to Nosto account OAuth cycle&#xD;
12
+ * Add support for bundle products with fixed pricing&#xD;
13
+ * Add support for using "tag1", "tag2" and "tag3" properties in Nosto product&#xD;
14
+ tagging and product update API&#xD;
15
+ * Add support for Nosto partner code in account creation API&#xD;
16
+ * Add support for overriding meta data models&#xD;
17
+ * Fix bug in cart/order item name tagging while running Magento Dev Mode&#xD;
18
+ * Fix bug in product export while having product flat tables enabled&#xD;
19
+ * Fix bug in order confirmation API when payment provider is no longer available</notes>
20
  <authors><author><name>Nosto</name><user>nosto</user><email>magento@nosto.com</email></author></authors>
21
+ <date>2015-07-30</date>
22
+ <time>09:31:38</time>
23
+ <contents><target name="magecommunity"><dir name="Nosto"><dir name="Tagging"><dir name="Block"><file name="Addtocart.php" hash="61d645e5cc9e54a5170ae03797f0426a"/><dir name="Adminhtml"><file name="Iframe.php" hash="d60e2221e6689b2ab2da9263897f6a6b"/><file name="Wizard.php" hash="f98931a1a6e327c0d05e43b73063f672"/></dir><file name="Cart.php" hash="c1c707dad76c98d807d5160b90c06ac6"/><file name="Category.php" hash="177a5d8d9f1ba9e246d149c228c3aec8"/><file name="Customer.php" hash="d35777ca399244e4fb441456320f8ad7"/><file name="Element.php" hash="e5b12bb118b92eb7075ff7a6e16e0eba"/><file name="Embed.php" hash="e8b628b6bc49fb865697552300d08526"/><file name="Meta.php" hash="1f761e731214b7572ef139d9e0577ea1"/><file name="Order.php" hash="32115070d380e654f093da11dd6e4d85"/><file name="Product.php" hash="ac7b85e6d03d94d03c59416b622b0039"/></dir><dir name="Helper"><file name="Account.php" hash="40eb62dd1718741b2064d4a440f46b2f"/><file name="Customer.php" hash="92da4f0ae6c2aef635b837635cd74238"/><file name="Data.php" hash="c50b9b5a694fdd0401748741de97f6ab"/><file name="Date.php" hash="1a108a4ec8169b73411b6c11b86a1d80"/><file name="Oauth.php" hash="9ecbea9e8411501cabe780e0511a1d05"/><file name="Price.php" hash="d37f4b50feb5cfe0a83f46327d243636"/><file name="Url.php" hash="289294904d246c56e4de96798927a7f6"/></dir><dir name="Model"><file name="Base.php" hash="c0b3c4a6f68a0b707bf85ceff50e3c4b"/><dir name="Container"><file name="Cart.php" hash="20d2936693361999575f1e6ac56f2e40"/><file name="Customer.php" hash="b03bca89845b6c939521add8df1f7e9a"/></dir><file name="Customer.php" hash="6d992a43a75f29836ed1450e130df560"/><dir name="Meta"><dir name="Account"><file name="Billing.php" hash="353e807f832a37591bf7359857044ca1"/><file name="Iframe.php" hash="731e2bf424e1b9d4e00d403f55a87b54"/><file name="Owner.php" hash="d86a8ceb0ef573793f829990dd48ab3c"/></dir><file name="Account.php" hash="8df7024533e1cf657b407c49fb19a3c5"/><file name="Oauth.php" hash="0863271d8a3db0de93525f0e64308f1c"/><dir name="Order"><file name="Buyer.php" hash="3b8e57e195e214ed3324967684614745"/><file name="Item.php" hash="90dbec8a0201ccd8fbca3e10f2c362ad"/><file name="Status.php" hash="37520c32630aa4bf14d8213f39e80a4b"/></dir><file name="Order.php" hash="7844be08fe7f3f5310c18f352a952a5e"/><file name="Product.php" hash="40cf899477bac2f9916b030af8885e5e"/></dir><file name="Observer.php" hash="58bf4eb430d8a74fbb1ac5c68750c30c"/><file name="Product.php" hash="3630a2a688f013b296d1865e6f32e1d2"/><dir name="Resource"><dir name="Customer"><file name="Collection.php" hash="0c99b46d5108a6fe31cad1190d8ef47c"/></dir><file name="Customer.php" hash="f92e4e5334b5e3493e8f04664b20f105"/><dir name="Product"><file name="Collection.php" hash="7566a7f4483a00c923bac2fbea173abd"/></dir><file name="Setup.php" hash="506b08bcb10cbe74e95812c5f646429f"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="Image.php" hash="d1fcc96aab01342627b96edf6fad1dd1"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="NostoController.php" hash="fd43fd322ea1f8d6b7db6d716250f71e"/></dir><file name="ExportController.php" hash="e20f49db51535241ed1857c2a86e077e"/><file name="OauthController.php" hash="e2ad2e3bcb5323e860154af78c2b0e98"/></dir><dir name="etc"><file name="adminhtml.xml" hash="7ea210738a77630f299a14b442f3b8d0"/><file name="cache.xml" hash="e874fbbf2eb89b325deb1a62afbcfb4d"/><file name="config.xml" hash="f8c154da340736d9b28ff5054e2b099d"/><file name="system.xml" hash="7deba6544a09d7af8c07e6b5edc0975a"/></dir><dir name="sql"><dir name="tagging_setup"><file name="mysql4-install-1.2.0.php" hash="3cbc52834c44870859562eec7969b9fd"/><file name="mysql4-upgrade-1.1.7-1.2.0.php" hash="0d8eb7990461a9d4b74b479120067aeb"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="nostotagging"><file name="iframe.phtml" hash="c81931adf855a4893e0cf2dc60c390cb"/><file name="wizard.phtml" hash="3f92e94e5ee3d3cd9906a6b0942a3a1b"/></dir></dir><dir name="layout"><file name="nostotagging.xml" hash="29eb82c1a28e9c4d398239c765a3f5fd"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="nostotagging"><file name="addtocart.phtml" hash="e8776f59ec4c7c7b6eea2fae9d56e2a4"/><file name="cart.phtml" hash="3c4e80cdcebf63c56dc14a6594e167b8"/><dir name="category"><file name="view.phtml" hash="fc09e2770ad6281ec96c8e92accc01f1"/></dir><file name="category.phtml" hash="81f36742cb4e3adbf9f692cc8f0ea8a8"/><file name="customer.phtml" hash="e9bc92bb7f7df989cc706c7eaee3614a"/><file name="element.phtml" hash="e1d38981789e632a3607ccf2e171f0cb"/><file name="embed.phtml" hash="9193ddd1ae373b68c53f8364f511b0a5"/><file name="meta.phtml" hash="c1b862a4993503fae420fb0eba194b00"/><file name="order.phtml" hash="e15b11ff1cb20aafaab0dc134ddd1a9b"/><file name="product.phtml" hash="9df3ff9f6e363e478d7fd68bd09827b1"/></dir></dir><dir name="layout"><file name="nostotagging.xml" hash="8adc3eecf5f90feffabee29d6308912b"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Nosto_Tagging.xml" hash="1705cb7e6db28388662ef52882d61701"/></dir></target><target name="magelib"><dir name="nosto"><dir name="php-sdk"><dir name="src"><dir name="classes"><file name="Nosto.php" hash="c595c5f646f6e513b6604848f8d10118"/><file name="NostoAccount.php" hash="c422a7f104c5ebc6eac9d83986280579"/><file name="NostoCipher.php" hash="a3d7d148311aa0319387c0918e5e26dc"/><file name="NostoDotEnv.php" hash="90b23c1b02095c9368372f1d5346c3f9"/><file name="NostoMessage.php" hash="5933eadd2ad08427010b0bf16657266b"/><file name="NostoObject.php" hash="187808f0c55d02294d41e9395f4c5d58"/><file name="NostoOrderConfirmation.php" hash="2a3fd5efb196bc0dcb7ad57fb61a81d0"/><file name="NostoProductReCrawl.php" hash="f370c539409dd74fc98b7aa1ea0f6387"/><file name="NostoValidator.php" hash="2096ddc9979ec77f8f0b1ec58b459329"/><dir name="api"><file name="NostoApiRequest.php" hash="37db50c0d35ff9a848afe6a4bb871b6f"/><file name="NostoApiToken.php" hash="2febdbec0fd3609162845aa678b36b38"/></dir><dir name="collection"><file name="NostoCollection.php" hash="35cea0282628354413f629062b58663a"/><file name="NostoOrderCollection.php" hash="db6f517948c1258e1521ceb1ce49d477"/><file name="NostoProductCollection.php" hash="3ae29dbbcb7effa234fa83461d3e6901"/></dir><dir name="exception"><file name="NostoException.php" hash="c4610fb70278d01bd85bc83b8e74df30"/><file name="NostoHttpException.php" hash="dabf4298746db898c8fe709ea9e25818"/></dir><dir name="export"><file name="NostoExportOrderCollection.php" hash="91bdd99a2be75be062fe5c7cde1803e4"/><file name="NostoExportProductCollection.php" hash="33986c8767922da98aa90f03759dbc0f"/><file name="NostoExporter.php" hash="72ad0af4bce8e57ada5a29e3634df94f"/></dir><dir name="helper"><file name="NostoHelper.php" hash="f4ca6c78e047fec93c32b7eb822b0692"/><file name="NostoHelperDate.php" hash="081a2d8bfec710f2baa52192a99a2658"/><file name="NostoHelperIframe.php" hash="303668f25103c245396b43811a15c28d"/><file name="NostoHelperPrice.php" hash="ee9f217dc1b8e0fc679fb56ca3fd3ca1"/></dir><dir name="http"><file name="NostoHttpRequest.php" hash="2c5b96a56d33b33e334d4d3772c2b14d"/><file name="NostoHttpRequestAdapter.php" hash="d8bf8e5db44ad982b655372529f4d88c"/><file name="NostoHttpRequestAdapterCurl.php" hash="945a4357578f91291d09f1e2850da580"/><file name="NostoHttpRequestAdapterSocket.php" hash="88f57e6d98de2ac652a235e2786f0be7"/><file name="NostoHttpResponse.php" hash="9982d3ed15bfcc8f0147b2b4cc400223"/></dir><dir name="oauth"><file name="NostoOAuthClient.php" hash="2672d9de80d23c91776d97b9803d01b4"/><file name="NostoOAuthToken.php" hash="f81c1c1e5c4fc2010162d8f69de2cb33"/></dir><dir name="operation"><file name="NostoOperationProduct.php" hash="37e24121df779ead75e028b15a3fe226"/></dir></dir><file name="config.inc.php" hash="b46a56f8d61ff2cf69cedb4281719e00"/><dir name="interfaces"><file name="NostoExportCollectionInterface.php" hash="63c833c17fe43ce48b45e0f552313a8b"/><file name="NostoOAuthClientMetaDataInterface.php" hash="75a82417bfc27cd82e41ea9810d31428"/><file name="NostoProductInterface.php" hash="64a9e110a97ebd8be690664ce5b8e371"/><file name="NostoValidatableInterface.php" hash="57ad8b28225344127843b97049f5868d"/><dir name="account"><file name="NostoAccountInterface.php" hash="063da0d25a5420f4e727938467c078f3"/><file name="NostoAccountMetaDataBillingDetailsInterface.php" hash="ef31f0c3b41591fd76f85a25021f0fe4"/><file name="NostoAccountMetaDataIframeInterface.php" hash="c739e6a3ef39a308df6852361f2fd1d7"/><file name="NostoAccountMetaDataInterface.php" hash="5adf0a5ed876348a05028a3ff111bf79"/><file name="NostoAccountMetaDataOwnerInterface.php" hash="4c037b8cb1b529c16c91f25cce2b0ed7"/></dir><dir name="order"><file name="NostoOrderBuyerInterface.php" hash="890884e45bcca61f96f0f98cda40b6c1"/><file name="NostoOrderInterface.php" hash="d341b4faf020bfca01336c5d60ca5e48"/><file name="NostoOrderPurchasedItemInterface.php" hash="e33b94290465eea80d614db35144b75a"/><file name="NostoOrderStatusInterface.php" hash="8c89cf4296629b635f52b53a9b800b1f"/></dir></dir><dir name="js"><file name="NostoIframe.min.js" hash="5fd9f5b418dd796c469aaa0c58b34aaa"/><dir name="src"><file name="NostoIframe.js" hash="ca03585215f846258d2dbb58724e48fa"/></dir></dir><dir name="libs"><dir name="phpseclib"><dir name="crypt"><file name="NostoCryptAES.php" hash="7f16ec6fa7eefa011a27acf4506a3b57"/><file name="NostoCryptBase.php" hash="c78432d428ad8a70be832f91261d4c42"/><file name="NostoCryptRandom.php" hash="eb21a56b9cf6e6ef0b220620dd4d0ebe"/><file name="NostoCryptRijndael.php" hash="9c728d06c0249f8bc24a7c61606ccc89"/></dir></dir></dir><file name=".env.example" hash="42aa9514d8b3f65e9df96b0df601f63c"/></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="nosto"><file name="NostoAdmin.js" hash="0119fb333233f1f0fa70f4167fb014ef"/><file name="NostoIframe.min.js" hash="5fd9f5b418dd796c469aaa0c58b34aaa"/><file name="iframeresizer.min.js" hash="163b065c9dd702dc364913a951b81fee"/></dir></dir></target></contents>
24
  <compatible/>
25
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><package><name>Mage_Core_Modules</name><channel>community</channel><min>1.6.0.0</min><max>1.9.2.0</max></package></required></dependencies>
26
  </package>