LetsSyncroLLC_Oct8ne - Version 2.1.6

Version Notes

New linkup method
Minor bugs fixed

Download this release

Release Info

Developer Oct8ne
Extension LetsSyncroLLC_Oct8ne
Version 2.1.6
Comparing to
See all releases


Code changes from version 2.1.5 to 2.1.6

app/code/community/LetsSyncroLLC/Oct8ne/Block/Accountconfig.php CHANGED
@@ -35,6 +35,7 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
35
  }
36
 
37
  if (isset($_GET['deactivate']) && !isset($submitLetsSyncroCredentials)) {
 
38
  if (!$this->updateLetsSyncroEnabled('0', $letssyncrooptions, $letssyncromodel))
39
  $this->_html .= '<div id="messagesbox"><ul class="messages"><li class="error-msg"><ul><li><div id="themessage">' . $this->__('There was an error deactivating OCT8NE integration.') . '</div></li></ul></li></ul><br></div>';
40
  else
@@ -44,6 +45,7 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
44
  }
45
 
46
  if (isset($_GET['activate']) && !isset($submitLetsSyncroCredentials)) {
 
47
  if (!$this->updateLetsSyncroEnabled('1', $letssyncrooptions, $letssyncromodel))
48
  $this->_html .= '<div id="messagesbox"><ul class="messages"><li class="error-msg"><ul><li><div id="themessage">' . $this->__('There was an error activating OCT8NE integration.') . '</div></li></ul></li></ul><br></div>';
49
  else
@@ -99,6 +101,8 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
99
  elseif ($letssyncrooptions['licenseid'] != '' && $letssyncrooptions['enabled'] == '1')
100
  $this->_html .= str_replace('&amp;deactivate', '', $linked_literal_deact);
101
 
 
 
102
  $this->_html .= '
103
  <legend>' . $this->__('Account Setup') . '</legend>
104
  <table cellspacing="0" class="form-list">
@@ -141,8 +145,7 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
141
  <br />
142
  <p class="LetsSyncro">' . $this->__('Don\'t have an oct8ne account? Email us: support@oct8ne.com') . '</p>
143
  </fieldset>
144
- </form><br />';
145
-
146
  return $this->_html;
147
  }
148
 
@@ -158,16 +161,53 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
158
  if ($letssyncro_enabled == '1' && ($letssyncro_licenseid == '' || strlen($letssyncro_licenseid) != 32))
159
  return false;
160
 
161
- $letssyncro_useremail = $letssyncrooptions['email'];
162
- $letssyncro_password = $letssyncrooptions['password'];
163
-
164
- $xmlData = $this->createXML_Logon($letssyncro_useremail, $letssyncro_password, $letssyncro_enabled ? 1 : 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  $linkup = Mage::helper('oct8ne/url')->getOct8neLinkupServiceUrl();
166
- $this->sendRequest($xmlData, 'logon', $linkup);
167
 
168
- return $letssyncromodel->setEnabled($letssyncro_enabled);
169
  }
170
-
171
  public function updateLetsSyncroUserPassword($letssyncrooptions, $letssyncromodel, $letssyncro_useremail, $letssyncro_password) {
172
  if (!$letssyncromodel->setEmail($letssyncro_useremail) || !$letssyncromodel->setPassword($letssyncro_password))
173
  return false;
@@ -175,34 +215,92 @@ class LetsSyncroLLC_Oct8ne_Block_Accountconfig extends Mage_Core_Block_Template
175
  $letssyncromodel->setApitoken('');
176
  $letssyncromodel->setLicenseid('');
177
 
178
- $xmlData = $this->createXML_Logon($letssyncro_useremail, $letssyncro_password);
179
-
180
- try {
181
- $response = $this->sendRequest($xmlData, 'logon', $letssyncrooptions['urlapi']);
182
-
183
- if (strripos($response, '<head>'))
184
- return false;
185
-
186
- $xml = new SimpleXmlElement($response);
187
-
188
- $this->message = isset($xml->Message) ? $xml->Message : NULL;
189
-
190
- if (!$xml || ("" . $xml->LicenseId === "")) {
191
- $letssyncromodel->setEnabled('0');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  return false;
193
  }
194
- if ($letssyncromodel->setApitoken($xml->ApiToken) &&
195
- $letssyncromodel->setLicenseid($xml->LicenseId) &&
196
- $letssyncromodel->setEmail($letssyncro_useremail) &&
197
- $letssyncromodel->setPassword($letssyncro_password)) {
198
- return true;
199
- }
200
  return false;
201
- } catch (Exception $e) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  return false;
203
  }
204
-
205
- return true;
206
  }
207
 
208
  public function sendRequest($xmlData, $method = '', $letssyncro_url, $letssyncro_apitoken = '') {
35
  }
36
 
37
  if (isset($_GET['deactivate']) && !isset($submitLetsSyncroCredentials)) {
38
+ Mage::log('Deactivate');
39
  if (!$this->updateLetsSyncroEnabled('0', $letssyncrooptions, $letssyncromodel))
40
  $this->_html .= '<div id="messagesbox"><ul class="messages"><li class="error-msg"><ul><li><div id="themessage">' . $this->__('There was an error deactivating OCT8NE integration.') . '</div></li></ul></li></ul><br></div>';
41
  else
45
  }
46
 
47
  if (isset($_GET['activate']) && !isset($submitLetsSyncroCredentials)) {
48
+ Mage::log('Activate');
49
  if (!$this->updateLetsSyncroEnabled('1', $letssyncrooptions, $letssyncromodel))
50
  $this->_html .= '<div id="messagesbox"><ul class="messages"><li class="error-msg"><ul><li><div id="themessage">' . $this->__('There was an error activating OCT8NE integration.') . '</div></li></ul></li></ul><br></div>';
51
  else
101
  elseif ($letssyncrooptions['licenseid'] != '' && $letssyncrooptions['enabled'] == '1')
102
  $this->_html .= str_replace('&amp;deactivate', '', $linked_literal_deact);
103
 
104
+ echo $oct8neLinkupServiceUrl;
105
+
106
  $this->_html .= '
107
  <legend>' . $this->__('Account Setup') . '</legend>
108
  <table cellspacing="0" class="form-list">
145
  <br />
146
  <p class="LetsSyncro">' . $this->__('Don\'t have an oct8ne account? Email us: support@oct8ne.com') . '</p>
147
  </fieldset>
148
+ </form><br />';
 
149
  return $this->_html;
150
  }
151
 
161
  if ($letssyncro_enabled == '1' && ($letssyncro_licenseid == '' || strlen($letssyncro_licenseid) != 32))
162
  return false;
163
 
164
+ try {
165
+ //peticion
166
+ $url = Mage::helper('oct8ne/url')->getOct8neLinkupServiceUrl();
167
+ echo $url;
168
+
169
+ $data = array('email' => $letssyncrooptions['email'],
170
+ 'pass' => $this->urlsafe_b64decode($letssyncrooptions['password']),
171
+ 'platform' => 'MAGENTO',
172
+ 'urlDomain' => Mage::getBaseUrl(),
173
+ 'statusPlatform' => $letssyncro_enabled ? 1 : 0);
174
+
175
+ $options = array(
176
+ 'http' => array(
177
+ 'header' => "Content-Type: application/json;charset=UTF-8\r\n",
178
+ 'method' => 'POST',
179
+ 'content' => json_encode($data)
180
+ )
181
+ );
182
+ $context = stream_context_create($options);
183
+ $result = self::OctFileGetContents($url, false, $context);
184
+ $result = json_decode($result);
185
+
186
+ if (isset($result)) {
187
+ //si se devuelve una licencia y token correctos se devuelve
188
+ $license = $result->LicenseId;
189
+ $token = $result->ApiToken;
190
+ //$msg = $result->Message;
191
+
192
+ if ($license != null && $token != null) {
193
+ Mage::log('Ha entrat al if de updateLetsSyncroEnabled');
194
+ return $letssyncromodel->setEnabled($letssyncro_enabled);
195
+ } else {
196
+ return false;
197
+ }
198
+ } else {
199
+ return false;
200
+ }
201
+ } catch (Exception $ex) {
202
+ return false;
203
+ }
204
+ /*$xmlData = $this->createXML_Logon($letssyncro_useremail, $letssyncro_password, $letssyncro_enabled ? 1 : 0);
205
  $linkup = Mage::helper('oct8ne/url')->getOct8neLinkupServiceUrl();
206
+ $this->sendRequest($xmlData, 'logon', $linkup);*/
207
 
