Simtech_Searchanise - Version 1.1.7

Version Notes

[!] Some attribute values could be ignored in the full-text search. Fixed.

[*] Full import is now more stable, less memory-consuming, and more DB error-resistant.

Download this release

Release Info

Developer Simbirsk Technologies, Ltd.
Extension Simtech_Searchanise
Version 1.1.7
Comparing to
See all releases


Code changes from version 1.1.6 to 1.1.7

app/code/community/Simtech/Searchanise/Helper/ApiSe.php CHANGED
@@ -490,6 +490,11 @@ class Simtech_Searchanise_Helper_ApiSe
490
  {
491
  return self::getSetting('server_version');
492
  }
 
 
 
 
 
493
 
494
  public static function getSearchTimeout()
495
  {
@@ -1136,42 +1141,49 @@ class Simtech_Searchanise_Helper_ApiSe
1136
 
1137
  public static function getMinMaxProductId($store = null)
1138
  {
1139
- $start = 0;
1140
- $max = 0;
1141
- $startCollection = Mage::getModel('catalog/product')
 
1142
  ->getCollection()
1143
  ->addAttributeToSort('entity_id', Varien_Data_Collection::SORT_ORDER_ASC)
1144
  ->setPageSize(1);
1145
  if ($store) {
1146
- $startCollection = $startCollection->addStoreFilter($store);
1147
  }
1148
- $startCollection = $startCollection->load()->toArray();
1149
-
1150
- $maxCollection = Mage::getModel('catalog/product')
1151
  ->getCollection()
1152
  ->addAttributeToSort('entity_id', Varien_Data_Collection::SORT_ORDER_DESC)
1153
  ->setPageSize(1);
1154
  if ($store) {
1155
- $maxCollection = $maxCollection->addStoreFilter($store);
1156
  }
1157
- $maxCollection = $maxCollection->load()->toArray();
1158
 
1159
- if (!empty($startCollection)) {
1160
- $start = reset($startCollection);
1161
- $start = (int) $start['entity_id'];
 
 
 
1162
  }
1163
-
1164
- if (!empty($maxCollection)) {
1165
- $max = reset($maxCollection);
1166
- $max = (int) $max['entity_id'];
 
 
 
1167
  }
1168
-
1169
- return array($start, $max);
1170
  }
1171
 
1172
  public static function getProductIdsFormRange($start, $end, $step, $store = null)
1173
  {
1174
- $ret = array();
1175
 
1176
  $products = Mage::getModel('catalog/product')
1177
  ->getCollection()
@@ -1179,23 +1191,26 @@ class Simtech_Searchanise_Helper_ApiSe
1179
  ->setPageSize($step);
1180
 
1181
  if (!empty($store)) {
1182
- $products->addStoreFilter($store);
1183
  }
1184
 
1185
- $products->load();
1186
-
1187
- if (!empty($products)) {
 
1188
  foreach ($products as $product) {
1189
- $ret[] = $product->getId();
1190
  }
1191
  }
1192
-
1193
- return $ret;
 
 
1194
  }
1195
 
1196
  public static function getFilterableFiltersIds($store = null)
1197
  {
1198
- $ret = array();
1199
 
1200
  $filters = Mage::getResourceModel('catalog/product_attribute_collection')
1201
  ->setItemObjectClass('catalog/resource_eav_attribute')
@@ -1205,20 +1220,22 @@ class Simtech_Searchanise_Helper_ApiSe
1205
  $filters->addStoreLabel($store->getId());
1206
  }
1207
 
1208
- $filters->load();
1209
-
1210
- if (!empty($filters)) {
1211
  foreach ($filters as $filter) {
1212
- $ret[] = $filter->getId();
1213
  }
1214
  }
 
 
1215
 
1216
- return $ret;
1217
  }
1218
 
1219
  public static function getFilterableInSearchFiltersIds($store = null)
1220
  {
1221
- $ret = array();
1222
 
1223
  $filters = Mage::getResourceModel('catalog/product_attribute_collection')
1224
  ->setItemObjectClass('catalog/resource_eav_attribute')
@@ -1227,16 +1244,20 @@ class Simtech_Searchanise_Helper_ApiSe
1227
  if (!empty($store)) {
1228
  $filters->addStoreLabel($store->getId());
1229
  }
1230
-
1231
  $filters->load();
1232
 
1233
- if (!empty($filters)) {
 
 
1234
  foreach ($filters as $filter) {
1235
- $ret[] = $filter->getId();
1236
  }
1237
  }
 
 
1238
 
1239
- return $ret;
1240
  }
1241
 
1242
  public static function getFiltersIds($store = null)
@@ -1305,25 +1326,33 @@ class Simtech_Searchanise_Helper_ApiSe
1305
  return $ret;
1306
  }
1307
 
1308
- public static function async()
1309
  {
1310
  @ignore_user_abort(true);
1311
  @set_time_limit(0);
1312
- // Need for get all products.
1313
- Mage::app()->setCurrentStore(0);
1314
-
1315
- $xmlHeader = Mage::helper('searchanise/ApiXML')->getXMLHeader();
1316
- $xmlFooter = Mage::helper('searchanise/ApiXML')->getXMLFooter();
1317
 
 
 
 
1318
  self::echoConnectProgress('.');
1319
 
1320
  $q = Mage::getModel('searchanise/queue')->getNextQueue();
1321
 
1322
  while (!empty($q)) {
 
 
 
1323
  $xml = '';
1324
  $status = true;
1325
- $store = Mage::app()->getStore($q['store_id']);
1326
  $data = array();
 
 
 
1327
  if ((!empty($q['data'])) && ($q['data'] != Simtech_Searchanise_Model_Queue::NOT_DATA)) {
1328
  $data = unserialize($q['data']);
1329
  }
@@ -1339,7 +1368,9 @@ class Simtech_Searchanise_Helper_ApiSe
1339
 
1340
  //Note: $q['started'] can be in future.
1341
  if ($q['status'] == Simtech_Searchanise_Model_Queue::STATUS_PROCESSING && ($q['started'] + self::getMaxProcessingTime() > self::getTime())) {
1342
- return Simtech_Searchanise_Model_Queue::STATUS_PROCESSING;
 
 
1343
  }
1344
 
1345
  if ($q['error_count'] >= self::getMaxErrorCount()) {
@@ -1362,59 +1393,48 @@ class Simtech_Searchanise_Helper_ApiSe
1362
  ->addFilter('store_id', $store->getId())
1363
  ->load()
1364
  ->delete();
1365
-
1366
  $queueData = array(
1367
  'data' => Simtech_Searchanise_Model_Queue::NOT_DATA,
1368
  'action' => Simtech_Searchanise_Model_Queue::ACT_START_FULL_IMPORT,
1369
  'store_id' => $store->getId(),
1370
  );
1371
-
1372
  Mage::getModel('searchanise/queue')->setData($queueData)->save();
1373
 
1374
  $i = 0;
1375
  $step = self::getProductsPerPass() * 50;
1376
-
1377
- $sqls_arr = array();
1378
-
1379
  list($start, $max) = self::getMinMaxProductId($store);
1380
-
1381
  do {
1382
  $end = $start + $step;
1383
 
1384
- $_product_ids = self::getProductIdsFormRange($start, $end, $step, $store);
1385
 
1386
  $start = $end + 1;
1387
 
1388
- if (empty($_product_ids)) {
1389
  continue;
1390
  }
1391
- $_product_ids = array_chunk($_product_ids, self::getProductsPerPass());
1392
 
1393
- foreach ($_product_ids as $product_ids) {
1394
- $sqls_arr[] = array(
1395
- 'data' => serialize($product_ids),
 
1396
  'action' => Simtech_Searchanise_Model_Queue::ACT_UPDATE,
1397
  'store_id' => $store->getId(),
1398
  );
 
 
 
 
 
1399
  }
1400
 
1401
- // fixme if need
1402
- // need change one sql if exist opportunity
1403
- /*if (count($sqls_arr) >= 30) {
1404
- //~ db_query("INSERT INTO ?:se_queue (`data`, `action`, `lang_code`) VALUES " . join(',', $sqls_arr));
1405
-
1406
- self::echoConnectProgress('.');
1407
- $sqls_arr = array();
1408
- }*/
1409
- // end fixme
1410
  } while ($end <= $max);
1411
-
1412
- if (count($sqls_arr) > 0) {
1413
- foreach ($sqls_arr as $queueData) {
1414
- Mage::getModel('searchanise/queue')->setData($queueData)->save();
1415
- }
1416
- }
1417
-
1418
  self::echoConnectProgress('.');
1419
 
1420
  //
@@ -1558,6 +1578,10 @@ class Simtech_Searchanise_Helper_ApiSe
1558
  }
1559
  }
1560
  }
 
 
 
 
