Flagbit_Factfinder - Version 4.1.10

Version Notes

Release

Download this release

Release Info

Developer FACTFinder
Extension Flagbit_Factfinder
Version 4.1.10
Comparing to
See all releases


Code changes from version 4.1.9 to 4.1.10

app/code/community/FACTFinder/Campaigns/Model/Handler/Abstract.php CHANGED
@@ -92,7 +92,9 @@ abstract class FACTFinder_Campaigns_Model_Handler_Abstract extends FACTFinder_Co
92
  $params['do'] = $this->_getDoParam();
93
  $params['productNumber'] = $this->_getProductNumberParam();
94
  $params['idsOnly'] = 'true';
95
-
 
 
96
  $this->_getFacade()->configureProductCampaignAdapter($params);
97
  }
98
 
92
  $params['do'] = $this->_getDoParam();
93
  $params['productNumber'] = $this->_getProductNumberParam();
94
  $params['idsOnly'] = 'true';
95
+ if(Mage::getStoreConfigFlag('factfinder/config/personalization')) {
96
+ $params['sid'] = Mage::helper('factfinder_tracking')->getSessionId();
97
+ }
98
  $this->_getFacade()->configureProductCampaignAdapter($params);
99
  }
100
 
app/code/community/FACTFinder/Core/Helper/Export.php CHANGED
@@ -24,6 +24,10 @@ class FACTFinder_Core_Helper_Export extends Mage_Core_Helper_Abstract
24
  const IMPORT_DELAY_KEY = 'factfinder_import_delay';
25
  const ARCHIVE_PATTERN = 'store_%s_export.zip';
26
  const EXPORT_TRIGGER_DELAY = 90;
 
 
 
 
27
 
28
  /**
29
  * @var int
@@ -271,4 +275,75 @@ class FACTFinder_Core_Helper_Export extends Mage_Core_Helper_Abstract
271
  }
272
 
273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  }
24
  const IMPORT_DELAY_KEY = 'factfinder_import_delay';
25
  const ARCHIVE_PATTERN = 'store_%s_export.zip';
26
  const EXPORT_TRIGGER_DELAY = 90;
27
+ const EXPORT_IMAGE_SIZE = 'suggest_image_size';
28
+ const EXPORT_IMAGE_TYPE = 'suggest_image_type';
29
+ const EXPORT_URLS_IMAGES = 'urls';
30
+ const OUT_OF_STOCK_PRODUCTS = 'out_of_stock_products';
31
 
32
  /**
33
  * @var int
275
  }
276
 
277
 
278
+ /**
279
+ * Get width of product images exported
280
+ *
281
+ * @param int $storeId
282
+ *
283
+ * @return null|string
284
+ */
285
+ public function getExportImageWidth($storeId = 0)
286
+ {
287
+ $width = $this->getExportConfigValue(self::EXPORT_IMAGE_SIZE, $storeId);
288
+ $width = array_shift(explode('x', $width));
289
+
290
+ return $width;
291
+ }
292
+
293
+
294
+ /**
295
+ * Get height of images exported. If not set use width
296
+ *
297
+ * @param int $storeId
298
+ *
299
+ * @return null|string
300
+ */
301
+ public function getExportImageHeight($storeId = 0)
302
+ {
303
+ $height = $this->getExportConfigValue(self::EXPORT_IMAGE_SIZE, $storeId);
304
+ $height = array_pop(explode('x', $height));
305
+
306
+ return $height ? $height : $this->getExportImageWidth();
307
+ }
308
+
309
+
310
+ /**
311
+ * Get type of product image to export
312
+ *
313
+ * @param int $storeId
314
+ *
315
+ * @return null|string
316
+ */
317
+ public function getExportImageType($storeId = 0)
318
+ {
319
+ return $this->getExportConfigValue(self::EXPORT_IMAGE_TYPE, $storeId);
320
+ }
321
+
322
+
323
+ /**
324
+ * Check if images and deeplinks should be exported
325
+ *
326
+ * @param int $storeId
327
+ *
328
+ * @return null|string
329
+ */
330
+ public function shouldExportImagesAndDeeplinks($storeId = 0)
331
+ {
332
+ return $this->getExportConfigValue(self::EXPORT_URLS_IMAGES, $storeId);
333
+ }
334
+
335
+
336
+ /**
337
+ * Check if out of stock products should be exported
338
+ *
339
+ * @param int $storeId
340
+ *
341
+ * @return null|string
342
+ */
343
+ public function shouldExportOutOfStock($storeId = 0)
344
+ {
345
+ return $this->getExportConfigValue(self::OUT_OF_STOCK_PRODUCTS, $storeId);
346
+ }
347
+
348
+
349
  }
app/code/community/FACTFinder/Core/Model/Export/Product.php CHANGED
@@ -23,7 +23,7 @@
23
  * @license https://opensource.org/licenses/MIT The MIT License (MIT)
24
  * @link http://www.flagbit.de
25
  */
26
- class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Resource_Fulltext
27
  {
28
 
29
  const FILENAME_PATTERN = 'store_%s_product.csv';
@@ -90,6 +90,22 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
90
  'numerical_attributes',
91
  );
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
  /**
95
  * Add row to csv
@@ -128,7 +144,7 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
128
  */
129
  public function getExportDirectory()
130
  {
131
- return Mage::helper('factfinder/export')->getExportDirectory();
132
  }
133
 
134
 
@@ -314,14 +330,14 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
314
  $dynamicFields = $this->_getDynamicFields();
315
 
316
  // status and visibility filter
317
- $visibility = $this->_getSearchableAttribute('visibility');
318
- $status = $this->_getSearchableAttribute('status');
319
  $visibilityVals = Mage::getSingleton('catalog/product_visibility')->getVisibleInSearchIds();
320
  $statusVals = Mage::getSingleton('catalog/product_status')->getVisibleStatusIds();
321
 
322
  $lastProductId = 0;