208
+ return $letssyncromodel->setEnabled($letssyncro_enabled);
209
  }
210
+
211
  public function updateLetsSyncroUserPassword($letssyncrooptions, $letssyncromodel, $letssyncro_useremail, $letssyncro_password) {
212
  if (!$letssyncromodel->setEmail($letssyncro_useremail) || !$letssyncromodel->setPassword($letssyncro_password))
213
  return false;
215
  $letssyncromodel->setApitoken('');
216
  $letssyncromodel->setLicenseid('');
217
 
218
+ try {
219
+ //peticion
220
+ $url = Mage::helper('oct8ne/url')->getOct8neLinkupServiceUrl();
221
+ $data = array('email' => $letssyncro_useremail,
222
+ 'pass' => $this->urlsafe_b64decode($letssyncro_password),
223
+ 'platform' => 'MAGENTO',
224
+ 'urlDomain' => Mage::getBaseUrl());
225
+
226
+ $options = array(
227
+ 'http' => array(
228
+ 'header' => "Content-Type: application/json;charset=UTF-8\r\n",
229
+ 'method' => 'POST',
230
+ 'content' => json_encode($data)
231
+ )
232
+ );
233
+ $context = stream_context_create($options);
234
+ $result = self::OctFileGetContents($url, false, $context);
235
+ $result = json_decode($result);
236
+
237
+ if (isset($result)) {
238
+ //si se devuelve una licencia y token correctos se devuelve
239
+ $license = $result->LicenseId;
240
+ $token = $result->ApiToken;
241
+ //$msg = $result->Message;
242
+
243
+ if ($license != null && $token != null) {
244
+ Mage::log('Ha entrat al if de updateLetsSyncroUserPassword');
245
+ if ($letssyncromodel->setApitoken($result->ApiToken) &&
246
+ $letssyncromodel->setLicenseid($result->LicenseId) &&
247
+ $letssyncromodel->setEmail($letssyncro_useremail) &&
248
+ $letssyncromodel->setPassword($letssyncro_password)) {
249
+ return true;
250
+ }
251
+ } else {
252
+ return false;
253
+ }
254
+ } else {
255
  return false;
256
  }
257
+ } catch (Exception $ex) {
 
 
 
 
 
258
  return false;
259
+ }
260
+ }
261
+
262
+ private static function jsonResult($data) {
263
+ $options = array(
264
+ 'http' => array(
265
+ 'header' => "Content-Type: application/json;charset=UTF-8\r\n",
266
+ 'method' => 'POST',
267
+ 'content' => json_encode($data)
268
+ )
269
+ );
270
+ return $options;
271
+ }
272
+
273
+ private static function octFileGetContents($url, $use_include_path = false, $stream_context = null, $curl_timeout = 5)
274
+ {
275
+ if ($stream_context == null && preg_match('/^https?:\/\//', $url)) {
276
+ $stream_context = @stream_context_create(array('http' => array('timeout' => $curl_timeout)));
277
+ }
278
+ if (in_array(ini_get('allow_url_fopen'), array('On', 'on', '1')) || !preg_match('/^https?:\/\//', $url)) {
279
+ $meth = 'file_get_contents';
280
+ return @$meth($url, $use_include_path, $stream_context);
281
+ } elseif (function_exists('curl_init')) {
282
+ $curl = curl_init();
283
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
284
+ curl_setopt($curl, CURLOPT_URL, $url);
285
+ curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
286
+ curl_setopt($curl, CURLOPT_TIMEOUT, $curl_timeout);
287
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
288
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=UTF-8\r\n'));
289
+ if ($stream_context != null) {
290
+ $opts = stream_context_get_options($stream_context);
291
+ if (isset($opts['http']['method']) && Tools::strtolower($opts['http']['method']) == 'post') {
292
+ curl_setopt($curl, CURLOPT_POST, true);
293
+ if (isset($opts['http']['content'])) {
294
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $opts['http']['content']);
295
+ }
296
+ }
297
+ }
298
+ $content = curl_exec($curl);
299
+ curl_close($curl);
300
+ return $content;
301
+ } else {
302
  return false;
303
  }
 
 
304
  }
305
 
306
  public function sendRequest($xmlData, $method = '', $letssyncro_url, $letssyncro_apitoken = '') {
app/code/community/LetsSyncroLLC/Oct8ne/Helper/Data.php CHANGED
@@ -107,7 +107,8 @@ class LetsSyncroLLC_Oct8ne_Helper_Data extends Mage_Core_Helper_Abstract {
107
  static public function createProductSummaryFromProduct($product, $qty = null) {
108
  $product_id = $product->getId();
109
  $formattedPrevPrice = $product->getFinalPrice() != 0 ? Mage::helper('core')->currency($product->getPrice(), true, false): NULL;
110
- $formattedPrice = $product->getFinalPrice() != 0 ? Mage::helper('core')->currency($product->getFinalPrice(), true, false) : NULL;
 
111
  $productUrl = self::_remove_http($product->getProductUrl());
112
  $thumbnail = self::_remove_http(self::getProductThumbnail($product, 120));
113
  $title = htmlspecialchars($product->getName(), ENT_QUOTES, "UTF-8");
@@ -272,22 +273,33 @@ class LetsSyncroLLC_Oct8ne_Helper_Data extends Mage_Core_Helper_Abstract {
272
  }
273
 
274
  static private function getSanitizedDescription($product) {
275
- $attrs = self::getDescriptionAttributes();
276
- $description = NULL;
277
- foreach ($attrs as $attr) {
278
- if (trim($attr) != '') {
279
- $description = $product[$attr];
280
- if (!is_null($description) && strlen(trim($description)) > 0) {
281
- break;
 
 
 
 
 
 
 
 
 
282
  }
283
  }
 
 
284
  }
285
  if (!is_null($description)) {
286
  $description = htmlspecialchars($description, ENT_QUOTES, "UTF-8");
287
  $description = trim($description, "\r\n\t ");
288
  $description = str_replace("\r", "", $description);
289
  $description = str_replace("\t", "", $description);
290
- $description = str_replace("\n", "&lt;br\/&gt;", $description);
291
  }
292
  return $description;
293
  }
@@ -384,25 +396,29 @@ class LetsSyncroLLC_Oct8ne_Helper_Data extends Mage_Core_Helper_Abstract {
384
  }
385
  }
386
 
 
 
 
 
387
  private static function getDescriptionAttributes() {
388
  $descriptionAttrs = Mage::getStoreConfig('oct8neData/productData/productDataDescription');
389
  if (trim($descriptionAttrs) == '') {
390
- $attrs = array('description', 'short_description');
391
  } else {
392
- $attrs = explode(',', $descriptionAttrs);
393
-
394
- // Uncomment the following block if we want to add
395
- // description & short_description attributes if
396
- // they have not been already included.
397
- //
398
- // if (!array_search('description', $attrs)) {
399
- // $attrs[] = 'description';
400
- // }
401
- // if (!array_search('short_description', $attrs)) {
402
- // $attrs[] = 'short_description';
403
- // }
404
  }
405
- return $attrs;
406
  }
407
 
408
  private static $profiler = NULL;
107
  static public function createProductSummaryFromProduct($product, $qty = null) {
108
  $product_id = $product->getId();
109
  $formattedPrevPrice = $product->getFinalPrice() != 0 ? Mage::helper('core')->currency($product->getPrice(), true, false): NULL;
110
+ $formattedPrice = $product->getFinalPrice() != 0 ? Mage::helper('core')->currency($product->getFinalPrice(), true, false) : NULL;
111
+
112
  $productUrl = self::_remove_http($product->getProductUrl());
113
  $thumbnail = self::_remove_http(self::getProductThumbnail($product, 120));
114
  $title = htmlspecialchars($product->getName(), ENT_QUOTES, "UTF-8");
273
  }
274
 
275
  static private function getSanitizedDescription($product) {
276
+ $descriptionAttrs = Mage::getStoreConfig('oct8neData/productData/productDataDescription');
277
+ if (trim($descriptionAttrs) == '') {
278
+ $groups = self::getDefaultDescriptionAttributes();
279
+ } else {
280
+ $groups = explode(',', $descriptionAttrs); // Example: ["a+b", "c"]
281
+ }
282
+ $description = "";
283
+ foreach($groups as $group) {
284
+ $fields = explode('+', $group);
285
+ foreach($fields as $field) {
286
+ $value = $product[$field];
287
+ if(!is_null($value) && strlen($value)>0) {
288
+ if (strlen($description) > 0) {
289
+ $description .= "<hr class='oct8ne-description-separator' />";
290
+ }
291
+ $description .= $value;
292
  }
293
  }
294
+ if(strlen($description) > 0)
295
+ break;
296
  }
297
  if (!is_null($description)) {
298
  $description = htmlspecialchars($description, ENT_QUOTES, "UTF-8");
299
  $description = trim($description, "\r\n\t ");
300
  $description = str_replace("\r", "", $description);
301
  $description = str_replace("\t", "", $description);
302
+ $description = str_replace("\n", "&lt;br/ &gt;", $description);
303
  }
304
  return $description;
305
  }
396
  }
397
  }