1561
 
1562
  // Change queue item status
1563
  if ($status == true) {
@@ -1797,22 +1821,7 @@ class Simtech_Searchanise_Helper_ApiSe
1797
 
1798
  return $ret;
1799
  }
1800
-
1801
- public static function changeAmpersand($str = '')
1802
- {
1803
- if (!empty($str)) {
1804
- if (strpos($str, '&amp;') !== false) {
1805
- return $str;
1806
- }
1807
-
1808
- if (strpos($str, '&') !== false) {
1809
- return str_replace('&','&amp;',$str);
1810
- }
1811
- }
1812
-
1813
- return $str;
1814
- }
1815
-
1816
  function printR()
1817
  {
1818
  static $count = 0;
490
  {
491
  return self::getSetting('server_version');
492
  }
493
+
494
+ public static function getAsyncMemoryLimit()
495
+ {
496
+ return self::getSetting('async_memory_limit');
497
+ }
498
 
499
  public static function getSearchTimeout()
500
  {
1141
 
1142
  public static function getMinMaxProductId($store = null)
1143
  {
1144
+ $startId = 0;
1145
+ $endId = 0;
1146
+
1147
+ $productStartCollection = Mage::getModel('catalog/product')
1148
  ->getCollection()
1149
  ->addAttributeToSort('entity_id', Varien_Data_Collection::SORT_ORDER_ASC)
1150
  ->setPageSize(1);
1151
  if ($store) {
1152
+ $productStartCollection = $productStartCollection->addStoreFilter($store);
1153
  }
1154
+ $productStartCollection = $productStartCollection->load();
1155
+
1156
+ $productEndCollection = Mage::getModel('catalog/product')
1157
  ->getCollection()
1158
  ->addAttributeToSort('entity_id', Varien_Data_Collection::SORT_ORDER_DESC)
1159
  ->setPageSize(1);
1160
  if ($store) {
1161
+ $productEndCollection = $productEndCollection->addStoreFilter($store);
1162
  }
1163
+ $productEndCollection = $productEndCollection->load();
1164
 
1165
+ if ($productStartCollection) {
1166
+ $productArr = $productStartCollection->toArray(array('entity_id'));
1167
+ if (!empty($productArr)) {
1168
+ $firstItem = reset($productArr);
1169
+ $startId = $firstItem['entity_id'];
1170
+ }
1171
  }
1172
+
1173
+ if ($productEndCollection) {
1174
+ $productArr = $productEndCollection->toArray(array('entity_id'));
1175
+ if (!empty($productArr)) {
1176
+ $firstItem = reset($productArr);
1177
+ $endId = $firstItem['entity_id'];
1178
+ }
1179
  }
1180
+
1181
+ return array($startId, $endId);
1182
  }
1183
 
1184
  public static function getProductIdsFormRange($start, $end, $step, $store = null)
1185
  {
1186
+ $arrProducts = array();
1187
 
1188
  $products = Mage::getModel('catalog/product')
1189
  ->getCollection()
1191
  ->setPageSize($step);
1192
 
1193
  if (!empty($store)) {
1194
+ $products = $products->addStoreFilter($store);
1195
  }
1196
 
1197
+ $products = $products->load();
1198
+ if ($products) {
1199
+ // Not used because 'arrProducts' comprising 'stock_item' field and is 'array(array())'
1200
+ // $arrProducts = $products->toArray(array('entity_id'));
1201
  foreach ($products as $product) {
1202
+ $arrProducts[] = $product->getId();
1203
  }
1204
  }
1205
+ // It is necessary for save memory.
1206
+ unset($products);
1207
+
1208
+ return $arrProducts;
1209
  }
1210
 
1211
  public static function getFilterableFiltersIds($store = null)
1212
  {
1213
+ $arrFilters = array();
1214
 
1215
  $filters = Mage::getResourceModel('catalog/product_attribute_collection')
1216
  ->setItemObjectClass('catalog/resource_eav_attribute')
1220
  $filters->addStoreLabel($store->getId());
1221
  }
1222
 
1223
+ if ($filters) {
1224
+ // It not used because 'arrFilters' is array(array())
1225
+ // $arrFilters = $filters->toArray(array('attribute'));
1226
  foreach ($filters as $filter) {
1227
+ $arrFilters[] = $filter->getId();
1228
  }
1229
  }
1230
+ // It is necessary for save memory.
1231
+ unset($filters);
1232
 
1233
+ return $arrFilters;
1234
  }
1235
 
1236
  public static function getFilterableInSearchFiltersIds($store = null)
1237
  {
1238
+ $arrFilters = array();
1239
 
1240
  $filters = Mage::getResourceModel('catalog/product_attribute_collection')
1241
  ->setItemObjectClass('catalog/resource_eav_attribute')
1244
  if (!empty($store)) {
1245
  $filters->addStoreLabel($store->getId());
1246
  }
1247
+
1248
  $filters->load();
1249
 
1250
+ if ($filters) {
1251
+ // It not used because 'arrFilters' is array(array())
1252
+ // $arrFilters = $filters->toArray(array('attribute'));
1253
  foreach ($filters as $filter) {
1254
+ $arrFilters[] = $filter->getId();
1255
  }
1256
  }
1257
+ // It is necessary for save memory.
1258
+ unset($filters);
1259
 
1260
+ return $arrFilters;
1261
  }
1262
 
1263
  public static function getFiltersIds($store = null)
1326
  return $ret;
1327
  }