323
  while (true) {
324
- $products = $this->_getSearchableProducts($storeId, $staticFields, null, $lastProductId);
325
  if (!$products) {
326
  break;
327
  }
@@ -331,7 +347,8 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
331
  foreach ($products as $productData) {
332
  $lastProductId = $productData['entity_id'];
333
  $productAttributes[$productData['entity_id']] = $productData['entity_id'];
334
- $productChildren = $this->_getProductChildIds($productData['entity_id'], $productData['type_id']);
 
335
  $productRelations[$productData['entity_id']] = $productChildren;
336
  if ($productChildren) {
337
  foreach ($productChildren as $productChild) {
@@ -340,7 +357,8 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
340
  }
341
  }
342
 
343
- $productAttributes = $this->_getProductAttributes($storeId, array_keys($productAttributes), $dynamicFields);
 
344
  foreach ($products as $productData) {
345
  if (!isset($productAttributes[$productData['entity_id']])) {
346
  continue;
@@ -396,7 +414,7 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
396
  $this->_formatAttributes('searchable', $productAttr, $storeId),
397
  $this->_formatAttributes('numerical', $productAttr, $storeId),
398
  );
399
- if ($this->_getIfExportImageAndDeeplink($storeId)) {
400
  //dont need to add image and deeplink to child product, just add empty values
401
  $subProductIndex[] = '';
402
  $subProductIndex[] = '';
@@ -528,79 +546,6 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
528
  }
529
 
530
 
531
- /**
532
- * Retrieve Searchable attributes
533
- *
534
- * @param string $backendType
535
- * @param string $type possible Types: system, sortable, filterable, searchable
536
- * @param int $storeId
537
- *
538
- * @return array
539
- */
540
- protected function _getSearchableAttributes($backendType = null, $type = null, $storeId = null)
541
- {
542
- if ($this->_searchableAttributes === null) {
543
- $this->_searchableAttributes = array();
544
- $entityType = $this->getEavConfig()->getEntityType('catalog_product');
545
- $entity = $entityType->getEntity();
546
-
547
- $userDefinedAttributes = array_keys(Mage::helper('factfinder/backend')
548
- ->unserializeFieldValue(Mage::getStoreConfig('factfinder/export/attributes', $storeId)));
549
-
550
- $whereCond = array(
551
- $this->_getWriteAdapter()->quoteInto('additional_table.is_searchable=?', 1),
552
- $this->_getWriteAdapter()->quoteInto('additional_table.is_filterable=?', 1),
553
- $this->_getWriteAdapter()->quoteInto('additional_table.used_for_sort_by=?', 1),
554
- $this->_getWriteAdapter()->quoteInto(
555
- 'main_table.attribute_code IN(?)',
556
- array_merge(array('status', 'visibility'), $userDefinedAttributes)
557
- )
558
- );
559
-
560
- $select = $this->_getWriteAdapter()->select()
561
- ->from(array('main_table' => $this->getTable('eav/attribute')))
562
- ->join(
563
- array('additional_table' => $this->getTable('catalog/eav_attribute')),
564
- 'additional_table.attribute_id = main_table.attribute_id'
565
- )
566
- ->where('main_table.entity_type_id=?', $entityType->getEntityTypeId())
567
- ->where(join(' OR ', $whereCond))
568
- ->order('main_table.attribute_id', 'asc');
569
-
570
- $attributesData = $this->_getWriteAdapter()->fetchAll($select);
571
- $this->getEavConfig()->importAttributesData($entityType, $attributesData);
572
-
573
- foreach ($attributesData as $attributeData) {
574
- $attributeCode = $attributeData['attribute_code'];
575
- $attribute = $this->getEavConfig()->getAttribute($entityType, $attributeCode);
576
- $attribute->setEntity($entity);
577
- $this->_searchableAttributes[$attribute->getId()] = $attribute;
578
- }
579
- }
580
-
581
- if ($type !== null || $backendType !== null) {
582
- $attributes = array();
583
- foreach ($this->_searchableAttributes as $attribute) {
584
- if ($backendType !== null
585
- && $attribute->getBackendType() != $backendType
586
- ) {
587
- continue;
588
- }
589
-
590
- if ($this->_checkIfSkipAttribute($attribute, $type)) {
591
- continue;
592
- }
593
-
594
- $attributes[$attribute->getId()] = $attribute;
595
- }
596
-
597
- return $attributes;
598
- }
599
-
600
- return $this->_searchableAttributes;
601
- }
602
-
603
-
604
  /**
605
  * Get Category Path by Product ID
606
  *
@@ -613,11 +558,11 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
613
  {
614
 
615
  if ($this->_categoryNames === null) {
616
- $this->_loadCategoryNames($storeId);
617
  }
618
 
619
  if ($this->_productsToCategoryPath === null) {
620
- $this->_loadCategoryPaths($storeId);
621
  }
622
 
623
  $value = '';
@@ -647,43 +592,6 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
647
  }
648
 
649
 
650
- /**
651
- * Return all product children ids
652
- *
653
- * @param int $productId Product Entity Id
654
- * @param string $typeId Super Product Link Type
655
- *
656
- * @return array
657
- */
658
- protected function _getProductChildIds($productId, $typeId)
659
- {
660
- $typeInstance = $this->_getProductTypeInstance($typeId);
661
- $relation = $typeInstance->isComposite()
662
- ? $typeInstance->getRelationInfo()
663
- : false;
664
-
665
- if ($relation && $relation->getTable() && $relation->getParentFieldName() && $relation->getChildFieldName()) {
666
- $select = $this->_getReadAdapter()->select()
667
- ->from(
668
- array('main' => $this->getTable($relation->getTable())),
669
- array($relation->getChildFieldName()))
670
- ->join(
671
- array('e' => $this->getTable('catalog/product')),
672
- 'main.' . $relation->getChildFieldName() . '=e.entity_id',
673
- array('entity_id', 'type_id', 'sku')
674
- )
675
- ->where("{$relation->getParentFieldName()}=?", $productId);
676
- if ($relation->getWhere() !== null) {
677
- $select->where($relation->getWhere());
678
- }
679
-
680
- return $this->_getReadAdapter()->fetchAll($select);
681
- }
682
-
683
- return null;
684
- }
685
-
686
-
687
  /**
688
  * Retrieve attribute source value for search
689
  * This method is mostly copied from Mage_CatalogSearch_Model_Resource_Fulltext,
@@ -697,7 +605,7 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
697
  */
698
  protected function _getAttributeValue($attributeId, $value, $storeId)
699
  {
700
- $attribute = $this->_getSearchableAttribute($attributeId);
701
  if (!$attribute->getIsSearchable() && $attribute->getAttributeCode() == 'visibility') {
702
  return $value;
703
  }
@@ -882,53 +790,26 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
882
  */
883
  protected function _exportImageAndDeepLink($productIndex, $productData, $storeId)
884
  {
885
- if ($this->_getIfExportImageAndDeeplink($storeId)) {
886
- $baseAdminUrl = Mage::app()->getStore()->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
887
- if ($storeId !== null) {
888
- $currentBaseUrl = Mage::app()->getStore($storeId)->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
889
- }
890
-
891
- $imageType = Mage::getStoreConfig('factfinder/export/suggest_image_type', $storeId);
892
- $imageSize = Mage::getStoreConfig('factfinder/export/suggest_image_size', $storeId);
893
-
894
- $product = Mage::getModel('catalog/product');
895
- $product->setStoreId($storeId);
896
- $product->load($productData['entity_id']);
897
 
898
- $image = $this->_imageHelper->init($product, $imageType);
899
- if (isset($imageSize) && $imageSize > 0) {
900
- $image->resize($imageSize);
901
- }
902
-
903
- $image = (string) $image;
904
 
905
- if ($storeId !== null) {
906
- $image = str_replace($baseAdminUrl, $currentBaseUrl, $image);
907
- }
908
 
909
- $productIndex[] = $image;
910
- $productIndex[] = $product->getProductUrl();
911
 
912
- $product->clearInstance();
913
- }
914
 
915
  return $productIndex;
916
  }
917
 
918
 
919
- /**
920
- * Check of image and deep links should be exported
921
- *
922
- * @param int $storeId
923
- *
924
- * @return bool
925
- */
926
- protected function _getIfExportImageAndDeeplink($storeId)
927
- {
928
- return Mage::getStoreConfigFlag('factfinder/export/urls', $storeId);
929
- }
930
-
931
-
932
  /**
933
  * Get array of dynamic fields to use in csv
934
  *
@@ -1008,102 +889,111 @@ class FACTFinder_Core_Model_Export_Product extends Mage_CatalogSearch_Model_Reso
1008
 
1009
 
1010
  /**
1011
- * Load category names to cache variable
1012
  *
1013
- * @param int $storeId
1014
- *
1015
- * @return $this
1016
  */
1017
- protected function _loadCategoryNames($storeId)
1018
  {
1019
- $nameAttribute = $this->_getCategoryNameAttribute();
1020
- $statusAttribute = $this->_getCategoryStatusAttribute();
1021
-
1022
- $select = $this->_getReadAdapter()->select()
1023
- ->from(
1024
- array('main' => $nameAttribute->getBackendTable()),
1025
- array('entity_id', 'value')
1026
- )
1027
- ->join(
1028
- array('e' => $statusAttribute->getBackendTable()),
1029
- 'main.entity_id=e.entity_id AND (e.store_id = 0 OR e.store_id = ' . $storeId
1030
- . ') AND e.attribute_id=' . $statusAttribute->getAttributeId(),
1031
- null
1032
- )
1033
- ->where('main.attribute_id=?', $nameAttribute->getAttributeId())
1034
- ->where('e.value=?', '1')
1035
- ->where('main.store_id = 0 OR main.store_id = ?', $storeId);
1036
-
1037
- $this->_categoryNames = $this->_getReadAdapter()->fetchPairs($select);
1038
-
1039
- return $this;
1040
  }
1041
 
1042
 
1043
  /**
1044
- * Get category name attribute model
1045
  *
1046
- * @return mixed
 
 
 
1047
  */
1048
- protected function _getCategoryNameAttribute()
1049
  {
1050
- $categoryAttributeCollection = Mage::getResourceModel('catalog/category_attribute_collection');
1051
- $categoryAttributeCollection->addFieldToFilter('attribute_code', array('eq' => 'name'))
1052
- ->getSelect()->limit(1);
 
 
 
 
1053
 
1054
- return $categoryAttributeCollection->getFirstItem();
1055
  }
1056
 
1057
 
1058
  /**
1059
- * Get category status attribute model (is_active)
1060
  *
1061
- * @return mixed
 
 
 
1062
  */
1063
- protected function _getCategoryStatusAttribute()
1064
  {
1065
- $categoryAttributeCollection = Mage::getResourceModel('catalog/category_attribute_collection');
1066
- $categoryAttributeCollection->addFieldToFilter('attribute_code', array('eq' => 'is_active'))
1067
- ->getSelect()->limit(1);
1068
 
1069
- return $categoryAttributeCollection->getFirstItem();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1070
  }
1071
 
1072
 
1073
  /**
1074
- * Load products to category paths
1075
  *
1076
- * @param int $storeId
 
 
1077
  *
1078
- * @return $this
1079
  */
1080
- protected function _loadCategoryPaths($storeId)
1081
  {
1082
- $select = $this->_getReadAdapter()->select()
1083
- ->from(
1084
- array('main' => $this->getTable('catalog/category_product_index')),
1085
- array('product_id')
1086
- )
1087
- ->join(
1088
- array('e' => $this->getTable('catalog/category')),
1089
- 'main.category_id=e.entity_id',
1090
- null
1091
- )
1092
- ->columns(array('e.path' => new Zend_Db_Expr('GROUP_CONCAT(e.path)')))
1093
- ->where(
1094
- 'main.visibility IN(?)',
1095
- array(
1096
- Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH,
1097
- Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH
1098
- )
1099
- )
1100
- ->where('main.store_id = ?', $storeId)
1101
- ->where('e.path LIKE \'1/' . Mage::app()->getStore($storeId)->getRootCategoryId() . '/%\'')
1102
- ->group('main.product_id');
1103
-
1104
- $this->_productsToCategoryPath = $this->_getReadAdapter()->fetchPairs($select);
1105
 
1106
- return $this;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1107
  }
1108
 
1109
 
23
  * @license https://opensource.org/licenses/MIT The MIT License (MIT)
24
  * @link http://www.flagbit.de
25
  */
26
+ class FACTFinder_Core_Model_Export_Product extends Mage_Core_Model_Abstract
27
  {
28
 
29
  const FILENAME_PATTERN = 'store_%s_product.csv';
90
  'numerical_attributes',
91
  );
92
 
93
+ /**
94
+ * @var
95
+ */
96
+ protected $_engine;
97
+
98
+
99
+ /**
100
+ * Init resource model
101
+ *
102
+ */
103
+ protected function _construct()
104
+ {
105
+ $this->_init('factfinder/export');
106
+ $this->_engine = Mage::helper('catalogsearch')->getEngine();
107
+ }
108
+
109
 
110
  /**
111
  * Add row to csv
144
  */
145
  public function getExportDirectory()
146
  {
147
+ return $this->getHelper()->getExportDirectory();
148
  }
149
 
150
 
330
  $dynamicFields = $this->_getDynamicFields();
331
 
332
  // status and visibility filter
333
+ $visibility = $this->getResource()->getSearchableAttribute('visibility');
334
+ $status = $this->getResource()->getSearchableAttribute('status');
335
  $visibilityVals = Mage::getSingleton('catalog/product_visibility')->getVisibleInSearchIds();
336
  $statusVals = Mage::getSingleton('catalog/product_status')->getVisibleStatusIds();
337
 
338
  $lastProductId = 0;
339
  while (true) {
340
+ $products = $this->getResource()->getSearchableProducts($storeId, $staticFields, $lastProductId);
341
  if (!$products) {
342
  break;
343
  }
347
  foreach ($products as $productData) {
348
  $lastProductId = $productData['entity_id'];
349
  $productAttributes[$productData['entity_id']] = $productData['entity_id'];
350
+ $productChildren = $this->getResource()
351
+ ->getProductChildIds($productData['entity_id'], $productData['type_id']);
352
  $productRelations[$productData['entity_id']] = $productChildren;
353
  if ($productChildren) {
354
  foreach ($productChildren as $productChild) {
357
  }
358
  }
359
 
360
+ $productAttributes = $this->getResource()
361
+ ->getProductAttributes($storeId, array_keys($productAttributes), $dynamicFields);
362
  foreach ($products as $productData) {
363
  if (!isset($productAttributes[$productData['entity_id']])) {
364
  continue;
414
  $this->_formatAttributes('searchable', $productAttr, $storeId),
415
  $this->_formatAttributes('numerical', $productAttr, $storeId),
416
  );
417
+ if ($this->getHelper()->shouldExportImagesAndDeeplinks($storeId)) {
418
  //dont need to add image and deeplink to child product, just add empty values
419
  $subProductIndex[] = '';
420
  $subProductIndex[] = '';
546
  }
547
 
548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
  /**
550
  * Get Category Path by Product ID
551
  *
558
  {
559
 
560
  if ($this->_categoryNames === null) {
561
+ $this->_categoryNames = $this->getResource()->getCategoryNames($storeId);
562
  }
563
 
564
  if ($this->_productsToCategoryPath === null) {
565
+ $this->_productsToCategoryPath = $this->getResource()->getCategoryPaths($storeId);
566
  }
567
 
568
  $value = '';
592
  }
593
 
594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
595
  /**
596
  * Retrieve attribute source value for search
597
  * This method is mostly copied from Mage_CatalogSearch_Model_Resource_Fulltext,
605
  */
606
  protected function _getAttributeValue($attributeId, $value, $storeId)
607
  {
608
+ $attribute = $this->getResource()->getSearchableAttribute($attributeId);
609
  if (!$attribute->getIsSearchable() && $attribute->getAttributeCode() == 'visibility') {
610
  return $value;
611
  }
790
  */
791
  protected function _exportImageAndDeepLink($productIndex, $productData, $storeId)
792
  {
793
+ $helper = $this->getHelper();
 
 
 
 
 
 
 
 
 
 
 
794
 
795
+ if (!$helper->shouldExportImagesAndDeeplinks($storeId)) {
796
+ return $productIndex;
797
+ }
 
 
 
798
 
799
+ // emulate store
800
+ $oldStore = Mage::app()->getStore()->getId();
801
+ Mage::app()->setCurrentStore($storeId);
802
 
803
+ $productIndex[] = $this->getProductImageUrl($productData['entity_id'], $storeId);
804
+ $productIndex[] = $this->getProductUrl($productData['entity_id'], $storeId);
805
 
806
+ // finish emulation
807
+ Mage::app()->setCurrentStore($oldStore);
808
 
809
  return $productIndex;
810
  }
811
 
812
 
 
 
 
 
 
 
 
 
 
 
 
 
 
813
  /**
814
  * Get array of dynamic fields to use in csv
815
  *
889
 
890
 
891
  /**
892
+ * Get export helper
893
  *
894
+ * @return FACTFinder_Core_Helper_Export
 
 
895
  */
896
+ protected function getHelper()
897
  {
898
+ return Mage::helper('factfinder/export');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
899
  }
900
 
901
 
902
  /**
903
+ * Gte product URL for store
904
  *
905
+ * @param int $productId
906
+ * @param int $storeId
907
+ *
908
+ * @return string
909
  */
910
+ protected function getProductUrl($productId, $storeId)
911
  {
912
+ $productUrl = Mage::getModel('catalog/product')
913
+ ->getCollection()
914
+ ->addAttributeToFilter('entity_id', $productId)
915
+ ->setStoreId($storeId)
916
+ ->addUrlRewrite()
917
+ ->getFirstItem()
918
+ ->getProductUrl();
919
 
920
+ return $productUrl;
921
  }
922
 
923
 
924
  /**
925
+ * Get image URL for product
926
  *
927
+ * @param int $productId
928
+ * @param int $storeId
929
+ *
930
+ * @return string
931
  */
932
+ protected function getProductImageUrl($productId, $storeId)
933
  {
934
+ $helper = $this->getHelper();
 
 
935
 
936
+ $imageType = $helper->getExportImageType();
937
+ $imageBaseFile = Mage::getResourceSingleton('catalog/product')
938
+ ->getAttributeRawValue($productId, $imageType, $storeId);
939
+
940
+ /** @var Mage_Catalog_Model_Product_Image $imageModel */
941
+ $imageModel = Mage::getModel('catalog/product_image');
942
+
943
+ // if size was set
944
+ if ($helper->getExportImageWidth($storeId)) {
945
+ $imageModel
946
+ ->setWidth($helper->getExportImageWidth($storeId))
947
+ ->setHeight($helper->getExportImageHeight($storeId));
948
+ }
949
+
950
+ $imageModel
951
+ ->setDestinationSubdir($imageType)
952
+ ->setBaseFile($imageBaseFile);
953
+
954
+ // if no cache image was generated we should create one
955
+ if (!$imageModel->isCached()) {
956
+ $imageModel
957
+ ->resize()
958
+ ->saveFile();
959
+ }
960
+
961
+ return $imageModel->getUrl();
962
  }
963
 
964
 
965
  /**
966
+ * Get searchable attributes by type
967
  *
968
+ * @param null $backendType Backend type of the attributes
969
+ * @param string $type Possible Types: system, sortable, filterable, searchable
970
+ * @param int $storeId
971
  *
972
+ * @return array
973
  */
974
+ protected function _getSearchableAttributes($backendType = null, $type = null, $storeId = 0)
975
  {
976
+ $attributes = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
977
 
978
+ if ($type !== null || $backendType !== null) {
979
+ foreach ($this->getResource()->getSearchableAttributes($storeId) as $attribute) {
980
+ if ($backendType !== null
981
+ && $attribute->getBackendType() != $backendType
982
+ ) {
983
+ continue;
984
+ }
985
+
986
+ if ($this->_checkIfSkipAttribute($attribute, $type)) {
987
+ continue;
988
+ }
989
+
990
+ $attributes[$attribute->getId()] = $attribute;
991
+ }
992
+ } else {
993
+ $attributes = $this->getResource()->getSearchableAttributes($storeId);
994
+ }
995
+
996
+ return $attributes;
997
  }
998
 
999
 
app/code/community/FACTFinder/Core/Model/Facade.php CHANGED
@@ -619,26 +619,6 @@ class FACTFinder_Core_Model_Facade
619
  }
620
 
621
 
622
- /**
623
- * Create a new results object
624
- *
625
- * @param array $records
626
- * @param string $refKey
627
- * @param int $foundRecordsCount
628
- *
629
- * @return \FACTFinder\Data\Result
630
- */
631
- public function getNewResultObject($records, $refKey, $foundRecordsCount)
632
- {
633
- return FF::getInstance(
634
- 'Data\Result',
635
- $records,
636
- $refKey,
637
- $foundRecordsCount
638
- );
639
- }
640
-
641
-
642
  /**
643
  * Get paging object (collection)
644
  *
619
  }
620
 
621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
622
  /**
623
  * Get paging object (collection)
624
  *
app/code/community/FACTFinder/Core/Model/Handler/Search.php CHANGED
@@ -28,6 +28,9 @@ class FACTFinder_Core_Model_Handler_Search extends FACTFinder_Core_Model_Handler
28
  {
29
 
30
  const SEARCH_STATUS_REGISTRY_KEY = 'ff_search_status';
 
 
 
31
 
32
  protected $_searchResult;
33
  protected $_searchResultCount;
@@ -182,7 +185,9 @@ class FACTFinder_Core_Model_Handler_Search extends FACTFinder_Core_Model_Handler
182
  array(
183
  'similarity' => $record->getSimilarity(),
184
  'position' => $record->getPosition(),
185
- 'original_position' => $record->getField('__ORIG_POSITION__')
 
 
186
  )
187
  );
188
  }
28
  {
29
 
30
  const SEARCH_STATUS_REGISTRY_KEY = 'ff_search_status';
31
+ const ORIGINAL_POSITION_FIELD = '__ORIG_POSITION__';
32
+ const CAMPAIGN_NAME_FIELD = '__FFCampaign__';
33
+ const INSTOREADS_PRODUCT_FIELD = '__FFInstoreAds__';
34
 
35
  protected $_searchResult;
36
  protected $_searchResultCount;
185
  array(
186
  'similarity' => $record->getSimilarity(),
187
  'position' => $record->getPosition(),
188
+ 'original_position' => $record->getField(self::ORIGINAL_POSITION_FIELD),
189
+ 'campaign' => $record->getField(self::CAMPAIGN_NAME_FIELD),
190
+ 'instore_ads' => $record->getField(self::INSTOREADS_PRODUCT_FIELD)
191
  )
192
  );
193
  }
app/code/community/FACTFinder/Core/Model/Resource/Export.php ADDED
@@ -0,0 +1,302 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * FACTFinder_Core
4
+ *
5
+ * @category Mage
6
+ * @package FACTFinder_Core
7
+ * @author Flagbit Magento Team <magento@flagbit.de>
8
+ * @copyright Copyright (c) 2016 Flagbit GmbH & Co. KG
9
+ * @license https://opensource.org/licenses/MIT The MIT License (MIT)
10
+ * @link http://www.flagbit.de
11
+ *
12
+ */
13
+
14
+ /**
15
+ * Model class
16
+ *
17
+ * This class provides db access to the export model
18
+ *
19
+ * @category Mage
20
+ * @package FACTFinder_Core
21
+ * @author Flagbit Magento Team <magento@flagbit.de>
22
+ * @copyright Copyright (c) 2016 Flagbit GmbH & Co. KG (http://www.flagbit.de)
23
+ * @license https://opensource.org/licenses/MIT The MIT License (MIT)
24
+ * @link http://www.flagbit.de
25
+ */
26
+ class FACTFinder_Core_Model_Resource_Export extends Mage_CatalogSearch_Model_Resource_Fulltext
27
+ {
28
+
29
+
30
+ /**
31
+ * Retrieve searchable products per store
32
+ *
33
+ * @param int $storeId
34
+ * @param array $staticFields
35
+ * @param int $lastProductId
36
+ * @param int $limit
37
+ *
38
+ * @return array
39
+ */
40
+ public function getSearchableProducts($storeId, array $staticFields, $lastProductId = 0, $limit = 100)
41
+ {
42
+ $websiteId = Mage::app()->getStore($storeId)->getWebsiteId();
43
+ $readConnection = $this->getReadConnection();
44
+
45
+ $select = $readConnection->select()
46
+ ->useStraightJoin(true)
47
+ ->from(
48
+ array('e' => $this->getTable('catalog/product')),
49
+ array_merge(array('entity_id', 'type_id'), $staticFields)
50
+ )
51
+ ->join(
52
+ array('website' => $this->getTable('catalog/product_website')),
53
+ $readConnection->quoteInto(
54
+ 'website.product_id=e.entity_id AND website.website_id=?',
55
+ $websiteId
56
+ ),
57
+ array()
58
+ )
59
+ ->join(
60
+ array('stock_status' => $this->getTable('cataloginventory/stock_status')),
61
+ $readConnection->quoteInto(
62
+ 'stock_status.product_id=e.entity_id AND stock_status.website_id=?',
63
+ $websiteId
64
+ ),
65
+ array('in_stock' => 'stock_status')
66
+ );
67
+
68
+ $select->where('e.entity_id>?', $lastProductId)
69
+ ->limit($limit)
70
+ ->order('e.entity_id');
71
+
72
+ if (!Mage::helper('factfinder/export')->shouldExportOutOfStock($storeId)) {
73
+ Mage::getSingleton('cataloginventory/stock_status')
74
+ ->prepareCatalogProductIndexSelect(
75
+ $select,
76
+ new Zend_Db_Expr('e.entity_id'),
77
+ new Zend_Db_Expr('website.website_id')
78
+ );
79
+ }
80
+
81
+ $result = $readConnection->fetchAll($select);
82
+
83
+ return $result;
84
+ }
85
+
86
+
87
+ /**
88
+ * Retrieve Searchable attributes
89
+ *
90
+ * @param int $storeId
91
+ *
92
+ * @return array
93
+ */
94
+ public function getSearchableAttributes($storeId = null)
95
+ {
96
+ if ($this->_searchableAttributes === null) {
97
+ $this->_searchableAttributes = array();
98
+ $entityType = $this->getEavConfig()->getEntityType('catalog_product');
99
+ $entity = $entityType->getEntity();
100
+
101
+ $userDefinedAttributes = Mage::getStoreConfig('factfinder/export/attributes', $storeId);
102
+ $userDefinedAttributes = array_keys(
103
+ Mage::helper('factfinder/backend')->unserializeFieldValue($userDefinedAttributes)
104
+ );
105
+
106
+ $whereCond = array(
107
+ $this->_getWriteAdapter()->quoteInto('additional_table.is_searchable=?', 1),
108
+ $this->_getWriteAdapter()->quoteInto('additional_table.is_filterable=?', 1),
109
+ $this->_getWriteAdapter()->quoteInto('additional_table.used_for_sort_by=?', 1),
110
+ $this->_getWriteAdapter()->quoteInto(
111
+ 'main_table.attribute_code IN(?)',
112
+ array_merge(array('status', 'visibility'), $userDefinedAttributes)
113
+ )
114
+ );
115
+
116
+ $select = $this->_getWriteAdapter()->select()
117
+ ->from(array('main_table' => $this->getTable('eav/attribute')))
118
+ ->join(
119
+ array('additional_table' => $this->getTable('catalog/eav_attribute')),
120
+ 'additional_table.attribute_id = main_table.attribute_id'
121
+ )
122
+ ->where('main_table.entity_type_id=?', $entityType->getEntityTypeId())
123
+ ->where(join(' OR ', $whereCond))
124
+ ->order('main_table.attribute_id', 'asc');
125
+
126
+ $attributesData = $this->_getWriteAdapter()->fetchAll($select);
127
+ $this->getEavConfig()->importAttributesData($entityType, $attributesData);
128
+
129
+ foreach ($attributesData as $attributeData) {
130
+ $attributeCode = $attributeData['attribute_code'];
131
+ $attribute = $this->getEavConfig()->getAttribute($entityType, $attributeCode);
132
+ $attribute->setEntity($entity);
133
+ $this->_searchableAttributes[$attribute->getId()] = $attribute;
134
+ }
135
+ }
136
+
137
+ return $this->_searchableAttributes;
138
+ }
139
+
140
+
141
+ /**
142
+ * Get products to category paths
143
+ *
144
+ * @param int $storeId
145
+ *
146
+ * @return array
147
+ */
148
+ public function getCategoryPaths($storeId)
149
+ {
150
+ $select = $this->_getReadAdapter()->select()
151
+ ->from(
152
+ array('main' => $this->getTable('catalog/category_product_index')),
153
+ array('product_id')
154
+ )
155
+ ->join(
156
+ array('e' => $this->getTable('catalog/category')),
157
+ 'main.category_id=e.entity_id',
158
+ null
159
+ )
160
+ ->columns(array('e.path' => new Zend_Db_Expr('GROUP_CONCAT(e.path)')))
161
+ ->where(
162
+ 'main.visibility IN(?)',
163
+ array(
164
+ Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH,
165
+ Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH
166
+ )
167
+ )
168
+ ->where('main.store_id = ?', $storeId)
169
+ ->where('e.path LIKE \'1/' . Mage::app()->getStore($storeId)->getRootCategoryId() . '/%\'')
170
+ ->group('main.product_id');
171
+
172
+ return $this->_getReadAdapter()->fetchPairs($select);
173
+ }
174
+
175
+
176
+ /**
177
+ * Get category names
178
+ *
179
+ * @param int $storeId
180
+ *
181
+ * @return $this
182
+ */
183
+ public function getCategoryNames($storeId)
184
+ {
185
+ $nameAttribute = $this->_getCategoryNameAttribute();
186
+ $statusAttribute = $this->_getCategoryStatusAttribute();
187
+
188
+ $select = $this->_getReadAdapter()->select()
189
+ ->from(
190
+ array('main' => $nameAttribute->getBackendTable()),
191
+ array('entity_id', 'value')
192
+ )
193
+ ->join(
194
+ array('e' => $statusAttribute->getBackendTable()),
195
+ 'main.entity_id=e.entity_id AND (e.store_id = 0 OR e.store_id = ' . $storeId
196
+ . ') AND e.attribute_id=' . $statusAttribute->getAttributeId(),
197
+ null
198
+ )
199
+ ->where('main.attribute_id=?', $nameAttribute->getAttributeId())
200
+ ->where('e.value=?', '1')
201
+ ->where('main.store_id = 0 OR main.store_id = ?', $storeId);
202
+
203
+ return $this->_getReadAdapter()->fetchPairs($select);
204
+ }
205
+
206
+
207
+ /**
208
+ * Get category name attribute model
209
+ *
210
+ * @return mixed
211
+ */
212
+ protected function _getCategoryNameAttribute()
213
+ {
214
+ $categoryAttributeCollection = Mage::getResourceModel('catalog/category_attribute_collection');
215
+ $categoryAttributeCollection->addFieldToFilter('attribute_code', array('eq' => 'name'))
216
+ ->getSelect()->limit(1);
217
+
218
+ return $categoryAttributeCollection->getFirstItem();
219
+ }
220
+
221
+
222
+ /**
223
+ * Get category status attribute model (is_active)
224
+ *
225
+ * @return mixed
226
+ */
227
+ protected function _getCategoryStatusAttribute()
228
+ {
229
+ $categoryAttributeCollection = Mage::getResourceModel('catalog/category_attribute_collection');
230
+ $categoryAttributeCollection->addFieldToFilter('attribute_code', array('eq' => 'is_active'))
231
+ ->getSelect()->limit(1);
232
+
233
+ return $categoryAttributeCollection->getFirstItem();
234
+ }
235
+
236
+
237
+ /**
238
+ * Return all product children ids
239
+ *
240
+ * @param int $productId Product Entity Id
241
+ * @param string $typeId Super Product Link Type
242
+ *
243
+ * @return array
244
+ */
245
+ public function getProductChildIds($productId, $typeId)
246
+ {
247
+ $typeInstance = $this->_getProductTypeInstance($typeId);
248
+ $relation = $typeInstance->isComposite()
249
+ ? $typeInstance->getRelationInfo()
250
+ : false;
251
+
252
+ if ($relation && $relation->getTable() && $relation->getParentFieldName() && $relation->getChildFieldName()) {
253
+ $select = $this->_getReadAdapter()->select()
254
+ ->from(
255
+ array('main' => $this->getTable($relation->getTable())),
256
+ array($relation->getChildFieldName()))
257
+ ->join(
258
+ array('e' => $this->getTable('catalog/product')),
259
+ 'main.' . $relation->getChildFieldName() . '=e.entity_id',
260
+ array('entity_id', 'type_id', 'sku')
261
+ )
262
+ ->where("{$relation->getParentFieldName()}=?", $productId);
263
+ if ($relation->getWhere() !== null) {
264
+ $select->where($relation->getWhere());
265
+ }
266
+
267
+ return $this->_getReadAdapter()->fetchAll($select);
268
+ }
269
+
270
+ return null;
271
+ }
272
+
273
+
274
+ /**
275
+ * Retrieve searchable attribute by Id or code
276
+ *
277
+ * @param int|string $attribute
278
+ *
279
+ * @return Mage_Eav_Model_Entity_Attribute
280
+ */
281
+ public function getSearchableAttribute($attribute)
282
+ {
283
+ return $this->_getSearchableAttribute($attribute);
284
+ }
285
+
286
+
287
+ /**
288
+ * Load product(s) attributes
289
+ *
290
+ * @param int $storeId
291
+ * @param array $productIds
292
+ * @param array $attributeTypes
293
+ *
294
+ * @return array
295
+ */
296
+ public function getProductAttributes($storeId, array $productIds, array $attributeTypes)
297
+ {
298
+ return $this->_getProductAttributes($storeId, $productIds, $attributeTypes);
299
+ }
300
+
301
+
302
+ }
app/code/community/FACTFinder/Core/etc/system.xml CHANGED
@@ -189,11 +189,20 @@
189
  <label>Export products without categories</label>
190
  <frontend_type>select</frontend_type>
191
  <source_model>adminhtml/system_config_source_yesno</source_model>
192
- <sort_order>11</sort_order>
193
  <show_in_default>1</show_in_default>
194
  <show_in_website>1</show_in_website>
195
  <show_in_store>1</show_in_store>
196
  </products_without_categories>
 
 
 
 
 
 
 
 
 
197
  <remove_tags translate="label">
198
  <label>Remove html entities and tags</label>
199
  <frontend_type>select</frontend_type>
189
  <label>Export products without categories</label>
190
  <frontend_type>select</frontend_type>
191
  <source_model>adminhtml/system_config_source_yesno</source_model>
192
+ <sort_order>10</sort_order>
193
  <show_in_default>1</show_in_default>
194
  <show_in_website>1</show_in_website>
195
  <show_in_store>1</show_in_store>
196
  </products_without_categories>
197
+ <out_of_stock_products>
198
+ <label>Export out of stock products</label>
199
+ <frontend_type>select</frontend_type>
200
+ <source_model>adminhtml/system_config_source_yesno</source_model>
201
+ <sort_order>15</sort_order>
202
+ <show_in_default>1</show_in_default>
203
+ <show_in_website>1</show_in_website>
204
+ <show_in_store>1</show_in_store>
205
+ </out_of_stock_products>
206
  <remove_tags translate="label">
207
  <label>Remove html entities and tags</label>
208
  <frontend_type>select</frontend_type>
app/code/community/FACTFinder/Recommendation/Helper/Data.php CHANGED
@@ -57,7 +57,9 @@ class FACTFinder_Recommendation_Helper_Data extends Mage_Core_Helper_Abstract
57
  {
58
  $exportHelper = Mage::helper('factfinder/export');
59
  $channel = Mage::helper('factfinder')->getPrimaryChannel($storeId);
 
60
  $facade = Mage::getModel('factfinder_recommendation/facade');
 
61
  $download = !$exportHelper->useFtp($storeId);
62
  $delay = $exportHelper->getImportDelay(self::IMPORT_TYPE);
63
 
57
  {
58
  $exportHelper = Mage::helper('factfinder/export');
59
  $channel = Mage::helper('factfinder')->getPrimaryChannel($storeId);
60
+ /** @var FACTFinder_Recommendation_Model_Facade $facade */
61
  $facade = Mage::getModel('factfinder_recommendation/facade');
62
+ $facade->setStoreId($storeId);
63
  $download = !$exportHelper->useFtp($storeId);
64
  $delay = $exportHelper->getImportDelay(self::IMPORT_TYPE);
65
 
app/code/community/FACTFinder/Suggest/Helper/Data.php CHANGED
@@ -47,6 +47,9 @@ class FACTFinder_Suggest_Helper_Data extends Mage_Core_Helper_Abstract
47
  if (Mage::app()->getStore()->isCurrentlySecure()) {
48
  $url = preg_replace('/^http:/', 'https:', $url);
49
  }
 
 
 
50
  }
51
 
52
  // avoid specifying the default port for http
@@ -95,7 +98,9 @@ class FACTFinder_Suggest_Helper_Data extends Mage_Core_Helper_Abstract
95
  {
96
  $exportHelper = Mage::helper('factfinder/export');
97
  $channel = Mage::helper('factfinder')->getPrimaryChannel($storeId);
 
98
  $facade = Mage::getModel('factfinder_suggest/facade');
 
99
  $download = !$exportHelper->useFtp($storeId);
100
  $delay = $exportHelper->getImportDelay(self::IMPORT_TYPE);
101
 
@@ -112,4 +117,30 @@ class FACTFinder_Suggest_Helper_Data extends Mage_Core_Helper_Abstract
112
  }
113
 
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  }
47
  if (Mage::app()->getStore()->isCurrentlySecure()) {
48
  $url = preg_replace('/^http:/', 'https:', $url);
49
  }
50
+
51
+ // remove all parameters except for channel
52
+ $url = $this->removeUrlParams($url, array('channel'));
53
  }
54
 
55
  // avoid specifying the default port for http
98
  {
99
  $exportHelper = Mage::helper('factfinder/export');
100
  $channel = Mage::helper('factfinder')->getPrimaryChannel($storeId);
101
+ /** @var FACTFinder_Suggest_Model_Facade $facade */
102
  $facade = Mage::getModel('factfinder_suggest/facade');
103
+ $facade->setStoreId($storeId);
104
  $download = !$exportHelper->useFtp($storeId);
105
  $delay = $exportHelper->getImportDelay(self::IMPORT_TYPE);
106
 
117
  }
118
 
119
 
120
+ /**
121
+ * Remove all parameters from url except for specified
122
+ *
123
+ * @param string $url
124
+ * @param array $exclude
125
+ *
126
+ * @return string
127
+ */
128
+ protected function removeUrlParams($url, $exclude = array())
129
+ {
130
+ $excludeParams = array();
131
+
132
+ foreach ($exclude as $paramName) {
133
+ preg_match("/[&|?]{$paramName}=([^&]*)&?/", $url, $values);
134
+ if (isset($values[1])) {
135
+ $excludeParams[$paramName] = $values[1];
136
+ }
137
+ }
138
+
139
+ $url = array_shift(explode('?', $url));
140
+ $query = http_build_query($excludeParams);
141
+
142
+ return $url . '?' . $query;
143
+ }
144
+
145
+
146
  }
app/code/community/FACTFinder/Tracking/Block/Click.php CHANGED
@@ -56,6 +56,14 @@ class FACTFinder_Tracking_Block_Click extends FACTFinder_Tracking_Block_Abstract
56
  'title' => $product->getName()
57
  );
58
 
 
 
 
 
 
 
 
 
59
  return $data;
60
 
61
  }
56
  'title' => $product->getName()
57
  );
58
 
59
+ if ($product->getCampaign() !== null) {
60
+ $data['campaign'] = $product->getCampaign();
61
+ }
62
+
63
+ if ($product->getInstoreAds() !== null) {
64
+ $data['instoreAds'] = $product->getInstoreAds();
65
+ }
66
+
67
  return $data;
68
 
69
  }
app/design/frontend/base/default/template/factfinder/suggest/advancedsuggest.phtml CHANGED
@@ -38,13 +38,13 @@
38
  <?php if (Mage::helper('factfinder')->isEnabled('suggest')): ?>
39
  searchForm = new FactFinderSuggest(
40
  'search_mini_form', 'search',
41
- '<?php echo $this->__('Search entire store here...') ?>',
42
  <?php echo $this->getTranslationsAsJson(); ?>,
43
  '<?php echo Mage::getStoreConfig('factfinder/search/channel'); ?>'
44
  );
45
  <?php else: ?>
46
  searchForm = new Varien.searchForm('search_mini_form', 'search',
47
- '<?php echo $this->__('Search entire shop here...') ?>'
48
  );
49
  <?php endif; ?>
50
 
38
  <?php if (Mage::helper('factfinder')->isEnabled('suggest')): ?>
39
  searchForm = new FactFinderSuggest(
40
  'search_mini_form', 'search',
41
+ '<?php echo addslashes($this->__('Search entire store here...')); ?>',
42
  <?php echo $this->getTranslationsAsJson(); ?>,
43
  '<?php echo Mage::getStoreConfig('factfinder/search/channel'); ?>'
44
  );
45
  <?php else: ?>
46
  searchForm = new Varien.searchForm('search_mini_form', 'search',
47
+ '<?php echo addslashes($this->__('Search entire shop here...')); ?>'
48
  );
49
  <?php endif; ?>
50
 
app/locale/de_DE/FACTFinder_Suggest.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ "ff_searchTerm","Suchbegriffe"
2
+ "ff_category","Kategorien"
3
+ "ff_productName","Produkte"
4
+ "ff_brand","Marken"
app/locale/en_US/FACTFinder_Suggest.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ "ff_searchTerm","Searchterms"
2
+ "ff_category","Categories"
3
+ "ff_productName","Products"
4
+ "ff_brand","Brands"
lib/FACTFinder/Adapter/AbstractAdapter.php CHANGED
@@ -39,6 +39,11 @@ abstract class AbstractAdapter
39
  */
40
  protected $urlBuilder;
41
 
 
 
 
 
 
42
  /**
43
  * @var \FACTFinder\Util\ContentProcessorInterface
44
  */
39
  */
40
  protected $urlBuilder;
41
 
42
+ /**
43
+ * @var bool
44
+ */
45
+ protected $upToDate = false;
46
+
47
  /**
48
  * @var \FACTFinder\Util\ContentProcessorInterface
49
  */
lib/FACTFinder/Adapter/Compare.php CHANGED
@@ -3,7 +3,7 @@ namespace FACTFinder\Adapter;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
- class Compare extends AbstractAdapter
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
@@ -21,18 +21,6 @@ class Compare extends AbstractAdapter
21
  */
22
  private $comparedRecords;
23
 
24
- /**
25
- * @var bool
26
- */
27
- private $attributesUpToDate = false;
28
- private $recordsUpToDate = false;
29
-
30
- /**
31
- * @var bool
32
- */
33
- private $comparableAttributesOnly = false;
34
-
35
-
36
  public function __construct(
37
  $loggerClass,
38
  \FACTFinder\Core\ConfigurationInterface $configuration,
@@ -60,25 +48,7 @@ class Compare extends AbstractAdapter
60
  {
61
  $parameters = $this->request->getParameters();
62
  $parameters['ids'] = implode(';', $productIDs);
63
- $this->attributesUpToDate = false;
64
- $this->recordsUpToDate = false;
65
- }
66
-
67
- /**
68
- * Set this to true to only retrieve those attributes that have been used
69
- * for comparison instead of full Record objects.
70
- *
71
- * @param $comparableAttributesOnly bool
72
- */
73
- public function setComparableAttributesOnly($comparableAttributesOnly)
74
- {
75
- // Reset the compared products, if more detail is wanted than before
76
- if($this->comparableAttributesOnly && !$comparableAttributesOnly)
77
- $this->recordsUpToDate = false;
78
-
79
- $this->comparableAttributesOnly = $comparableAttributesOnly;
80
- $parameters = $this->request->getParameters();
81
- $parameters['idsOnly'] = $comparableAttributesOnly ? 'true' : 'false';
82
  }
83
 
84
  /**
@@ -92,10 +62,10 @@ class Compare extends AbstractAdapter
92
  public function getComparableAttributes()
93
  {
94
  if (is_null($this->comparableAttributes)
95
- || !$this->attributesUpToDate
96
  ) {
97
  $this->comparableAttributes = $this->createComparableAttributes();
98
- $this->attributesUpToDate = true;
99
  }
100
 
101
  return $this->comparableAttributes;
@@ -136,10 +106,10 @@ class Compare extends AbstractAdapter
136
  public function getComparedRecords()
137
  {
138
  if (is_null($this->comparedRecords)
139
- || !$this->recordsUpToDate
140
  ) {
141
  $this->comparedRecords = $this->createComparedRecords();
142
- $this->recordsUpToDate = true;
143
  }
144
 
145
  return $this->comparedRecords;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
+ class Compare extends ConfigurableResponse
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
21
  */
22
  private $comparedRecords;
23
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  public function __construct(
25
  $loggerClass,
26
  \FACTFinder\Core\ConfigurationInterface $configuration,
48
  {
49
  $parameters = $this->request->getParameters();
50
  $parameters['ids'] = implode(';', $productIDs);
51
+ $this->upToDate = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
 
54
  /**
62
  public function getComparableAttributes()
63
  {
64
  if (is_null($this->comparableAttributes)
65
+ || !$this->upToDate
66
  ) {
67
  $this->comparableAttributes = $this->createComparableAttributes();
68
+ $this->upToDate = true;
69
  }
70
 
71
  return $this->comparableAttributes;
106
  public function getComparedRecords()
107
  {
108
  if (is_null($this->comparedRecords)
109
+ || !$this->upToDate
110
  ) {
111
  $this->comparedRecords = $this->createComparedRecords();
112
+ $this->upToDate = true;
113
  }
114
 
115
  return $this->comparedRecords;
lib/FACTFinder/Adapter/ConfigurableResponse.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace FACTFinder\Adapter;
3
+
4
+ use FACTFinder\Loader as FF;
5
+
6
+ /**
7
+ * Base class for all adapters which support the response of records with ids only.
8
+ */
9
+ abstract class ConfigurableResponse extends AbstractAdapter
10
+ {
11
+ /**
12
+ * @var bool
13
+ */
14
+ protected $idsOnly = false;
15
+
16
+ /**
17
+ * @param string $loggerClass Class name of logger to use. The class should
18
+ * implement FACTFinder\Util\LoggerInterface.
19
+ * @param \FACTFinder\Core\ConfigurationInterface $configuration
20
+ * Configuration object to use.
21
+ * @param \FACTFinder\Core\Server\Request $request The request object from
22
+ * which to obtain the server data.
23
+ * @param \FACTFinder\Core\Client\UrlBuilder $urlBuilder
24
+ * Client URL builder object to use.
25
+ * @param \FACTFinder\Core\encodingConverter $encodingConverter
26
+ * Encoding converter object to use
27
+ */
28
+ public function __construct(
29
+ $loggerClass,
30
+ \FACTFinder\Core\ConfigurationInterface $configuration,
31
+ \FACTFinder\Core\Server\Request $request,
32
+ \FACTFinder\Core\Client\UrlBuilder $urlBuilder,
33
+ \FACTFinder\Core\AbstractEncodingConverter $encodingConverter = null
34
+ ) {
35
+ parent::__construct($loggerClass, $configuration, $request,
36
+ $urlBuilder, $encodingConverter);
37
+ }
38
+
39
+ /**
40
+ * Set this to true to only retrieve the IDs of products instead
41
+ * of full Record objects.
42
+ * @param $idsOnly bool
43
+ */
44
+ public function setIdsOnly($idsOnly)
45
+ {
46
+ if($this->idsOnly && !$idsOnly)
47
+ $this->upToDate = false;
48
+
49
+ $this->idsOnly = $idsOnly;
50
+ $parameters = $this->request->getParameters();
51
+ $parameters['idsOnly'] = $idsOnly ? 'true' : 'false';
52
+ }
53
+ }
lib/FACTFinder/Adapter/PersonalisedResponse.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace FACTFinder\Adapter;
3
+
4
+ use FACTFinder\Loader as FF;
5
+
6
+ /**
7
+ * Base class for all adapters which support the personalisation.
8
+ */
9
+ abstract class PersonalisedResponse extends ConfigurableResponse
10
+ {
11
+ /**
12
+ * @var string
13
+ */
14
+ protected $sid = false;
15
+
16
+ /**
17
+ * @param string $loggerClass Class name of logger to use. The class should
18
+ * implement FACTFinder\Util\LoggerInterface.
19
+ * @param \FACTFinder\Core\ConfigurationInterface $configuration
20
+ * Configuration object to use.
21
+ * @param \FACTFinder\Core\Server\Request $request The request object from
22
+ * which to obtain the server data.
23
+ * @param \FACTFinder\Core\Client\UrlBuilder $urlBuilder
24
+ * Client URL builder object to use.
25
+ * @param \FACTFinder\Core\encodingConverter $encodingConverter
26
+ * Encoding converter object to use
27
+ */
28
+ public function __construct(
29
+ $loggerClass,
30
+ \FACTFinder\Core\ConfigurationInterface $configuration,
31
+ \FACTFinder\Core\Server\Request $request,
32
+ \FACTFinder\Core\Client\UrlBuilder $urlBuilder,
33
+ \FACTFinder\Core\AbstractEncodingConverter $encodingConverter = null
34
+ ) {
35
+ parent::__construct($loggerClass, $configuration, $request,
36
+ $urlBuilder, $encodingConverter);
37
+ }
38
+
39
+ /**
40
+ * Set the session id for personalization.
41
+ *
42
+ * @param string $sessionId session id
43
+ */
44
+ public function setSid($sessionId)
45
+ {
46
+ if (strcmp($sessionId, $this->sid) !== 0) {
47
+ $this->sid = $sessionId;
48
+ $this->parameters['sid'] = $this->sid;
49
+ $this->upToDate = false;
50
+ }
51
+ }
52
+ }
lib/FACTFinder/Adapter/ProductCampaign.php CHANGED
@@ -3,7 +3,7 @@ namespace FACTFinder\Adapter;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
- class ProductCampaign extends AbstractAdapter
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
@@ -18,13 +18,8 @@ class ProductCampaign extends AbstractAdapter
18
  /**
19
  * @var bool
20
  */
21
- protected $isShoppingCartCampaign = false;
22
- private $campaignsUpToDate = false;
23
-
24
- /**
25
- * @var bool
26
- */
27
- private $idsOnly = false;
28
 
29
  public function __construct(
30
  $loggerClass,
@@ -57,7 +52,7 @@ class ProductCampaign extends AbstractAdapter
57
  {
58
  $parameters = $this->request->getParameters();
59
  $parameters['productNumber'] = $productNumbers;
60
- $this->campaignsUpToDate = false;
61
  }
62
 
63
  /**
@@ -70,23 +65,19 @@ class ProductCampaign extends AbstractAdapter
70
  {
71
  $parameters = $this->request->getParameters();
72
  $parameters->add('productNumber', $productNumbers);
73
- $this->campaignsUpToDate = false;
74
  }
75
 
76
  /**
77
- * Set this to true to only retrieve the IDs of pushed products instead
78
- * of full Record objects.
79
- *
80
- * @param $idsOnly bool
81
  */
82
- public function setIDsOnly($idsOnly)
83
  {
84
- if($this->idsOnly && !$idsOnly)
85
- $this->campaignsUpToDate = false;
86
-
87
- $this->idsOnly = $idsOnly;
88
  $parameters = $this->request->getParameters();
89
- $parameters['idsOnly'] = $idsOnly ? 'true' : 'false';
 
90
  }
91
 
92
  /**
@@ -95,7 +86,8 @@ class ProductCampaign extends AbstractAdapter
95
  public function makeProductCampaign()
96
  {
97
  $this->isShoppingCartCampaign = false;
98
- $this->campaignsUpToDate = false;
 
99
  $this->parameters['do'] = 'getProductCampaigns';
100
  }
101
 
@@ -105,9 +97,20 @@ class ProductCampaign extends AbstractAdapter
105
  public function makeShoppingCartCampaign()
106
  {
107
  $this->isShoppingCartCampaign = true;
108
- $this->campaignsUpToDate = false;
 
109
  $this->parameters['do'] = 'getShoppingCartCampaigns';
110
  }
 
 
 
 
 
 
 
 
 
 
111
 
112
  /**
113
  * Returns campaigns for IDs previously specified. If no IDs have been
@@ -118,11 +121,11 @@ class ProductCampaign extends AbstractAdapter
118
  public function getCampaigns()
119
  {
120
  if (is_null($this->campaigns)
121
- || !$this->campaignsUpToDate
122
  ) {
123
  $this->request->resetLoaded();
124
  $this->campaigns = $this->createCampaigns();
125
- $this->campaignsUpToDate = true;
126
  }
127
 
128
  return $this->campaigns;
@@ -131,15 +134,20 @@ class ProductCampaign extends AbstractAdapter
131
  private function createCampaigns()
132
  {
133
  $campaigns = array();
134
-
135
- if (!isset($this->parameters['productNumber']))
 
 
 
 
 
136
  {
137
  $this->log->warn('Product campaigns cannot be loaded without a product ID. '
138
  . 'Use setProductIDs() or addProductIDs() first.');
139
  }
140
  else
141
  {
142
- if ($this->isShoppingCartCampaign)
143
  {
144
  $jsonData = $this->getResponseContent();
145
  }
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
+ class ProductCampaign extends PersonalisedResponse
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
18
  /**
19
  * @var bool
20
  */
21
+ protected $isShoppingCartCampaign = false;
22
+ protected $isLandingPageCampaign = false;
 
 
 
 
 
23
 
24
  public function __construct(
25
  $loggerClass,
52
  {
53
  $parameters = $this->request->getParameters();
54
  $parameters['productNumber'] = $productNumbers;
55
+ $this->upToDate = false;
56
  }
57
 
58
  /**
65
  {
66
  $parameters = $this->request->getParameters();
67
  $parameters->add('productNumber', $productNumbers);
68
+ $this->upToDate = false;
69
  }
70
 
71
  /**
72
+ * Set the page id to get landing page campaigns.
73
+ *
74
+ * @param string $pageId The id which determines the campaigns for a page.
 
75
  */
76
+ public function setPageId($pageId)
77
  {
 
 
 
 
78
  $parameters = $this->request->getParameters();
79
+ $parameters->add('pageId', $pageId);
80
+ $this->upToDate = false;
81
  }
82
 
83
  /**
86
  public function makeProductCampaign()
87
  {
88
  $this->isShoppingCartCampaign = false;
89
+ $this->isLandingPageCampaign = false;
90
+ $this->upToDate = false;
91
  $this->parameters['do'] = 'getProductCampaigns';
92
  }
93
 
97
  public function makeShoppingCartCampaign()
98
  {
99
  $this->isShoppingCartCampaign = true;
100
+ $this->isLandingPageCampaign = false;
101
+ $this->upToDate = false;
102
  $this->parameters['do'] = 'getShoppingCartCampaigns';
103
  }
104
+
105
+ /**
106
+ * Sets the adapter up for fetching campaigns on landing pages
107
+ */
108
+ public function makePageCampaign()
109
+ {
110
+ $this->isLandingPageCampaign = true;
111
+ $this->upToDate = false;
112
+ $this->parameters['do'] = 'getPageCampaigns';
113
+ }
114
 
115
  /**
116
  * Returns campaigns for IDs previously specified. If no IDs have been
121
  public function getCampaigns()
122
  {
123
  if (is_null($this->campaigns)
124
+ || !$this->upToDate
125
  ) {
126
  $this->request->resetLoaded();
127
  $this->campaigns = $this->createCampaigns();
128
+ $this->upToDate = true;
129
  }
130
 
131
  return $this->campaigns;
134
  private function createCampaigns()
135
  {
136
  $campaigns = array();
137
+
138
+ if ($this->isLandingPageCampaign && !isset($this->parameters['pageId']))
139
+ {
140
+ $this->log->warn('Page campaigns cannot be loaded without a page ID. '
141
+ . 'Use setPageId() first.');
142
+ }
143
+ else if (!$this->isLandingPageCampaign && !isset($this->parameters['productNumber']))
144
  {
145
  $this->log->warn('Product campaigns cannot be loaded without a product ID. '
146
  . 'Use setProductIDs() or addProductIDs() first.');
147
  }
148
  else
149
  {
150
+ if ($this->isShoppingCartCampaign || $this->isLandingPageCampaign)
151
  {
152
  $jsonData = $this->getResponseContent();
153
  }
lib/FACTFinder/Adapter/Recommendation.php CHANGED
@@ -3,7 +3,7 @@ namespace FACTFinder\Adapter;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
- class Recommendation extends AbstractAdapter
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
@@ -15,17 +15,6 @@ class Recommendation extends AbstractAdapter
15
  */
16
  private $recommendations;
17
 
18
- /**
19
- * @var bool
20
- */
21
- private $recommendationsUpToDate = false;
22
-
23
- /**
24
- * @var bool
25
- */
26
- private $idsOnly = false;
27
-
28
-
29
  public function __construct(
30
  $loggerClass,
31
  \FACTFinder\Core\ConfigurationInterface $configuration,
@@ -68,7 +57,7 @@ class Recommendation extends AbstractAdapter
68
  }
69
  // Make sure that the recommendations are fetched again. In theory,
70
  // we only have to do this when recordCount increases.
71
- $this->recommendationsUpToDate = false;
72
  }
73
 
74
  /**
@@ -81,7 +70,7 @@ class Recommendation extends AbstractAdapter
81
  {
82
  $parameters = $this->request->getParameters();
83
  $parameters['id'] = $productIDs;
84
- $this->recommendationsUpToDate = false;
85
  }
86
 
87
  /**
@@ -94,34 +83,7 @@ class Recommendation extends AbstractAdapter
94
  {
95
  $parameters = $this->request->getParameters();
96
  $parameters->add('id', $productIDs);
97
- $this->recommendationsUpToDate = false;
98
- }
99
-
100
- /**
101
- * Set this to true to only retrieve the IDs of recommended products instead
102
- * of full Record objects.
103
- * @param $idsOnly bool
104
- */
105
- public function setIdsOnly($idsOnly)
106
- {
107
- // Reset the recommendations, if more detail is wanted than before
108
- if($this->idsOnly && !$idsOnly)
109
- $this->recommendationsUpToDate = false;
110
-
111
- $this->idsOnly = $idsOnly;
112
- $parameters = $this->request->getParameters();
113
- $parameters['idsOnly'] = $idsOnly ? 'true' : 'false';
114
- }
115
-
116
- /**
117
- * Set value for parameter sid for personalization.
118
- *
119
- * @param string $sid session id
120
- */
121
- public function setSid($sid)
122
- {
123
- $this->parameters['sid'] = $sid;
124
- $this->recommendationsUpToDate = false;
125
  }
126
 
127
  /**
@@ -133,11 +95,11 @@ class Recommendation extends AbstractAdapter
133
  public function getRecommendations()
134
  {
135
  if (is_null($this->recommendations)
136
- || !$this->recommendationsUpToDate
137
  ) {
138
  $this->request->resetLoaded();
139
  $this->recommendations = $this->createRecommendations();
140
- $this->recommendationsUpToDate = true;
141
  }
142
 
143
  return $this->recommendations;
@@ -165,10 +127,7 @@ class Recommendation extends AbstractAdapter
165
  $position = 1;
166
  foreach($recommenderData as $recordData)
167
  {
168
- if ($this->idsOnly)
169
- $records[] = $this->createSparseRecord($recordData);
170
- else
171
- $records[] = $this->createRecord($recordData, $position++);
172
  }
173
  }
174
  }
@@ -181,14 +140,6 @@ class Recommendation extends AbstractAdapter
181
  );
182
  }
183
 
184
- private function createSparseRecord($recordData)
185
- {
186
- return FF::getInstance(
187
- 'Data\Record',
188
- (string)$recordData['id']
189
- );
190
- }
191
-
192
  private function createRecord($recordData, $position)
193
  {
194
  return FF::getInstance(
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
+ class Recommendation extends PersonalisedResponse
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
15
  */
16
  private $recommendations;
17
 
 
 
 
 
 
 
 
 
 
 
 
18
  public function __construct(
19
  $loggerClass,
20
  \FACTFinder\Core\ConfigurationInterface $configuration,
57
  }
58
  // Make sure that the recommendations are fetched again. In theory,
59
  // we only have to do this when recordCount increases.
60
+ $this->upToDate = false;
61
  }
62
 
63
  /**
70
  {
71
  $parameters = $this->request->getParameters();
72
  $parameters['id'] = $productIDs;
73
+ $this->upToDate = false;
74
  }
75
 
76
  /**
83
  {
84
  $parameters = $this->request->getParameters();
85
  $parameters->add('id', $productIDs);
86
+ $this->upToDate = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
88
 
89
  /**
95
  public function getRecommendations()
96
  {
97
  if (is_null($this->recommendations)
98
+ || !$this->upToDate
99
  ) {
100
  $this->request->resetLoaded();
101
  $this->recommendations = $this->createRecommendations();
102
+ $this->upToDate = true;
103
  }
104
 
105
  return $this->recommendations;
127
  $position = 1;
128
  foreach($recommenderData as $recordData)
129
  {
130
+ $records[] = $this->createRecord($recordData, $position++);
 
 
 
131
  }
132
  }
133
  }
140
  );
141
  }
142
 
 
 
 
 
 
 
 
 
143
  private function createRecord($recordData, $position)
144
  {
145
  return FF::getInstance(
lib/FACTFinder/Adapter/Search.php CHANGED
@@ -3,7 +3,7 @@ namespace FACTFinder\Adapter;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
- class Search extends AbstractAdapter
7
  {
8
 
9
  /**
@@ -55,16 +55,6 @@ class Search extends AbstractAdapter
55
  * @var FACTFinder\Data\CampaignIterator
56
  */
57
  private $campaigns;
58
-
59
- /**
60
- * @var bool
61
- */
62
- private $recordsUpToDate = false;
63
-
64
- /**
65
- * @var bool
66
- */
67
- private $idsOnly = false;
68
 
69
  public function __construct(
70
  $loggerClass,
@@ -92,43 +82,16 @@ class Search extends AbstractAdapter
92
  {
93
  $this->parameters['query'] = $query;
94
  }
95
-
96
- /**
97
- * Set value for parameter sid for personalization.
98
- *
99
- * @param string $sid session id
100
- */
101
- public function setSid($sid)
102
- {
103
- $this->parameters['sid'] = $sid;
104
- $this->recordsUpToDate = false;
105
- }
106
-
107
- /**
108
- * Set this to true to only retrieve the IDs of products instead
109
- * of full Record objects.
110
- *
111
- * @param $idsOnly bool
112
- */
113
- public function setIDsOnly($idsOnly)
114
- {
115
- if($this->idsOnly && !$idsOnly)
116
- $this->recordsUpToDate = false;
117
-
118
- $this->idsOnly = $idsOnly;
119
- $parameters = $this->request->getParameters();
120
- $parameters['idsOnly'] = $idsOnly ? 'true' : 'false';
121
- }
122
 
123
  /**
124
  * @return \FACTFinder\Data\Result
125
  */
126
  public function getResult()
127
  {
128
- if (is_null($this->result) || !$this->recordsUpToDate) {
129
  $this->request->resetLoaded();
130
  $this->result = $this->createResult();
131
- $this->recordsUpToDate = true;
132
  }
133
 
134
  return $this->result;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
+ class Search extends PersonalisedResponse
7
  {
8
 
9
  /**
55
  * @var FACTFinder\Data\CampaignIterator
56
  */
57
  private $campaigns;
 
 
 
 
 
 
 
 
 
 
58
 
59
  public function __construct(
60
  $loggerClass,
82
  {
83
  $this->parameters['query'] = $query;
84
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
  /**
87
  * @return \FACTFinder\Data\Result
88
  */
89
  public function getResult()
90
  {
91
+ if (is_null($this->result) || !$this->upToDate) {
92
  $this->request->resetLoaded();
93
  $this->result = $this->createResult();
94
+ $this->upToDate = true;
95
  }
96
 
97
  return $this->result;
lib/FACTFinder/Adapter/SimilarRecords.php CHANGED
@@ -3,7 +3,7 @@ namespace FACTFinder\Adapter;
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
- class SimilarRecords extends AbstractAdapter
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
@@ -21,18 +21,6 @@ class SimilarRecords extends AbstractAdapter
21
  */
22
  private $similarRecords;
23
 
24
- /**
25
- * @var bool
26
- */
27
- private $attributesUpToDate = false;
28
- private $recordsUpToDate = false;
29
-
30
- /**
31
- * @var bool
32
- */
33
- private $idsOnly = false;
34
-
35
-
36
  public function __construct(
37
  $loggerClass,
38
  \FACTFinder\Core\ConfigurationInterface $configuration,
@@ -74,7 +62,7 @@ class SimilarRecords extends AbstractAdapter
74
  }
75
  // Make sure that the records are fetched again. In principle, we only
76
  // have to do this when recordCount increases.
77
- $this->recordsUpToDate = false;
78
  }
79
 
80
  /**
@@ -86,24 +74,7 @@ class SimilarRecords extends AbstractAdapter
86
  {
87
  $parameters = $this->request->getParameters();
88
  $parameters['id'] = $productID;
89
- $this->attributesUpToDate = false;
90
- $this->recordsUpToDate = false;
91
- }
92
-
93
- /**
94
- * Set this to true to only retrieve the IDs of similar products instead
95
- * of full Record objects.
96
- * @param $idsOnly bool
97
- */
98
- public function setIDsOnly($idsOnly)
99
- {
100
- // Reset the similar records, if more detail is wanted than before
101
- if($this->idsOnly && !$idsOnly)
102
- $this->recordsUpToDate = false;
103
-
104
- $this->idsOnly = $idsOnly;
105
- $parameters = $this->request->getParameters();
106
- $parameters['idsOnly'] = $idsOnly ? 'true' : 'false';
107
  }
108
 
109
  /**
@@ -117,10 +88,10 @@ class SimilarRecords extends AbstractAdapter
117
  public function getSimilarAttributes()
118
  {
119
  if (is_null($this->similarAttributes)
120
- || !$this->attributesUpToDate
121
  ) {
122
  $this->similarAttributes = $this->createSimilarAttributes();
123
- $this->attributesUpToDate = true;
124
  }
125
 
126
  return $this->similarAttributes;
@@ -161,11 +132,11 @@ class SimilarRecords extends AbstractAdapter
161
  public function getSimilarRecords()
162
  {
163
  if (is_null($this->similarRecords)
164
- || !$this->recordsUpToDate
165
  ) {
166
  $this->request->resetLoaded();
167
  $this->similarRecords = $this->createSimilarRecords();
168
- $this->recordsUpToDate = true;
169
  }
170
 
171
  return $this->similarRecords;
@@ -189,10 +160,7 @@ class SimilarRecords extends AbstractAdapter
189
  {
190
  foreach($jsonData['records'] as $recordData)
191
  {
192
- if ($this->idsOnly)
193
- $records[] = $this->createSparseRecord($recordData);
194
- else
195
- $records[] = $this->createRecord($recordData, $position++);
196
  }
197
  }
198
  }
@@ -205,14 +173,6 @@ class SimilarRecords extends AbstractAdapter
205
  );
206
  }
207
 
208
- private function createSparseRecord($recordData)
209
- {
210
- return FF::getInstance(
211
- 'Data\Record',
212
- (string)$recordData['id']
213
- );
214
- }
215
-
216
  private function createRecord($recordData, $position)
217
  {
218
  return FF::getInstance(
3
 
4
  use FACTFinder\Loader as FF;
5
 
6
+ class SimilarRecords extends ConfigurableResponse
7
  {
8
  /**
9
  * @var FACTFinder\Util\LoggerInterface
21
  */
22
  private $similarRecords;
23
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  public function __construct(
25
  $loggerClass,
26
  \FACTFinder\Core\ConfigurationInterface $configuration,
62
  }
63
  // Make sure that the records are fetched again. In principle, we only
64
  // have to do this when recordCount increases.
65
+ $this->upToDate = false;
66
  }
67
 
68
  /**
74
  {
75
  $parameters = $this->request->getParameters();
76
  $parameters['id'] = $productID;
77
+ $this->upToDate = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
 
80
  /**
88
  public function getSimilarAttributes()
89
  {
90
  if (is_null($this->similarAttributes)
91
+ || !$this->upToDate
92
  ) {
93
  $this->similarAttributes = $this->createSimilarAttributes();
94
+ $this->upToDate = true;
95
  }
96
 
97
  return $this->similarAttributes;
132
  public function getSimilarRecords()
133
  {
134
  if (is_null($this->similarRecords)
135
+ || !$this->upToDate
136
  ) {
137
  $this->request->resetLoaded();
138
  $this->similarRecords = $this->createSimilarRecords();
139
+ $this->upToDate = true;
140
  }
141
 
142
  return $this->similarRecords;
160
  {
161
  foreach($jsonData['records'] as $recordData)
162
  {
163
+ $records[] = $this->createRecord($recordData, $position++);
 
 
 
164
  }
165
  }
166
  }
173
  );
174
  }
175
 
 
 
 
 
 
 
 
 
176
  private function createRecord($recordData, $position)
177
  {
178
  return FF::getInstance(
lib/FACTFinder/Adapter/Tracking.php CHANGED
@@ -88,6 +88,8 @@ class Tracking extends AbstractAdapter
88
  * @param int $pageSize size of the page where the product was found (optional - is 12 by default)
89
  * @param int $origPageSize original size of the page before the user could have changed it (optional - is set equals to $page by default)
90
  * @param string $userId id of user (optional if modul personalisation is not used)
 
 
91
  * @return boolean $success
92
  */
93
  public function trackClick(
@@ -103,10 +105,12 @@ class Tracking extends AbstractAdapter
103
  $title = '',
104
  $pageSize = 12,
105
  $origPageSize = -1,
106
- $userId = null
 
 
107
  ) {
108
  $this->setupClickTracking($id, $query, $pos, $masterId, $sid, $cookieId, $origPos, $page,
109
- $simi, $title, $pageSize, $origPageSize, $userId);
110
  return $this->applyTracking();
111
  }
112
 
@@ -128,7 +132,9 @@ class Tracking extends AbstractAdapter
128
  $title = '',
129
  $pageSize = 12,
130
  $origPageSize = -1,
131
- $userId = null
 
 
132
  ) {
133
  if (strlen($sid) == 0) $sid = session_id();
134
  if ($origPos == -1) $origPos = $pos;
@@ -150,6 +156,8 @@ class Tracking extends AbstractAdapter
150
  if (strlen($userId) > 0) $params['userId'] = $userId;
151
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
152
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
 
 
153
 
154
  $this->parameters->clear();
155
  $this->parameters->setAll($params);
@@ -167,6 +175,8 @@ class Tracking extends AbstractAdapter
167
  * @param int $count number of items purchased for each product (optional - default 1)
168
  * @param float $price this is the single unit price (optional)
169
  * @param string $userId id of user (optional if modul personalisation is not used)
 
 
170
  * @return boolean $success
171
  */
172
  public function trackCart(
@@ -178,9 +188,11 @@ class Tracking extends AbstractAdapter
178
  $cookieId = null,
179
  $count = 1,
180
  $price = null,
181
- $userId = null
 
 
182
  ) {
183
- $this->setupCartTracking($id, $masterId, $title, $query, $sid, $cookieId, $count, $price, $userId);
184
  return $this->applyTracking();
185
  }
186
 
@@ -198,7 +210,9 @@ class Tracking extends AbstractAdapter
198
  $cookieId = null,
199
  $count = 1,
200
  $price = null,
201
- $userId = null
 
 
202
  ) {
203
  if (strlen($sid) == 0) $sid = session_id();
204
  $params = array(
@@ -214,6 +228,8 @@ class Tracking extends AbstractAdapter
214
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
215
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
216
  if (strlen($query) > 0) $params['query'] = $query;
 
 
217
 
218
  $this->parameters->clear();
219
  $this->parameters->setAll($params);
@@ -231,6 +247,8 @@ class Tracking extends AbstractAdapter
231
  * @param int $count number of items purchased for each product (optional - default 1)
232
  * @param float $price this is the single unit price (optional)
233
  * @param string $userId id of user (optional if modul personalisation is not used)
 
 
234
  * @return boolean $success
235
  */
236
  public function trackCheckout(
@@ -242,9 +260,11 @@ class Tracking extends AbstractAdapter
242
  $cookieId = null,
243
  $count = 1,
244
  $price = null,
245
- $userId = null
 
 
246
  ) {
247
- $this->setupCheckoutTracking($id, $masterId, $title, $query, $sid, $cookieId, $count, $price, $userId);
248
  return $this->applyTracking();
249
  }
250
 
@@ -262,7 +282,9 @@ class Tracking extends AbstractAdapter
262
  $cookieId = null,
263
  $count = 1,
264
  $price = null,
265
- $userId = null
 
 
266
  ) {
267
  if (strlen($sid) == 0) $sid = session_id();
268
  $params = array(
@@ -279,6 +301,8 @@ class Tracking extends AbstractAdapter
279
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
280
  if (strlen($query) > 0) $params['query'] = $query;
281
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
 
 
282
 
283
  $this->parameters->clear();
284
  $this->parameters->setAll($params);
88
  * @param int $pageSize size of the page where the product was found (optional - is 12 by default)
89
  * @param int $origPageSize original size of the page before the user could have changed it (optional - is set equals to $page by default)
90
  * @param string $userId id of user (optional if modul personalisation is not used)
91
+ * @param string $campaign campaign name (optional)
92
+ * @param boolean $instoreAds determines whether it's a sponsered product (optional)
93
  * @return boolean $success
94
  */
95
  public function trackClick(
105
  $title = '',
106
  $pageSize = 12,
107
  $origPageSize = -1,
108
+ $userId = null,
109
+ $campaign = null,
110
+ $instoreAds = false
111
  ) {
112
  $this->setupClickTracking($id, $query, $pos, $masterId, $sid, $cookieId, $origPos, $page,
113
+ $simi, $title, $pageSize, $origPageSize, $userId, $campaign, $instoreAds);
114
  return $this->applyTracking();
115
  }
116
 
132
  $title = '',
133
  $pageSize = 12,
134
  $origPageSize = -1,
135
+ $userId = null,
136
+ $campaign = null,
137
+ $instoreAds = false
138
  ) {
139
  if (strlen($sid) == 0) $sid = session_id();
140
  if ($origPos == -1) $origPos = $pos;
156
  if (strlen($userId) > 0) $params['userId'] = $userId;
157
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
158
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
159
+ if (strlen($campaign) > 0) $params['campaign'] = $campaign;
160
+ if ($instoreAds) $params['instoreAds'] = 'true';
161
 
162
  $this->parameters->clear();
163
  $this->parameters->setAll($params);
175
  * @param int $count number of items purchased for each product (optional - default 1)
176
  * @param float $price this is the single unit price (optional)
177
  * @param string $userId id of user (optional if modul personalisation is not used)
178
+ * @param string $campaign campaign name (optional)
179
+ * @param boolean $instoreAds determines whether it's a sponsered product (optional)
180
  * @return boolean $success
181
  */
182
  public function trackCart(
188
  $cookieId = null,
189
  $count = 1,
190
  $price = null,
191
+ $userId = null,
192
+ $campaign = null,
193
+ $instoreAds = false
194
  ) {
195
+ $this->setupCartTracking($id, $masterId, $title, $query, $sid, $cookieId, $count, $price, $userId, $campaign, $instoreAds);
196
  return $this->applyTracking();
197
  }
198
 
210
  $cookieId = null,
211
  $count = 1,
212
  $price = null,
213
+ $userId = null,
214
+ $campaign = null,
215
+ $instoreAds = false
216
  ) {
217
  if (strlen($sid) == 0) $sid = session_id();
218
  $params = array(
228
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
229
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
230
  if (strlen($query) > 0) $params['query'] = $query;
231
+ if (strlen($campaign) > 0) $params['campaign'] = $campaign;
232
+ if ($instoreAds) $params['instoreAds'] = 'true';
233
 
234
  $this->parameters->clear();
235
  $this->parameters->setAll($params);
247
  * @param int $count number of items purchased for each product (optional - default 1)
248
  * @param float $price this is the single unit price (optional)
249
  * @param string $userId id of user (optional if modul personalisation is not used)
250
+ * @param string $campaign campaign name (optional)
251
+ * @param boolean $instoreAds determines whether it's a sponsered product (optional)
252
  * @return boolean $success
253
  */
254
  public function trackCheckout(
260
  $cookieId = null,
261
  $count = 1,
262
  $price = null,
263
+ $userId = null,
264
+ $campaign = null,
265
+ $instoreAds = false
266
  ) {
267
+ $this->setupCheckoutTracking($id, $masterId, $title, $query, $sid, $cookieId, $count, $price, $userId, $campaign, $instoreAds);
268
  return $this->applyTracking();
269
  }
270
 
282
  $cookieId = null,
283
  $count = 1,
284
  $price = null,
285
+ $userId = null,
286
+ $campaign = null,
287
+ $instoreAds = false
288
  ) {
289
  if (strlen($sid) == 0) $sid = session_id();
290
  $params = array(
301
  if (strlen($cookieId) > 0) $params['cookieId'] = $cookieId;
302
  if (strlen($query) > 0) $params['query'] = $query;
303
  if (strlen($masterId) > 0) $params['masterId'] = $masterId;
304
+ if (strlen($campaign) > 0) $params['campaign'] = $campaign;
305
+ if ($instoreAds) $params['instoreAds'] = 'true';
306
 
307
  $this->parameters->clear();
308
  $this->parameters->setAll($params);
lib/FACTFinder/Core/AbstractConfiguration.php CHANGED
@@ -190,6 +190,7 @@ abstract class AbstractConfiguration implements ConfigurationInterface
190
  '/^substringFilter.*/' => true,
191
  'advisorStatus' => true,
192
  'callback' => true,
 
193
  'catalog' => true,
194
  'channel' => true,
195
  'cookieId' => true,
@@ -202,6 +203,7 @@ abstract class AbstractConfiguration implements ConfigurationInterface
202
  'ids' => true,
203
  'idsOnly' => true,
204
  'ignoreForCache' => true,
 
205
  'isArticleNumber' => true,
206
  'log' => true,
207
  'mainId' => true,
@@ -222,6 +224,7 @@ abstract class AbstractConfiguration implements ConfigurationInterface
222
  'query' => true,
223
  'queryFromSuggest' => true,
224
  'searchField' => true,
 
225
  'sid' => true,
226
  'simi' => true,
227
  'title' => true,
190
  '/^substringFilter.*/' => true,
191
  'advisorStatus' => true,
192
  'callback' => true,
193
+ 'campaign' => true,
194
  'catalog' => true,
195
  'channel' => true,
196
  'cookieId' => true,
203
  'ids' => true,
204
  'idsOnly' => true,
205
  'ignoreForCache' => true,
206
+ 'instoreAds' => true,
207
  'isArticleNumber' => true,
208
  'log' => true,
209
  'mainId' => true,
224
  'query' => true,
225
  'queryFromSuggest' => true,
226
  'searchField' => true,
227
+ 'seoPath' => true,
228
  'sid' => true,
229
  'simi' => true,
230
  'title' => true,
lib/FACTFinder/Data/SearchParameters.php CHANGED
@@ -12,7 +12,8 @@ class SearchParameters
12
  /**
13
  * @var string
14
  */
15
- private $query;
 
16
  private $channel;
17
  private $advisorStatus;
18
 
@@ -43,6 +44,8 @@ class SearchParameters
43
  ) {
44
  $this->query = isset($parameters['query']) ? $parameters['query'] : '';
45
 
 
 
46
  // Properly prepared server parameters will always have a channel set
47
  $this->channel = $parameters['channel'];
48
 
@@ -78,7 +81,13 @@ class SearchParameters
78
  }
79
  }
80
 
81
-
 
 
 
 
 
 
82
 
83
  /**
84
  * @return string
12
  /**
13
  * @var string
14
  */
15
+ private $query;
16
+ private $seoPath;
17
  private $channel;
18
  private $advisorStatus;
19
 
44
  ) {
45
  $this->query = isset($parameters['query']) ? $parameters['query'] : '';
46
 
47
+ $this->seoPath = isset($parameters['seoPath']) ? $parameters['seoPath'] : '';
48
+
49
  // Properly prepared server parameters will always have a channel set
50
  $this->channel = $parameters['channel'];
51
 
81
  }
82
  }
83
 
84
+ /**
85
+ * @return string
86
+ */
87
+ public function getSeoPath()
88
+ {
89
+ return $this->seoPath;
90
+ }
91
 
92
  /**
93
  * @return string
package.xml CHANGED
@@ -1,18 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Flagbit_Factfinder</name>
4
- <version>4.1.9</version>
5
  <stability>stable</stability>
6
  <license uri="https://opensource.org/licenses/MIT">MIT</license>
7
  <channel>community</channel>
8
  <extends/>
9
- <summary>4.1.9 Release</summary>
10
- <description>4.1.9 Release</description>
11
  <notes>Release</notes>
12
  <authors><author><name>FACTFinder</name><user>FACT_Finder</user><email>info@flagbit.de</email></author></authors>
13
- <date>2016-08-26</date>
14
- <time>12:56:51</time>
15
- <contents><target name="magecommunity"><dir name="FACTFinder"><dir name="Asn"><dir name="Block"><dir name="Catalog"><dir name="Layer"><file name="Factfinder.php" hash="0e79d252a2752aab67f7490436350fe7"/><file name="State.php" hash="2bf2c99237e881372fdc074c3505d188"/></dir><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="9b0c98e266174c8f8b02b896a556b769"/></dir><file name="Pager.php" hash="ec87967ba312a3d589e0af0afbacdd0a"/></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="668be3edd4c8f6d0e051252d2e52d545"/></dir><dir name="Model"><dir name="Catalog"><file name="Layer.php" hash="6dafe882395b5d09f84c102f3b785410"/></dir><dir name="Handler"><file name="Search.php" hash="bbec7bd87e1d2f15792fdda46f34eb52"/></dir><dir name="Layer"><dir name="Filter"><file name="Factfinder.php" hash="2666ae9c79aa939e9539a1af5b0f7784"/><file name="Item.php" hash="a68545b4cb4487691ae75cdbf47af377"/></dir></dir><file name="Observer.php" hash="9ec46432b3d3170b626cfb4439315209"/><dir name="Resource"><dir name="Product"><dir name="Attribute"><file name="Collection.php" hash="03b060fd637de1fd632f1b9784b1124c"/></dir></dir><dir name="Search"><file name="Collection.php" hash="3e7a88eb53ccfb79b4448f9eb7bd4177"/></dir></dir></dir><dir name="etc"><file name="config.xml" hash="e07b890b06b00d94bc4a4a5931325366"/><file name="system.xml" hash="d76e04ebe1d564be4113c1428fdfc637"/></dir></dir><dir name="Campaigns"><dir name="Block"><file name="Abstract.php" hash="cc5e41bb89f07f191be99430451221fa"/><dir name="Advisory"><file name="Search.php" hash="1d4bf82a7baffbe64be17216436c35d4"/></dir><dir name="Feedback"><file name="Abstract.php" hash="018e415bdd754127cfad8bfa5881c0ce"/><file name="Cart.php" hash="35f9fec2518383c909495af90b324b8b"/><file name="Product.php" hash="82999021756a26d81bf829b9aa4dd5cc"/><file name="Search.php" hash="ebf3d35f6425b771291b08f696169d04"/></dir><dir name="Pushed"><file name="Abstract.php" hash="fbfbf5cb5c1ebce8e588ac7af1f1458d"/><file name="Cart.php" hash="741d3bd71ce91cd583778a5e26be9ff5"/><file name="Product.php" hash="c1e774c4ceb71469080e49557887a893"/><file name="Search.php" hash="ae352cfd5ca8bdf2a0b46d1148c710ae"/></dir></dir><dir name="Helper"><file name="Data.php" hash="c7882a90dca46e639a5e4c64bef153ff"/></dir><dir name="Model"><file name="Facade.php" hash="44fc55139509b76f19b7c95c6a81eb4c"/><dir name="Handler"><file name="Abstract.php" hash="04dd6ad2a877111364fd9c8f132671fc"/><file name="Cart.php" hash="128dd5052d20384ea2220020469f7cf6"/><file name="Product.php" hash="8d48380fbccec220bc4caabbcb5d7d7d"/><file name="Search.php" hash="e039a207ca98655c647355ebf287566d"/></dir><file name="Observer.php" hash="043e7411be7ec13a656b07750a7811af"/><dir name="Resource"><dir name="Pushedproducts"><file name="Collection.php" hash="569856158dee935d611ebc30f426835c"/></dir></dir></dir><dir name="etc"><file name="config.xml" hash="8f6b7cec7cff39b149beeffb39764668"/><file name="system.xml" hash="54992bb35ac6088733d3f18408872fdb"/></dir></dir><dir name="Core"><dir name="Block"><dir name="Adminhtml"><file name="Exportlink.php" hash="7a845ee8974cfcf74d9a32fed2ac0b21"/><dir name="Form"><dir name="Field"><file name="Attribute.php" hash="bea2183e56100233e7aebaccd6680c6f"/><file name="Attributes.php" hash="292742f954dec1863caaee9313a237c9"/></dir></dir></dir><dir name="Catalog"><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="b9438ae943def50b46531ac1265e0634"/></dir><file name="Pager.php" hash="aa301fb57966bafcc370fa510d2ad146"/></dir></dir><dir name="CatalogSearch"><file name="Layer.php" hash="ad3dcdd26b5a723e43c7b8011a4ea25f"/></dir><dir name="EnterpriseSearch"><file name="Layer.php" hash="19455e36be3e0c14cabba762ccbdef1a"/></dir></dir><dir name="Helper"><file name="Backend.php" hash="f30c89ca668b193a8fc8bf00eda34413"/><file name="Data.php" hash="5108935421d26c45a63676b6b97f3044"/><file name="Debug.php" hash="c563d343c68db980e9256dc510e78ea1"/><file name="Export.php" hash="e48e0b03c1da11fab1c6d74648b4e014"/><file name="Rewrite.php" hash="30921c0924e535d669ecdd7e9592f883"/><file name="Search.php" hash="fd1e90271d620c57a0cb7b80e33f536f"/></dir><dir name="Model"><file name="Autoloader.php" hash="29370ccbcd483f93be86999485889900"/><dir name="CatalogSearch"><file name="Layer.php" hash="8d15e27cca249cd3827d33e9acdbb369"/><file name="Query.php" hash="4f5b732eb28a7c1efde28eb602c38772"/></dir><dir name="Export"><file name="Observer.php" hash="03a94f73f89b923c374a2663b03e3497"/><file name="Price.php" hash="1128559eb16cf0d562ad22af9ccdd1a4"/><file name="Product.php" hash="13fe01bed2105dd1eddaa886c621a2bc"/><file name="Stock.php" hash="d6531c28c572968ab82d3282eda9b29a"/></dir><file name="Facade.php" hash="1b66c3bfea09a60611b232f36ac4ba60"/><file name="File.php" hash="77cc3d2067b42c2cad6f21dcb6d7a73e"/><file name="Ftp.php" hash="d70cfab0ce607aca6efa32d82d3a85c3"/><dir name="Handler"><file name="Abstract.php" hash="1924821d13996f9f672369b63a05ac08"/><file name="Search.php" hash="63a9a4b197027654c5328f37245d7add"/><file name="Status.php" hash="635b9cb62808803be64d373dc2a0e808"/></dir><file name="Observer.php" hash="e5decfa3b52571cb75335dd41b1927f5"/><dir name="Resource"><file name="Fulltext.php" hash="dfbece11e5fe8224c94d1e1bb7affe3e"/><dir name="Search"><file name="Collection.php" hash="50596cf9508d0d96a4bb315a50f35984"/><file name="Engine.php" hash="602547a2d224f80933b6681db1cb3cc4"/></dir></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Attributes.php" hash="d877a4da13c592f5b8260b202bcead13"/><file name="Cron.php" hash="f24b6995fea6309acb720876f3156270"/><file name="Enabled.php" hash="cb13a29b7100518350a7e5830180e9bd"/><file name="Engine.php" hash="ef1f702d79c7ed0fe72437ca4bf13a19"/></dir><dir name="Source"><file name="Authtype.php" hash="7ce07da0f6bcb8e88b5699ace77e6f31"/><file name="Engine.php" hash="8f1c2f344aa3182c312a665488661fa5"/><file name="Identifier.php" hash="a80606fe94b2eaf78f8d07628f2a64f0"/><file name="Protocol.php" hash="310b7fd8648b60f5cc9c3e3c9f87345c"/></dir></dir></dir><file name="Url.php" hash="57e5e87457b3051cec9bc3c988f79282"/></dir><dir name="controllers"><file name="ExportController.php" hash="4e0800619796d128a9466c84fecd3b56"/></dir><dir name="etc"><file name="adminhtml.xml" hash="0247e1b846aefb3fb9c5c0706681a586"/><file name="config.xml" hash="471974367bce221b6795be5f4015a6e9"/><file name="system.xml" hash="66c43a66c412e296809d8c77cafb7b51"/></dir></dir><dir name="Recommendation"><dir name="Helper"><file name="Data.php" hash="a09697fa784bfd2fe23f6b4fbd9f3e84"/></dir><dir name="Model"><file name="Facade.php" hash="ed9c246bc831c7f3950a88853d401288"/><dir name="Handler"><file name="Recommendations.php" hash="f5645b78a6dca466af5b22ff0456ca71"/></dir><file name="Observer.php" hash="4db52b3863efccd17b19e92e6ff2521e"/></dir><dir name="etc"><file name="config.xml" hash="03ec96e0fa78fdfbc3d4d5fac7193704"/><file name="system.xml" hash="f841228bf8a5397fe18da6186c5e3208"/></dir></dir><dir name="Suggest"><dir name="Block"><file name="TopSearch.php" hash="96fc7e73d907a0438111253ae6c5fc6f"/><dir name="XmlConnect"><dir name="Catalog"><dir name="Search"><file name="Suggest.php" hash="150658cb1d7bc7ae5b4566ed1331bb12"/></dir></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="b62d7dbfc30329545823b8988a78f20a"/></dir><dir name="Model"><file name="Facade.php" hash="254f13fa4cbbe9602ae40c5cd124282e"/><dir name="Handler"><file name="Suggest.php" hash="948fd13668d507ba4ebed7c9a2055be4"/></dir><file name="Observer.php" hash="f23771ea8bd4d679a90282714275aeb7"/><file name="Processor.php" hash="f37cf3fb0c72464f1e651f34d64b44dd"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Imagetype.php" hash="a8a39dc5d44080a3b070bc72f103efef"/></dir></dir></dir></dir><dir name="controllers"><file name="ProxyController.php" hash="68fc8cee37a52a538762252e47f340a1"/></dir><dir name="etc"><file name="config.xml" hash="5e6b384d971afc4a0c6b7cc4d437badf"/><file name="system.xml" hash="10d1692d1a09edc2edb5344d41a1d9ae"/></dir></dir><dir name="Tagcloud"><dir name="Block"><file name="TagCloud.php" hash="d0c6c681b3da27ef349ff1295c5e26a9"/></dir><dir name="Helper"><file name="Data.php" hash="ea2c8093a1d87a8148f1205e8b73cc2d"/></dir><dir name="Model"><file name="Facade.php" hash="69069badc93509011f7c4fa2b1ca3e72"/><dir name="Handler"><file name="TagCloud.php" hash="e2e5ba229002ad3cfa5769a9f74d808b"/></dir></dir><dir name="etc"><file name="config.xml" hash="3ff00cc34fdbaed962f704204ce47f1a"/></dir></dir><dir name="Tracking"><dir name="Block"><file name="Abstract.php" hash="24419c96d9768b86ec890a1b38278e0f"/><file name="Click.php" hash="b85c8619ab7a18163a4ce27ffe9fd8da"/><file name="Recommendation.php" hash="0ed995b57afb6efa4a72d414dc7db3bf"/></dir><dir name="Helper"><file name="Data.php" hash="f0018ce83f815b057fab66351e58fdb6"/></dir><dir name="Model"><file name="Facade.php" hash="f8684a20a82bff4b668af460af476d41"/><dir name="Handler"><file name="Tracking.php" hash="9672d838ac3775c8a7dc4ef70593ca7e"/></dir><file name="Observer.php" hash="69e6c0236f629cb7f5b168b7ce3b6b84"/><file name="Processor.php" hash="9fd3af06f452ca2cb719d135b6ecda52"/><file name="Queue.php" hash="046d6d464d56a609b71574c6e0a3c4d1"/><dir name="Resource"><dir name="Queue"><file name="Collection.php" hash="daecedd55cb992ae3988305324c8c1b9"/></dir><file name="Queue.php" hash="3be1d09978ae6e8c56fb673931b05479"/></dir></dir><dir name="controllers"><file name="ProxyController.php" hash="33f25104bc086fcbe998459baccdd0b3"/></dir><dir name="etc"><file name="config.xml" hash="e3a33e4ca92d72192bcc0e73eb7db9a5"/><file name="system.xml" hash="3e5a4357f098832fa5e6ef67d1ceecaa"/></dir><dir name="sql"><dir name="factfinder_tracking_setup"><file name="install-1.0.0.php" hash="553ad063abd837a220ebff97618578b4"/><file name="upgrade-1.0.0-4.1.2.php" hash="a80b4f755d0bea172eefebe10b877cd6"/></dir></dir></dir></dir></target><target name="magelib"><dir name="FACTFinder"><dir name="Adapter"><file name="AbstractAdapter.php" hash="b24c565309d7d3b6363b5ab059f9b55f"/><file name="Compare.php" hash="b6452710afb4ff28509f6426c95bec74"/><file name="Import.php" hash="584eecdb7281603ba5ef901082fb52d7"/><file name="ProductCampaign.php" hash="1f05bb0b3911425e2b472cb5c76e705c"/><file name="Recommendation.php" hash="55508a24d0fa324a426bf1cbf1baf913"/><file name="Search.php" hash="29af1b0da523085c0a676331284331ae"/><file name="SimilarRecords.php" hash="2f9c9fd1751dacb1a56c432320d94c19"/><file name="Suggest.php" hash="5f91090f7c7ea764f9fc21938aade3c8"/><file name="TagCloud.php" hash="fe1faf30373e91b96e57c08fb64df23a"/><file name="Tracking.php" hash="b71446f5d1ba0e44c09ae4e7012bca55"/></dir><dir name="Core"><file name="AbstractConfiguration.php" hash="a6f7c0b9013a7986a1fa798e8fc3414c"/><file name="AbstractEncodingConverter.php" hash="7946720c77c47e3ed2070606a74a48cb"/><file name="ArrayConfiguration.php" hash="dc60873fa6eed180126944247cb4de99"/><dir name="Client"><file name="RequestParser.php" hash="bc5dabb648f7278db4a1c5f14af4dfa0"/><file name="UrlBuilder.php" hash="d73cc166fcf20b7623ea0f7c319d3224"/></dir><file name="ConfigurationInterface.php" hash="1158aaee6a7502cf81bf27b8ed0c76ff"/><file name="IConvEncodingConverter.php" hash="5c504a3229cc8a59c09f03f3bf2c9348"/><file name="ManualConfiguration.php" hash="a49d0b05cc319b807c40b37a861b060d"/><dir name="Page"><file name=".gitignore" hash="d41d8cd98f00b204e9800998ecf8427e"/></dir><file name="ParametersConverter.php" hash="9c01642c6de1842b8f1b4e8d9f93017e"/><dir name="Server"><file name="AbstractDataProvider.php" hash="8d33ddebe3d3e60b72893188d7f2369f"/><file name="ConnectionData.php" hash="c4246099ec93e7f589c0e22179d9557a"/><file name="EasyCurlDataProvider.php" hash="48f452cd3ca1dcf3b4e7cc4d8b59c8a9"/><file name="EasyCurlRequestFactory.php" hash="61f88e882120dca5e5e1964d1f898527"/><file name="FileSystemDataProvider.php" hash="30b428e2b76307b1143057a155371c34"/><file name="FileSystemRequestFactory.php" hash="f0a464725448393e64948a6063208d91"/><file name="MultiCurlDataProvider.php" hash="2e467a4976694ef4e7775d913dafedf4"/><file name="MultiCurlRequestFactory.php" hash="41f978e0dd60065026dc5adced1f9503"/><file name="NullResponse.php" hash="3a419c1ea234ef20e1330c7b445eb9c6"/><file name="Request.php" hash="08ddaaa7701558e1802408089d15b5dd"/><file name="RequestFactoryInterface.php" hash="65cfad6045407bdd63af980f6f996c99"/><file name="Response.php" hash="695c80ce5ee4e8dc38c78d0349e1f31b"/><file name="UrlBuilder.php" hash="6f468178b95a96f6217f44f9ef392cfb"/></dir><file name="Utf8EncodingConverter.php" hash="1cb05e6f174e36ed3cce6e2a7eb987ed"/><file name="XmlConfiguration.php" hash="faafd887682d6aa01f61604df24df277"/></dir><dir name="Custom"><file name=".gitignore" hash="d41d8cd98f00b204e9800998ecf8427e"/></dir><dir name="Data"><file name="AdvisorAnswer.php" hash="55ffe5c6f8e1363d1d02875feec202d1"/><file name="AdvisorQuestion.php" hash="baa784c529640f2976b22262ec6f8983"/><file name="AfterSearchNavigation.php" hash="f1d08832e73cf45b8a35d99020aa49ea"/><file name="ArticleNumberSearchStatus.php" hash="da1966d4016c32ea492b8b6b931d8222"/><file name="BreadCrumb.php" hash="84b69c8df53c6d9eb721950a29e4a84d"/><file name="BreadCrumbTrail.php" hash="324bb6a06c0058e53c58bd3f96fe0ff3"/><file name="BreadCrumbType.php" hash="c9c3568bbfa4989517ee8f3b9c779fa2"/><file name="Campaign.php" hash="23966a3bea56ac66ff2b795e11983c6a"/><file name="CampaignIterator.php" hash="503766bc960efe69e861c2f45dce77d2"/><file name="Filter.php" hash="aafda20fe7c992af46316d74be33ec73"/><file name="FilterGroup.php" hash="8820c34c807044489682a290e86466b6"/><file name="FilterSelectionType.php" hash="bd0d0676af5d0182f6b6631e6df8ecb9"/><file name="FilterStyle.php" hash="1299441866fb075e331d2f9ca2755091"/><file name="FilterType.php" hash="b073cf2f411298509337808624666687"/><file name="Item.php" hash="b91116ddeb81c0b90e76a2a4f7b51261"/><file name="Page.php" hash="35daab87fdc5e3b4732480996b982364"/><file name="Paging.php" hash="1b06374d761489582de08551f17a58a1"/><file name="Record.php" hash="cd62198f27ebbb1e0a88008642c7157a"/><file name="Result.php" hash="01b94e91b11b61d794fb9ff40d6148d3"/><file name="ResultsPerPageOptions.php" hash="ae22d184bf43cd7b11cad567489a2261"/><file name="SearchParameters.php" hash="d7041887d5f65e763c7a2e0a323b18fd"/><file name="SearchStatus.php" hash="356fd9774c237a0e26ac85a6186bccfd"/><file name="SingleWordSearchItem.php" hash="db057d7f0460f29c5b31ab9689b3906b"/><file name="SliderFilter.php" hash="344d226acde13ec85f59d5a97cf8afc5"/><file name="Sorting.php" hash="284b4811c99ad057d08caead45ea2dee"/><file name="SortingDirection.php" hash="ec86bc437928a4aa623a8c098c94f435"/><file name="SortingItem.php" hash="428e8c59a5372cafc5ec69bf868dea18"/><file name="SortingItems.php" hash="4fd36b79ed02099265103e1e81c71557"/><file name="SuggestQuery.php" hash="4011313cfd853eace88c399444ffa4cc"/><file name="TagQuery.php" hash="a4460d5e8a9f918eea820a029dc21290"/></dir><file name="Loader.php" hash="cf900585b0fd44978f97e7a2b2279a99"/><dir name="Util"><file name="Curl.php" hash="c9cbe7b2116dd6160b8db3a14b634561"/><file name="CurlHandle.php" hash="bea42fdebc33e31cf58889de18232d3e"/><file name="CurlInterface.php" hash="1858bc215b7706ba81ff6e14aa2f4750"/><file name="CurlMultiHandle.php" hash="2085a5a09c218971412a44c0dad6bf72"/><file name="CurlStub.php" hash="555c36a9a5352e1a6acfd65a68cf911b"/><file name="Log4PhpLogger.php" hash="d232fe476b310ec8692877edddc972e4"/><file name="LoggerInterface.php" hash="36dfa3ee8a089595ef285806d0068b27"/><file name="NullLogger.php" hash="51e1a2a9c89a9efba49d0a0d3ee9325d"/><file name="Parameters.php" hash="6bb6f333d55dd7bce2a0014f10edbc29"/><file name="Pimple.php" hash="fb5e70660a5fe56edfdf11bec1ba6009"/></dir></dir><dir name="FACTFinderCustom"><file name="Configuration.php" hash="93832ed3840c5899c9c761c702dec17b"/></dir><dir name="log4php"><file name="Logger.php" hash="39841035ea058cc62571fcb9b4f3aa43"/><file name="LoggerAppender.php" hash="a8b07b24ee26931cef9373163542128a"/><file name="LoggerAppenderPool.php" hash="7e44ee58fbd3c50ae51c98742aa4f327"/><file name="LoggerAutoloader.php" hash="5aa85dd61ff00167d2b9d482bf418c77"/><file name="LoggerConfigurable.php" hash="4c89cbf3c90a724930c6d46995da16bd"/><file name="LoggerConfigurator.php" hash="b8ac801c410e0515fbd5ec6b67dfb40b"/><file name="LoggerException.php" hash="c91fd8cc5bfee3cad373f8ed9440458c"/><file name="LoggerFilter.php" hash="39b6689eeb15e468781c0a62a8f482b5"/><file name="LoggerHierarchy.php" hash="be16af259ec43bef5c49bd1118e94859"/><file name="LoggerLayout.php" hash="7c089f20f7abba10699de2bd4423af7c"/><file name="LoggerLevel.php" hash="f380928eb1aac5ade3d7654f200ebb81"/><file name="LoggerLocationInfo.php" hash="33f1a195cfdcc7ebf681a3085eb6b228"/><file name="LoggerLoggingEvent.php" hash="f227e5ae0d04fef3a36899906d4ad478"/><file name="LoggerMDC.php" hash="64868651982829e59d3b316498145a79"/><file name="LoggerNDC.php" hash="482045e33b9fe22e53269c021cbfe877"/><file name="LoggerReflectionUtils.php" hash="174b22dd241ba4263aba8d978d37959f"/><file name="LoggerRoot.php" hash="0d762ed21fdff2708adab3068b94c2c3"/><file name="LoggerThrowableInformation.php" hash="76d98d20d55cf0e3bd4b1b138023c3af"/><dir name="appenders"><file name="LoggerAppenderConsole.php" hash="5eefc20589c86b11d2832f9a8fafa44f"/><file name="LoggerAppenderDailyFile.php" hash="f97b57f6b0b9dba2f650ae5e17d9f28b"/><file name="LoggerAppenderEcho.php" hash="76824ae7be6503e8c5ca3a9fc15b7816"/><file name="LoggerAppenderFile.php" hash="92481c41d6f9d3d2cf6cfc82c7c0ef22"/><file name="LoggerAppenderFirePHP.php" hash="1eccdf817ff2e0204265a5a77901f0a1"/><file name="LoggerAppenderMail.php" hash="a23d71d709af265b20797eeb0d71911e"/><file name="LoggerAppenderMailEvent.php" hash="f853e9e18511ab18873484882c744655"/><file name="LoggerAppenderMongoDB.php" hash="494b30e44a3add5eeb9c0d54ea88c29b"/><file name="LoggerAppenderNull.php" hash="ec6ca85fadc4d71f75b5e8e13df6e058"/><file name="LoggerAppenderPDO.php" hash="4388d8e542fe680228365ffd48d8ab6d"/><file name="LoggerAppenderPhp.php" hash="9853767b74b8234361ace83867c9f18d"/><file name="LoggerAppenderRollingFile.php" hash="5bc49b8f05b36842b800d699bfe05e45"/><file name="LoggerAppenderSocket.php" hash="6111536426fdf6f8a4adafb460510301"/><file name="LoggerAppenderSyslog.php" hash="afda0ccf876a87781e58d63104519bdc"/></dir><dir name="configurators"><file name="LoggerConfigurationAdapter.php" hash="b07bade9ae4809776742d3b36ca4feb7"/><file name="LoggerConfigurationAdapterINI.php" hash="bfbca46c36693f098334699c7b71b569"/><file name="LoggerConfigurationAdapterPHP.php" hash="9f9c0bd65cda5224c8e90726baebb363"/><file name="LoggerConfigurationAdapterXML.php" hash="42ec1e713dadb1c6c813df278e6c58cb"/><file name="LoggerConfiguratorDefault.php" hash="a27dd348466a605849ffa946a5fa7bdf"/></dir><dir name="filters"><file name="LoggerFilterDenyAll.php" hash="8800e84c773b87e2638d22d627baae51"/><file name="LoggerFilterLevelMatch.php" hash="2ea447c40baea629486a6b7a4f8f352d"/><file name="LoggerFilterLevelRange.php" hash="b4b6753e0d0a8d734471482bb7b4981c"/><file name="LoggerFilterStringMatch.php" hash="342113e5152ef6e9703807fa36e52785"/></dir><dir name="helpers"><file name="LoggerFormattingInfo.php" hash="89a5ed8f751e4a6a826275619266b911"/><file name="LoggerOptionConverter.php" hash="e02f5ffc3918a0352bf77121e5add1d5"/><file name="LoggerPatternParser.php" hash="a5d4dfeb2a66b022380e0e3d7ba9b318"/><file name="LoggerUtils.php" hash="90264a3263bc4e3a3dac1dbeb3cc35df"/></dir><dir name="layouts"><file name="LoggerLayoutHtml.php" hash="cf6066b51d7ac2de4accaf13f68fb442"/><file name="LoggerLayoutPattern.php" hash="10c48d2fa44953d20fcb3e3542a05ebf"/><file name="LoggerLayoutSerialized.php" hash="cef71f72176167a15c79f5cab5515a77"/><file name="LoggerLayoutSimple.php" hash="ba2aaa713c715b823c4e767a2f0b3e67"/><file name="LoggerLayoutTTCC.php" hash="1ecb0af018b78ad42f4a9d70e182f429"/><file name="LoggerLayoutXml.php" hash="b52409dbb1bacc1c7b4c5ddf66ed8afa"/></dir><dir name="pattern"><file name="LoggerPatternConverter.php" hash="fcbd56bf082b96f02fcf5b0b552de4c1"/><file name="LoggerPatternConverterClass.php" hash="e61c2f7544feee8ee9b966311471a2a7"/><file name="LoggerPatternConverterCookie.php" hash="465d359167443336f258d9b5a89095ef"/><file name="LoggerPatternConverterDate.php" hash="4a399075a3c2d7542e3c649f55162482"/><file name="LoggerPatternConverterEnvironment.php" hash="829265aa84843818bd9faf3bd42b0432"/><file name="LoggerPatternConverterFile.php" hash="a7091f0857b99db4e00c33b61df5e3d3"/><file name="LoggerPatternConverterLevel.php" hash="6219dcb0d8630e6f69cbf4ba669fd11f"/><file name="LoggerPatternConverterLine.php" hash="a27bf38b5c6453a9925d365bde65fe47"/><file name="LoggerPatternConverterLiteral.php" hash="a2cd9e35ca6253cde6a467320837a767"/><file name="LoggerPatternConverterLocation.php" hash="b88efadaccdf31b25b1fb14866c106a0"/><file name="LoggerPatternConverterLogger.php" hash="4342ab32fa26cdf53308896272c2e36b"/><file name="LoggerPatternConverterMDC.php" hash="d241043bc9ea9ecdbf3a0ae5d5a42206"/><file name="LoggerPatternConverterMessage.php" hash="cad3040a1a3d1d40dc6a26727bebe19d"/><file name="LoggerPatternConverterMethod.php" hash="3208fb30a3bc0a7e0fb281800c43ecef"/><file name="LoggerPatternConverterNDC.php" hash="2e68ba79896c47c5067bbf0b371df260"/><file name="LoggerPatternConverterNewLine.php" hash="291bd541e0f689484a5596323e3cac14"/><file name="LoggerPatternConverterProcess.php" hash="7421d9b9b6a5f8f51c3a9a1c796911a5"/><file name="LoggerPatternConverterRelative.php" hash="24495b25867aac190135610061cd244d"/><file name="LoggerPatternConverterRequest.php" hash="67a484d44fd7ddc06a654995904e9653"/><file name="LoggerPatternConverterServer.php" hash="bef42f8b51bc220453e3f4b1e67e7402"/><file name="LoggerPatternConverterSession.php" hash="7cd6290d364837cd2ff4358c03022e98"/><file name="LoggerPatternConverterSessionID.php" hash="fc7b37aa3cb28fbb09862eb7edc6d042"/><file name="LoggerPatternConverterSuperglobal.php" hash="6b984fb3d26fb0186595370d0f066659"/><file name="LoggerPatternConverterThrowable.php" hash="4ca10f0f20408a30243ff589415634c9"/></dir><dir name="renderers"><file name="LoggerRenderer.php" hash="332819a947805d55c2aa546ced274f01"/><file name="LoggerRendererDefault.php" hash="4c4003cde8e0a74cc562060ca7bccf61"/><file name="LoggerRendererException.php" hash="4b2def2de9aa459bd321e826c02e31c2"/><file name="LoggerRendererMap.php" hash="b9aadee6f31f7cb38210653141b94fa6"/></dir><dir name="xml"><file name="log4php.dtd" hash="fb7e60edf02964352b7ddee1f26d8924"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="factfinder"><file name="asn.xml" hash="05ee1b7d0d34d7e43de8c115aeaab69d"/><file name="campaigns.xml" hash="d722ded27e895f0f0aa15954c46f93f3"/><file name="core.xml" hash="fe920d8ef444afbcfa2053b72bc819fc"/><file name="suggest.xml" hash="9c1a761044cd33da5e028c92ce9abe4f"/><file name="tagcloud.xml" hash="0d31f54985019d96bb1b5af17ccdf0d3"/><file name="tracking.xml" hash="53ce8afeb32391a4b207121a372162a2"/></dir></dir><dir name="template"><dir name="factfinder"><dir name="asn"><dir name="layer"><dir name="filter"><file name="slider.phtml" hash="2004f809f803e17d9739a7173958ceca"/></dir><file name="slider.phtml" hash="d48c9aace222c7525430b5235acd4026"/></dir></dir><dir name="campaigns"><file name="advisory.phtml" hash="3341ee58f81da41020f85c2145048b8b"/><file name="feedback.phtml" hash="4c1868f038a13bd2ca270b7d9a077452"/><file name="pushed.phtml" hash="b76b7c5b064ee6dc86ccc94a363bdb05"/></dir><dir name="core"><dir name="export"><file name="locked.phtml" hash="f0948f48fcc40dfcb21a8da68ce29425"/><file name="nofile.phtml" hash="c304b037812f4c34d7e094fe3b70cd80"/></dir></dir><dir name="suggest"><file name="advancedsuggest.phtml" hash="d94fe357abf9ae7026769e62a3cd9ba9"/></dir><dir name="tracking"><file name="click.phtml" hash="3e545af810a201db7c76c0502f606308"/><file name="recommendation.phtml" hash="02dba2d0cc5e1608682a700916a963d8"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="."><file name="factfinder.xml" hash="f87803fd5c96fc784baff992c2bce96b"/></dir><dir name="modules"><file name="FACTFinder_Asn.xml" hash="a003a8010c577c396c8e2ee5b1ea4417"/><file name="FACTFinder_Campaigns.xml" hash="ccd3080cf57535193a6fe2e6946640fd"/><file name="FACTFinder_Core.xml" hash="80f5142c2acf5ceeca0fd552ddb7ce4c"/><file name="FACTFinder_Recommendation.xml" hash="9742344545ee435a4dc87eb2bb80bf19"/><file name="FACTFinder_Suggest.xml" hash="882806b936029f0ef04d4719542ecea3"/><file name="FACTFinder_Tagcloud.xml" hash="62d3ccec2191e7dfd8225e02912891d2"/><file name="FACTFinder_Tracking.xml" hash="779b734bdcafabab072a1afd9d0bf7c4"/></dir></target><target name="mage"><dir name="shell"><file name="factfinder.php" hash="f5d0ef5e78c29b1e700c822d2c2d491c"/></dir></target><target name="mageweb"><dir name="js"><dir name="factfinder"><file name="jXHR.js" hash="a62424da9902b49a76659683121618d0"/><file name="suggest.js" hash="fcae24ad674632753fc4e14e1c4d6d6c"/><file name="tracking.js" hash="f22da039733a2c67254d41cfa5e6ea9b"/></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="js"><dir name="factfinder_onetouchslider"><file name="234A0ACCECB3C19247FA8B7920453761.cache.js" hash="df488d926e6054769d4731148e707b58"/><file name="25E490B929D7CDBF44085E4E4D9D6F78.cache.js" hash="2a017b95cfbd8653a222660b60697419"/><file name="53ABFAE8983A4589B497F48695DB2A7C.cache.js" hash="b6b02347438384cc886b2509426826b5"/><file name="75B23D057185BAB61CFE100CE08C4D84.cache.js" hash="ec9c94e05e64372a9636ef03e688d451"/><file name="79DD9AE9135ADFDE204324DA7F1B1405.cache.png" hash="6ba720deee377e093c5f5b0423c152df"/><file name="9F0D0456482D7A7A901A2CD8F64EA019.cache.js" hash="dad64db53266865af02c620795c6ab13"/><file name="clear.cache.gif" hash="6d22e4f2d2057c6e8d6fab098e76e80f"/><file name="de.factfinder.asn.slider.OneTouchSlider.nocache.js" hash="f92d47fc9eb8cf8ff78173997f5a4a7a"/></dir></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.3.0</min><max>7.1.0</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Flagbit_Factfinder</name>
4
+ <version>4.1.10</version>
5
  <stability>stable</stability>
6
  <license uri="https://opensource.org/licenses/MIT">MIT</license>
7
  <channel>community</channel>
8
  <extends/>
9
+ <summary>4.1.10 Release</summary>
10
+ <description>4.1.10 Release</description>
11
  <notes>Release</notes>
12
  <authors><author><name>FACTFinder</name><user>FACT_Finder</user><email>info@flagbit.de</email></author></authors>
13
+ <date>2016-09-02</date>
14
+ <time>13:09:08</time>
15
+ <contents><target name="magecommunity"><dir name="FACTFinder"><dir name="Asn"><dir name="Block"><dir name="Catalog"><dir name="Layer"><file name="Factfinder.php" hash="0e79d252a2752aab67f7490436350fe7"/><file name="State.php" hash="2bf2c99237e881372fdc074c3505d188"/></dir><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="9b0c98e266174c8f8b02b896a556b769"/></dir><file name="Pager.php" hash="ec87967ba312a3d589e0af0afbacdd0a"/></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="668be3edd4c8f6d0e051252d2e52d545"/></dir><dir name="Model"><dir name="Catalog"><file name="Layer.php" hash="6dafe882395b5d09f84c102f3b785410"/></dir><dir name="Handler"><file name="Search.php" hash="bbec7bd87e1d2f15792fdda46f34eb52"/></dir><dir name="Layer"><dir name="Filter"><file name="Factfinder.php" hash="2666ae9c79aa939e9539a1af5b0f7784"/><file name="Item.php" hash="a68545b4cb4487691ae75cdbf47af377"/></dir></dir><file name="Observer.php" hash="9ec46432b3d3170b626cfb4439315209"/><dir name="Resource"><dir name="Product"><dir name="Attribute"><file name="Collection.php" hash="03b060fd637de1fd632f1b9784b1124c"/></dir></dir><dir name="Search"><file name="Collection.php" hash="3e7a88eb53ccfb79b4448f9eb7bd4177"/></dir></dir></dir><dir name="etc"><file name="config.xml" hash="e07b890b06b00d94bc4a4a5931325366"/><file name="system.xml" hash="d76e04ebe1d564be4113c1428fdfc637"/></dir></dir><dir name="Campaigns"><dir name="Block"><file name="Abstract.php" hash="cc5e41bb89f07f191be99430451221fa"/><dir name="Advisory"><file name="Search.php" hash="1d4bf82a7baffbe64be17216436c35d4"/></dir><dir name="Feedback"><file name="Abstract.php" hash="018e415bdd754127cfad8bfa5881c0ce"/><file name="Cart.php" hash="35f9fec2518383c909495af90b324b8b"/><file name="Product.php" hash="82999021756a26d81bf829b9aa4dd5cc"/><file name="Search.php" hash="ebf3d35f6425b771291b08f696169d04"/></dir><dir name="Pushed"><file name="Abstract.php" hash="fbfbf5cb5c1ebce8e588ac7af1f1458d"/><file name="Cart.php" hash="741d3bd71ce91cd583778a5e26be9ff5"/><file name="Product.php" hash="c1e774c4ceb71469080e49557887a893"/><file name="Search.php" hash="ae352cfd5ca8bdf2a0b46d1148c710ae"/></dir></dir><dir name="Helper"><file name="Data.php" hash="c7882a90dca46e639a5e4c64bef153ff"/></dir><dir name="Model"><file name="Facade.php" hash="44fc55139509b76f19b7c95c6a81eb4c"/><dir name="Handler"><file name="Abstract.php" hash="e6d76eeb23fb5bef16efbfa3da0fecdc"/><file name="Cart.php" hash="128dd5052d20384ea2220020469f7cf6"/><file name="Product.php" hash="8d48380fbccec220bc4caabbcb5d7d7d"/><file name="Search.php" hash="e039a207ca98655c647355ebf287566d"/></dir><file name="Observer.php" hash="043e7411be7ec13a656b07750a7811af"/><dir name="Resource"><dir name="Pushedproducts"><file name="Collection.php" hash="569856158dee935d611ebc30f426835c"/></dir></dir></dir><dir name="etc"><file name="config.xml" hash="8f6b7cec7cff39b149beeffb39764668"/><file name="system.xml" hash="54992bb35ac6088733d3f18408872fdb"/></dir></dir><dir name="Core"><dir name="Block"><dir name="Adminhtml"><file name="Exportlink.php" hash="7a845ee8974cfcf74d9a32fed2ac0b21"/><dir name="Form"><dir name="Field"><file name="Attribute.php" hash="bea2183e56100233e7aebaccd6680c6f"/><file name="Attributes.php" hash="292742f954dec1863caaee9313a237c9"/></dir></dir></dir><dir name="Catalog"><dir name="Product"><dir name="List"><file name="Toolbar.php" hash="b9438ae943def50b46531ac1265e0634"/></dir><file name="Pager.php" hash="aa301fb57966bafcc370fa510d2ad146"/></dir></dir><dir name="CatalogSearch"><file name="Layer.php" hash="ad3dcdd26b5a723e43c7b8011a4ea25f"/></dir><dir name="EnterpriseSearch"><file name="Layer.php" hash="19455e36be3e0c14cabba762ccbdef1a"/></dir></dir><dir name="Helper"><file name="Backend.php" hash="f30c89ca668b193a8fc8bf00eda34413"/><file name="Data.php" hash="5108935421d26c45a63676b6b97f3044"/><file name="Debug.php" hash="c563d343c68db980e9256dc510e78ea1"/><file name="Export.php" hash="5b84cbf3c114593cd691e192f2ece920"/><file name="Rewrite.php" hash="30921c0924e535d669ecdd7e9592f883"/><file name="Search.php" hash="fd1e90271d620c57a0cb7b80e33f536f"/></dir><dir name="Model"><file name="Autoloader.php" hash="29370ccbcd483f93be86999485889900"/><dir name="CatalogSearch"><file name="Layer.php" hash="8d15e27cca249cd3827d33e9acdbb369"/><file name="Query.php" hash="4f5b732eb28a7c1efde28eb602c38772"/></dir><dir name="Export"><file name="Observer.php" hash="03a94f73f89b923c374a2663b03e3497"/><file name="Price.php" hash="1128559eb16cf0d562ad22af9ccdd1a4"/><file name="Product.php" hash="efddf1144d043892d1cf0fa46e8fb294"/><file name="Stock.php" hash="d6531c28c572968ab82d3282eda9b29a"/></dir><file name="Facade.php" hash="b2fd0c05a687db4c784111ecb4da9ef8"/><file name="File.php" hash="77cc3d2067b42c2cad6f21dcb6d7a73e"/><file name="Ftp.php" hash="d70cfab0ce607aca6efa32d82d3a85c3"/><dir name="Handler"><file name="Abstract.php" hash="1924821d13996f9f672369b63a05ac08"/><file name="Search.php" hash="31e58f2022169272740ad0d79674d0d8"/><file name="Status.php" hash="635b9cb62808803be64d373dc2a0e808"/></dir><file name="Observer.php" hash="e5decfa3b52571cb75335dd41b1927f5"/><dir name="Resource"><file name="Export.php" hash="b0db501cd527c64278519796cf8f39f1"/><file name="Fulltext.php" hash="dfbece11e5fe8224c94d1e1bb7affe3e"/><dir name="Search"><file name="Collection.php" hash="50596cf9508d0d96a4bb315a50f35984"/><file name="Engine.php" hash="602547a2d224f80933b6681db1cb3cc4"/></dir></dir><dir name="System"><dir name="Config"><dir name="Backend"><file name="Attributes.php" hash="d877a4da13c592f5b8260b202bcead13"/><file name="Cron.php" hash="f24b6995fea6309acb720876f3156270"/><file name="Enabled.php" hash="cb13a29b7100518350a7e5830180e9bd"/><file name="Engine.php" hash="ef1f702d79c7ed0fe72437ca4bf13a19"/></dir><dir name="Source"><file name="Authtype.php" hash="7ce07da0f6bcb8e88b5699ace77e6f31"/><file name="Engine.php" hash="8f1c2f344aa3182c312a665488661fa5"/><file name="Identifier.php" hash="a80606fe94b2eaf78f8d07628f2a64f0"/><file name="Protocol.php" hash="310b7fd8648b60f5cc9c3e3c9f87345c"/></dir></dir></dir><file name="Url.php" hash="57e5e87457b3051cec9bc3c988f79282"/></dir><dir name="controllers"><file name="ExportController.php" hash="4e0800619796d128a9466c84fecd3b56"/></dir><dir name="etc"><file name="adminhtml.xml" hash="0247e1b846aefb3fb9c5c0706681a586"/><file name="config.xml" hash="471974367bce221b6795be5f4015a6e9"/><file name="system.xml" hash="8722773df22bda2a415e2cb3f87ee2f1"/></dir></dir><dir name="Recommendation"><dir name="Helper"><file name="Data.php" hash="6312dfdef17070694f59139acbb2d5e1"/></dir><dir name="Model"><file name="Facade.php" hash="ed9c246bc831c7f3950a88853d401288"/><dir name="Handler"><file name="Recommendations.php" hash="f5645b78a6dca466af5b22ff0456ca71"/></dir><file name="Observer.php" hash="4db52b3863efccd17b19e92e6ff2521e"/></dir><dir name="etc"><file name="config.xml" hash="03ec96e0fa78fdfbc3d4d5fac7193704"/><file name="system.xml" hash="f841228bf8a5397fe18da6186c5e3208"/></dir></dir><dir name="Suggest"><dir name="Block"><file name="TopSearch.php" hash="96fc7e73d907a0438111253ae6c5fc6f"/><dir name="XmlConnect"><dir name="Catalog"><dir name="Search"><file name="Suggest.php" hash="150658cb1d7bc7ae5b4566ed1331bb12"/></dir></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="1d9e6e162f27abc911a1e19d02ea86a3"/></dir><dir name="Model"><file name="Facade.php" hash="254f13fa4cbbe9602ae40c5cd124282e"/><dir name="Handler"><file name="Suggest.php" hash="948fd13668d507ba4ebed7c9a2055be4"/></dir><file name="Observer.php" hash="f23771ea8bd4d679a90282714275aeb7"/><file name="Processor.php" hash="f37cf3fb0c72464f1e651f34d64b44dd"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Imagetype.php" hash="a8a39dc5d44080a3b070bc72f103efef"/></dir></dir></dir></dir><dir name="controllers"><file name="ProxyController.php" hash="68fc8cee37a52a538762252e47f340a1"/></dir><dir name="etc"><file name="config.xml" hash="5e6b384d971afc4a0c6b7cc4d437badf"/><file name="system.xml" hash="10d1692d1a09edc2edb5344d41a1d9ae"/></dir></dir><dir name="Tagcloud"><dir name="Block"><file name="TagCloud.php" hash="d0c6c681b3da27ef349ff1295c5e26a9"/></dir><dir name="Helper"><file name="Data.php" hash="ea2c8093a1d87a8148f1205e8b73cc2d"/></dir><dir name="Model"><file name="Facade.php" hash="69069badc93509011f7c4fa2b1ca3e72"/><dir name="Handler"><file name="TagCloud.php" hash="e2e5ba229002ad3cfa5769a9f74d808b"/></dir></dir><dir name="etc"><file name="config.xml" hash="3ff00cc34fdbaed962f704204ce47f1a"/></dir></dir><dir name="Tracking"><dir name="Block"><file name="Abstract.php" hash="24419c96d9768b86ec890a1b38278e0f"/><file name="Click.php" hash="9fe6720543830930d97d7eb16f7fb489"/><file name="Recommendation.php" hash="0ed995b57afb6efa4a72d414dc7db3bf"/></dir><dir name="Helper"><file name="Data.php" hash="f0018ce83f815b057fab66351e58fdb6"/></dir><dir name="Model"><file name="Facade.php" hash="f8684a20a82bff4b668af460af476d41"/><dir name="Handler"><file name="Tracking.php" hash="9672d838ac3775c8a7dc4ef70593ca7e"/></dir><file name="Observer.php" hash="69e6c0236f629cb7f5b168b7ce3b6b84"/><file name="Processor.php" hash="9fd3af06f452ca2cb719d135b6ecda52"/><file name="Queue.php" hash="046d6d464d56a609b71574c6e0a3c4d1"/><dir name="Resource"><dir name="Queue"><file name="Collection.php" hash="daecedd55cb992ae3988305324c8c1b9"/></dir><file name="Queue.php" hash="3be1d09978ae6e8c56fb673931b05479"/></dir></dir><dir name="controllers"><file name="ProxyController.php" hash="33f25104bc086fcbe998459baccdd0b3"/></dir><dir name="etc"><file name="config.xml" hash="e3a33e4ca92d72192bcc0e73eb7db9a5"/><file name="system.xml" hash="3e5a4357f098832fa5e6ef67d1ceecaa"/></dir><dir name="sql"><dir name="factfinder_tracking_setup"><file name="install-1.0.0.php" hash="553ad063abd837a220ebff97618578b4"/><file name="upgrade-1.0.0-4.1.2.php" hash="a80b4f755d0bea172eefebe10b877cd6"/></dir></dir></dir></dir></target><target name="magelib"><dir name="FACTFinder"><dir name="Adapter"><file name="AbstractAdapter.php" hash="91eae466a803590699160600c430eab6"/><file name="Compare.php" hash="6b7cbae461ef45587c565affadbf8664"/><file name="ConfigurableResponse.php" hash="8ffa7eaa12d448a7bd4a9bba9975c573"/><file name="Import.php" hash="584eecdb7281603ba5ef901082fb52d7"/><file name="PersonalisedResponse.php" hash="6b62c326d25e123f686baa358a1b258b"/><file name="ProductCampaign.php" hash="945181a15218fd90721d3258eaf2fd17"/><file name="Recommendation.php" hash="0bcc4ccce41f40d343ebe19c901bea69"/><file name="Search.php" hash="202f3e5d444edb8be0b4e187bd98ea78"/><file name="SimilarRecords.php" hash="b80691760f993d2a43cbe2eb933090fe"/><file name="Suggest.php" hash="5f91090f7c7ea764f9fc21938aade3c8"/><file name="TagCloud.php" hash="fe1faf30373e91b96e57c08fb64df23a"/><file name="Tracking.php" hash="18948f9db1782730258a0e83f6f517b9"/></dir><dir name="Core"><file name="AbstractConfiguration.php" hash="d9341f7f13615a8a0c2805b2021cdfc8"/><file name="AbstractEncodingConverter.php" hash="7946720c77c47e3ed2070606a74a48cb"/><file name="ArrayConfiguration.php" hash="dc60873fa6eed180126944247cb4de99"/><dir name="Client"><file name="RequestParser.php" hash="bc5dabb648f7278db4a1c5f14af4dfa0"/><file name="UrlBuilder.php" hash="d73cc166fcf20b7623ea0f7c319d3224"/></dir><file name="ConfigurationInterface.php" hash="1158aaee6a7502cf81bf27b8ed0c76ff"/><file name="IConvEncodingConverter.php" hash="5c504a3229cc8a59c09f03f3bf2c9348"/><file name="ManualConfiguration.php" hash="a49d0b05cc319b807c40b37a861b060d"/><dir name="Page"><file name=".gitignore" hash="d41d8cd98f00b204e9800998ecf8427e"/></dir><file name="ParametersConverter.php" hash="9c01642c6de1842b8f1b4e8d9f93017e"/><dir name="Server"><file name="AbstractDataProvider.php" hash="8d33ddebe3d3e60b72893188d7f2369f"/><file name="ConnectionData.php" hash="c4246099ec93e7f589c0e22179d9557a"/><file name="EasyCurlDataProvider.php" hash="48f452cd3ca1dcf3b4e7cc4d8b59c8a9"/><file name="EasyCurlRequestFactory.php" hash="61f88e882120dca5e5e1964d1f898527"/><file name="FileSystemDataProvider.php" hash="30b428e2b76307b1143057a155371c34"/><file name="FileSystemRequestFactory.php" hash="f0a464725448393e64948a6063208d91"/><file name="MultiCurlDataProvider.php" hash="2e467a4976694ef4e7775d913dafedf4"/><file name="MultiCurlRequestFactory.php" hash="41f978e0dd60065026dc5adced1f9503"/><file name="NullResponse.php" hash="3a419c1ea234ef20e1330c7b445eb9c6"/><file name="Request.php" hash="08ddaaa7701558e1802408089d15b5dd"/><file name="RequestFactoryInterface.php" hash="65cfad6045407bdd63af980f6f996c99"/><file name="Response.php" hash="695c80ce5ee4e8dc38c78d0349e1f31b"/><file name="UrlBuilder.php" hash="6f468178b95a96f6217f44f9ef392cfb"/></dir><file name="Utf8EncodingConverter.php" hash="1cb05e6f174e36ed3cce6e2a7eb987ed"/><file name="XmlConfiguration.php" hash="faafd887682d6aa01f61604df24df277"/></dir><dir name="Custom"><file name=".gitignore" hash="d41d8cd98f00b204e9800998ecf8427e"/></dir><dir name="Data"><file name="AdvisorAnswer.php" hash="55ffe5c6f8e1363d1d02875feec202d1"/><file name="AdvisorQuestion.php" hash="baa784c529640f2976b22262ec6f8983"/><file name="AfterSearchNavigation.php" hash="f1d08832e73cf45b8a35d99020aa49ea"/><file name="ArticleNumberSearchStatus.php" hash="da1966d4016c32ea492b8b6b931d8222"/><file name="BreadCrumb.php" hash="84b69c8df53c6d9eb721950a29e4a84d"/><file name="BreadCrumbTrail.php" hash="324bb6a06c0058e53c58bd3f96fe0ff3"/><file name="BreadCrumbType.php" hash="c9c3568bbfa4989517ee8f3b9c779fa2"/><file name="Campaign.php" hash="23966a3bea56ac66ff2b795e11983c6a"/><file name="CampaignIterator.php" hash="503766bc960efe69e861c2f45dce77d2"/><file name="Filter.php" hash="aafda20fe7c992af46316d74be33ec73"/><file name="FilterGroup.php" hash="8820c34c807044489682a290e86466b6"/><file name="FilterSelectionType.php" hash="bd0d0676af5d0182f6b6631e6df8ecb9"/><file name="FilterStyle.php" hash="1299441866fb075e331d2f9ca2755091"/><file name="FilterType.php" hash="b073cf2f411298509337808624666687"/><file name="Item.php" hash="b91116ddeb81c0b90e76a2a4f7b51261"/><file name="Page.php" hash="35daab87fdc5e3b4732480996b982364"/><file name="Paging.php" hash="1b06374d761489582de08551f17a58a1"/><file name="Record.php" hash="cd62198f27ebbb1e0a88008642c7157a"/><file name="Result.php" hash="01b94e91b11b61d794fb9ff40d6148d3"/><file name="ResultsPerPageOptions.php" hash="ae22d184bf43cd7b11cad567489a2261"/><file name="SearchParameters.php" hash="e8e1f9d24396f864f0367c9c6d575a37"/><file name="SearchStatus.php" hash="356fd9774c237a0e26ac85a6186bccfd"/><file name="SingleWordSearchItem.php" hash="db057d7f0460f29c5b31ab9689b3906b"/><file name="SliderFilter.php" hash="344d226acde13ec85f59d5a97cf8afc5"/><file name="Sorting.php" hash="284b4811c99ad057d08caead45ea2dee"/><file name="SortingDirection.php" hash="ec86bc437928a4aa623a8c098c94f435"/><file name="SortingItem.php" hash="428e8c59a5372cafc5ec69bf868dea18"/><file name="SortingItems.php" hash="4fd36b79ed02099265103e1e81c71557"/><file name="SuggestQuery.php" hash="4011313cfd853eace88c399444ffa4cc"/><file name="TagQuery.php" hash="a4460d5e8a9f918eea820a029dc21290"/></dir><file name="Loader.php" hash="cf900585b0fd44978f97e7a2b2279a99"/><dir name="Util"><file name="Curl.php" hash="c9cbe7b2116dd6160b8db3a14b634561"/><file name="CurlHandle.php" hash="bea42fdebc33e31cf58889de18232d3e"/><file name="CurlInterface.php" hash="1858bc215b7706ba81ff6e14aa2f4750"/><file name="CurlMultiHandle.php" hash="2085a5a09c218971412a44c0dad6bf72"/><file name="CurlStub.php" hash="555c36a9a5352e1a6acfd65a68cf911b"/><file name="Log4PhpLogger.php" hash="d232fe476b310ec8692877edddc972e4"/><file name="LoggerInterface.php" hash="36dfa3ee8a089595ef285806d0068b27"/><file name="NullLogger.php" hash="51e1a2a9c89a9efba49d0a0d3ee9325d"/><file name="Parameters.php" hash="6bb6f333d55dd7bce2a0014f10edbc29"/><file name="Pimple.php" hash="fb5e70660a5fe56edfdf11bec1ba6009"/></dir></dir><dir name="FACTFinderCustom"><file name="Configuration.php" hash="93832ed3840c5899c9c761c702dec17b"/></dir><dir name="log4php"><file name="Logger.php" hash="39841035ea058cc62571fcb9b4f3aa43"/><file name="LoggerAppender.php" hash="a8b07b24ee26931cef9373163542128a"/><file name="LoggerAppenderPool.php" hash="7e44ee58fbd3c50ae51c98742aa4f327"/><file name="LoggerAutoloader.php" hash="5aa85dd61ff00167d2b9d482bf418c77"/><file name="LoggerConfigurable.php" hash="4c89cbf3c90a724930c6d46995da16bd"/><file name="LoggerConfigurator.php" hash="b8ac801c410e0515fbd5ec6b67dfb40b"/><file name="LoggerException.php" hash="c91fd8cc5bfee3cad373f8ed9440458c"/><file name="LoggerFilter.php" hash="39b6689eeb15e468781c0a62a8f482b5"/><file name="LoggerHierarchy.php" hash="be16af259ec43bef5c49bd1118e94859"/><file name="LoggerLayout.php" hash="7c089f20f7abba10699de2bd4423af7c"/><file name="LoggerLevel.php" hash="f380928eb1aac5ade3d7654f200ebb81"/><file name="LoggerLocationInfo.php" hash="33f1a195cfdcc7ebf681a3085eb6b228"/><file name="LoggerLoggingEvent.php" hash="f227e5ae0d04fef3a36899906d4ad478"/><file name="LoggerMDC.php" hash="64868651982829e59d3b316498145a79"/><file name="LoggerNDC.php" hash="482045e33b9fe22e53269c021cbfe877"/><file name="LoggerReflectionUtils.php" hash="174b22dd241ba4263aba8d978d37959f"/><file name="LoggerRoot.php" hash="0d762ed21fdff2708adab3068b94c2c3"/><file name="LoggerThrowableInformation.php" hash="76d98d20d55cf0e3bd4b1b138023c3af"/><dir name="appenders"><file name="LoggerAppenderConsole.php" hash="5eefc20589c86b11d2832f9a8fafa44f"/><file name="LoggerAppenderDailyFile.php" hash="f97b57f6b0b9dba2f650ae5e17d9f28b"/><file name="LoggerAppenderEcho.php" hash="76824ae7be6503e8c5ca3a9fc15b7816"/><file name="LoggerAppenderFile.php" hash="92481c41d6f9d3d2cf6cfc82c7c0ef22"/><file name="LoggerAppenderFirePHP.php" hash="1eccdf817ff2e0204265a5a77901f0a1"/><file name="LoggerAppenderMail.php" hash="a23d71d709af265b20797eeb0d71911e"/><file name="LoggerAppenderMailEvent.php" hash="f853e9e18511ab18873484882c744655"/><file name="LoggerAppenderMongoDB.php" hash="494b30e44a3add5eeb9c0d54ea88c29b"/><file name="LoggerAppenderNull.php" hash="ec6ca85fadc4d71f75b5e8e13df6e058"/><file name="LoggerAppenderPDO.php" hash="4388d8e542fe680228365ffd48d8ab6d"/><file name="LoggerAppenderPhp.php" hash="9853767b74b8234361ace83867c9f18d"/><file name="LoggerAppenderRollingFile.php" hash="5bc49b8f05b36842b800d699bfe05e45"/><file name="LoggerAppenderSocket.php" hash="6111536426fdf6f8a4adafb460510301"/><file name="LoggerAppenderSyslog.php" hash="afda0ccf876a87781e58d63104519bdc"/></dir><dir name="configurators"><file name="LoggerConfigurationAdapter.php" hash="b07bade9ae4809776742d3b36ca4feb7"/><file name="LoggerConfigurationAdapterINI.php" hash="bfbca46c36693f098334699c7b71b569"/><file name="LoggerConfigurationAdapterPHP.php" hash="9f9c0bd65cda5224c8e90726baebb363"/><file name="LoggerConfigurationAdapterXML.php" hash="42ec1e713dadb1c6c813df278e6c58cb"/><file name="LoggerConfiguratorDefault.php" hash="a27dd348466a605849ffa946a5fa7bdf"/></dir><dir name="filters"><file name="LoggerFilterDenyAll.php" hash="8800e84c773b87e2638d22d627baae51"/><file name="LoggerFilterLevelMatch.php" hash="2ea447c40baea629486a6b7a4f8f352d"/><file name="LoggerFilterLevelRange.php" hash="b4b6753e0d0a8d734471482bb7b4981c"/><file name="LoggerFilterStringMatch.php" hash="342113e5152ef6e9703807fa36e52785"/></dir><dir name="helpers"><file name="LoggerFormattingInfo.php" hash="89a5ed8f751e4a6a826275619266b911"/><file name="LoggerOptionConverter.php" hash="e02f5ffc3918a0352bf77121e5add1d5"/><file name="LoggerPatternParser.php" hash="a5d4dfeb2a66b022380e0e3d7ba9b318"/><file name="LoggerUtils.php" hash="90264a3263bc4e3a3dac1dbeb3cc35df"/></dir><dir name="layouts"><file name="LoggerLayoutHtml.php" hash="cf6066b51d7ac2de4accaf13f68fb442"/><file name="LoggerLayoutPattern.php" hash="10c48d2fa44953d20fcb3e3542a05ebf"/><file name="LoggerLayoutSerialized.php" hash="cef71f72176167a15c79f5cab5515a77"/><file name="LoggerLayoutSimple.php" hash="ba2aaa713c715b823c4e767a2f0b3e67"/><file name="LoggerLayoutTTCC.php" hash="1ecb0af018b78ad42f4a9d70e182f429"/><file name="LoggerLayoutXml.php" hash="b52409dbb1bacc1c7b4c5ddf66ed8afa"/></dir><dir name="pattern"><file name="LoggerPatternConverter.php" hash="fcbd56bf082b96f02fcf5b0b552de4c1"/><file name="LoggerPatternConverterClass.php" hash="e61c2f7544feee8ee9b966311471a2a7"/><file name="LoggerPatternConverterCookie.php" hash="465d359167443336f258d9b5a89095ef"/><file name="LoggerPatternConverterDate.php" hash="4a399075a3c2d7542e3c649f55162482"/><file name="LoggerPatternConverterEnvironment.php" hash="829265aa84843818bd9faf3bd42b0432"/><file name="LoggerPatternConverterFile.php" hash="a7091f0857b99db4e00c33b61df5e3d3"/><file name="LoggerPatternConverterLevel.php" hash="6219dcb0d8630e6f69cbf4ba669fd11f"/><file name="LoggerPatternConverterLine.php" hash="a27bf38b5c6453a9925d365bde65fe47"/><file name="LoggerPatternConverterLiteral.php" hash="a2cd9e35ca6253cde6a467320837a767"/><file name="LoggerPatternConverterLocation.php" hash="b88efadaccdf31b25b1fb14866c106a0"/><file name="LoggerPatternConverterLogger.php" hash="4342ab32fa26cdf53308896272c2e36b"/><file name="LoggerPatternConverterMDC.php" hash="d241043bc9ea9ecdbf3a0ae5d5a42206"/><file name="LoggerPatternConverterMessage.php" hash="cad3040a1a3d1d40dc6a26727bebe19d"/><file name="LoggerPatternConverterMethod.php" hash="3208fb30a3bc0a7e0fb281800c43ecef"/><file name="LoggerPatternConverterNDC.php" hash="2e68ba79896c47c5067bbf0b371df260"/><file name="LoggerPatternConverterNewLine.php" hash="291bd541e0f689484a5596323e3cac14"/><file name="LoggerPatternConverterProcess.php" hash="7421d9b9b6a5f8f51c3a9a1c796911a5"/><file name="LoggerPatternConverterRelative.php" hash="24495b25867aac190135610061cd244d"/><file name="LoggerPatternConverterRequest.php" hash="67a484d44fd7ddc06a654995904e9653"/><file name="LoggerPatternConverterServer.php" hash="bef42f8b51bc220453e3f4b1e67e7402"/><file name="LoggerPatternConverterSession.php" hash="7cd6290d364837cd2ff4358c03022e98"/><file name="LoggerPatternConverterSessionID.php" hash="fc7b37aa3cb28fbb09862eb7edc6d042"/><file name="LoggerPatternConverterSuperglobal.php" hash="6b984fb3d26fb0186595370d0f066659"/><file name="LoggerPatternConverterThrowable.php" hash="4ca10f0f20408a30243ff589415634c9"/></dir><dir name="renderers"><file name="LoggerRenderer.php" hash="332819a947805d55c2aa546ced274f01"/><file name="LoggerRendererDefault.php" hash="4c4003cde8e0a74cc562060ca7bccf61"/><file name="LoggerRendererException.php" hash="4b2def2de9aa459bd321e826c02e31c2"/><file name="LoggerRendererMap.php" hash="b9aadee6f31f7cb38210653141b94fa6"/></dir><dir name="xml"><file name="log4php.dtd" hash="fb7e60edf02964352b7ddee1f26d8924"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="factfinder"><file name="asn.xml" hash="05ee1b7d0d34d7e43de8c115aeaab69d"/><file name="campaigns.xml" hash="d722ded27e895f0f0aa15954c46f93f3"/><file name="core.xml" hash="fe920d8ef444afbcfa2053b72bc819fc"/><file name="suggest.xml" hash="9c1a761044cd33da5e028c92ce9abe4f"/><file name="tagcloud.xml" hash="0d31f54985019d96bb1b5af17ccdf0d3"/><file name="tracking.xml" hash="53ce8afeb32391a4b207121a372162a2"/></dir></dir><dir name="template"><dir name="factfinder"><dir name="asn"><dir name="layer"><dir name="filter"><file name="slider.phtml" hash="2004f809f803e17d9739a7173958ceca"/></dir><file name="slider.phtml" hash="d48c9aace222c7525430b5235acd4026"/></dir></dir><dir name="campaigns"><file name="advisory.phtml" hash="3341ee58f81da41020f85c2145048b8b"/><file name="feedback.phtml" hash="4c1868f038a13bd2ca270b7d9a077452"/><file name="pushed.phtml" hash="b76b7c5b064ee6dc86ccc94a363bdb05"/></dir><dir name="core"><dir name="export"><file name="locked.phtml" hash="f0948f48fcc40dfcb21a8da68ce29425"/><file name="nofile.phtml" hash="c304b037812f4c34d7e094fe3b70cd80"/></dir></dir><dir name="suggest"><file name="advancedsuggest.phtml" hash="9f74281e6e75d1d3aec83d5d7f026c17"/></dir><dir name="tracking"><file name="click.phtml" hash="3e545af810a201db7c76c0502f606308"/><file name="recommendation.phtml" hash="02dba2d0cc5e1608682a700916a963d8"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="."><file name="factfinder.xml" hash="f87803fd5c96fc784baff992c2bce96b"/></dir><dir name="modules"><file name="FACTFinder_Asn.xml" hash="a003a8010c577c396c8e2ee5b1ea4417"/><file name="FACTFinder_Campaigns.xml" hash="ccd3080cf57535193a6fe2e6946640fd"/><file name="FACTFinder_Core.xml" hash="80f5142c2acf5ceeca0fd552ddb7ce4c"/><file name="FACTFinder_Recommendation.xml" hash="9742344545ee435a4dc87eb2bb80bf19"/><file name="FACTFinder_Suggest.xml" hash="882806b936029f0ef04d4719542ecea3"/><file name="FACTFinder_Tagcloud.xml" hash="62d3ccec2191e7dfd8225e02912891d2"/><file name="FACTFinder_Tracking.xml" hash="779b734bdcafabab072a1afd9d0bf7c4"/></dir></target><target name="mage"><dir name="shell"><file name="factfinder.php" hash="f5d0ef5e78c29b1e700c822d2c2d491c"/></dir></target><target name="mageweb"><dir name="js"><dir name="factfinder"><file name="jXHR.js" hash="a62424da9902b49a76659683121618d0"/><file name="suggest.js" hash="fcae24ad674632753fc4e14e1c4d6d6c"/><file name="tracking.js" hash="f22da039733a2c67254d41cfa5e6ea9b"/></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="js"><dir name="factfinder_onetouchslider"><file name="234A0ACCECB3C19247FA8B7920453761.cache.js" hash="df488d926e6054769d4731148e707b58"/><file name="25E490B929D7CDBF44085E4E4D9D6F78.cache.js" hash="2a017b95cfbd8653a222660b60697419"/><file name="53ABFAE8983A4589B497F48695DB2A7C.cache.js" hash="b6b02347438384cc886b2509426826b5"/><file name="75B23D057185BAB61CFE100CE08C4D84.cache.js" hash="ec9c94e05e64372a9636ef03e688d451"/><file name="79DD9AE9135ADFDE204324DA7F1B1405.cache.png" hash="6ba720deee377e093c5f5b0423c152df"/><file name="9F0D0456482D7A7A901A2CD8F64EA019.cache.js" hash="dad64db53266865af02c620795c6ab13"/><file name="clear.cache.gif" hash="6d22e4f2d2057c6e8d6fab098e76e80f"/><file name="de.factfinder.asn.slider.OneTouchSlider.nocache.js" hash="f92d47fc9eb8cf8ff78173997f5a4a7a"/></dir></dir><dir name="css"><file name="factfinder_suggest.css" hash="1a8a97d65582535cbc74c5599fcb34e1"/></dir></dir></dir></dir></target><target name="magelocale"><dir name="de_DE"><file name="FACTFinder_Suggest.csv" hash="3098dfae8ccf75366dfa093ce5c863f2"/></dir><dir name="en_US"><file name="FACTFinder_Suggest.csv" hash="2e9fd7bbc9407364430a7c281c94ec63"/></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.3.0</min><max>7.1.0</max></php></required></dependencies>
18
  </package>
skin/frontend/base/default/css/factfinder_suggest.css ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .form-search .search-autocomplete.advanced-suggest li {
2
+ overflow: hidden;
3
+ }
4
+
5
+ .form-search .search-autocomplete.advanced-suggest li.delimiter {
6
+ cursor: default;
7
+ font-weight: bold;
8
+ }
9
+
10
+ .form-search .search-autocomplete.advanced-suggest img.thumbnail {
11
+ float:left;
12
+ margin-top: 2px;
13
+ margin-bottom: 3px;
14
+ margin-right: 5px;
15
+ width: 31px;
16
+ height: 31px;
17
+ }