398
 
399
+ private static function getDefaultDescriptionAttributes() {
400
+ return array('description', 'short_description');
401
+ }
402
+
403
  private static function getDescriptionAttributes() {
404
  $descriptionAttrs = Mage::getStoreConfig('oct8neData/productData/productDataDescription');
405
  if (trim($descriptionAttrs) == '') {
406
+ $result = self::getDefaultDescriptionAttributes();
407
  } else {
408
+ $attrs = [];
409
+ $groups = explode(',', $descriptionAttrs); // Example: ["a+b", "c"]
410
+ foreach($groups as $group) {
411
+ $fields = explode('+', $group);
412
+ foreach($fields as $field) {
413
+ $field = trim($field);
414
+ if(!array_key_exists($field, $attrs) ){
415
+ $attrs[$field] = null;
416
+ }
417
+ }
418
+ }
419
+ $result = array_keys($attrs);
420
  }
421
+ return $result;
422
  }
423
 
424
  private static $profiler = NULL;
app/code/community/LetsSyncroLLC/Oct8ne/Helper/Search/Solr.php CHANGED
@@ -8,7 +8,8 @@
8
  * - id_field: name of id field
9
  * - name_field: name of product name field (used for sorting)
10
  * - price_field: name of price field (used for sorting and filtering)
11
- * - query_field: name of the field where the text search is performed
 
12
  * - additional_query_params: additional criteria to be added to the search expression
13
  * - categories_field: name of the field having the array of categories the product belongs to
14
  * - related_method: method to get the related products (name|name-reverse|categories|self)
@@ -20,7 +21,7 @@
20
  host=http://dev.binaryanvil.net:8080/solr;
21
  id_field=id;
22
  additional_query_params=in_stock:true AND store_id:1;
23
- query_field=fulltext_1_en;
24
  name_field=attr_sort_name_en;
25
  price_field=price_0_1;
26
  related_method=name;
@@ -47,6 +48,7 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
47
 