1328
 
1329
+ public static function async($flIgnoreProcessing = false)
1330
  {
1331
  @ignore_user_abort(true);
1332
  @set_time_limit(0);
1333
+ // Adding memory if necessary
1334
+ $asyncMemoryLimit = Mage::helper('searchanise/ApiSe')->getAsyncMemoryLimit();
1335
+ if (substr(ini_get('memory_limit'), 0, -1) < $asyncMemoryLimit) {
1336
+ @ini_set('memory_limit', $asyncMemoryLimit . 'M');
1337
+ }
1338
 
1339
+ // Need for get all products.
1340
+ Mage::app()->setCurrentStore('admin');
1341
+
1342
  self::echoConnectProgress('.');
1343
 
1344
  $q = Mage::getModel('searchanise/queue')->getNextQueue();
1345
 
1346
  while (!empty($q)) {
1347
+ if (Mage::helper('searchanise')->checkDebug()) {
1348
+ Mage::helper('searchanise/ApiSe')->printR($q);
1349
+ }
1350
  $xml = '';
1351
  $status = true;
 
1352
  $data = array();
1353
+ $store = Mage::app()->getStore($q['store_id']);
1354
+ $xmlHeader = Mage::helper('searchanise/ApiXML')->getXMLHeader($store);
1355
+ $xmlFooter = Mage::helper('searchanise/ApiXML')->getXMLFooter($store);
1356
  if ((!empty($q['data'])) && ($q['data'] != Simtech_Searchanise_Model_Queue::NOT_DATA)) {
1357
  $data = unserialize($q['data']);
1358
  }
1368
 
1369
  //Note: $q['started'] can be in future.
1370
  if ($q['status'] == Simtech_Searchanise_Model_Queue::STATUS_PROCESSING && ($q['started'] + self::getMaxProcessingTime() > self::getTime())) {
1371
+ if (!$flIgnoreProcessing) {
1372
+ return Simtech_Searchanise_Model_Queue::STATUS_PROCESSING;
1373
+ }
1374
  }
1375
 
1376
  if ($q['error_count'] >= self::getMaxErrorCount()) {
1393
  ->addFilter('store_id', $store->getId())
1394
  ->load()
1395
  ->delete();
1396
+
1397
  $queueData = array(
1398
  'data' => Simtech_Searchanise_Model_Queue::NOT_DATA,
1399
  'action' => Simtech_Searchanise_Model_Queue::ACT_START_FULL_IMPORT,
1400
  'store_id' => $store->getId(),
1401
  );
1402
+
1403
  Mage::getModel('searchanise/queue')->setData($queueData)->save();
1404
 
1405
  $i = 0;
1406
  $step = self::getProductsPerPass() * 50;
1407
+
 
 
1408
  list($start, $max) = self::getMinMaxProductId($store);
1409
+
1410
  do {
1411
  $end = $start + $step;
1412
 
1413
+ $_productIds = self::getProductIdsFormRange($start, $end, $step, $store);
1414
 
1415
  $start = $end + 1;
1416
 
1417
+ if (empty($_productIds)) {
1418
  continue;
1419
  }
1420
+ $_productIds = array_chunk($_productIds, self::getProductsPerPass());
1421
 
1422
+ foreach ($_productIds as $productIds) {
1423
+ $_data = serialize($productIds);
1424
+ $queueData = array(
1425
+ 'data' => $_data,
1426
  'action' => Simtech_Searchanise_Model_Queue::ACT_UPDATE,
1427
  'store_id' => $store->getId(),
1428
  );
1429
+ $_result = Mage::getModel('searchanise/queue')->setData($queueData)->save();
1430
+ // It is necessary for save memory.
1431
+ unset($_result);
1432
+ unset($_data);
1433
+ unset($queueData);
1434
  }
1435
 
 
 
 
 
 
 
 
 
 
1436
  } while ($end <= $max);
1437
+
 
 
 
 
 
 
1438
  self::echoConnectProgress('.');
1439
 
1440
  //
1578
  }
1579
  }
1580
  }
1581
+
1582
+ if (Mage::helper('searchanise')->checkDebug()) {
1583
+ Mage::helper('searchanise/ApiSe')->printR('status', $status);
1584
+ }
1585
 
1586
  // Change queue item status
1587
  if ($status == true) {
1821
 
1822
  return $ret;
1823
  }
1824
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1825
  function printR()
1826
  {
1827
  static $count = 0;
app/code/community/Simtech/Searchanise/Helper/ApiXML.php CHANGED
@@ -305,9 +305,18 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
305
  return $minimalPrice;
306
  }
307
 
308
- public static function generateProductXML($product, $store = null)
309
  {
310
- $entry = '<entry>' . self::XML_END_LINE;
 
 
 
 
 
 
 
 
 
311
  $entry .= '<id>' . $product->getId() . '</id>' . self::XML_END_LINE;
312
 
313
  $entry .= '<title><![CDATA[' . $product->getName() . ']]></title>' . self::XML_END_LINE;
@@ -320,7 +329,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
320
  $entry .= '<summary><![CDATA[' . $summary. ']]></summary>' . self::XML_END_LINE;
321
 
322
  $productUrl = $product->getProductUrl(false);
323
- $productUrl = Mage::helper('searchanise/ApiSe')->changeAmpersand($productUrl);
324
  $entry .= '<link href="' . $productUrl . '" />' . self::XML_END_LINE;
325
  $entry .= '<cs:product_code><![CDATA[' . $product->getSku() . ']]></cs:product_code>' . self::XML_END_LINE;
326
 
@@ -524,10 +533,6 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
524
 
525
  if ($textValue != '') {
526
  $entry .= '<cs:attribute name="' . $attributeCode .'" type="text" text_search="Y" weight="' . $attributeWeight . '">';
527
- // fixme in the future
528
- // need for fixed bug of Server
529
- $entry .= ' ';
530
- // end fixme
531
  $entry .= '<![CDATA[' . $textValue . ']]>';
532
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
533
  }
@@ -542,7 +547,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
542
  if (!empty($arrValues)) {
543
  foreach ($arrValues as $v) {
544
  if ($v != '') {
545
- $strIdValues .= '<value>' . $v . '</value>';
546
  }
547
  }
548
  }
@@ -620,10 +625,10 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
620
  $entry .= '<cs:attribute name="categories" type="text">';
621
  // need, it's important
622
  $entry .= ' ';
623
- $category_ids = $product->getCategoryIds();
624
- if (!empty($category_ids)) {
625
- foreach ($category_ids as $cat_key => $category_id) {
626
- $entry .= '<value>' . $category_id . '</value>';
627
  }
628
  }
629
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
@@ -648,7 +653,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
648
  if ($tags) {
649
  foreach ($tags as $tag) {
650
  if ($tag != '') {
651
- $strTagIds .= '<value>' . $tag->getId() . '</value>';
652
  $strTagNames .= '<value><![CDATA[' . $tag->getName() . ']]></value>';
653
  }
654
  }
@@ -664,10 +669,6 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
664
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
665
 
666
  $entry .= '<cs:attribute name="tags" type="text" text_search="Y" weight="' . self::WEIGHT_TAGS .'">';
667
- // fixme in the future
668
- // need for fixed bug of Server
669
- $entry .= ' ';
670
- // end fixme
671
  $entry .= $strTagNames;
672
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
673
  }
@@ -795,16 +796,27 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
795
  }
796
 
797
  foreach ($productIds as $key => $productId) {
798
- $product = Mage::getModel('catalog/product')->load($productId);
799
-
800
- if ($store) {
801
- $product->setWebsiteId($store->getWebsiteId());
802
  }
803
- if ($customerGroupId != null) {
804
- $product->setCustomerGroupId($customerGroupId);
 
 
 
805
  }
 
806
 
807
- $products[] = $product;
 
 
 
 
 
 
 
 
 
808
  }
809
 
810
  return $products;
@@ -878,7 +890,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
878
  }
879
 
880
  // Main functions //
881
- public static function generateProductsXML($productIds = null, $store = null, $flagAddMinimalPrice = false)
882
  {
883
  $ret = '';
884
 
@@ -906,7 +918,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
906
  $arrAdditionalProducts = $additionalProducts->toArray();
907
  if ((!empty($arrAdditionalProducts)) && (count($arrAdditionalProducts) != 0)) {
908
  foreach ($additionalProducts as $product) {
909
- $ret .= self::generateProductXML($product, $store);
910
  }
911
  }
912
  }
@@ -916,7 +928,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
916
 
917
  if ($products) {
918
  foreach ($products as $product) {
919
- $ret .= self::generateProductXML($product, $store);
920
  }
921
  }
922
 
@@ -991,7 +1003,7 @@ class Simtech_Searchanise_Helper_ApiXML extends Mage_Core_Helper_Data
991
  $url = '';
992
 
993
  if (empty($store)) {
994
- $store = Mage::app()->getStore()->getBaseUrl();
995
  } else {
996
  $url = $store->getUrl();
997
  }
305
  return $minimalPrice;
306
  }
307
 
308
+ public static function generateProductXML($product, $store = null, $checkData = true)
309
  {
310
+ $entry = '';
311
+ if ($checkData) {
312
+ if (!$product ||
313
+ !$product->getId() ||
314
+ !$product->getName()
315
+ ) {
316
+ return $entry;
317
+ }
318
+ }
319
+ $entry .= '<entry>' . self::XML_END_LINE;
320
  $entry .= '<id>' . $product->getId() . '</id>' . self::XML_END_LINE;
321
 
322
  $entry .= '<title><![CDATA[' . $product->getName() . ']]></title>' . self::XML_END_LINE;
329
  $entry .= '<summary><![CDATA[' . $summary. ']]></summary>' . self::XML_END_LINE;
330
 
331
  $productUrl = $product->getProductUrl(false);
332
+ $productUrl = htmlspecialchars($productUrl);
333
  $entry .= '<link href="' . $productUrl . '" />' . self::XML_END_LINE;
334
  $entry .= '<cs:product_code><![CDATA[' . $product->getSku() . ']]></cs:product_code>' . self::XML_END_LINE;
335
 
533
 
534
  if ($textValue != '') {
535
  $entry .= '<cs:attribute name="' . $attributeCode .'" type="text" text_search="Y" weight="' . $attributeWeight . '">';
 
 
 
 
536
  $entry .= '<![CDATA[' . $textValue . ']]>';
537
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
538
  }
547
  if (!empty($arrValues)) {
548
  foreach ($arrValues as $v) {
549
  if ($v != '') {
550
+ $strIdValues .= '<value><![CDATA[' . $v . ']]></value>';
551
  }
552
  }
553
  }
625
  $entry .= '<cs:attribute name="categories" type="text">';
626
  // need, it's important
627
  $entry .= ' ';
628
+ $categoryIds = $product->getCategoryIds();
629
+ if (!empty($categoryIds)) {
630
+ foreach ($categoryIds as $catKey => $categoryId) {
631
+ $entry .= '<value><![CDATA[' . $categoryId . ']]></value>';
632
  }
633
  }
634
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
653
  if ($tags) {
654
  foreach ($tags as $tag) {
655
  if ($tag != '') {
656
+ $strTagIds .= '<value><![CDATA[' . $tag->getId() . ']]></value>';
657
  $strTagNames .= '<value><![CDATA[' . $tag->getName() . ']]></value>';
658
  }
659
  }
669
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
670
 
671
  $entry .= '<cs:attribute name="tags" type="text" text_search="Y" weight="' . self::WEIGHT_TAGS .'">';
 
 
 
 
672
  $entry .= $strTagNames;
673
  $entry .= '</cs:attribute>' . self::XML_END_LINE;
674
  }
796
  }
797
 
798
  foreach ($productIds as $key => $productId) {
799
+ if (empty($productId)) {
800
+ continue;
 
 
801
  }
802
+ // It can use various types of data.
803
+ if (is_array($productId)) {
804
+ if (isset($productId['entity_id'])) {
805
+ $productId = $productId['entity_id'];
806
+ }
807
  }
808
+ $product = Mage::getModel('catalog/product')->load($productId);
809
 
810
+ if ($product) {
811
+ if ($store) {
812
+ $product->setWebsiteId($store->getWebsiteId());
813
+ }
814
+ if ($customerGroupId != null) {
815
+ $product->setCustomerGroupId($customerGroupId);
816
+ }
817
+
818
+ $products[] = $product;
819
+ }
820
  }
821
 
822
  return $products;
890
  }
891
 
892
  // Main functions //
893
+ public static function generateProductsXML($productIds = null, $store = null, $flagAddMinimalPrice = false, $checkData = true)
894
  {
895
  $ret = '';
896
 
918
  $arrAdditionalProducts = $additionalProducts->toArray();
919
  if ((!empty($arrAdditionalProducts)) && (count($arrAdditionalProducts) != 0)) {
920
  foreach ($additionalProducts as $product) {
921
+ $ret .= self::generateProductXML($product, $store, $checkData);
922
  }
923
  }
924
  }
928
 
929
  if ($products) {
930
  foreach ($products as $product) {
931
+ $ret .= self::generateProductXML($product, $store, $checkData);
932
  }
933
  }
934
 
1003
  $url = '';
1004
 
1005
  if (empty($store)) {
1006
+ $url = Mage::app()->getStore()->getBaseUrl();
1007
  } else {
1008
  $url = $store->getUrl();
1009
  }
app/code/community/Simtech/Searchanise/controllers/AsyncController.php CHANGED
@@ -13,6 +13,7 @@
13
  ****************************************************************************/
14
  class Simtech_Searchanise_AsyncController extends Mage_Core_Controller_Front_Action