48
  public function search($storeId, $searchTerm, $searchOrder, $searchDir, $page, $pageSize, &$totalSearchResults, &$attrs_applied, &$attrs_available) {
49
  if (!$this->checkEngineParams()) {
 
50
  return array();
51
  }
52
 
@@ -67,19 +69,21 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
67
 
68
  public function getRelatedProductIds($product, $page, $pageSize) {
69
  if (!$this->checkEngineParams()) {
 
70
  return array();
71
  }
72
 
73
- if ($relatedMethod == "self") {
74
- $result = array($product->getId());
75
- return $result;
76
- }
77
-
78
  $pageSize = 30;
79
  $relatedMethod = strtolower($this->getEngineParam("related_method"));
80
  if (!$relatedMethod) {
81
  $relatedMethod = "name";
82
  }
 
 
 
 
 
 
83
  $result = NULL;
84
  if ($relatedMethod == "categories") {
85
  $categoryIds = $product->getCategoryIds();
@@ -136,20 +140,18 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
136
  $query = $host . '/select?' . http_build_query($queryParams);
137
 
138
  // Set up query expression
139
- $queryField = $this->getEngineParam("query_field");
 
 
 
140
  $q = trim("" . $this->getEngineParam("additional_query_params"));
141
  if ($q) {
142
  $q .= " AND ";
143
  }
144
  $searchTerm = trim($searchTerm);
145
  if ($searchTerm) {
146
- $q .= "(";
147
- if ($searchTerm[0] == '"' && $searchTerm[strlen($searchTerm) - 1] == '"') {
148
- $q .= ("(" . $queryField . ":" . $searchTerm . ")");
149
- } else {
150
- $q .= $this->generateQueryExpression($queryField, $searchTerm);
151
- }
152
- $q .= ")";
153
  }
154
  $q = str_replace(" ", "%20", $q);
155
  $query .= "&q=" . $q;
@@ -164,9 +166,18 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
164
  if ($this->getEngineParam("price_range")) {
165
  $query = $this->addAllPriceRangesToQuery($query);
166
  }
167
-
168
  $this->log("Executing query: {$query}");
169
 
 
 
 
 
 
 
 
 
 
170
  $request = curl_init($query);
171
 
172
  if($this->getEngineParam("http_verb")=="post") {
@@ -202,6 +213,56 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
202
  curl_close($request);
203
  return $result;
204
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
 
206
  // Add all facets to the query, so
207
  // the results will include these facets
@@ -409,27 +470,10 @@ class LetsSyncroLLC_Oct8ne_Helper_Search_Solr extends LetsSyncroLLC_Oct8ne_Helpe
409
  return $filters;
410
  }
411
 
412
- // Splits the search terms and generates an "OR" search expression
413
- // Example: "hello world" -> "text:hello OR text:world"
414
- private function generateQueryExpression($queryField, $searchTerm) {
415
- $words = explode(" ", $searchTerm);
416
- $result = "";
417
- foreach ($words as $word) {
418
- $word = trim($word);
419
- if ($word) {
420
- if ($result != "") {
421
- $result .=" OR ";
422
- }
423
- $result .= $queryField . ":" . $word;
424
- }
425
- }
426
- return $result;
427
- }
428
-
429
  private function checkEngineParams() {
430
  $valid = $this->check("host");
431
  $valid = $valid && $this->check("id_field");
432
- $valid = $valid && $this->check("query_field");
433
  $valid = $valid && $this->check("name_field");
434
  $valid = $valid && $this->check("price_field");
435
  $valid = $valid && $this->check("categories_field");
8
  * - id_field: name of id field
9
  * - name_field: name of product name field (used for sorting)
10
  * - price_field: name of price field (used for sorting and filtering)
11
+ * - query_fields: name of the fields where the text search is performed (separated by commas)
12
+ * - multiword_criteria: operator used in criteria for multiple words (AND|OR). By default, "OR"
13
  * - additional_query_params: additional criteria to be added to the search expression
14
  * - categories_field: name of the field having the array of categories the product belongs to
15
  * - related_method: method to get the related products (name|name-reverse|categories|self)
21
  host=http://dev.binaryanvil.net:8080/solr;
22
  id_field=id;
23
  additional_query_params=in_stock:true AND store_id:1;
24
+ query_fields=fulltext_1_en,fulltext_2_en;
25
  name_field=attr_sort_name_en;
26
  price_field=price_0_1;
27
  related_method=name;
48
 
49
  public function search($storeId, $searchTerm, $searchOrder, $searchDir, $page, $pageSize, &$totalSearchResults, &$attrs_applied, &$attrs_available) {
50
  if (!$this->checkEngineParams()) {
51
+ Mage::log("[Oct8ne] Invalid Solr engine params");
52
  return array();
53
  }
54
 
69
 
70
  public function getRelatedProductIds($product, $page, $pageSize) {
71
  if (!$this->checkEngineParams()) {
72
+ Mage::log("[Oct8ne] Invalid Solr engine params");
73
  return array();
74
  }
75
 
 
 
 
 
 
76
  $pageSize = 30;
77
  $relatedMethod = strtolower($this->getEngineParam("related_method"));
78
  if (!$relatedMethod) {
79
  $relatedMethod = "name";
80
  }
81
+
82
+ if ($relatedMethod == "self") {
83
+ $result = array($product->getId());
84
+ return $result;
85
+ }
86
+
87
  $result = NULL;
88
  if ($relatedMethod == "categories") {
89
  $categoryIds = $product->getCategoryIds();
140
  $query = $host . '/select?' . http_build_query($queryParams);
141
 
142
  // Set up query expression
143
+ $queryFields = $this->getEngineParam("query_fields");
144
+ if(! $queryFields) {
145
+ $queryFields = $this->getEngineParam("query_field"); // Retrocompatibility
146
+ }
147
  $q = trim("" . $this->getEngineParam("additional_query_params"));
148
  if ($q) {
149
  $q .= " AND ";
150
  }
151
  $searchTerm = trim($searchTerm);
152
  if ($searchTerm) {
153
+ $searchCriteria = $this->getSearchCriteria($searchTerm, $queryFields);
154
+ $q .= $searchCriteria;
 
 
 
 
 
155
  }
156
  $q = str_replace(" ", "%20", $q);
157
  $query .= "&q=" . $q;
166
  if ($this->getEngineParam("price_range")) {
167
  $query = $this->addAllPriceRangesToQuery($query);
168
  }
169
+
170
  $this->log("Executing query: {$query}");
171
 
172
+ /* Uncomment to debug
173
+ if($searchCriteria) {
174
+ echo "<b>Search criteria:</b><br>" . $searchCriteria . "<br>";
175
+ }
176
+ echo "<b>Complete criteria:</b><br>" . $q . "<br>";
177
+ echo "<b>Query:</b><br>" . $query . "<br>";
178
+ die();
179
+ */
180
+
181
  $request = curl_init($query);
182
 
183
  if($this->getEngineParam("http_verb")=="post") {
213
  curl_close($request);
214
  return $result;
215
  }
216
+
217
+ private function getSearchCriteria($searchTerm, $queryFields) {
218
+ $fieldsArray = explode(",", $queryFields);
219
+ if(empty($fieldsArray)) {
220
+ return "";
221
+ }
222
+ $result = "(";
223
+ $first = true;
224
+ foreach($fieldsArray as $queryField) {
225
+ if (!$first) {
226
+ $result .= " OR ";
227
+ }
228
+ if ($searchTerm[0] == '"' && $searchTerm[strlen($searchTerm) - 1] == '"') {
229
+ $result .= ("(" . $queryField . ":" . $searchTerm . ")");
230
+ } else {
231
+ $result .= $this->generateQueryExpression($queryField, $searchTerm);
232
+ }
233
+ $first = false;
234
+ }
235
+ $result .= ")";
236
+ return $result;
237
+ }
238
+
239
+ // Splits the search terms and generates an "OR" search expression
240
+ // Example: "hello world" -> "(text:hello OR text:world)"
241
+ private function generateQueryExpression($queryField, $searchTerm) {
242
+ $words = explode(" ", $searchTerm);
243
+ if(empty($words)) {
244
+ return "";
245
+ }
246
+ $result = "(";
247
+ $first = true;
248
+
249
+ $multiwordCriteria = $this->getEngineParam("multiword_criteria");
250
+ if(!$multiwordCriteria) {
251
+ $multiwordCriteria = "OR";
252
+ }
253
+ foreach ($words as $word) {
254
+ $word = trim($word);
255
+ if ($word) {
256
+ if (!$first) {
257
+ $result .=" " . $multiwordCriteria ." ";
258
+ }
259
+ $result .= $queryField . ":" . $word;
260
+ $first = false;
261
+ }
262
+ }
263
+ $result .= ")";
264
+ return $result;
265
+ }
266
 
267
  // Add all facets to the query, so
268
  // the results will include these facets
470
  return $filters;
471
  }
472
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
  private function checkEngineParams() {
474
  $valid = $this->check("host");
475
  $valid = $valid && $this->check("id_field");
476
+ $valid = $valid && ($this->check("query_fields") || $this->check("query_field")); // Retrocompatible
477
  $valid = $valid && $this->check("name_field");
478
  $valid = $valid && $this->check("price_field");
479
  $valid = $valid && $this->check("categories_field");
app/code/community/LetsSyncroLLC/Oct8ne/Helper/Url.php CHANGED
@@ -21,7 +21,7 @@ class LetsSyncroLLC_Oct8ne_Helper_Url extends Mage_Core_Helper_Url {
21
  public function getOct8neLinkupServiceUrl() {
22
  $linkupUrl = Mage::registry('oct8neLinkupServiceUrl');
23
  if (!$linkupUrl) {
24
- $linkupUrl = "https://webservice.oct8ne.com/syncroservice";
25
  }
26
  return $linkupUrl;
27
  }
21
  public function getOct8neLinkupServiceUrl() {
22
  $linkupUrl = Mage::registry('oct8neLinkupServiceUrl');
23
  if (!$linkupUrl) {
24
+ $linkupUrl = "https://backoffice.oct8ne.com/platformConnection/linkup";
25
  }
26
  return $linkupUrl;
27
  }
app/code/community/LetsSyncroLLC/Oct8ne/controllers/FrameController.php CHANGED
@@ -145,7 +145,7 @@ class LetsSyncroLLC_Oct8ne_FrameController extends Mage_Core_Controller_Front_Ac
145
  'result' => $result
146
  );
147
  $this->returnJson($results);
148
- }
149
 
150
  public function removeFromWishlistAction() {
151
  $this->setEnvironment();
@@ -328,11 +328,11 @@ class LetsSyncroLLC_Oct8ne_FrameController extends Mage_Core_Controller_Front_Ac
328
  $response = json_encode($jsonData);
329
  $callback = $this->getRequest()->getParam('callback', NULL);
330
  if ($callback) {
331
- $this->getResponse()->setHeader('Content-type', 'application/javascript; charset=UTF8', true);
332
  $response = $callback . "(" . $response . ");";
333
- }else{
334
- $this->getResponse()->setHeader('Content-type', 'application/json; charset=UTF8', true);
335
- }
336
  $this->getResponse()->setBody($response);
337
  }
338
 
@@ -401,17 +401,17 @@ class LetsSyncroLLC_Oct8ne_FrameController extends Mage_Core_Controller_Front_Ac
401
 
402
  // Sets the current request environment (currency & locale)
403
  private function setEnvironment() {
404
-
405
  $app = Mage::app();
406
  $request = $this->getRequest();
407
-
408
  // Set currency, if nedded
409
  $currency = $request->getParam('currency', null);
410
  if ($currency) {
411
  $store = $app->getStore();
412
  $currentCurrency = $store->getCurrentCurrencyCode();
413
- if($currency != $currentCurrency) {
414
- $store->setCurrentCurrencyCode($currency);
415
  }
416
  }
417
 
145
  'result' => $result
146
  );
147
  $this->returnJson($results);
148
+ }
149
 
150
  public function removeFromWishlistAction() {
151
  $this->setEnvironment();
328
  $response = json_encode($jsonData);
329
  $callback = $this->getRequest()->getParam('callback', NULL);
330
  if ($callback) {
331
+ $this->getResponse()->setHeader('Content-type', 'application/javascript; charset=utf-8', true);
332
  $response = $callback . "(" . $response . ");";
333
+ } else {
334
+ $this->getResponse()->setHeader('Content-type', 'application/json; charset=utf-8', true);
335
+ }
336
  $this->getResponse()->setBody($response);
337
  }
338
 
401
 
402
  // Sets the current request environment (currency & locale)
403
  private function setEnvironment() {
404
+
405
  $app = Mage::app();
406
  $request = $this->getRequest();
407
+
408
  // Set currency, if nedded
409
  $currency = $request->getParam('currency', null);
410
  if ($currency) {
411
  $store = $app->getStore();
412
  $currentCurrency = $store->getCurrentCurrencyCode();
413
+ if ($currency != $currentCurrency) {
414
+ $store->setCurrentCurrencyCode($currency);
415
  }
416
  }
417
 
app/code/community/LetsSyncroLLC/Oct8ne/controllers/SetupController.php CHANGED
@@ -32,7 +32,7 @@ class LetsSyncroLLC_Oct8ne_SetupController extends Mage_Core_Controller_Front_Ac
32
  $this->addSetting($dataList, $settings, 'oct8neSearch/assistedSearch/elementSelector', "Search element selector", 'CSS selector. Example: "#search"');
33
  $this->addSetting($dataList, $settings, 'oct8neSearch/searchEngine/engine', "Search engine", 'Allowed: { "magento", "sli", "solr", "celebros" }');
34
  $this->addSetting($dataList, $settings, 'oct8neSearch/searchEngine/params', "Search engine settings", '"Search engine specific settings"');
35
- $this->addSetting($dataList, $settings, 'oct8neData/productData/productDataDescription', "Comma-separated product description fields", 'Example: "description, short_description"');
36
  $this->addSetting($dataList, $settings, 'oct8neData/productData/ignoreExcludedImages', "Ignore images marked as excluded", "1=true, 0=false");
37
  $this->addSetting($dataList, $settings, 'oct8neData/productData/returnActualProductImageUrl', "Use product's actual images instead of 'image' action", "1=true, 0=false");
38
  $this->addSetting($dataList, $settings, 'oct8neData/productData/actualProductImageWidth', "Product's actual images default width", "Example: '600' or empty for not resizing");
@@ -58,13 +58,13 @@ class LetsSyncroLLC_Oct8ne_SetupController extends Mage_Core_Controller_Front_Ac
58
  print "<table border=1 cellspacing=0 cellpadding=3><tr><th>Key</th><th>Current value</th><th>Description</th><th>Example/Allowed values</th></tr>";
59
  print_r($settings);
60
  print "</table>";
61
- print "<hr><form method='post' action='/oct8ne/setup/setsettings'>"
62
  . "Key: <input type='text' name='setting' id='setting' list='settings' size='50'> "
63
  . "New value: <textarea name='value' id='value' style='vertical-align: top; margin-right: 10px'></textarea>"
64
  . "<input type='hidden' name='apitoken' value='" . $this->getRequest()->getParam('apitoken', null) . "'>"
65
  . "<input type='submit'>"
66
  . "</form>"
67
- . "<p><a href='/oct8ne/setup'>Back to menu</a></p>"
68
  . "<script>"
69
  . "function selectSetting(setting, value) {"
70
  . " document.getElementById('setting').value = setting;"
@@ -94,7 +94,10 @@ class LetsSyncroLLC_Oct8ne_SetupController extends Mage_Core_Controller_Front_Ac
94
 
95
  // Mage::app()->cleanCache();
96
  Mage::getConfig()->reinit();
97
- header("Location: /oct8ne/setup/settings?done=1");
 
 
 
98
  die();
99
  }
100
 
@@ -119,7 +122,7 @@ class LetsSyncroLLC_Oct8ne_SetupController extends Mage_Core_Controller_Front_Ac
119
  if($this->getRequest()->getParam('done')) {
120
  print "<h3 style='color: blue'>Linkup/status settings changed!</h3>";
121
  }
122
- print "<hr><form method='post' action='/oct8ne/setup/setLinkup'>"
123
  . "API token: <input type='text' name='apiToken' value='{$apiToken}' required> <br />"
124
  . "License ID: <input type='text' name='licenseId' value='{$licenseId}' required> <br />"
125
  . "Enabled: <select name='enabled'>"
@@ -152,7 +155,9 @@ class LetsSyncroLLC_Oct8ne_SetupController extends Mage_Core_Controller_Front_Ac
152
 
153
  $letssyncromodel->save();
154
 
155
- header("Location: /oct8ne/setup/linkup?done=1");
 
 
156
  die();
157
  }
158
 
32
  $this->addSetting($dataList, $settings, 'oct8neSearch/assistedSearch/elementSelector', "Search element selector", 'CSS selector. Example: "#search"');
33
  $this->addSetting($dataList, $settings, 'oct8neSearch/searchEngine/engine', "Search engine", 'Allowed: { "magento", "sli", "solr", "celebros" }');
34
  $this->addSetting($dataList, $settings, 'oct8neSearch/searchEngine/params', "Search engine settings", '"Search engine specific settings"');
35
+ $this->addSetting($dataList, $settings, 'oct8neData/productData/productDataDescription', "Comma-separated product description fallback fields or groups.", 'Example: "description,short_description,field1+field2"');
36
  $this->addSetting($dataList, $settings, 'oct8neData/productData/ignoreExcludedImages', "Ignore images marked as excluded", "1=true, 0=false");
37
  $this->addSetting($dataList, $settings, 'oct8neData/productData/returnActualProductImageUrl', "Use product's actual images instead of 'image' action", "1=true, 0=false");
38
  $this->addSetting($dataList, $settings, 'oct8neData/productData/actualProductImageWidth', "Product's actual images default width", "Example: '600' or empty for not resizing");
58
  print "<table border=1 cellspacing=0 cellpadding=3><tr><th>Key</th><th>Current value</th><th>Description</th><th>Example/Allowed values</th></tr>";
59
  print_r($settings);
60
  print "</table>";
61
+ print "<hr><form method='post' action='setsettings'>"
62
  . "Key: <input type='text' name='setting' id='setting' list='settings' size='50'> "
63
  . "New value: <textarea name='value' id='value' style='vertical-align: top; margin-right: 10px'></textarea>"
64
  . "<input type='hidden' name='apitoken' value='" . $this->getRequest()->getParam('apitoken', null) . "'>"
65
  . "<input type='submit'>"
66
  . "</form>"
67
+ . "<p><a href='../setup'>Back to menu</a></p>"
68
  . "<script>"
69
  . "function selectSetting(setting, value) {"
70
  . " document.getElementById('setting').value = setting;"
94
 
95
  // Mage::app()->cleanCache();
96
  Mage::getConfig()->reinit();
97
+
98
+ $current = strtolower($_SERVER['REQUEST_URI']);
99
+ $url = str_replace("setsettings", "settings?done=1", $current);
100
+ header("Location: " . $url);
101
  die();
102
  }
103
 
122
  if($this->getRequest()->getParam('done')) {
123
  print "<h3 style='color: blue'>Linkup/status settings changed!</h3>";
124
  }
125
+ print "<hr><form method='post' action='setLinkup'>"
126
  . "API token: <input type='text' name='apiToken' value='{$apiToken}' required> <br />"
127
  . "License ID: <input type='text' name='licenseId' value='{$licenseId}' required> <br />"
128
  . "Enabled: <select name='enabled'>"
155
 
156
  $letssyncromodel->save();
157
 
158
+ $current = strtolower($_SERVER['REQUEST_URI']);
159
+ $url = str_replace("setlinkup", "linkup?done=1", $current);
160
+ header("Location: " . $url);
161
  die();
162
  }
163
 
app/code/community/LetsSyncroLLC/Oct8ne/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <LetsSyncroLLC_Oct8ne>
5
- <version>2.1.5</version>
6
  </LetsSyncroLLC_Oct8ne>
7
  </modules>
8
 
2
  <config>
3
  <modules>
4
  <LetsSyncroLLC_Oct8ne>
5
+ <version>2.1.6</version>
6
  </LetsSyncroLLC_Oct8ne>
7
  </modules>
8
 
app/code/community/LetsSyncroLLC/Oct8ne/etc/system.xml CHANGED
@@ -26,7 +26,7 @@
26
  <fields>
27
  <productDataDescription translate="label">
28
  <label>Description Attributes</label>
29
- <comment>Type the attributes containing the product descriptions, separated by commas. By default, "description,short_description".</comment>
30
  <frontend_type>text</frontend_type>
31
  <sort_order>10</sort_order>
32
  <show_in_default>1</show_in_default>
26
  <fields>
27
  <productDataDescription translate="label">
28
  <label>Description Attributes</label>
29
+ <comment>Type the attributes containing the product description, separated by commas. We'll use the first non empty field. Default: "description,short_description".&lt;br /&gt;To concatenate fields, just use "+" as follows "short_description+description".</comment>
30
  <frontend_type>text</frontend_type>
31
  <sort_order>10</sort_order>
32
  <show_in_default>1</show_in_default>
app/design/frontend/base/default/template/oct8ne/letssyncro.phtml CHANGED
@@ -51,7 +51,7 @@ if (is_null(Mage::registry('oct8ne')) && !$disable) {
51
  }
52
  echo <<<EOT
53
 
54
- <script type= "text/javascript">
55
  var oct8ne = document.createElement("script");
56
  oct8ne.type = "text/javascript";
57
  oct8ne.async = true;
51
  }
52
  echo <<<EOT
53
 
54
+ <script type="text/javascript">
55
  var oct8ne = document.createElement("script");
56
  oct8ne.type = "text/javascript";
57
  oct8ne.async = true;
app/etc/modules/LetsSyncroLLC_Oct8ne.xml CHANGED
@@ -4,7 +4,7 @@
4
  <LetsSyncroLLC_Oct8ne>
5
  <active>true</active>
6
  <codePool>community</codePool>
7
- <version>2.1.5</version>
8
  <depends>
9
  <Mage_Eav/>
10
  <Mage_Dataflow/>
4
  <LetsSyncroLLC_Oct8ne>
5
  <active>true</active>
6
  <codePool>community</codePool>
7
+ <version>2.1.6</version>
8
  <depends>
9
  <Mage_Eav/>
10
  <Mage_Dataflow/>
package.xml CHANGED
@@ -1,18 +1,20 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>LetsSyncroLLC_Oct8ne</name>
4
- <version>2.1.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Oct8ne extension</summary>
10
  <description>Agent-assisted search, proprietary co-viewing technology, &amp; live chat to engage in personal selling &amp; service.</description>
11
- <notes>Minor bugs fixed</notes>
 
 
12
  <authors><author><name>Oct8ne</name><user>Oct8ne</user><email>xavier.gonzalez@oct8ne.com</email></author></authors>
13
- <date>2016-10-18</date>
14
- <time>10:48:55</time>
15
- <contents><target name="magecommunity"><dir name="LetsSyncroLLC"><dir name="Oct8ne"><dir name="Block"><file name="Accountconfig.php" hash="e5b8a407edcdce88776067327d851e1d"/><dir name="Customer"><file name="Notifier.php" hash="58785a446c6c6a69db0348b81852028b"/></dir><dir name="Html"><file name="Head.php" hash="7fec049acbd3391ce0176982eede105b"/></dir><file name="Index.php" hash="d4cc07e7e6412cb9f3cedf2508f56461"/><dir name="Mage"><dir name="Product"><file name="View.php" hash="ca15ba7c5cc756cc18af5c9c48fbe492"/></dir></dir></dir><dir name="Helper"><file name="CustomerData.php" hash="38658993e66fee8d5e3170658fa71556"/><file name="Data.php" hash="629a96987cf9bab775e402166448f3eb"/><file name="Debug.php" hash="147f2d06848b4596a0409b471cf0769a"/><dir name="Image"><file name="Default.php" hash="74ff374e88db99c4ae911bd3303e4c8e"/><file name="Schuler.php" hash="ea104cd9d9df2c62beab7af298e45fe1"/></dir><file name="Reports.php" hash="6df3362a381e507a69fbf27162174f1b"/><dir name="Search"><file name="Base.php" hash="abd7647e0892bd912cc11406ee59188b"/><file name="Celebros.php" hash="9c7007d3a3501d63af8207e107f6ac0f"/><dir name="CelebrosAPI"><file name="QwiserAnswer.php" hash="56f07a272ce8de8738868fc4c7a74165"/><file name="QwiserAnswers.php" hash="a7ac00848b3f60935771880b75aba90c"/><file name="QwiserConcept.php" hash="32ffebe11630864b666fe66f37eab1b2"/><file name="QwiserConcepts.php" hash="0b3c0fada961fe22dd6cbb3a4b719d2a"/><file name="QwiserProduct.php" hash="09069308e5f5fc862ddafebe7152f40b"/><file name="QwiserProductAnswer.php" hash="9dc1c8c9a929affa9db5a339ac1b7317"/><file name="QwiserProductAnswers.php" hash="699fc568eeb8bfc3d4bcc9b24102d3ad"/><file name="QwiserProductField.php" hash="273c36aad014b9220201881738eeafea"/><file name="QwiserProductFields.php" hash="4670e55b10d57c4208d9e5bacdd1d91c"/><file name="QwiserProducts.php" hash="cf2f76940b1c508823d00fbb7817cd06"/><file name="QwiserProductsMetaData.php" hash="4d54fae9b996ea18bbad5a60cd72c52a"/><file name="QwiserQuestion.php" hash="a148b2193de6967c3a12f43b939b92f2"/><file name="QwiserQuestions.php" hash="9de5d58ab267ea6a4ea9084d54920ddd"/><file name="QwiserSearchAPI.php" hash="e2680c99083553f6e0dc908ba3875603"/><file name="QwiserSearchPath.php" hash="300327589bf6720d0ae400c9cce755e7"/><file name="QwiserSearchPathEntry.php" hash="6e4192df47fc6c7ebdbb6251b6401e57"/><file name="QwiserSearchResults.php" hash="379337770db03fc27377be8de14ebd55"/><file name="QwiserSpellerInformation.php" hash="c52100535c3f0dc9650740cdbda6e40a"/><file name="SearchInformation.php" hash="de29fd1136f2512c18603164abfa58af"/><file name="SortingOptions.php" hash="a55d1eaabfee811b9f71dfdbb61f5c9a"/><file name="domxml-php4-to-php5.php" hash="29c0571bea402f63987c09d811d1a662"/></dir><file name="Magento.php" hash="0ae593bd70db8952c897682082594c10"/><file name="Sli.php" hash="c3cbe01a28f09a0e83bffb7764fb40c1"/><file name="Solr.php" hash="e391c51c27d6004e193281605603358d"/></dir><file name="Url.php" hash="86a93cb5528c89ea8417f04bd3e2504b"/><file name="Version.php" hash="fe41f98f2f73b6252f0e2c4fca830369"/><file name="Wishlist.php" hash="95a30da6de9131026580e6475a2ea951"/></dir><dir name="Model"><file name="Cron.php" hash="11fbdce80ef509a89cbc055960c627dd"/><file name="ImageWidth.php" hash="ddffd8d74a25f989b1116a663ac3a9e6"/><file name="Letssyncro.php" hash="a7755ee759fa31f004207823314a907d"/><dir name="Mage"><file name="Onepage.php" hash="400ea1de621a7d2e6b0e04db55b60027"/><file name="Request.php" hash="feee181c817bc4a1ed8d662104ddb1af"/><file name="Rewrite.php" hash="5699a8b1707724c4ad01fd6998cf12d6"/><file name="Url.php" hash="82a05832eaea74fedfd2c5b081dc5cc6"/></dir><dir name="Mysql4"><dir name="LetsSyncro"><file name="Collection.php" hash="1820b31106065627aa81007f966de6b7"/></dir><file name="Letssyncro.php" hash="81b49a4f7770d408eacd230a41434cbf"/><dir name="Order"><file name="Collection.php" hash="431a18fb0f8a2d29ea44a1b617b48382"/></dir><file name="Order.php" hash="1fd857af382915617c1d64d438a842ab"/></dir><file name="Observer.php" hash="bdfb77a7082ac8c27756b5bf7f4779df"/><file name="Order.php" hash="5ea076e3f76f9a28a5ab6eee1f157b69"/><file name="Orderproducts.php" hash="9edf0ab5159b046d0d33c2766087183f"/><file name="Quoteproducts.php" hash="3b6baf23d5ab4136c52fe24d470a3fd0"/><file name="SearchEngines.php" hash="d894f3f32f74bde7899db50dcf3e2719"/></dir><dir name="controllers"><file name="AccountController.php" hash="c900a756947b61498e5edd2e39b1d0bf"/><file name="FrameController.php" hash="67499ce984d9fc2dd4f45407a9824828"/><file name="IndexController.php" hash="5a63469c2dead9b78a262fd580a3e43b"/><file name="Oct8neAdminController.php" hash="159d851a7b51f3483ebdfe2b49b05b4a"/><file name="SetupController.php" hash="b9f461cec0fdf8b92a5becf09aa7460f"/></dir><dir name="etc"><file name="config.xml" hash="8cc1d4c035129f665bde4cdb49def1f3"/><file name="system.xml" hash="9263ef911019a940dfa3d26017d784c9"/></dir><dir name="sql"><dir name="oct8ne_setup"><file name="mysql4-install-2.0.0.php" hash="7cd9ed6b373a104ec7a27b1b2f26b570"/><file name="mysql4-install-2.1.0.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.2.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.3.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.4.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-upgrade-1-2.1.0.php" hash="5883e47d9718350d49146e33ba8fbd84"/><file name="mysql4-upgrade-1.0.0-1.1.0.php" hash="0944f9c420562fa8071b04eff2abdb15"/><file name="mysql4-upgrade-1.1.6-1.1.7.php" hash="eecd1f66e51507306abf5e4fa5d70584"/><file name="mysql4-upgrade-1.1.7-2.0.0.php" hash="3c7e1655fb0b45dd5dc01aca98929679"/><file name="mysql4-upgrade-2.0.0-2.0.3.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.0.3-2.1.0.php" hash="4a06d9802360e45a08d417168c260f15"/><file name="mysql4-upgrade-2.1.0-2.1.1.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.1-2.1.2.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.2-2.1.3.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.3-2.1.4.php" hash="0288d291dec83584d97052e62b64a738"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="oct8ne"><dir name="layout"><file name="oct8ne.xml" hash="664f6b6c51799aba0fa905cbc80eb703"/></dir><dir name="template"><dir name="page"><file name="1column.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="2columns-left.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="2columns-right.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="3columns.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/></dir></dir></dir></dir><dir name="base"><dir name="default"><dir name="layout"><file name="oct8ne.xml" hash="4b6f167fdbaf25f864934c0e8ecdda51"/></dir><dir name="template"><dir name="oct8ne"><dir name="frame"><file name="clean-page.phtml" hash="86c6580270709b8adb8a624130704cb5"/><dir name="productview"><file name="additional.phtml" hash="d0f80a4f31b31154af12197301cbc524"/><file name="addto.phtml" hash="358f19e35ff76f853cfad50ad35329fc"/><file name="addtocart.phtml" hash="06ac8be9a7197e87e8c5972c27804cc9"/><file name="attributes.phtml" hash="def5531385ad60aac88274bd91f76f52"/><file name="description.phtml" hash="09674e0a56d36f27c93d3a52c3a880c4"/><file name="media.phtml" hash="b23c4e9ef29e00d2f592d822fec8e52c"/><file name="media.phtml.ORIGINAL" hash="071f4d92269b2cbfa1a14271afbf0dbe"/><dir name="options"><file name="js.phtml" hash="7d9917d908ca99033c3473ecc10d895d"/><dir name="type"><file name="date.phtml" hash="41a612891cda695e3023d15a460c4325"/><file name="default.phtml" hash="b6f6d8e715f2a1d59913f313654fc38a"/><file name="file.phtml" hash="5e336ccdfa66b78264e5a0e859600d74"/><file name="select.phtml" hash="162f029fc825b78676cce70633805e62"/><file name="text.phtml" hash="c2c2940fb278d952e0e0d5d232ba5ed9"/></dir><dir name="wrapper"><file name="bottom.phtml" hash="182b49972e67cc834b8e1094a3984f5b"/></dir><file name="wrapper.phtml" hash="b635f6abf10b920afb6000b462134db6"/></dir><file name="options.phtml" hash="60d92d70da66f28300788027aa6f3056"/><file name="price.phtml" hash="06e90ec3368d07d62c3895f706069f96"/><file name="price_clone.phtml" hash="fb1ca9b19f97b0498f529b96c5c0e372"/><file name="tierprices.phtml" hash="4ac50d3c9f54d11fa5041a361485da74"/><dir name="type"><file name="configurable.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/><file name="default.phtml" hash="e7f000d4b7fbc62f4e155e429f976126"/><file name="grouped.phtml" hash="9ce42ac44794853963bf68e9f2e911b0"/><dir name="options"><file name="configurable.phtml" hash="2636b369c1ceacd1b131f77ade2c996f"/></dir><file name="simple.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/><file name="virtual.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/></dir></dir><file name="productview.phtml" hash="da287c78285ecb003bbee37491d3a2f2"/></dir><file name="letssyncro.phtml" hash="4453b8605c496c871e5fda587a8d248a"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="LetsSyncroLLC_Oct8ne.xml" hash="8218462ab9de33d43e0af1345508c7c1"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="LetsSyncroLLC_Oct8ne.csv" hash="686df4107da7e35e243b629c5ee57963"/></dir><dir name="es_ES"><file name="LetsSyncroLLC_Oct8ne.csv" hash="eb0b3ddaae1e2e52005e9ab23cb37163"/></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><file name="oct8ne.css" hash="4255fddac8c054bbe32621cdccf844b8"/></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="LetsSyncro_Logo.png" hash="2104af20cc380d0c745531e1dca2f97c"/></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>LetsSyncroLLC_Oct8ne</name>
4
+ <version>2.1.6</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Oct8ne extension</summary>
10
  <description>Agent-assisted search, proprietary co-viewing technology, &amp; live chat to engage in personal selling &amp; service.</description>
11
+ <notes>New linkup method&#xD;
12
+ Minor bugs fixed&#xD;
13
+ </notes>
14
  <authors><author><name>Oct8ne</name><user>Oct8ne</user><email>xavier.gonzalez@oct8ne.com</email></author></authors>
15
+ <date>2017-05-04</date>
16
+ <time>15:56:18</time>
17
+ <contents><target name="magecommunity"><dir name="LetsSyncroLLC"><dir name="Oct8ne"><dir name="Block"><file name="Accountconfig.php" hash="bffa6b2340097289f85620a1f55057c9"/><dir name="Customer"><file name="Notifier.php" hash="58785a446c6c6a69db0348b81852028b"/></dir><dir name="Html"><file name="Head.php" hash="7fec049acbd3391ce0176982eede105b"/></dir><file name="Index.php" hash="d4cc07e7e6412cb9f3cedf2508f56461"/><dir name="Mage"><dir name="Product"><file name="View.php" hash="ca15ba7c5cc756cc18af5c9c48fbe492"/></dir></dir></dir><dir name="Helper"><file name="CustomerData.php" hash="38658993e66fee8d5e3170658fa71556"/><file name="Data.php" hash="b44aae800370a4bc39c66d4e1b349215"/><file name="Debug.php" hash="147f2d06848b4596a0409b471cf0769a"/><dir name="Image"><file name="Default.php" hash="74ff374e88db99c4ae911bd3303e4c8e"/><file name="Schuler.php" hash="ea104cd9d9df2c62beab7af298e45fe1"/></dir><file name="Reports.php" hash="6df3362a381e507a69fbf27162174f1b"/><dir name="Search"><file name="Base.php" hash="abd7647e0892bd912cc11406ee59188b"/><file name="Celebros.php" hash="9c7007d3a3501d63af8207e107f6ac0f"/><dir name="CelebrosAPI"><file name="QwiserAnswer.php" hash="56f07a272ce8de8738868fc4c7a74165"/><file name="QwiserAnswers.php" hash="a7ac00848b3f60935771880b75aba90c"/><file name="QwiserConcept.php" hash="32ffebe11630864b666fe66f37eab1b2"/><file name="QwiserConcepts.php" hash="0b3c0fada961fe22dd6cbb3a4b719d2a"/><file name="QwiserProduct.php" hash="09069308e5f5fc862ddafebe7152f40b"/><file name="QwiserProductAnswer.php" hash="9dc1c8c9a929affa9db5a339ac1b7317"/><file name="QwiserProductAnswers.php" hash="699fc568eeb8bfc3d4bcc9b24102d3ad"/><file name="QwiserProductField.php" hash="273c36aad014b9220201881738eeafea"/><file name="QwiserProductFields.php" hash="4670e55b10d57c4208d9e5bacdd1d91c"/><file name="QwiserProducts.php" hash="cf2f76940b1c508823d00fbb7817cd06"/><file name="QwiserProductsMetaData.php" hash="4d54fae9b996ea18bbad5a60cd72c52a"/><file name="QwiserQuestion.php" hash="a148b2193de6967c3a12f43b939b92f2"/><file name="QwiserQuestions.php" hash="9de5d58ab267ea6a4ea9084d54920ddd"/><file name="QwiserSearchAPI.php" hash="e2680c99083553f6e0dc908ba3875603"/><file name="QwiserSearchPath.php" hash="300327589bf6720d0ae400c9cce755e7"/><file name="QwiserSearchPathEntry.php" hash="6e4192df47fc6c7ebdbb6251b6401e57"/><file name="QwiserSearchResults.php" hash="379337770db03fc27377be8de14ebd55"/><file name="QwiserSpellerInformation.php" hash="c52100535c3f0dc9650740cdbda6e40a"/><file name="SearchInformation.php" hash="de29fd1136f2512c18603164abfa58af"/><file name="SortingOptions.php" hash="a55d1eaabfee811b9f71dfdbb61f5c9a"/><file name="domxml-php4-to-php5.php" hash="29c0571bea402f63987c09d811d1a662"/></dir><file name="Magento.php" hash="0ae593bd70db8952c897682082594c10"/><file name="Sli.php" hash="c3cbe01a28f09a0e83bffb7764fb40c1"/><file name="Solr.php" hash="65b9025b2d6c9d5a4d560241dfbe3805"/></dir><file name="Url.php" hash="2489577dcb604e9ddbeaf0e51495d202"/><file name="Version.php" hash="fe41f98f2f73b6252f0e2c4fca830369"/><file name="Wishlist.php" hash="95a30da6de9131026580e6475a2ea951"/></dir><dir name="Model"><file name="Cron.php" hash="11fbdce80ef509a89cbc055960c627dd"/><file name="ImageWidth.php" hash="ddffd8d74a25f989b1116a663ac3a9e6"/><file name="Letssyncro.php" hash="a7755ee759fa31f004207823314a907d"/><dir name="Mage"><file name="Onepage.php" hash="400ea1de621a7d2e6b0e04db55b60027"/><file name="Request.php" hash="feee181c817bc4a1ed8d662104ddb1af"/><file name="Rewrite.php" hash="5699a8b1707724c4ad01fd6998cf12d6"/><file name="Url.php" hash="82a05832eaea74fedfd2c5b081dc5cc6"/></dir><dir name="Mysql4"><dir name="LetsSyncro"><file name="Collection.php" hash="1820b31106065627aa81007f966de6b7"/></dir><file name="Letssyncro.php" hash="81b49a4f7770d408eacd230a41434cbf"/><dir name="Order"><file name="Collection.php" hash="431a18fb0f8a2d29ea44a1b617b48382"/></dir><file name="Order.php" hash="1fd857af382915617c1d64d438a842ab"/></dir><file name="Observer.php" hash="bdfb77a7082ac8c27756b5bf7f4779df"/><file name="Order.php" hash="5ea076e3f76f9a28a5ab6eee1f157b69"/><file name="Orderproducts.php" hash="9edf0ab5159b046d0d33c2766087183f"/><file name="Quoteproducts.php" hash="3b6baf23d5ab4136c52fe24d470a3fd0"/><file name="SearchEngines.php" hash="d894f3f32f74bde7899db50dcf3e2719"/></dir><dir name="controllers"><file name="AccountController.php" hash="c900a756947b61498e5edd2e39b1d0bf"/><file name="FrameController.php" hash="86bc36473a0d69bc6e01b2d14374a0b8"/><file name="IndexController.php" hash="5a63469c2dead9b78a262fd580a3e43b"/><file name="Oct8neAdminController.php" hash="159d851a7b51f3483ebdfe2b49b05b4a"/><file name="SetupController.php" hash="5d00d70a9d9794877ba9c7490038d6d2"/></dir><dir name="etc"><file name="config.xml" hash="821162e310a571b56a3097d4c2296c7f"/><file name="system.xml" hash="2447530e6dd54c5abd423732c54644da"/></dir><dir name="sql"><dir name="oct8ne_setup"><file name="mysql4-install-2.0.0.php" hash="7cd9ed6b373a104ec7a27b1b2f26b570"/><file name="mysql4-install-2.1.0.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.2.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.3.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-install-2.1.4.php" hash="0c268a08bbfc48a072fdfb75c7013a43"/><file name="mysql4-upgrade-1-2.1.0.php" hash="5883e47d9718350d49146e33ba8fbd84"/><file name="mysql4-upgrade-1.0.0-1.1.0.php" hash="0944f9c420562fa8071b04eff2abdb15"/><file name="mysql4-upgrade-1.1.6-1.1.7.php" hash="eecd1f66e51507306abf5e4fa5d70584"/><file name="mysql4-upgrade-1.1.7-2.0.0.php" hash="3c7e1655fb0b45dd5dc01aca98929679"/><file name="mysql4-upgrade-2.0.0-2.0.3.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.0.3-2.1.0.php" hash="4a06d9802360e45a08d417168c260f15"/><file name="mysql4-upgrade-2.1.0-2.1.1.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.1-2.1.2.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.2-2.1.3.php" hash="0288d291dec83584d97052e62b64a738"/><file name="mysql4-upgrade-2.1.3-2.1.4.php" hash="0288d291dec83584d97052e62b64a738"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="oct8ne"><dir name="layout"><file name="oct8ne.xml" hash="664f6b6c51799aba0fa905cbc80eb703"/></dir><dir name="template"><dir name="page"><file name="1column.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="2columns-left.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="2columns-right.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/><file name="3columns.phtml" hash="3fbf17f71254a75cbf3261eab5a727ab"/></dir></dir></dir></dir><dir name="base"><dir name="default"><dir name="layout"><file name="oct8ne.xml" hash="4b6f167fdbaf25f864934c0e8ecdda51"/></dir><dir name="template"><dir name="oct8ne"><dir name="frame"><file name="clean-page.phtml" hash="86c6580270709b8adb8a624130704cb5"/><dir name="productview"><file name="additional.phtml" hash="d0f80a4f31b31154af12197301cbc524"/><file name="addto.phtml" hash="358f19e35ff76f853cfad50ad35329fc"/><file name="addtocart.phtml" hash="06ac8be9a7197e87e8c5972c27804cc9"/><file name="attributes.phtml" hash="def5531385ad60aac88274bd91f76f52"/><file name="description.phtml" hash="09674e0a56d36f27c93d3a52c3a880c4"/><file name="media.phtml" hash="b23c4e9ef29e00d2f592d822fec8e52c"/><file name="media.phtml.ORIGINAL" hash="071f4d92269b2cbfa1a14271afbf0dbe"/><dir name="options"><file name="js.phtml" hash="7d9917d908ca99033c3473ecc10d895d"/><dir name="type"><file name="date.phtml" hash="41a612891cda695e3023d15a460c4325"/><file name="default.phtml" hash="b6f6d8e715f2a1d59913f313654fc38a"/><file name="file.phtml" hash="5e336ccdfa66b78264e5a0e859600d74"/><file name="select.phtml" hash="162f029fc825b78676cce70633805e62"/><file name="text.phtml" hash="c2c2940fb278d952e0e0d5d232ba5ed9"/></dir><dir name="wrapper"><file name="bottom.phtml" hash="182b49972e67cc834b8e1094a3984f5b"/></dir><file name="wrapper.phtml" hash="b635f6abf10b920afb6000b462134db6"/></dir><file name="options.phtml" hash="60d92d70da66f28300788027aa6f3056"/><file name="price.phtml" hash="06e90ec3368d07d62c3895f706069f96"/><file name="price_clone.phtml" hash="fb1ca9b19f97b0498f529b96c5c0e372"/><file name="tierprices.phtml" hash="4ac50d3c9f54d11fa5041a361485da74"/><dir name="type"><file name="configurable.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/><file name="default.phtml" hash="e7f000d4b7fbc62f4e155e429f976126"/><file name="grouped.phtml" hash="9ce42ac44794853963bf68e9f2e911b0"/><dir name="options"><file name="configurable.phtml" hash="2636b369c1ceacd1b131f77ade2c996f"/></dir><file name="simple.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/><file name="virtual.phtml" hash="b9a427816f9c8a3d0d7179e8d5382683"/></dir></dir><file name="productview.phtml" hash="da287c78285ecb003bbee37491d3a2f2"/></dir><file name="letssyncro.phtml" hash="38ae135b7c4c762a16fe5d9718067be7"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="LetsSyncroLLC_Oct8ne.xml" hash="a29daa08815803264bc549f41d12bbe2"/></dir></target><target name="magelocale"><dir><dir name="en_US"><file name="LetsSyncroLLC_Oct8ne.csv" hash="686df4107da7e35e243b629c5ee57963"/></dir><dir name="es_ES"><file name="LetsSyncroLLC_Oct8ne.csv" hash="eb0b3ddaae1e2e52005e9ab23cb37163"/></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><file name="oct8ne.css" hash="4255fddac8c054bbe32621cdccf844b8"/></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><file name="LetsSyncro_Logo.png" hash="2104af20cc380d0c745531e1dca2f97c"/></dir></dir></dir></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
20
  </package>