15
  {
 
16
  protected $_notUseHttpRequestText = null;
17
  protected $_flShowStatusAsync = null;
18
 
@@ -71,6 +72,14 @@ class Simtech_Searchanise_AsyncController extends Mage_Core_Controller_Front_Act
71
  public function indexAction()
72
  {
73
  if (Mage::helper('searchanise/ApiSe')->getStatusModule() == 'Y') {
 
 
 
 
 
 
 
 
74
  // not need because it checked in the "Async.php" block
75
  // if (Mage::helper('searchanise/ApiSe')->checkStartAsync()) {
76
  if (true) {
@@ -84,8 +93,18 @@ class Simtech_Searchanise_AsyncController extends Mage_Core_Controller_Front_Act
84
  if ($check) {
85
  @ignore_user_abort(true);
86
  @set_time_limit(0);
 
 
 
 
 
 
 
 
 
 
87
 
88
- $result = Mage::helper('searchanise/ApiSe')->async();
89
 
90
  if ($this->checkShowSatusAsync()) {
91
  echo 'Searchanise status sync: ';
13
  ****************************************************************************/
14
  class Simtech_Searchanise_AsyncController extends Mage_Core_Controller_Front_Action
15
  {
16
+ const PARENT_PRIVATE_KEY = 'parent_private_key';
17
  protected $_notUseHttpRequestText = null;
18
  protected $_flShowStatusAsync = null;
19
 
72
  public function indexAction()
73
  {
74
  if (Mage::helper('searchanise/ApiSe')->getStatusModule() == 'Y') {
75
+ $parentPrivateKey = $this->getRequest()->getParam(self::PARENT_PRIVATE_KEY);
76
+ if ((empty($parentPrivateKey)) ||
77
+ (Mage::helper('searchanise/ApiSe')->getParentPrivateKey() !== $parentPrivateKey)) {
78
+ $checkKey = false;
79
+ } else {
80
+ $checkKey = true;
81
+ }
82
+
83
  // not need because it checked in the "Async.php" block
84
  // if (Mage::helper('searchanise/ApiSe')->checkStartAsync()) {
85
  if (true) {
93
  if ($check) {
94
  @ignore_user_abort(true);
95
  @set_time_limit(0);
96
+ if ($checkKey && $this->getRequest()->getParam('display_errors') === 'Y') {
97
+ @error_reporting (E_ALL);
98
+ @ini_set('display_errors', 1);
99
+ } else {
100
+ @ini_set('display_errors', 0);
101
+ }
102
+ $flIgnoreProcessing = false;
103
+ if ($checkKey && $this->getRequest()->getParam('ignore_processing') === 'Y') {
104
+ $flIgnoreProcessing = true;
105
+ }
106
 
107
+ $result = Mage::helper('searchanise/ApiSe')->async($flIgnoreProcessing);
108
 
109
  if ($this->checkShowSatusAsync()) {
110
  echo 'Searchanise status sync: ';
app/code/community/Simtech/Searchanise/controllers/InfoController.php CHANGED
@@ -16,8 +16,9 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
16
  {
17
  const RESYNC = 'resync';
18
  const OUTPUT = 'visual';
19
- const PROFILER = 'profiler';
20
  const STORE_ID = 'store_id';
 
21
  const PRODUCT_ID = 'product_id';
22
  const PRODUCT_IDS = 'product_ids';
23
  const PARENT_PRIVATE_KEY = 'parent_private_key';
@@ -47,20 +48,8 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
47
 
48
  public function indexAction()
49
  {
50
- $resync = $this->getRequest()->getParam(self::RESYNC);
51
- $visual = $this->getRequest()->getParam(self::OUTPUT);
52
- $profiler = $this->getRequest()->getParam(self::PROFILER);
53
- $storeId = $this->getRequest()->getParam(self::STORE_ID);
54
- $productId = $this->getRequest()->getParam(self::PRODUCT_ID);
55
- $productIds = $this->getRequest()->getParam(self::PRODUCT_IDS);
56
  $parentPrivateKey = $this->getRequest()->getParam(self::PARENT_PRIVATE_KEY);
57
 
58
- if ($productId) {
59
- $productIds = array($productId);
60
- } elseif ($productIds) {
61
- $productIds = explode(',', $productIds);
62
- }
63
-
64
  if ((empty($parentPrivateKey)) ||
65
  (Mage::helper('searchanise/ApiSe')->getParentPrivateKey() !== $parentPrivateKey)) {
66
  $_options = Mage::helper('searchanise/ApiSe')->getAddonOptions();
@@ -75,6 +64,21 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
75
  echo Mage::helper('core')->jsonEncode($options);
76
  }
77
  } else {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  $store = null;
79
  if (!empty($storeId)) {
80
  $store = Mage::app()->getStore($storeId);
@@ -116,14 +120,19 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
116
  Mage::helper('searchanise/ApiSe')->queueImport();
117
 
118
  } elseif (!empty($productIds)) {
119
-
120
- $productFeeds = Mage::helper('searchanise/ApiXML')->generateProductsXML($productIds, $store);
 
 
 
 
121
 
122
  if ($visual) {
123
  Mage::helper('searchanise/ApiSe')->printR($productFeeds);
124
  } else {
125
  echo Mage::helper('core')->jsonEncode($productFeeds);
126
  }
 
127
  } else {
128
  Mage::helper('searchanise/ApiSe')->checkImportIsDone();
129
 
@@ -146,6 +155,13 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
146
  @ignore_user_abort(1);
147
  $options['ignore_user_abort_after'] = ini_get('ignore_user_abort_after');
148
 
 
 
 
 
 
 
 
149
  if ($visual) {
150
  Mage::helper('searchanise/ApiSe')->printR($options);
151
  } else {
@@ -200,4 +216,4 @@ class Simtech_Searchanise_InfoController extends Mage_Core_Controller_Front_Acti
200
 
201
  return $out;
202
  }
203
- }
16
  {
17
  const RESYNC = 'resync';
18
  const OUTPUT = 'visual';
19
+ const PROFILER = 'profiler';
20
  const STORE_ID = 'store_id';
21
+ const CHECK_DATA = 'check_data';
22
  const PRODUCT_ID = 'product_id';
23
  const PRODUCT_IDS = 'product_ids';
24
  const PARENT_PRIVATE_KEY = 'parent_private_key';
48
 
49
  public function indexAction()
50
  {
 
 
 
 
 
 
51
  $parentPrivateKey = $this->getRequest()->getParam(self::PARENT_PRIVATE_KEY);
52
 
 
 
 
 
 
 
53
  if ((empty($parentPrivateKey)) ||
54
  (Mage::helper('searchanise/ApiSe')->getParentPrivateKey() !== $parentPrivateKey)) {
55
  $_options = Mage::helper('searchanise/ApiSe')->getAddonOptions();
64
  echo Mage::helper('core')->jsonEncode($options);
65
  }
66
  } else {
67
+ @ini_set('display_errors', 1);
68
+ $resync = $this->getRequest()->getParam(self::RESYNC);
69
+ $visual = $this->getRequest()->getParam(self::OUTPUT);
70
+ $profiler = $this->getRequest()->getParam(self::PROFILER);
71
+ $storeId = $this->getRequest()->getParam(self::STORE_ID);
72
+ $checkData = $this->getRequest()->getParam(self::CHECK_DATA);
73
+ $productId = $this->getRequest()->getParam(self::PRODUCT_ID);
74
+ $productIds = $this->getRequest()->getParam(self::PRODUCT_IDS);
75
+
76
+ if ($productId) {
77
+ $productIds = array($productId);
78
+ } elseif ($productIds) {
79
+ $productIds = explode(',', $productIds);
80
+ }
81
+
82
  $store = null;
83
  if (!empty($storeId)) {
84
  $store = Mage::app()->getStore($storeId);
120
  Mage::helper('searchanise/ApiSe')->queueImport();
121
 
122
  } elseif (!empty($productIds)) {
123
+ $productFeeds = Mage::helper('searchanise/ApiXML')->generateProductsXML($productIds, $store, false, $checkData);
124
+ if ($productFeeds) {
125
+ $xmlHeader = Mage::helper('searchanise/ApiXML')->getXMLHeader($store);
126
+ $xmlFooter = Mage::helper('searchanise/ApiXML')->getXMLFooter($store);
127
+ $productFeeds = $xmlHeader . $productFeeds . $xmlFooter;
128
+ }
129
 
130
  if ($visual) {
131
  Mage::helper('searchanise/ApiSe')->printR($productFeeds);
132
  } else {
133
  echo Mage::helper('core')->jsonEncode($productFeeds);
134
  }
135
+
136
  } else {
137
  Mage::helper('searchanise/ApiSe')->checkImportIsDone();
138
 
155
  @ignore_user_abort(1);
156
  $options['ignore_user_abort_after'] = ini_get('ignore_user_abort_after');
157
 
158
+ $options['memory_limit'] = ini_get('memory_limit');
159
+ $asyncMemoryLimit = Mage::helper('searchanise/ApiSe')->getAsyncMemoryLimit();
160
+ if (substr(ini_get('memory_limit'), 0, -1) < $asyncMemoryLimit) {
161
+ @ini_set('memory_limit', $asyncMemoryLimit . 'M');
162
+ }
163
+ $options['memory_limit_after'] = ini_get('memory_limit');
164
+
165
  if ($visual) {
166
  Mage::helper('searchanise/ApiSe')->printR($options);
167
  } else {
216
 
217
  return $out;
218
  }
219
+ }
app/code/community/Simtech/Searchanise/etc/config.xml CHANGED
@@ -15,7 +15,7 @@
15
  <config>
16
  <modules>
17
  <Simtech_Searchanise>
18
- <version>1.1.6</version>
19
  </Simtech_Searchanise>
20
  </modules>
21
  <frontend>
@@ -562,6 +562,7 @@
562
  <searchanise>
563
  <config>
564
  <server_version>1.2</server_version>
 
565
  <search_timeout>3</search_timeout>
566
  <request_timeout>10</request_timeout>
567
  <ajax_async_timeout>1</ajax_async_timeout>
15
  <config>
16
  <modules>
17
  <Simtech_Searchanise>
18
+ <version>1.1.7</version>
19
  </Simtech_Searchanise>
20
  </modules>
21
  <frontend>
562
  <searchanise>
563
  <config>
564
  <server_version>1.2</server_version>
565
+ <async_memory_limit>512</async_memory_limit>
566
  <search_timeout>3</search_timeout>
567
  <request_timeout>10</request_timeout>
568
  <ajax_async_timeout>1</ajax_async_timeout>
app/code/community/Simtech/Searchanise/etc/config_without_search.xml CHANGED
@@ -15,7 +15,7 @@
15
  <config>
16
  <modules>
17
  <Simtech_Searchanise>
18
- <version>1.1.6</version>
19
  </Simtech_Searchanise>
20
  </modules>
21
  <frontend>
@@ -562,6 +562,7 @@
562
  <searchanise>
563
  <config>
564
  <server_version>1.2</server_version>
 
565
  <search_timeout>3</search_timeout>
566
  <request_timeout>10</request_timeout>
567
  <ajax_async_timeout>1</ajax_async_timeout>
15
  <config>
16
  <modules>
17
  <Simtech_Searchanise>
18
+ <version>1.1.7</version>
19
  </Simtech_Searchanise>
20
  </modules>
21
  <frontend>
562
  <searchanise>
563
  <config>
564
  <server_version>1.2</server_version>
565
+ <async_memory_limit>512</async_memory_limit>
566
  <search_timeout>3</search_timeout>
567
  <request_timeout>10</request_timeout>
568
  <ajax_async_timeout>1</ajax_async_timeout>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Simtech_Searchanise</name>
4
- <version>1.1.6</version>
5
  <stability>stable</stability>
6
  <license uri="http://docs.searchanise.com/connector_addon/license_agreement.html">Commercial license: http://docs.searchanise.com/connector_addon/license_agreement.html</license>
7
  <channel>community</channel>
@@ -10,13 +10,12 @@
10
  <description>Searchanise is a free SaaS solution providing fast and smart search for online stores. It provides rapid search results and instant search suggestions presented in a fancy and customizable widget.&#xD;
11
  &#xD;
12
  With the help of Searchanise Connector Add-on you will be able to connect your store to the service and start using the search widget in no time. Power up your store right now!</description>
13
- <notes>[!] Price could be indicated incorrectly on currency change. Fixed.&lt;br /&gt;&#xD;
14
- [~] Cron sync init method now works in parallel with the AJAX method by default to improve stability.&lt;br /&gt;&#xD;
15
- [*] Unnecessary cron processing notifications sent every 5 minutes with the OK message removed..&lt;br /&gt;</notes>
16
  <authors><author><name>Simbirsk Technologies, Ltd.</name><user>searchanise</user><email>sales@searchanise.com</email></author></authors>
17
- <date>2013-08-27</date>
18
- <time>08:57:46</time>
19
- <contents><target name="magecommunity"><dir name="Simtech"><dir name="Searchanise"><dir name="Block"><file name="Async.php" hash="bc97c98da15f5abbc1d8922ca477dc6d"/><file name="Autocomplete.php" hash="efc89ac3f897be3bc307fba6a36778f0"/><file name="Jsinit.php" hash="0cf9770f73064f571420283a0e4bdb8d"/><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="73c06dbe5c5ca8778bb2488ed2b5b5ed"/></dir><file name="Result.php" hash="4e767e273ee21a38332ac226af878291"/></dir><file name="Result.php" hash="dec7b27ab9511c956680eb60eba9b95e"/></dir><dir name="Helper"><file name="ApiSe.php" hash="af325d27456d9ef37f324562f3ffdcbb"/><file name="ApiXML.php" hash="92d2847f967b6b02dabe882239264e80"/><file name="Data.php" hash="53bbede2bf74a83521ee64240739f898"/></dir><dir name="Model"><file name="Advanced.php" hash="2a22ebcf7ac75b54681ef8a27bad2e47"/><dir name="Config"><file name="Data.php" hash="ddc558d22208f0ebc1e4378c9d050022"/></dir><file name="Config.php" hash="00ca3c7955f3ff2283c636a2074b6f03"/><dir name="Import"><dir name="Entity"><file name="Product.php" hash="4997af528b36f0f576d1c01402e14b03"/></dir></dir><dir name="Layer"><dir name="Filter"><file name="Category.php" hash="e290ab29f2d50e1acbbbb37496150ea4"/><file name="Price.php" hash="743887b32bf012274ad8a371fff96411"/></dir></dir><file name="Layer.php" hash="3e8c975d649ae6e20fcc69d35779c97c"/><file name="LayerCatalogSearch.php" hash="61728092fdb9cf42490afacdc4e731fd"/><dir name="Mysql4"><dir name="Advanced"><file name="Collection.php" hash="dd8c6f3cbb0621a5a7320f3104e68da6"/></dir><dir name="Config"><file name="Collection.php" hash="470218c1eb3f1cc1ca0e6d0e93e1b097"/></dir><file name="Config.php" hash="c95dc8ecd7ab4f955b6eaf4710ab960e"/><dir name="Fulltext"><file name="Collection.php" hash="5646955503a90020f87cfd861ac07e73"/></dir><dir name="Product"><file name="Collection.php" hash="28b478eb328502ce03e389404d9f54b5"/><file name="CollectionTag.php" hash="def509d1365374e6dede36be17e75bf3"/></dir><dir name="Queue"><file name="Collection.php" hash="30ca0f8640bdc443deb94cd2e71010c8"/></dir><file name="Queue.php" hash="286351623e8f011a21519f8d9c3e3151"/><file name="Store.php" hash="0126a4291d7dad6641bf59abb0f64cc4"/></dir><file name="Observer.php" hash="8d24a27713e1db605ef0c14862df8bf0"/><file name="Queue.php" hash="831f5ea7e57810f9c78d09659424e9a7"/><file name="Request.php" hash="af0f9a16a0dbc69ba76458eac802638b"/><dir name="Resource"><dir name="Advanced"><file name="Collection.php" hash="12933839daa74d17ac82fca89071bc0a"/></dir><dir name="Eav"><dir name="Mysql4"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="982b1960bec58522f1bd8b82f86452b4"/><file name="Price.php" hash="fc1ec55d6c2aa97558e06691e690e466"/></dir></dir><dir name="Product"><file name="Action.php" hash="006e3c8c775cf31a8b9c66fb934c9d2d"/></dir></dir></dir><dir name="Fulltext"><file name="Collection.php" hash="b9e2e4884a7ecee0000e6a41c0e6d3e2"/></dir><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="0bfecbdff2458785a287c3f1de23ed56"/><file name="Price.php" hash="38d1acaa4478d678d4bb20704a81b760"/></dir></dir><dir name="Product"><file name="Collection.php" hash="6072bf2a7a4713f3db2fa96014e7453a"/><file name="CollectionTag.php" hash="e89307da7c26ee153c3f9dead94dcd13"/></dir><file name="Store.php" hash="8dd81bf57d38af2b4640bbf14063d3f8"/></dir><file name="Searchanise.php" hash="507813e92908000315aabc4256c5a05c"/><dir name="System"><dir name="Config"><dir name="Source"><dir name="Searchanise"><file name="TypeAsync.php" hash="11d1aa481094ccbeab365b1fed33440d"/></dir></dir></dir></dir><dir name="Tag"><file name="Relation.php" hash="598f81fd8b2ac77baf24211c2ed03e55"/></dir></dir><dir name="controllers"><file name="AdvancedController.php" hash="7500f6075382cd8a14816e424da2348f"/><file name="AsyncController.php" hash="c0d808f26138c60b417b6fc6b8d31efa"/><file name="CategoryController.php" hash="909f99c5cf7f85405fc76ebe976c2c8e"/><file name="IndexController.php" hash="e3234ca51a7669741e29ff7c38789989"/><file name="InfoController.php" hash="dcd05c05477c8df8d612ac1c62912944"/><file name="OptionsController.php" hash="56785c8ea24472c2047268b2d9e8e878"/><file name="ProductController.php" hash="6633fde99f35ffeaa05884f0e0d98da7"/><file name="ResultController.php" hash="4b00515cc47593704ea1178d7b44d48e"/><file name="ResyncController.php" hash="0612f929d375427326821dfc12186be8"/><file name="SignupController.php" hash="80f87a63d6272f98a068dde35f1d140e"/></dir><dir name="etc"><file name="config.xml" hash="fc3bd88786229c92b19e921af4ef5fae"/><file name="config_without_search.xml" hash="92f5bbf15aae1a1228af350602e51060"/><file name="system.xml" hash="a6b2e082fe45706b86b8da0fe02d4374"/></dir><dir name="sql"><dir name="searchanise_setup"><file name="mysql4-install-0.1.0.php" hash="754324c8783e9cc24de86396e1587e73"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="searchanise"><file name="dashboard.phtml" hash="4f0674cd493872c2b1e89cdcc80546ab"/></dir></dir><dir name="layout"><file name="searchanise.xml" hash="68baa611d05db05f8816ea2a8260e961"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="searchanise.xml" hash="5e904fee02cbd42324a297d513b9f582"/></dir></dir></dir><dir name="default"><dir name="default"><dir name="template"><dir name="catalogsearch"><file name="form.mini.phtml" hash="fcf8e06e66801a36c96f20ca5d187123"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Simtech_Searchanise.xml" hash="04148681a6648bd370ab62140cbf2ad9"/></dir></target><target name="magelocale"><dir name="en_US"><file name="Simtech_Searchanise.csv" hash="1bdb7fddc596dac1460bc3054c425187"/></dir></target></contents>
20
  <compatible/>
21
  <dependencies><required><php><min>5.2.13</min><max>6.0.0</max></php></required></dependencies>
22
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Simtech_Searchanise</name>
4
+ <version>1.1.7</version>
5
  <stability>stable</stability>
6
  <license uri="http://docs.searchanise.com/connector_addon/license_agreement.html">Commercial license: http://docs.searchanise.com/connector_addon/license_agreement.html</license>
7
  <channel>community</channel>
10
  <description>Searchanise is a free SaaS solution providing fast and smart search for online stores. It provides rapid search results and instant search suggestions presented in a fancy and customizable widget.&#xD;
11
  &#xD;
12
  With the help of Searchanise Connector Add-on you will be able to connect your store to the service and start using the search widget in no time. Power up your store right now!</description>
13
+ <notes>[!] Some attribute values could be ignored in the full-text search. Fixed.&lt;br /&gt;&#xD;
14
+ [*] Full import is now more stable, less memory-consuming, and more DB error-resistant.</notes>
 
15
  <authors><author><name>Simbirsk Technologies, Ltd.</name><user>searchanise</user><email>sales@searchanise.com</email></author></authors>
16
+ <date>2013-09-23</date>
17
+ <time>08:30:05</time>
18
+ <contents><target name="magecommunity"><dir name="Simtech"><dir name="Searchanise"><dir name="Block"><file name="Async.php" hash="bc97c98da15f5abbc1d8922ca477dc6d"/><file name="Autocomplete.php" hash="efc89ac3f897be3bc307fba6a36778f0"/><file name="Jsinit.php" hash="0cf9770f73064f571420283a0e4bdb8d"/><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="73c06dbe5c5ca8778bb2488ed2b5b5ed"/></dir><file name="Result.php" hash="4e767e273ee21a38332ac226af878291"/></dir><file name="Result.php" hash="dec7b27ab9511c956680eb60eba9b95e"/></dir><dir name="Helper"><file name="ApiSe.php" hash="097890a3d144ef9f5c073ec823503aa5"/><file name="ApiXML.php" hash="cc920563319910b4775a10aee240b782"/><file name="Data.php" hash="53bbede2bf74a83521ee64240739f898"/></dir><dir name="Model"><file name="Advanced.php" hash="2a22ebcf7ac75b54681ef8a27bad2e47"/><dir name="Config"><file name="Data.php" hash="ddc558d22208f0ebc1e4378c9d050022"/></dir><file name="Config.php" hash="00ca3c7955f3ff2283c636a2074b6f03"/><dir name="Import"><dir name="Entity"><file name="Product.php" hash="4997af528b36f0f576d1c01402e14b03"/></dir></dir><dir name="Layer"><dir name="Filter"><file name="Category.php" hash="e290ab29f2d50e1acbbbb37496150ea4"/><file name="Price.php" hash="743887b32bf012274ad8a371fff96411"/></dir></dir><file name="Layer.php" hash="3e8c975d649ae6e20fcc69d35779c97c"/><file name="LayerCatalogSearch.php" hash="61728092fdb9cf42490afacdc4e731fd"/><dir name="Mysql4"><dir name="Advanced"><file name="Collection.php" hash="dd8c6f3cbb0621a5a7320f3104e68da6"/></dir><dir name="Config"><file name="Collection.php" hash="470218c1eb3f1cc1ca0e6d0e93e1b097"/></dir><file name="Config.php" hash="c95dc8ecd7ab4f955b6eaf4710ab960e"/><dir name="Fulltext"><file name="Collection.php" hash="5646955503a90020f87cfd861ac07e73"/></dir><dir name="Product"><file name="Collection.php" hash="28b478eb328502ce03e389404d9f54b5"/><file name="CollectionTag.php" hash="def509d1365374e6dede36be17e75bf3"/></dir><dir name="Queue"><file name="Collection.php" hash="30ca0f8640bdc443deb94cd2e71010c8"/></dir><file name="Queue.php" hash="286351623e8f011a21519f8d9c3e3151"/><file name="Store.php" hash="0126a4291d7dad6641bf59abb0f64cc4"/></dir><file name="Observer.php" hash="8d24a27713e1db605ef0c14862df8bf0"/><file name="Queue.php" hash="831f5ea7e57810f9c78d09659424e9a7"/><file name="Request.php" hash="af0f9a16a0dbc69ba76458eac802638b"/><dir name="Resource"><dir name="Advanced"><file name="Collection.php" hash="12933839daa74d17ac82fca89071bc0a"/></dir><dir name="Eav"><dir name="Mysql4"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="982b1960bec58522f1bd8b82f86452b4"/><file name="Price.php" hash="fc1ec55d6c2aa97558e06691e690e466"/></dir></dir><dir name="Product"><file name="Action.php" hash="006e3c8c775cf31a8b9c66fb934c9d2d"/></dir></dir></dir><dir name="Fulltext"><file name="Collection.php" hash="b9e2e4884a7ecee0000e6a41c0e6d3e2"/></dir><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="0bfecbdff2458785a287c3f1de23ed56"/><file name="Price.php" hash="38d1acaa4478d678d4bb20704a81b760"/></dir></dir><dir name="Product"><file name="Collection.php" hash="6072bf2a7a4713f3db2fa96014e7453a"/><file name="CollectionTag.php" hash="e89307da7c26ee153c3f9dead94dcd13"/></dir><file name="Store.php" hash="8dd81bf57d38af2b4640bbf14063d3f8"/></dir><file name="Searchanise.php" hash="507813e92908000315aabc4256c5a05c"/><dir name="System"><dir name="Config"><dir name="Source"><dir name="Searchanise"><file name="TypeAsync.php" hash="11d1aa481094ccbeab365b1fed33440d"/></dir></dir></dir></dir><dir name="Tag"><file name="Relation.php" hash="598f81fd8b2ac77baf24211c2ed03e55"/></dir></dir><dir name="controllers"><file name="AdvancedController.php" hash="7500f6075382cd8a14816e424da2348f"/><file name="AsyncController.php" hash="e12b49146b32369e8eda17b7e6558fc7"/><file name="CategoryController.php" hash="909f99c5cf7f85405fc76ebe976c2c8e"/><file name="IndexController.php" hash="e3234ca51a7669741e29ff7c38789989"/><file name="InfoController.php" hash="dfbb0787588ac7884cac6dda72507209"/><file name="OptionsController.php" hash="56785c8ea24472c2047268b2d9e8e878"/><file name="ProductController.php" hash="6633fde99f35ffeaa05884f0e0d98da7"/><file name="ResultController.php" hash="4b00515cc47593704ea1178d7b44d48e"/><file name="ResyncController.php" hash="0612f929d375427326821dfc12186be8"/><file name="SignupController.php" hash="80f87a63d6272f98a068dde35f1d140e"/></dir><dir name="etc"><file name="config.xml" hash="99932a4a58258b261b1b61e98928f9de"/><file name="config_without_search.xml" hash="e470d291701015dcf403caf7ec5ce265"/><file name="system.xml" hash="a6b2e082fe45706b86b8da0fe02d4374"/></dir><dir name="sql"><dir name="searchanise_setup"><file name="mysql4-install-0.1.0.php" hash="754324c8783e9cc24de86396e1587e73"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="searchanise"><file name="dashboard.phtml" hash="4f0674cd493872c2b1e89cdcc80546ab"/></dir></dir><dir name="layout"><file name="searchanise.xml" hash="68baa611d05db05f8816ea2a8260e961"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="searchanise.xml" hash="5e904fee02cbd42324a297d513b9f582"/></dir></dir></dir><dir name="default"><dir name="default"><dir name="template"><dir name="catalogsearch"><file name="form.mini.phtml" hash="fcf8e06e66801a36c96f20ca5d187123"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Simtech_Searchanise.xml" hash="04148681a6648bd370ab62140cbf2ad9"/></dir></target><target name="magelocale"><dir name="en_US"><file name="Simtech_Searchanise.csv" hash="1bdb7fddc596dac1460bc3054c425187"/></dir></target></contents>
19
  <compatible/>
20
  <dependencies><required><php><min>5.2.13</min><max>6.0.0</max></php></required></dependencies>
21
  </package>