Antidot_Antidot - Version 1.2.3

Version Notes

Fix facet with ampersand configuration for search engine > facets
Replace "-" with "&afs:feed" to separate feeds in url (compatibility with AFS 7.7)
Fix empty facet id sent when performing an empty query to afs to get facets list
Add description node for variants
Add cdata for variant name
Prevent to export empty categories node
Add cdata for variant name
Add variant details for grouped products

Download this release

Release Info

Developer Antidot
Extension Antidot_Antidot
Version 1.2.3
Comparing to
See all releases


Code changes from version 1.2.2 to 1.2.3

Files changed (115) hide show
  1. app/code/community/MDN/Antidot/Block/Catalogsearch/Articles.php +70 -0
  2. app/code/community/MDN/Antidot/Block/Catalogsearch/Banner.php +6 -3
  3. app/code/community/MDN/Antidot/Block/Catalogsearch/Stores.php +70 -0
  4. app/code/community/MDN/Antidot/Block/System/Config/Button/PushStores.php +36 -0
  5. app/code/community/MDN/Antidot/Block/System/Config/Fieldset/Notice.php +3 -0
  6. app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/AcpFeeds.php +97 -0
  7. app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/Facet.php +2 -1
  8. app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/Tabs.php +95 -0
  9. app/code/community/MDN/Antidot/Helper/CatalogSearch/Data.php +12 -6
  10. app/code/community/MDN/Antidot/Helper/Data.php +47 -0
  11. app/code/community/MDN/Antidot/Helper/LogExport.php +1 -1
  12. app/code/community/MDN/Antidot/Model/Export/Abstract.php +58 -16
  13. app/code/community/MDN/Antidot/Model/Export/Article.php +136 -75
  14. app/code/community/MDN/Antidot/Model/Export/Context.php +6 -3
  15. app/code/community/MDN/Antidot/Model/Export/Product.php +1 -2
  16. app/code/community/MDN/Antidot/Model/Export/Store.php +33 -0
  17. app/code/community/MDN/Antidot/Model/Observer.php +108 -2
  18. app/code/community/MDN/Antidot/Model/Resource/Catalog/Product/Collection.php +48 -0
  19. app/code/community/MDN/Antidot/Model/Resource/Engine/Abstract.php +21 -0
  20. app/code/community/MDN/Antidot/Model/Resource/Engine/Antidot.php +36 -13
  21. app/code/community/MDN/Antidot/Model/Search/Search.php +24 -2
  22. app/code/community/MDN/Antidot/Model/Search/Suggest.php +54 -25
  23. app/code/community/MDN/Antidot/Model/Transport/Http.php +7 -2
  24. app/code/community/MDN/Antidot/Test/Block/System/Config/Form/Field/Array/AcpFeeds.php +52 -0
  25. app/code/community/MDN/Antidot/Test/Helper/Data.php +222 -4
  26. app/code/community/MDN/Antidot/Test/Helper/Data/fixtures/testGetActiveResultTabsCase1.yaml +2 -0
  27. app/code/community/MDN/Antidot/Test/Helper/Data/fixtures/testGetActiveResultTabsCase2.yaml +2 -0
  28. app/code/community/MDN/Antidot/Test/Model/Export/Abstract.php +12 -0
  29. app/code/community/MDN/Antidot/Test/Model/Export/Article.php +106 -0
  30. app/code/community/MDN/Antidot/Test/Model/Export/Article/fixtures/testWriteXml.yaml +117 -0
  31. app/code/community/MDN/Antidot/Test/Model/Export/Store.php +26 -0
  32. app/code/community/MDN/Antidot/Test/Model/Observer.php +30 -0
  33. app/code/community/MDN/Antidot/Test/Model/Search/Search.php +55 -0
  34. app/code/community/MDN/Antidot/Test/Model/Search/Suggest.php +59 -3
  35. app/code/community/MDN/Antidot/Test/Model/Search/Suggest/fixtures/testFeedConfig.yaml +36 -0
  36. app/code/community/MDN/Antidot/Test/Model/Transport/Http.php +47 -1
  37. app/code/community/MDN/Antidot/controllers/Adminhtml/Antidot/PushController.php +50 -0
  38. app/code/community/MDN/Antidot/etc/config.xml +46 -29
  39. app/code/community/MDN/Antidot/etc/system.xml +90 -91
  40. app/code/community/MDN/Antidot/sql/Antidot_setup/mysql4-upgrade-1.2.2-1.2.3.php +169 -0
  41. app/design/adminhtml/default/default/template/antidot/system/config/form/field/acpfeeds.phtml +58 -0
  42. app/design/adminhtml/default/default/template/antidot/system/config/form/field/tabs.phtml +58 -0
  43. app/design/frontend/base/default/layout/antidot.xml +11 -0
  44. app/design/frontend/base/default/template/antidot/catalogsearch/result/articles.phtml +17 -0
  45. app/design/frontend/base/default/template/antidot/catalogsearch/result/stores.phtml +22 -0
  46. app/design/frontend/base/default/template/antidot/page/antidot_results.phtml +112 -0
  47. app/design/frontend/rwd/default/template/antidot/page/antidot_results.phtml +129 -0
  48. app/locale/de_AT/MDN_Antidot.csv +24 -1
  49. app/locale/de_CH/MDN_Antidot.csv +24 -1
  50. app/locale/de_DE/MDN_Antidot.csv +24 -1
  51. app/locale/es_AR/MDN_Antidot.csv +24 -1
  52. app/locale/es_CL/MDN_Antidot.csv +24 -1
  53. app/locale/es_CO/MDN_Antidot.csv +24 -1
  54. app/locale/es_CR/MDN_Antidot.csv +24 -1
  55. app/locale/es_ES/MDN_Antidot.csv +24 -1
  56. app/locale/es_MX/MDN_Antidot.csv +24 -1
  57. app/locale/es_PA/MDN_Antidot.csv +24 -1
  58. app/locale/es_PE/MDN_Antidot.csv +24 -1
  59. app/locale/es_VE/MDN_Antidot.csv +24 -1
  60. app/locale/fr_CA/MDN_Antidot.csv +29 -5
  61. app/locale/fr_FR/MDN_Antidot.csv +26 -2
  62. lib/antidot/.travis.yml +1 -0
  63. lib/antidot/AFS/SEARCH/TEST/DATA/introspection_responses.php +468 -0
  64. lib/antidot/AFS/SEARCH/TEST/introspectionTest.php +115 -0
  65. lib/antidot/AFS/SEARCH/TEST/metadataHelperTest.php +106 -0
  66. lib/antidot/AFS/SEARCH/TEST/responseHelperTest.php +70 -0
  67. lib/antidot/AFS/SEARCH/afs_introspection.php +66 -0
  68. lib/antidot/AFS/SEARCH/afs_metadata_helper.php +144 -0
  69. lib/antidot/AFS/SEARCH/afs_response_helper.php +39 -0
  70. lib/antidot/AIF/TEST/authenticationTest.php +6 -1
  71. lib/antidot/AIF/TEST/pafConnectorTest.php +3 -3
  72. lib/antidot/AIF/afs_about_connector.php +1 -1
  73. lib/antidot/AIF/afs_authentication.php +2 -2
  74. lib/antidot/AIF/afs_bows_connector.php +1 -1
  75. lib/antidot/AIF/afs_paf_connector.php +40 -13
  76. lib/antidot/AIF/afs_paf_live_connector.php +5 -2
  77. lib/antidot/AIF/afs_token_authentication.php +10 -4
  78. lib/antidot/AIF/afs_user_authentication.php +14 -12
  79. lib/antidot/COMMON/afs_connector_base.php +6 -0
  80. lib/antidot/afs_lib.php +1 -1
  81. lib/antidot/afs_version.php +1 -1
  82. lib/antidot/doc/data/raw_example.php +338 -13
  83. package.xml +4 -4
  84. skin/frontend/base/default/css/antidot/CollapsibleLists.css +30 -0
  85. skin/frontend/base/default/css/antidot/catalogsearch.css +68 -0
  86. skin/frontend/base/default/css/mdn/antidot/CollapsibleLists.css +0 -44
  87. skin/frontend/base/default/images/{mdn/antidot → antidot}/button-closed.png +0 -0
  88. skin/frontend/base/default/images/{mdn/antidot → antidot}/button-open.png +0 -0
  89. skin/frontend/base/default/images/{mdn/antidot → antidot}/button.png +0 -0
  90. skin/frontend/base/default/images/mdn/antidot/base.gif +0 -0
  91. skin/frontend/base/default/images/mdn/antidot/cd.gif +0 -0
  92. skin/frontend/base/default/images/mdn/antidot/empty.gif +0 -0
  93. skin/frontend/base/default/images/mdn/antidot/folder.gif +0 -0
  94. skin/frontend/base/default/images/mdn/antidot/folderopen.gif +0 -0
  95. skin/frontend/base/default/images/mdn/antidot/globe.gif +0 -0
  96. skin/frontend/base/default/images/mdn/antidot/imgfolder.gif +0 -0
  97. skin/frontend/base/default/images/mdn/antidot/join.gif +0 -0
  98. skin/frontend/base/default/images/mdn/antidot/joinbottom.gif +0 -0
  99. skin/frontend/base/default/images/mdn/antidot/line.gif +0 -0
  100. skin/frontend/base/default/images/mdn/antidot/list-item-contents.png +0 -0
  101. skin/frontend/base/default/images/mdn/antidot/list-item-last-open.png +0 -0
  102. skin/frontend/base/default/images/mdn/antidot/list-item-last.png +0 -0
  103. skin/frontend/base/default/images/mdn/antidot/list-item-open.png +0 -0
  104. skin/frontend/base/default/images/mdn/antidot/list-item-root.png +0 -0
  105. skin/frontend/base/default/images/mdn/antidot/list-item.png +0 -0
  106. skin/frontend/base/default/images/mdn/antidot/minus.gif +0 -0
  107. skin/frontend/base/default/images/mdn/antidot/minusbottom.gif +0 -0
  108. skin/frontend/base/default/images/mdn/antidot/musicfolder.gif +0 -0
  109. skin/frontend/base/default/images/mdn/antidot/nolines_minus.gif +0 -0
  110. skin/frontend/base/default/images/mdn/antidot/nolines_plus.gif +0 -0
  111. skin/frontend/base/default/images/mdn/antidot/page.gif +0 -0
  112. skin/frontend/base/default/images/mdn/antidot/plus.gif +0 -0
  113. skin/frontend/base/default/images/mdn/antidot/plusbottom.gif +0 -0
  114. skin/frontend/base/default/images/mdn/antidot/question.gif +0 -0
  115. skin/frontend/base/default/images/mdn/antidot/trash.gif +0 -0
app/code/community/MDN/Antidot/Block/Catalogsearch/Articles.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Block_Catalogsearch_Articles extends Mage_Core_Block_Template
17
+ {
18
+ protected $_articles = null;
19
+
20
+ /**
21
+ * Return articles
22
+ * @return type
23
+ */
24
+ public function getArticles()
25
+ {
26
+ if ($this->_articles == null)
27
+ {
28
+ $this->loadArticles();
29
+ }
30
+ return $this->_articles;
31
+ }
32
+
33
+ /**
34
+ * Return articles
35
+ * @return boolean
36
+ */
37
+ public function hasArticle()
38
+ {
39
+ return count($this->getArticles())>0;
40
+ }
41
+
42
+ /**
43
+ * Load articles based on antidot results
44
+ */
45
+ protected function loadArticles()
46
+ {
47
+ if ($this->getLayer()) {
48
+ $this->_articles = $this->getLayer()->getProductCollection()->getArticles();
49
+ } else {
50
+ $this->_articles = array();
51
+ }
52
+
53
+ }
54
+
55
+ /**
56
+ * Returns current catalog layer.
57
+ *
58
+ * @return MDN_Antidot_Model_Catalogsearch_Layer|Mage_Catalog_Model_Layer
59
+ */
60
+ public function getLayer()
61
+ {
62
+ $helper = Mage::helper('Antidot');
63
+ if ($helper->isActiveEngine()) {
64
+ return Mage::getSingleton('Antidot/catalogsearch_layer');
65
+ }
66
+
67
+ return null;
68
+ }
69
+
70
+ }
app/code/community/MDN/Antidot/Block/Catalogsearch/Banner.php CHANGED
@@ -44,8 +44,11 @@ class MDN_Antidot_Block_Catalogsearch_Banner extends Mage_Core_Block_Template
44
  */
45
  protected function loadBanners()
46
  {
47
-
48
- $this->_banners = $this->getLayer()->getProductCollection()->getBanners();
 
 
 
49
 
50
  }
51
 
@@ -61,7 +64,7 @@ class MDN_Antidot_Block_Catalogsearch_Banner extends Mage_Core_Block_Template
61
  return Mage::getSingleton('Antidot/catalogsearch_layer');
62
  }
63
 
64
- return parent::getLayer();
65
  }
66
 
67
  }
44
  */
45
  protected function loadBanners()
46
  {
47
+ if ($this->getLayer()) {
48
+ $this->_banners = $this->getLayer()->getProductCollection()->getBanners();
49
+ } else {
50
+ $this->_banners = array();
51
+ }
52
 
53
  }
54
 
64
  return Mage::getSingleton('Antidot/catalogsearch_layer');
65
  }
66
 
67
+ return null;
68
  }
69
 
70
  }
app/code/community/MDN/Antidot/Block/Catalogsearch/Stores.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Block_Catalogsearch_Stores extends Mage_Core_Block_Template
17
+ {
18
+ protected $_stores = null;
19
+
20
+ /**
21
+ * Return stores
22
+ * @return type
23
+ */
24
+ public function getStores()
25
+ {
26
+ if ($this->_stores == null)
27
+ {
28
+ $this->loadStores();
29
+ }
30
+ return $this->_stores;
31
+ }
32
+
33
+ /**
34
+ * Return stores
35
+ * @return boolean
36
+ */
37
+ public function hasStore()
38
+ {
39
+ return count($this->getStores())>0;
40
+ }
41
+
42
+ /**
43
+ * Load stores based on antidot results
44
+ */
45
+ protected function loadStores()
46
+ {
47
+ if ($this->getLayer()) {
48
+ $this->_stores = $this->getLayer()->getProductCollection()->getStores();
49
+ } else {
50
+ $this->_stores = array();
51
+ }
52
+
53
+ }
54
+
55
+ /**
56
+ * Returns current catalog layer.
57
+ *
58
+ * @return MDN_Antidot_Model_Catalogsearch_Layer|Mage_Catalog_Model_Layer
59
+ */
60
+ public function getLayer()
61
+ {
62
+ $helper = Mage::helper('Antidot');
63
+ if ($helper->isActiveEngine()) {
64
+ return Mage::getSingleton('Antidot/catalogsearch_layer');
65
+ }
66
+
67
+ return null;
68
+ }
69
+
70
+ }
app/code/community/MDN/Antidot/Block/System/Config/Button/PushStores.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Block_System_Config_Button_PushStores extends Mage_Adminhtml_Block_System_Config_Form_Field
17
+ {
18
+
19
+ /**
20
+ * {@inherit}
21
+ */
22
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
23
+ {
24
+ $this->setElement($element);
25
+ $url = Mage::helper("adminhtml")->getUrl('adminhtml/antidot_push/store');
26
+
27
+ $html = $this->getLayout()->createBlock('adminhtml/widget_button')
28
+ ->setType('button')
29
+ ->setClass('scalable')
30
+ ->setLabel(Mage::helper('Antidot')->__('Push'))
31
+ ->setOnClick("setLocation('$url')")
32
+ ->toHtml();
33
+
34
+ return $html;
35
+ }
36
+ }
app/code/community/MDN/Antidot/Block/System/Config/Fieldset/Notice.php CHANGED
@@ -50,6 +50,9 @@ class MDN_Antidot_Block_System_Config_Fieldset_Notice
50
  }
51
 
52
  $html .= '</ul>';
 
 
 
53
  $html .= '</div>';
54
  return $html;
55
  }
50
  }
51
 
52
  $html .= '</ul>';
53
+ $html .= '<ul style="margin-bottom:10px;margin-top:10px;margin-left:5px;"><li>';
54
+ $html .= '<a target="_blank "href="http://doc-store.antidot.net/book#!book;uri=aa77b81f03d5e6f1e553b7e6c6fd0e0c;breadcrumb=a909fa5b2c554e4d940a115a476a5fd5">'.$helper->__("Documentation").'</a>';
55
+ $html .= '</ul></li>';
56
  $html .= '</div>';
57
  return $html;
58
  }
app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/AcpFeeds.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Block_System_Config_Form_Field_Array_AcpFeeds extends Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract
17
+ {
18
+
19
+ /**
20
+ * Check if columns are defined, set template
21
+ *
22
+ */
23
+ public function __construct()
24
+ {
25
+ parent::__construct();
26
+ $this->setTemplate('antidot/system/config/form/field/acpfeeds.phtml');
27
+ }
28
+
29
+ /**
30
+ * {@inherit}
31
+ */
32
+ protected function _prepareToRender()
33
+ {
34
+
35
+ $this->addColumn('feed', array());
36
+ $this->addColumn('active', array());
37
+ $this->addColumn('suggest_number', array());
38
+
39
+ }
40
+
41
+
42
+ /**
43
+ * Obtain existing data from form element
44
+ *
45
+ * Each row will be instance of Varien_Object
46
+ *
47
+ * @return array
48
+ */
49
+ public function getArrayRows()
50
+ {
51
+
52
+ /** @var Varien_Data_Form_Element_Abstract */
53
+ $element = $this->getElement();
54
+ $elementValues = $element->getValue();
55
+
56
+ $resultTypes = array(
57
+ 'categories' => Mage::helper('Antidot')->__('Categories'),
58
+ 'products' => Mage::helper('Antidot')->__('Products'),
59
+ 'brands' => Mage::helper('Antidot')->__('Brands'),
60
+ 'articles' => Mage::helper('Antidot')->__('Articles'),
61
+ 'stores' => Mage::helper('Antidot')->__('Stores')
62
+ );
63
+
64
+ $result=array();
65
+ if ($elementValues) {
66
+ foreach ($elementValues as $rowId => $elementValue) {
67
+ $tab = $elementValue['feed'];
68
+ $elementValue['name'] = $resultTypes[$tab];
69
+ $rowId = '_feeds_'.$tab;
70
+ $elementValue['_id'] = $rowId;
71
+ unset($resultTypes[$tab]);
72
+ $result[$rowId] = new Varien_Object($elementValue);
73
+ }
74
+ }
75
+
76
+ /**
77
+ * if no data : set values by default :
78
+ */
79
+ foreach ($resultTypes as $typeResult => $label) {
80
+ $rowId = '_feeds_'.$typeResult;
81
+ $row = array();
82
+ $row['_id'] = $rowId;
83
+ $row['feed'] = $typeResult;
84
+ $row['name'] = $label;
85
+
86
+ //Add the values from element config
87
+ $row['active'] = '';
88
+ $row['suggest_number'] = '';
89
+
90
+ $result[$rowId] = new Varien_Object($row);
91
+ }
92
+
93
+ return $result;
94
+
95
+ }
96
+
97
+ }
app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/Facet.php CHANGED
@@ -55,13 +55,14 @@ class MDN_Antidot_Block_System_Config_Form_Field_Array_Facet extends Mage_Adminh
55
  return $this->_getOrderRenderer()
56
  ->setName($inputName)
57
  ->setTitle($columnName)
58
- ->setWidth(50)
59
  ->setOptions(Mage::getModel("Antidot/System_Config_Number")->toOptionArray(10))
60
  ->toHtml();
61
  case 'multiple':
62
  return $this->_getMultipleRenderer()
63
  ->setName($inputName)
64
  ->setTitle($columnName)
 
65
  ->setOptions(Mage::getModel("Antidot/System_Config_DisableEnable")->toOptionArray())
66
  ->toHtml();
67
  }
55
  return $this->_getOrderRenderer()
56
  ->setName($inputName)
57
  ->setTitle($columnName)
58
+ ->setExtraParams('style="width:50px"')
59
  ->setOptions(Mage::getModel("Antidot/System_Config_Number")->toOptionArray(10))
60
  ->toHtml();
61
  case 'multiple':
62
  return $this->_getMultipleRenderer()
63
  ->setName($inputName)
64
  ->setTitle($columnName)
65
+ ->setExtraParams('style="width:100px"')
66
  ->setOptions(Mage::getModel("Antidot/System_Config_DisableEnable")->toOptionArray())
67
  ->toHtml();
68
  }
app/code/community/MDN/Antidot/Block/System/Config/Form/Field/Array/Tabs.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Block_System_Config_Form_Field_Array_Tabs extends Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract
17
+ {
18
+
19
+ /**
20
+ * Check if columns are defined, set template
21
+ *
22
+ */
23
+ public function __construct()
24
+ {
25
+ parent::__construct();
26
+ $this->setTemplate('antidot/system/config/form/field/tabs.phtml');
27
+ }
28
+
29
+ /**
30
+ * {@inherit}
31
+ */
32
+ protected function _prepareToRender()
33
+ {
34
+
35
+ $this->addColumn('tab', array());
36
+ $this->addColumn('active', array());
37
+ $this->addColumn('show_noresult', array());
38
+
39
+ }
40
+
41
+
42
+ /**
43
+ * Obtain existing data from form element
44
+ *
45
+ * Each row will be instance of Varien_Object
46
+ *
47
+ * @return array
48
+ */
49
+ public function getArrayRows()
50
+ {
51
+
52
+ /** @var Varien_Data_Form_Element_Abstract */
53
+ $element = $this->getElement();
54
+ $elementValues = $element->getValue();
55
+
56
+ $resultTypes = array(
57
+ 'products' => Mage::helper('Antidot')->__('Products'),
58
+ 'articles' => Mage::helper('Antidot')->__('Articles'),
59
+ 'stores' => Mage::helper('Antidot')->__('Stores')
60
+ );
61
+
62
+ $result=array();
63
+ if ($elementValues) {
64
+ foreach ($elementValues as $rowId => $elementValue) {
65
+ $tab = $elementValue['tab'];
66
+ $elementValue['name'] = $resultTypes[$tab];
67
+ $rowId = '_result_tab_'.$tab;
68
+ $elementValue['_id'] = $rowId;
69
+ unset($resultTypes[$tab]);
70
+ $result[$rowId] = new Varien_Object($elementValue);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * if no data : set values by default :
76
+ */
77
+ foreach ($resultTypes as $typeResult => $label) {
78
+ $rowId = '_result_tab_'.$typeResult;
79
+ $row = array();
80
+ $row['_id'] = $rowId;
81
+ $row['tab'] = $typeResult;
82
+ $row['name'] = $label;
83
+
84
+ //Add the values from element config
85
+ $row['active'] = '';
86
+ $row['show_noresult'] = '';
87
+
88
+ $result[$rowId] = new Varien_Object($row);
89
+ }
90
+
91
+ return $result;
92
+
93
+ }
94
+
95
+ }
app/code/community/MDN/Antidot/Helper/CatalogSearch/Data.php CHANGED
@@ -29,12 +29,18 @@ class MDN_Antidot_Helper_CatalogSearch_Data extends Mage_CatalogSearch_Helper_Da
29
  /**
30
  * {@inherit}
31
  */
32
- public function getResultUrl($query = null, $store = null)
33
  {
34
- return $this->_getUrl('catalogsearch/result', array(
35
- '_query' => array(self::QUERY_VAR_NAME => $query),
36
- '_secure' => Mage::app()->getFrontController()->getRequest()->isSecure(),
37
- '_store' => $store
38
- ));
 
 
 
 
 
 
39
  }
40
  }
29
  /**
30
  * {@inherit}
31
  */
32
+ public function getResultUrl($query = null, $store = null, $useSid = null)
33
  {
34
+ $params = array('_query' => array(self::QUERY_VAR_NAME => $query),
35
+ '_secure' => Mage::app()->getFrontController()->getRequest()->isSecure(),
36
+ '_store' => $store);
37
+
38
+ if ($useSid===null) {
39
+ $useSid = Mage::app()->getUseSessionInUrl();
40
+ }
41
+ if (!$useSid) {
42
+ $params['_nosid'] = true;
43
+ }
44
+ return $this->_getUrl('catalogsearch/result', $params);
45
  }
46
  }
app/code/community/MDN/Antidot/Helper/Data.php CHANGED
@@ -300,4 +300,51 @@ class MDN_Antidot_Helper_Data extends Mage_Core_Helper_Abstract
300
  }
301
  return $mageEdition;
302
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
  }
300
  }
301
  return $mageEdition;
302
  }
303
+
304
+ /**
305
+ * Return if there is at least one active tab
306
+ *
307
+ * @return boolean
308
+ */
309
+ public function hasResultTabs() {
310
+ return count($this->getActiveResultTabs())>0;
311
+ }
312
+
313
+ /**
314
+ * Return the active tabs array
315
+ *
316
+ * @param $collection MDN_Antidot_Model_Resource_Catalog_Product_Collection
317
+ * @return array
318
+ */
319
+ public function getActiveResultTabs($collection = null) {
320
+
321
+ $resultTypes = array(
322
+ 'products' => Mage::helper('Antidot')->__('Products'),
323
+ 'articles' => Mage::helper('Antidot')->__('Articles'),
324
+ 'stores' => Mage::helper('Antidot')->__('Stores')
325
+ );
326
+
327
+ $activeTabs = array();
328
+ $tabs = unserialize(Mage::getStoreConfig('antidot/engine/result_tabs'));
329
+ $selectFirst = true;
330
+ if ($tabs) {
331
+ foreach($tabs as $tab) {
332
+ if (isset($tab['active'])) { //if the tab is set active in BO
333
+ if (!$collection || isset($tab['show_noresult']) //if the tab is set show if no result in BO
334
+ || $collection->getTotalResult($tab['tab'])>0 // if there's result on this tab
335
+ || ($collection->getTotalResult() == 0 && $tab['tab']=='products')) { // if there's no result in any tab and the tab is products
336
+ $tab['name'] = $resultTypes[$tab['tab']];
337
+ //select the first tab with result (or product tab if no results at all)
338
+ if ($selectFirst && $collection && ($collection->getTotalResult($tab['tab'])>0
339
+ || ($collection->getTotalResult() == 0 && $tab['tab']=='products'))) {
340
+ $tab['selected'] = $selectFirst;
341
+ $selectFirst = false;
342
+ }
343
+ $activeTabs[] = $tab;
344
+ }
345
+ }
346
+ }
347
+ }
348
+ return $activeTabs;
349
+ }
350
  }
app/code/community/MDN/Antidot/Helper/LogExport.php CHANGED
@@ -21,7 +21,7 @@ class MDN_Antidot_Helper_LogExport extends Mage_Core_Helper_Abstract
21
  *
22
  * @param string $uid Reference to
23
  * @param string $type FULL|INC
24
- * @param string $element CATALOG|CATEGORY
25
  * @param string $begin
26
  * @param string $end
27
  * @param int $items
21
  *
22
  * @param string $uid Reference to
23
  * @param string $type FULL|INC
24
+ * @param string $element CATALOG|CATEGORY|STORE|ARTICLE
25
  * @param string $begin
26
  * @param string $end
27
  * @param int $items
app/code/community/MDN/Antidot/Model/Export/Abstract.php CHANGED
@@ -36,6 +36,11 @@ abstract class MDN_Antidot_Model_Export_Abstract extends Mage_Core_Model_Abstrac
36
  'description'
37
  );
38
 
 
 
 
 
 
39
  /**
40
  * The name of the PAF export
41
  *
@@ -43,6 +48,18 @@ abstract class MDN_Antidot_Model_Export_Abstract extends Mage_Core_Model_Abstrac
43
  */
44
  abstract public function getPafName();
45
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /**
47
  * Init the xml writer
48
  */
@@ -59,19 +76,42 @@ abstract class MDN_Antidot_Model_Export_Abstract extends Mage_Core_Model_Abstrac
59
  * Extract the exact uri from an url
60
  * (When executed from cron script magento can generate url whith the script name instead of index.php)
61
  * (MCNX-253)
 
62
  *
63
  * @param string $url
64
- * $param boolean $onlyPath
65
  * @return string
66
  */
67
  protected function getExactUrl($url, $onlyPath = true)
68
  {
69
- if ($onlyPath) {
70
- $urls = parse_url($url);
71
- $url = $urls['path'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
73
- //replace all antidotExport*.php script by index.php in uri (in case of cron export) :
74
- return preg_replace('#\/antidotExport(.*)\.php#', '/index.php', $url);
75
  }
76
 
77
  /**
@@ -83,19 +123,21 @@ abstract class MDN_Antidot_Model_Export_Abstract extends Mage_Core_Model_Abstrac
83
  {
84
  $this->fields = array();
85
  $values = Mage::getStoreConfig('antidot/fields_'.$section);
86
- foreach($values as $key => $value) {
87
- if(in_array($key, $this->fieldsSerialized) && $value = @unserialize($value)) {
88
- $values = array_values($value);
89
- foreach($values as $value) {
90
- if($key !== 'properties') {
91
- $this->fields[$key][] = $value['value'];
92
- } else {
93
- $this->fields[$key][] = $value;
 
 
94
  }
 
95
  }
96
- continue;
97
  }
98
- $this->fields[$key] = $value;
99
  }
100
  }
101
 
36
  'description'
37
  );
38
 
39
+ /**
40
+ * @var boolean isIncremental
41
+ */
42
+ protected $isIncremental = false;
43
+
44
  /**
45
  * The name of the PAF export
46
  *
48
  */
49
  abstract public function getPafName();
50
 
51
+ /**
52
+ * Is an incremental export
53
+ *
54
+ * @return string
55
+ */
56
+ public function getIsIncremental() {
57
+ return $this->isIncremental;
58
+ }
59
+
60
+ public function setIsIncremental($bool) {
61
+ $this->isIncremental = $bool;
62
+ }
63
  /**
64
  * Init the xml writer
65
  */
76
  * Extract the exact uri from an url
77
  * (When executed from cron script magento can generate url whith the script name instead of index.php)
78
  * (MCNX-253)
79
+ * Remove also SID param
80
  *
81
  * @param string $url
82
+ * $param boolean $onlyPath (remove http://domain.com )
83
  * @return string
84
  */
85
  protected function getExactUrl($url, $onlyPath = true)
86
  {
87
+ $urls = parse_url($url);
88
+ $url = '';
89
+ if (!$onlyPath) {
90
+ //add scheme, host
91
+ $url.=$urls['scheme'].'://';
92
+ $url.=$urls['host'];
93
+ }
94
+
95
+ $path = $urls['path'];
96
+ //replace all antidotExport*.php script by index.php in uri (in case of cron export) :
97
+ $path = preg_replace('#\/antidotExport(.*)\.php#', '/index.php', $path);
98
+ $url .= $path;
99
+
100
+ if (isset($urls['query'])) {
101
+ //construct query string without SID
102
+ $query = array();
103
+ parse_str($urls['query'], $query);
104
+ $queryStr = '';
105
+ foreach ($query as $key => $value) {
106
+ if ($key!='SID'){
107
+ $queryStr .= $key . '=' . $value;
108
+ }
109
+ }
110
+ if ($queryStr) {
111
+ $url .= '?' . $queryStr;
112
+ }
113
  }
114
+ return $url;
 
115
  }
116
 
117
  /**
123
  {
124
  $this->fields = array();
125
  $values = Mage::getStoreConfig('antidot/fields_'.$section);
126
+ if ($values) {
127
+ foreach ($values as $key => $value) {
128
+ if (in_array($key, $this->fieldsSerialized) && $value = @unserialize($value)) {
129
+ $values = array_values($value);
130
+ foreach ($values as $value) {
131
+ if ($key !== 'properties') {
132
+ $this->fields[$key][] = $value['value'];
133
+ } else {
134
+ $this->fields[$key][] = $value;
135
+ }
136
  }
137
+ continue;
138
  }
139
+ $this->fields[$key] = $value;
140
  }
 
141
  }
142
  }
143
 
app/code/community/MDN/Antidot/Model/Export/Article.php CHANGED
@@ -13,18 +13,17 @@
13
  * @author : Antidot devmagento@antidot.net
14
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
  */
16
- class MDN_Antidot_Model_Export_Article extends MDN_Antidot_Model_Export_Product
17
  {
18
 
19
  const TYPE = 'ARTICLE';
20
- const FILENAME_XML = 'articles-%s-fr.xml';
 
21
  const FILENAME_ZIP = '%s_full_%s_articles.zip';
22
  const XSD = 'http://ref.antidot.net/store/latest/articles.xsd';
23
 
24
  const imagePrefix = 'media/catalog/article';
25
 
26
- const ARTICLE_LIMIT = 1000;
27
-
28
  /**
29
  * {@inherit}
30
  */
@@ -37,89 +36,151 @@ class MDN_Antidot_Model_Export_Article extends MDN_Antidot_Model_Export_Product
37
  *
38
  * @param array $context
39
  * @param string $filename
 
40
  */
41
- public function writeXml($context, $filename)
42
  {
43
- $this->initXml();
44
- $this->initFields('article');
45
- $this->setFilename($filename);
46
-
47
-
48
-
49
- $this->xml->push('articles', array('xmlns' => "http://ref.antidot.net/store/afs#"));
50
- $this->writeHeader($context);
51
- $this->writePart($this->xml->flush());
52
-
53
- foreach($context->getWebsiteAndStores() as $ws) {
54
- $store = $ws['store'];
55
- $page = 1;
56
- while($articles = $this->getProducts($store, $page, self::ARTICLE_LIMIT)) {
57
- foreach($articles as $article) {
58
- $this->xml->push('article', array('id' => $article->getId(), 'xml:lang' => $context->getLang()));
59
-
60
- $this->xml->push('websites');
61
- $this->xml->element('website', $store->getWebsite()->getName(), array('id' => $store->getWebsite()->getId()));
62
- $this->xml->pop();
63
-
64
- $this->xml->element('created_at', $article->getCreated_at());
65
- $this->xml->element('last_updated_at', $article->getUpdated_at());
66
- //$this->xml->element('published_at', $article->getPublished_at());
67
-
68
- $this->xml->element('title', $this->xml->encloseCData($this->getField($article, 'title')));
69
- $this->xml->element('subtitle', $this->xml->encloseCData($this->getField($article, 'subtitle')));
70
- $this->xml->element('type', $this->xml->encloseCData($this->getField($article, 'type')));
71
- $this->xml->element('text', $this->xml->encloseCData($this->getField($article, 'text')));
72
-
73
- $this->writeDescriptions($article);
74
- $this->writeIdentifiers($article);
75
- $this->writeClassification($article);
76
- //$this->writeBrands($article);
77
-
78
- $this->writeUrl($article, false);
79
- $this->writeMisc($article);
80
-
81
- $this->xml->pop();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
- $page++;
 
 
 
 
 
 
 
 
 
84
 
85
  $this->writePart($this->xml->flush());
86
  }
87
- }
88
- $this->xml->pop();
89
-
90
- $this->writePart($this->xml->flush(), true);
91
- }
92
-
93
- /**
94
- * Write the article identifiers
95
- *
96
- * @param Product $article
97
- */
98
- protected function writeBrands($article)
99
- {
100
- if ($manufacturer = $this->getField($article, 'manufacturer')) {
101
- $this->xml->push('brands');
102
- $brandUrl = Mage::getModel('Antidot/export_brand')->getUrl($article->getAttributeText('manufacturer'));
103
- $this->xml->element('brand', $this->xml->encloseCData($article->getAttributeText('manufacturer')), array('id' => $manufacturer, 'url' => $brandUrl));
104
  $this->xml->pop();
 
 
 
105
  }
 
 
106
  }
107
 
108
  /**
109
- * Get articles to generate
110
- *
111
- * @param int $store
112
- * @param int $page
113
- * @param int $limit
114
- * @return array
115
  */
116
- protected function getArticles($store, $page, $limit)
117
  {
118
- return Mage::getModel('cms/page')
119
- ->getCollection()
120
- ->addStoreFilter($store->getId())
121
- ->addAttributeToSelect('*')
122
- ->setPage($page, $limit)
123
- ;
124
  }
 
125
  }
13
  * @author : Antidot devmagento@antidot.net
14
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
  */
16
+ class MDN_Antidot_Model_Export_Article extends MDN_Antidot_Model_Export_Product
17
  {
18
 
19
  const TYPE = 'ARTICLE';
20
+ const FILE_PATH_CONF = 'articles';
21
+ const FILENAME_XML = 'articles-%s-%s-%s.xml';
22
  const FILENAME_ZIP = '%s_full_%s_articles.zip';
23
  const XSD = 'http://ref.antidot.net/store/latest/articles.xsd';
24
 
25
  const imagePrefix = 'media/catalog/article';
26
 
 
 
27
  /**
28
  * {@inherit}
29
  */
36
  *
37
  * @param array $context
38
  * @param string $filename
39
+ * @param string $type Incremantal or full
40
  */
41
+ public function writeXml($context, $filename, $type)
42
  {
43
+
44
+ if (count($context->getStoreIds()) == 0) {
45
+ return 0;
46
+ }
47
+
48
+ Mage::log('Starting article XML export, filename = '.$filename, null, 'antidot.log');
49
+ $articlesExported = 0;
50
+
51
+ $pageResource = Mage::getResourceModel('cms/page');
52
+ $articles = Mage::getModel('cms/page')
53
+ ->getCollection()
54
+ ->addStoreFilter($context->getStoreIds())
55
+ ->addFieldToFilter('identifier', array('nin' => array('home', 'no-route')))
56
+ ->addFieldToFilter('is_active', 1)
57
+ ->addFieldToSelect('*')
58
+ ;
59
+
60
+ $chunkSize = 100;
61
+ $articles->setPageSize($chunkSize);
62
+
63
+ $articlesCount = $articles->getSize();
64
+ Mage::log('Articles to export : '.$articlesCount, null, 'antidot.log');
65
+ $chunkCount = $articles->getLastPageNumber();
66
+
67
+ if ($articlesCount > 0) {
68
+
69
+ $this->initXml();
70
+ $this->initFields('article');
71
+ $this->setFilename($filename);
72
+
73
+ $this->xml->push('articles', array('xmlns' => "http://ref.antidot.net/store/afs#"));
74
+ $this->writeHeader($context);
75
+ $this->writePart($this->xml->flush());
76
+
77
+ $lastExecutionTime = time();
78
+ Mage::log(
79
+ 'Process chunk # 0 / '.$chunkCount.' - memory usage = '.memory_get_usage(),
80
+ null,
81
+ 'antidot.log'
82
+ );
83
+ for ($chunkId = 1; $chunkId <= $chunkCount; $chunkId++) {
84
+ $articles->setCurPage($chunkId);
85
+
86
+
87
+ foreach ($articles as $article) {
88
+
89
+ //Get stores affected on the page :
90
+ $storeIds = $pageResource->lookupStoreIds($article->getId());
91
+ $websites = array();
92
+ //get the corresponding websites
93
+ foreach ($storeIds as $storeId) {
94
+ if ($storeId == 0) {
95
+ $websites = $context->getWebsites();
96
+ } else {
97
+ $website = $context->getWebSiteByStore($storeId);
98
+ if ($website) { //ad dthe website only if the store of the page is in the export context
99
+ $websites[$website->getId()] = $website;
100
+ }
101
+ }
102
+ }
103
+
104
+ //Write 1 article by website
105
+ foreach ($websites as $website) {
106
+
107
+ $this->xml->push(
108
+ 'article',
109
+ array('id' => $article->getId().'_'.$website->getId(), 'xml:lang' => $context->getLang())
110
+ );
111
+
112
+ //write websites
113
+ $this->xml->push('websites');
114
+ $this->xml->element(
115
+ 'website',
116
+ $website->getName(),
117
+ array('id' => $website->getId())
118
+ );
119
+ $this->xml->pop();
120
+
121
+ //$this->xml->element('created_at', $article->getCreationTime());
122
+ //$this->xml->element('last_updated_at', $article->getUpdateTime());
123
+ $this->xml->push('identifiers');
124
+ $this->xml->element(
125
+ 'identifier',
126
+ $this->xml->encloseCData($this->getField($article, 'identifier')),
127
+ array('type' => 'identifier')
128
+ );
129
+ $this->xml->pop();
130
+
131
+ $this->xml->element('title', $this->xml->encloseCData($this->getField($article, 'title')));
132
+ $this->xml->element(
133
+ 'subtitle',
134
+ $this->xml->encloseCData($this->getField($article, 'content_heading'))
135
+ );
136
+ $this->xml->element('text', $this->xml->encloseCData($this->getField($article, 'content')));
137
+
138
+ $urlStoreId = $website->getDefaultStore()->getId();
139
+ if (!in_array($urlStoreId, $storeIds) && count($storeIds) && $storeIds[0]!=0) {
140
+ $urlStoreId=$storeIds[0];
141
+ }
142
+ $this->writeUrl($article, $urlStoreId);
143
+
144
+ $articlesExported++;
145
+
146
+ $this->xml->pop();
147
+ }
148
  }
149
+ $articles->clear();
150
+
151
+ Mage::log(
152
+ 'Process chunk # '.$chunkId.' / '.$chunkCount.' - memory usage = '.memory_get_usage(
153
+ ).' - took '.(time() - $lastExecutionTime).' sec',
154
+ null,
155
+ 'antidot.log'
156
+ );
157
+ $lastExecutionTime = time();
158
+
159
 
160
  $this->writePart($this->xml->flush());
161
  }
162
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  $this->xml->pop();
164
+
165
+ $this->writePart($this->xml->flush(), true);
166
+
167
  }
168
+
169
+ return $articlesExported;
170
  }
171
 
172
  /**
173
+ * Write the product urls
174
+ *
175
+ * @param Mage_Cms_Model_Page $article
176
+ * @param int $storeId
 
 
177
  */
178
+ protected function writeUrl($article, $storeId)
179
  {
180
+ $this->xml->element('url', $this->xml->encloseCData(Mage::getUrl($article->getIdentifier(), array(
181
+ '_store' => $storeId,
182
+ '_nosid' => true
183
+ ))));
 
 
184
  }
185
+
186
  }
app/code/community/MDN/Antidot/Model/Export/Context.php CHANGED
@@ -246,10 +246,13 @@ class MDN_Antidot_Model_Export_Context extends Mage_Core_Model_Abstract
246
  return $this->categoryTrees;
247
  }
248
 
249
- /* non utilisé pour l'instant
 
 
 
250
  function getWebsites() {
251
- $this->websites;
252
- }*/
253
 
254
  /**
255
  * Get the list of the pair website/store of the current context
246
  return $this->categoryTrees;
247
  }
248
 
249
+ /**
250
+ * Get the list of websites
251
+ * @return array
252
+ */
253
  function getWebsites() {
254
+ return $this->websites;
255
+ }
256
 
257
  /**
258
  * Get the list of the pair website/store of the current context
app/code/community/MDN/Antidot/Model/Export/Product.php CHANGED
@@ -498,8 +498,7 @@ class MDN_Antidot_Model_Export_Product extends MDN_Antidot_Model_Export_Abstract
498
  if(!empty($manufacturer)) {
499
  $field = empty($this->fields['manufacturer']) ? 'manufacturer' : $this->fields['manufacturer'];
500
  $brand = mb_substr($product->getAttributeText($field), 0, self::BRAND_MAX_LENGTH, 'UTF-8');
501
- $brandUrl = Mage::helper('catalogsearch')->getResultUrl($brand, $product->getStoreId());
502
- $brandUrl = parse_url($brandUrl, PHP_URL_PATH).'?'.parse_url($brandUrl, PHP_URL_QUERY);
503
  $brandUrl = $this->getExactUrl($brandUrl);
504
  if(!empty($brand)) {
505
  $this->xml->element('brand', $this->xml->encloseCData($brand), array('id' => $manufacturer, 'url' => $brandUrl));
498
  if(!empty($manufacturer)) {
499
  $field = empty($this->fields['manufacturer']) ? 'manufacturer' : $this->fields['manufacturer'];
500
  $brand = mb_substr($product->getAttributeText($field), 0, self::BRAND_MAX_LENGTH, 'UTF-8');
501
+ $brandUrl = Mage::helper('catalogsearch')->getResultUrl($brand, $product->getStoreId(), false);
 
502
  $brandUrl = $this->getExactUrl($brandUrl);
503
  if(!empty($brand)) {
504
  $this->xml->element('brand', $this->xml->encloseCData($brand), array('id' => $manufacturer, 'url' => $brandUrl));
app/code/community/MDN/Antidot/Model/Export/Store.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Model_Export_Store extends MDN_Antidot_Model_Export_Abstract
17
+ {
18
+
19
+ const TYPE = 'STORE';
20
+ const FILE_PATH_CONF = 'stores';
21
+ const FILENAME_XML = 'stores-%s-%s-%s.xml';
22
+ const FILENAME_ZIP = '%s_full_%s_stores.zip';
23
+ const XSD = 'http://ref.antidot.net/store/latest/stores.xsd';
24
+
25
+ /**
26
+ * {@inherit}
27
+ */
28
+ public function getPafName() {
29
+ return "Stores";
30
+ }
31
+
32
+
33
+ }
app/code/community/MDN/Antidot/Model/Observer.php CHANGED
@@ -113,12 +113,33 @@ class MDN_Antidot_Model_Observer extends Mage_Core_Model_Abstract
113
  {
114
  return $this->generate(Mage::getModel('Antidot/export_category'), self::GENERATE_FULL, $runContext);
115
  }
116
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  /**
118
  * Generate files
119
  *
120
  * @param Antidot/Export_* $exportModel
121
  * @param string $type
 
122
  * @throws Exception
123
  */
124
  protected function generate($exportModel, $type, $runContext)
@@ -176,7 +197,12 @@ class MDN_Antidot_Model_Observer extends Mage_Core_Model_Abstract
176
  $log['reference'] = 'unknown';
177
  if(!empty($files)) {
178
  $this->log('Compress files');
179
- $filenameZip = $type === self::GENERATE_INC ? $exportModel::FILENAME_ZIP_INC : $exportModel::FILENAME_ZIP;
 
 
 
 
 
180
  $filenameZip = sprintf($filenameZip, date('YmdHis'), $ownerForFilename);
181
  $filename = $this->compress($files, $filenameZip);
182
  $log['reference'] = md5($filename);
@@ -221,6 +247,86 @@ class MDN_Antidot_Model_Observer extends Mage_Core_Model_Abstract
221
  return $log['items'];
222
  }
223
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
  /**
225
  * Move file with error to another directory $tmp/antidot/error
226
  *
113
  {
114
  return $this->generate(Mage::getModel('Antidot/export_category'), self::GENERATE_FULL, $runContext);
115
  }
116
+
117
+ /**
118
+ * Generate the articles file
119
+ */
120
+ public function articlesFullExport($runContext)
121
+ {
122
+ if (Mage::getStoreConfig('antidot/articles/index_cms', Mage_Core_Model_App::ADMIN_STORE_ID)) {
123
+ return $this->generate(Mage::getModel('Antidot/export_article'), self::GENERATE_FULL, $runContext);
124
+ } else {
125
+ return $this->sendExternalFile(Mage::getModel('Antidot/export_article'), $runContext);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Generate the stores file
131
+ */
132
+ public function storesFullExport($runContext)
133
+ {
134
+ return $this->sendExternalFile(Mage::getModel('Antidot/export_store'), $runContext);
135
+ }
136
+
137
  /**
138
  * Generate files
139
  *
140
  * @param Antidot/Export_* $exportModel
141
  * @param string $type
142
+ * @param $runContext
143
  * @throws Exception
144
  */
145
  protected function generate($exportModel, $type, $runContext)
197
  $log['reference'] = 'unknown';
198
  if(!empty($files)) {
199
  $this->log('Compress files');
200
+ if ( $type === self::GENERATE_INC ) {
201
+ $filenameZip = $exportModel::FILENAME_ZIP_INC;
202
+ $exportModel->setIsIncremental(true);
203
+ } else {
204
+ $filenameZip = $exportModel::FILENAME_ZIP;
205
+ }
206
  $filenameZip = sprintf($filenameZip, date('YmdHis'), $ownerForFilename);
207
  $filename = $this->compress($files, $filenameZip);
208
  $log['reference'] = md5($filename);
247
  return $log['items'];
248
  }
249
 
250
+ /**
251
+ * Generate files
252
+ *
253
+ * @param Antidot/Export_* $exportModel
254
+ * @throws Exception
255
+ */
256
+ protected function sendExternalFile($exportModel)
257
+ {
258
+
259
+ Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
260
+
261
+ $this->type = $exportModel::TYPE;
262
+ $this->log('start sendExternalFile');
263
+ $log['begin'] = time();
264
+ $log['items'] = 1;
265
+ $log['error'] = array();
266
+ $log['reference'] = '';
267
+
268
+ try
269
+ {
270
+ $filepath = Mage::getStoreConfig('antidot/'.$exportModel::FILE_PATH_CONF.'/file_path', Mage_Core_Model_App::ADMIN_STORE_ID);
271
+ if (strpos($filepath, '/') !==0) {
272
+ $filepath = Mage::getBaseDir() . DS . $filepath;
273
+ }
274
+
275
+ $owner = Mage::getStoreConfig('antidot/general/owner', Mage_Core_Model_App::ADMIN_STORE_ID);
276
+ $ownerForFilename = $this->getOwnerForFilename($owner);
277
+ $filenameZipPattern = sprintf($exportModel::FILENAME_ZIP, '*', $ownerForFilename);
278
+
279
+ $lastFileModif = 0;
280
+ $filenameZip = '';
281
+ foreach (glob($filepath . DS . $filenameZipPattern) as $filename) {
282
+ $filetime = filemtime ($filename);
283
+ if ($lastFileModif<$filetime) {
284
+ $filenameZip = $filename;
285
+ $lastFileModif = $filetime;
286
+ }
287
+ }
288
+
289
+ $log['reference'] = 'unknown';
290
+ if($filenameZip) {
291
+ $log['reference'] = md5($filenameZip);
292
+ $this->send($filenameZip, $exportModel);
293
+
294
+ $log['status'] = 'SUCCESS';
295
+ } else {
296
+ $log['items'] = 0;
297
+ $log['status'] = 'FAILED';
298
+ $log['error'][] = Mage::helper('Antidot')->__('There\'s no file corresponding to the pattern %s in %s', $filenameZipPattern, $filepath);
299
+ }
300
+
301
+ if(file_exists($filenameZip)) {
302
+ $this->log('Unlink file');
303
+ unlink($filenameZip);
304
+ }
305
+ }
306
+ catch(Exception $ex)
307
+ {
308
+ Mage::log($ex->__toString(), Zend_Log::ERR, 'antidot.log');
309
+ $log['error'][] = $ex->getMessage();
310
+ $log['status'] = 'FAILED';
311
+ $log['items'] = 0;
312
+ }
313
+
314
+ $log['end'] = time();
315
+ $this->log('send external file '.$exportModel::TYPE.' '.$exportModel->getOwner());
316
+ $this->log('end');
317
+
318
+ Mage::helper('Antidot/logExport')->add($log['reference'], self::GENERATE_FULL, $exportModel::TYPE, $log['begin'], $log['end'], $log['items'], $log['status'], implode(',', $log['error']));
319
+
320
+ if ( count($log['error']) ) {
321
+ //send error alert mail
322
+ Mage::helper('Antidot')->sendMail('Export failed', print_r($log['error'], true));
323
+ //throw Exception in order to dispay error message in UI
324
+ Mage::throwException(implode(',', $log['error']));
325
+ }
326
+
327
+ return $log['items'];
328
+ }
329
+
330
  /**
331
  * Move file with error to another directory $tmp/antidot/error
332
  *
app/code/community/MDN/Antidot/Model/Resource/Catalog/Product/Collection.php CHANGED
@@ -231,6 +231,26 @@ class MDN_Antidot_Model_Resource_Catalog_Product_Collection extends Mage_Catalog
231
  return $this->_banners;
232
  }
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  /**
235
  * Returns collection size
236
  *
@@ -352,9 +372,37 @@ class MDN_Antidot_Model_Resource_Catalog_Product_Collection extends Mage_Catalog
352
  $this->_categoryIds = isset($this->queryResult['category_ids']) ? $this->queryResult['category_ids'] : array();
353
  $this->_banners = isset($this->queryResult['banners']) ? $this->queryResult['banners'] : array();
354
  $this->_spellcheck = isset($this->queryResult['spellcheck']) ? $this->queryResult['spellcheck'] : false;
 
 
355
  }
356
  }
357
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  /**
359
  * Retrieves parameters.
360
  *
231
  return $this->_banners;
232
  }
233
 
234
+ /**
235
+ * Returh the articles
236
+ *
237
+ * @return array
238
+ */
239
+ public function getArticles()
240
+ {
241
+ return $this->_articles;
242
+ }
243
+
244
+ /**
245
+ * Returh the stores
246
+ *
247
+ * @return array
248
+ */
249
+ public function getStores()
250
+ {
251
+ return $this->_stores;
252
+ }
253
+
254
  /**
255
  * Returns collection size
256
  *
372
  $this->_categoryIds = isset($this->queryResult['category_ids']) ? $this->queryResult['category_ids'] : array();
373
  $this->_banners = isset($this->queryResult['banners']) ? $this->queryResult['banners'] : array();
374
  $this->_spellcheck = isset($this->queryResult['spellcheck']) ? $this->queryResult['spellcheck'] : false;
375
+ $this->_articles = isset($this->queryResult['articles']) ? $this->queryResult['articles'] : array();
376
+ $this->_stores = isset($this->queryResult['stores']) ? $this->queryResult['stores'] : array();
377
  }
378
  }
379
 
380
+ /**
381
+ * Return the number of result given the tab
382
+ * If tab is not define it return the total number of result on every tabs
383
+ *
384
+ * @param null $tab
385
+ * @return int
386
+ */
387
+ public function getTotalResult($tab = null) {
388
+ $this->initQueryResult($this->_getQuery(), $this->_getParams());
389
+ switch ($tab) {
390
+ case 'products':
391
+ return (int)$this->_totalRecords;
392
+ break;
393
+ case 'articles':
394
+ return count($this->_articles);
395
+ break;
396
+ case 'stores':
397
+ return count($this->_stores);
398
+ break;
399
+ case null;
400
+ return (int)$this->_totalRecords + count($this->_articles) + count($this->_stores);
401
+
402
+ }
403
+
404
+
405
+ }
406
  /**
407
  * Retrieves parameters.
408
  *
app/code/community/MDN/Antidot/Model/Resource/Engine/Abstract.php CHANGED
@@ -98,6 +98,24 @@ abstract class MDN_Antidot_Model_Resource_Engine_Abstract
98
  }
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  $this->_idsByQuery[$paramsHash] = array(
102
  'ids' => $ids,
103
  'total_count' => (isset($resultTmp['total_count'])) ? $resultTmp['total_count'] : null,
@@ -105,7 +123,10 @@ abstract class MDN_Antidot_Model_Resource_Engine_Abstract
105
  'category_ids' => (isset($resultTmp['category_ids'])) ? $resultTmp['category_ids'] : array(),
106
  'banners' => (isset($resultTmp['banners'])) ? $resultTmp['banners'] : array(),
107
  'spellcheck' => (isset($resultTmp['spellcheck'])) ? $resultTmp['spellcheck'] : false,
 
 
108
  );
 
109
  }
110
 
111
  return $this->_idsByQuery[$paramsHash];
98
  }
99
  }
100
 
101
+ $articles=array();
102
+ if (isset($resultTmp['Articles'])) {
103
+ foreach ($resultTmp['Articles'] as $articleA) {
104
+ $article = new Varien_Object();
105
+ $article->setData($articleA);
106
+ $articles[] = $article;
107
+ }
108
+ }
109
+
110
+ $stores=array();
111
+ if (isset($resultTmp['Stores'])) {
112
+ foreach ($resultTmp['Stores'] as $storeA) {
113
+ $store = new Varien_Object();
114
+ $store->setData($storeA);
115
+ $stores[] = $store;
116
+ }
117
+ }
118
+
119
  $this->_idsByQuery[$paramsHash] = array(
120
  'ids' => $ids,
121
  'total_count' => (isset($resultTmp['total_count'])) ? $resultTmp['total_count'] : null,
123
  'category_ids' => (isset($resultTmp['category_ids'])) ? $resultTmp['category_ids'] : array(),
124
  'banners' => (isset($resultTmp['banners'])) ? $resultTmp['banners'] : array(),
125
  'spellcheck' => (isset($resultTmp['spellcheck'])) ? $resultTmp['spellcheck'] : false,
126
+ 'articles' => $articles,
127
+ 'stores' => $stores,
128
  );
129
+
130
  }
131
 
132
  return $this->_idsByQuery[$paramsHash];
app/code/community/MDN/Antidot/Model/Resource/Engine/Antidot.php CHANGED
@@ -230,22 +230,37 @@ class MDN_Antidot_Model_Resource_Engine_Antidot extends MDN_Antidot_Model_Resour
230
  */
231
  protected function prepareQueryResponse($response, $type = 'Catalog')
232
  {
233
- if($type === 'Catalog') {
234
- $this->_lastNumFound = (int)$response->get_meta()->get_total_replies();
235
- $result = array();
236
- foreach ($response->get_replies() as $reply) {
237
- $result[] = $this->_objectToArray($this->getDataFromReply($reply));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  }
239
 
240
- return $result;
241
- }
242
-
243
- foreach ($response->get_replies() as $reply) {
244
- $reply = $this->getDataFromReply($reply);
245
- $result[] = $reply['id'];
246
  }
247
-
248
  return $result;
 
249
  }
250
 
251
  /**
@@ -269,7 +284,6 @@ class MDN_Antidot_Model_Resource_Engine_Antidot extends MDN_Antidot_Model_Resour
269
  $data[$field->getName()] = (string)$field;
270
  }
271
  }
272
-
273
  return $data;
274
  }
275
 
@@ -371,6 +385,15 @@ class MDN_Antidot_Model_Resource_Engine_Antidot extends MDN_Antidot_Model_Resour
371
  $result['category_ids'] = $this->prepareQueryResponse($resultAntidot->replysetCategories, 'Categories');
372
  }
373
 
 
 
 
 
 
 
 
 
 
374
  if(isset($resultAntidot->promote) && $resultAntidot->promote && $replies = $resultAntidot->promote->get_replies()) {
375
  if((Mage::getStoreConfig('antidot/promote/redirect') === 'no_result' && $result['total_count'] == 0) || Mage::getStoreConfig('antidot/promote/redirect') === 'always') {
376
  $promote = current($replies);
230
  */
231
  protected function prepareQueryResponse($response, $type = 'Catalog')
232
  {
233
+ $result = array();
234
+ if ($response) {
235
+ if ($type === 'Categories') {
236
+ foreach ($response->get_replies() as $reply) {
237
+ $reply = $this->getDataFromReply($reply);
238
+ $result[] = $reply['id'];
239
+ }
240
+
241
+ return $result;
242
+ }
243
+
244
+ if ($type === 'Catalog') {
245
+ $this->_lastNumFound = (int)$response->get_meta()->get_total_replies();
246
+ foreach ($response->get_replies() as $reply) {
247
+ $result[] = $this->_objectToArray($this->getDataFromReply($reply));
248
+ }
249
+ }
250
+
251
+ if ($type === 'Articles' || $type === 'Stores') {
252
+ foreach ($response->get_replies() as $reply) {
253
+ $data = $this->getDataFromReply($reply);
254
+ $data['title'] = $reply->get_title();
255
+ $data['abstract'] = $reply->get_abstract();
256
+ $result[] = $data;
257
+ }
258
  }
259
 
 
 
 
 
 
 
260
  }
261
+
262
  return $result;
263
+
264
  }
265
 
266
  /**
284
  $data[$field->getName()] = (string)$field;
285
  }
286
  }
 
287
  return $data;
288
  }
289
 
385
  $result['category_ids'] = $this->prepareQueryResponse($resultAntidot->replysetCategories, 'Categories');
386
  }
387
 
388
+ if (isset($resultAntidot->additionalReplyset) && is_array($resultAntidot->additionalReplyset)) {
389
+ foreach ($resultAntidot->additionalReplyset as $additionalFeed => $additionalReplyset) {
390
+ $result[$additionalFeed] = $this->prepareQueryResponse(
391
+ $additionalReplyset,
392
+ $additionalFeed
393
+ );
394
+ }
395
+ }
396
+
397
  if(isset($resultAntidot->promote) && $resultAntidot->promote && $replies = $resultAntidot->promote->get_replies()) {
398
  if((Mage::getStoreConfig('antidot/promote/redirect') === 'no_result' && $result['total_count'] == 0) || Mage::getStoreConfig('antidot/promote/redirect') === 'always') {
399
  $promote = current($replies);
app/code/community/MDN/Antidot/Model/Search/Search.php CHANGED
@@ -37,6 +37,11 @@ class MDN_Antidot_Model_Search_Search extends MDN_Antidot_Model_Search_Abstract
37
  */
38
  protected $facets;
39
 
 
 
 
 
 
40
  /**
41
  * {@inherit}
42
  */
@@ -48,11 +53,20 @@ class MDN_Antidot_Model_Search_Search extends MDN_Antidot_Model_Search_Abstract
48
  $this->lang = $lang;
49
 
50
  foreach (Mage::getStoreConfig('antidot/engine') as $field => $value) {
 
51
  if (substr($field, 0, 4) === 'feed' && $value === '1') {
52
  $this->feeds[] = ucfirst(substr($field, 5));
53
  }
54
  }
55
- $this->feeds = array_unique($this->feeds);
 
 
 
 
 
 
 
 
56
 
57
  if ($this->isConfigured) {
58
  $this->afsSearch = new AfsSearch($this->afsHost, $this->afsService, $this->afsStatus);
@@ -100,6 +114,11 @@ class MDN_Antidot_Model_Search_Search extends MDN_Antidot_Model_Search_Abstract
100
  $resultAntidot->promote = $this->getPromoteFromResult($results);
101
  $resultAntidot->replyset = $this->getReplySetFromResult($results);
102
  $resultAntidot->replysetCategories = $this->getReplySetFromResult($results, 'Categories');
 
 
 
 
 
103
  $resultAntidot->isOrchestrated = $this->getOrchestratedFromResult($results);
104
 
105
  //save translations
@@ -235,7 +254,10 @@ class MDN_Antidot_Model_Search_Search extends MDN_Antidot_Model_Search_Abstract
235
  foreach ($params['filters'] as $filter) {
236
  if (is_array($filter)) {
237
  foreach ($filter as $key => $values) {
238
- $query = $query->add_filter($key, $values);
 
 
 
239
  }
240
  } else {
241
  //$query = $query->add_filter($key, $value);
37
  */
38
  protected $facets;
39
 
40
+ /**
41
+ * @var array additionalFeeds;
42
+ */
43
+ protected $additionalFeeds = array();
44
+
45
  /**
46
  * {@inherit}
47
  */
53
  $this->lang = $lang;
54
 
55
  foreach (Mage::getStoreConfig('antidot/engine') as $field => $value) {
56
+ //If category search is enabled, add it to feeds
57
  if (substr($field, 0, 4) === 'feed' && $value === '1') {
58
  $this->feeds[] = ucfirst(substr($field, 5));
59
  }
60
  }
61
+
62
+ //Add Articles and Stores feeds if corresponding tabs are activated in BO
63
+ foreach (Mage::helper('Antidot')->getActiveResultTabs() as $tab) {
64
+ if ($tab['tab'] !== 'products') { //articles or stores
65
+ $this->additionalFeeds[] = ucfirst($tab['tab']);
66
+ }
67
+ }
68
+
69
+ $this->feeds = array_unique(array_merge($this->feeds, $this->additionalFeeds));
70
 
71
  if ($this->isConfigured) {
72
  $this->afsSearch = new AfsSearch($this->afsHost, $this->afsService, $this->afsStatus);
114
  $resultAntidot->promote = $this->getPromoteFromResult($results);
115
  $resultAntidot->replyset = $this->getReplySetFromResult($results);
116
  $resultAntidot->replysetCategories = $this->getReplySetFromResult($results, 'Categories');
117
+ $resultAntidot->additionalReplyset = array();
118
+ foreach ($this->additionalFeeds as $additionalFeed) {
119
+ $resultAntidot->additionalReplyset[$additionalFeed] = $this->getReplySetFromResult($results, $additionalFeed);
120
+ }
121
+
122
  $resultAntidot->isOrchestrated = $this->getOrchestratedFromResult($results);
123
 
124
  //save translations
254
  foreach ($params['filters'] as $filter) {
255
  if (is_array($filter)) {
256
  foreach ($filter as $key => $values) {
257
+ $query = $query->add_filter_on_feed($key, $values, 'Catalog');
258
+ if ($key == "website") {
259
+ $query = $query->add_filter_on_feed($key, $values, 'Articles');
260
+ }
261
  }
262
  } else {
263
  //$query = $query->add_filter($key, $value);
app/code/community/MDN/Antidot/Model/Search/Suggest.php CHANGED
@@ -66,24 +66,29 @@ class MDN_Antidot_Model_Search_Suggest extends MDN_Antidot_Model_Search_Abstract
66
  {
67
  parent::_construct();
68
 
69
- $config = Mage::getStoreConfig('antidot/suggest');
70
- $this->template = trim($config['template']);
71
- foreach($config as $field => $value) {
72
- if(isset($this->feed[$field]) && $value === '0') {
73
- unset($this->feed[$field]);
74
- } elseif(preg_match('/([a-z]+)_displayed/', $field, $matches)) {
75
- $field = $matches[1];
76
- if(isset($this->feed[$field])) {
77
- $this->feed[$field]['number'] = (int)$value;
78
- }
79
- } elseif(preg_match('/order_([0-4])/', $field, $matches)) {
80
- $order = $matches[1];
81
- if(isset($this->feed[$value])) {
82
- $this->feed[$value]['order'] = $order;
 
 
 
 
83
  }
 
84
  }
85
  }
86
-
87
  $this->loadFacetAutocomplete();
88
  $this->loadAdditionalFeeds();
89
 
@@ -155,7 +160,7 @@ class MDN_Antidot_Model_Search_Suggest extends MDN_Antidot_Model_Search_Abstract
155
  Mage::log(print_r(libxml_get_errors(), true), null, 'antidot.log');
156
  return "";
157
  }
158
-
159
  $xml = $this->postProcessXml($xml);
160
 
161
  if($format === 'xml') {
@@ -174,8 +179,18 @@ class MDN_Antidot_Model_Search_Suggest extends MDN_Antidot_Model_Search_Abstract
174
  */
175
  private function postProcessXml(&$xml)
176
  {
177
-
178
- $ns = $xml->getNamespaces(true);
 
 
 
 
 
 
 
 
 
 
179
  foreach ($xml->children($ns['afs'])->replySet as $replySet) {
180
 
181
  $type = (string)$replySet->attributes()->name;
@@ -189,6 +204,23 @@ class MDN_Antidot_Model_Search_Suggest extends MDN_Antidot_Model_Search_Abstract
189
  unset($replySet->reply[$i]);
190
  }
191
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  }
193
 
194
  return $xml;
@@ -306,16 +338,13 @@ class MDN_Antidot_Model_Search_Suggest extends MDN_Antidot_Model_Search_Abstract
306
  return '';
307
  }
308
 
309
- libxml_use_internal_errors(true);
310
- $xsl = simplexml_load_string($this->template);
311
- if ($xsl === false) {
312
- Mage::log('Error loading xsl template (suggest) : ', null, 'antidot.log');
313
- Mage::log(print_r(libxml_get_errors(), true), null, 'antidot.log');
314
  return '';
315
  }
316
-
 
317
  $xslt = new XSLTProcessor();
318
- $xslt->importStylesheet($xsl);
319
 
320
  $xml = $xslt->transformToXml($xml);
321
  if ($xml === false) {
66
  {
67
  parent::_construct();
68
 
69
+ $template = Mage::getStoreConfig('antidot/suggest/template');
70
+ libxml_use_internal_errors(true);
71
+ $this->template = simplexml_load_string(trim($template));
72
+ if ($this->template === false) {
73
+ Mage::log('Error loading xsl template (suggest) : ', null, 'antidot.log');
74
+ Mage::log(print_r(libxml_get_errors(), true), null, 'antidot.log');
75
+ }
76
+
77
+ if ($feeds = Mage::getStoreConfig('antidot/suggest/feeds')) {
78
+ $feeds = unserialize($feeds);
79
+ $i = 1;
80
+ foreach ($feeds as $configFeed) {
81
+ $feed = $configFeed['feed'];
82
+ if (isset($this->feed[$feed]) && !isset($configFeed['active'])) {
83
+ unset($this->feed[$feed]);
84
+ } else {
85
+ $this->feed[$feed]['number'] = (int)$configFeed['suggest_number'];
86
+ $this->feed[$feed]['order'] = $i;
87
  }
88
+ $i++;
89
  }
90
  }
91
+
92
  $this->loadFacetAutocomplete();
93
  $this->loadAdditionalFeeds();
94
 
160
  Mage::log(print_r(libxml_get_errors(), true), null, 'antidot.log');
161
  return "";
162
  }
163
+
164
  $xml = $this->postProcessXml($xml);
165
 
166
  if($format === 'xml') {
179
  */
180
  private function postProcessXml(&$xml)
181
  {
182
+
183
+ $thumbWidth = 40;
184
+ if ($this->template) {
185
+ /* Exctract thumbWidth from the xslt template */
186
+ $xpath = $this->template->xpath("//xsl:variable[@name='thumbnail_width']");
187
+ if (isset($xpath[0])) {
188
+ $thumbWidth = $xpath[0]->__toString();
189
+ }
190
+ }
191
+
192
+
193
+ $ns = $xml->getNamespaces(true);
194
  foreach ($xml->children($ns['afs'])->replySet as $replySet) {
195
 
196
  $type = (string)$replySet->attributes()->name;
204
  unset($replySet->reply[$i]);
205
  }
206
  }
207
+
208
+ //PRE-PROCESSING OF URL THUMBNAILS : resize base images to the size defined in xslt template
209
+ foreach ($replySet->reply as $reply) {
210
+ foreach ($reply->option as $option) {
211
+ if ($option->attributes()->key == 'url_thumbnail') {
212
+
213
+ $thumb = $option->attributes()->value;
214
+ $thumb = basename($thumb);
215
+ $product = Mage::getModel('catalog/product');
216
+ $product->setData('thumbnail', '/'.$thumb[0].'/'.$thumb[1].'/'.$thumb);
217
+ $thumb = Mage::helper('catalog/image')->init($product, 'thumbnail')->resize($thumbWidth)->__toString();
218
+
219
+ $option->attributes()->value = $thumb;
220
+
221
+ }
222
+ }
223
+ }
224
  }
225
 
226
  return $xml;
338
  return '';
339
  }
340
 
341
+ if (!$this->template) {
 
 
 
 
342
  return '';
343
  }
344
+
345
+ libxml_use_internal_errors(true);
346
  $xslt = new XSLTProcessor();
347
+ $xslt->importStylesheet($this->template);
348
 
349
  $xml = $xslt->transformToXml($xml);
350
  if ($xml === false) {
app/code/community/MDN/Antidot/Model/Transport/Http.php CHANGED
@@ -68,12 +68,17 @@ class MDN_Antidot_Model_Transport_Http extends MDN_Antidot_Model_Transport_Abstr
68
 
69
  $service = new AfsService($this->afsService, $this->afsStatus);
70
 
71
- $doc = new AfsDocument(file_get_contents($file));
 
72
 
73
  $connector = new AfsPafConnector($this->afsHost, $service, $exportModel->getPafName(), $auth, AFS_SCHEME_HTTPS, $curlConnector);
74
 
 
 
 
 
75
  /** @var AfsPafUploadReply $result */
76
- $result = $connector->upload_doc($doc);
77
 
78
  if ($result->in_error()) {
79
  throw new Exception("Can't send the file (".$result->get_error().")");
68
 
69
  $service = new AfsService($this->afsService, $this->afsStatus);
70
 
71
+ $doc = new AfsDocument();
72
+ $doc->set_content_from_file($file);
73
 
74
  $connector = new AfsPafConnector($this->afsHost, $service, $exportModel->getPafName(), $auth, AFS_SCHEME_HTTPS, $curlConnector);
75
 
76
+ $pafMode=PaFMode::Full;
77
+ if ( $exportModel->getIsIncremental()) {
78
+ $pafMode=PaFMode::Incremental;
79
+ }
80
  /** @var AfsPafUploadReply $result */
81
+ $result = $connector->upload_doc($doc, null, $pafMode);
82
 
83
  if ($result->in_error()) {
84
  throw new Exception("Can't send the file (".$result->get_error().")");
app/code/community/MDN/Antidot/Test/Block/System/Config/Form/Field/Array/AcpFeeds.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Test_Block_System_Config_Form_Field_Array_AcpFeeds extends EcomDev_PHPUnit_Test_Case
17
+ {
18
+
19
+ /**
20
+ *
21
+ */
22
+ public function testGetArrayRows()
23
+ {
24
+ /* @var $block MDN_Antidot_Block_System_Config_Form_Field_Array_AcpFeeds */
25
+ $block = Mage::app()->getLayout()->createBlock('Antidot/system_config_form_field_array_acpFeeds');
26
+
27
+
28
+ $element = new Varien_Object();
29
+ $element->setValue(array('1' => array('feed'=>'products'),
30
+ '2' => array('feed'=>'categories'),
31
+ '3' => array('feed'=>'brands'),
32
+ '4' => array('feed'=>'articles'),
33
+ '5' => array('feed'=>'stores'),
34
+ ));
35
+ $block->setElement($element);
36
+
37
+ $rows = $block->getArrayRows();
38
+
39
+ $this->assertEquals(
40
+ 5,
41
+ count($rows)
42
+ );
43
+ $this->assertTrue(isset($rows['_feeds_products']));
44
+ $this->assertTrue(isset($rows['_feeds_categories']));
45
+ $this->assertTrue(isset($rows['_feeds_brands']));
46
+ $this->assertTrue(isset($rows['_feeds_articles']));
47
+ $this->assertTrue(isset($rows['_feeds_stores']));
48
+
49
+ }
50
+
51
+
52
+ }
app/code/community/MDN/Antidot/Test/Helper/Data.php CHANGED
@@ -16,21 +16,239 @@ class MDN_Antidot_Test_Helper_Data extends EcomDev_PHPUnit_Test_Case
16
  {
17
 
18
  /**
19
- * Test method MDN_Antidot_Model_Observer returnBytes
20
  */
21
  function testReturnBytes()
22
  {
23
- /** @var $observer MDN_Antidot_Model_Observer */
24
  $helper = Mage::helper('Antidot');
25
 
26
  foreach (array("2048M" => "2147483648", "512M" => "536870912", "4G" => "4294967296") as $value => $expected) {
27
  $result = $helper->returnBytes($value);
28
  $this->assertEquals(
29
- $result,
30
- $expected
31
  );
32
  }
33
 
34
  }
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  }
16
  {
17
 
18
  /**
19
+ * Test method MDN_Antidot_Helper_Data returnBytes
20
  */
21
  function testReturnBytes()
22
  {
23
+ /** @var $observer MDN_Antidot_Helper_Data */
24
  $helper = Mage::helper('Antidot');
25
 
26
  foreach (array("2048M" => "2147483648", "512M" => "536870912", "4G" => "4294967296") as $value => $expected) {
27
  $result = $helper->returnBytes($value);
28
  $this->assertEquals(
29
+ $expected,
30
+ $result
31
  );
32
  }
33
 
34
  }
35
 
36
+ /**
37
+ * Test method MDN_Antidot_Helper_Data getActiveResultTabs Case 0 :
38
+ * No fixture, Mage::getStoreConfig('antidot/engine/result_tabs') return empty
39
+ * No tabs are configured in BO
40
+ *
41
+ */
42
+ function testGetActiveResultTabsCase0()
43
+ {
44
+ /** @var $observer MDN_Antidot_Helper_Data */
45
+ $helper = Mage::helper('Antidot');
46
+
47
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
48
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
49
+ ->getMock();
50
+
51
+ //There's results in the 3 tabs
52
+ $mockCollection->expects($this->any())->method('getTotalResult')
53
+ ->will($this->returnValueMap(
54
+ array(
55
+ array('products', 10),
56
+ array('articles', 11),
57
+ array('stores', 12),
58
+ array(null, 33),
59
+ )
60
+ ));
61
+
62
+ $tabs = $helper->getActiveResultTabs($mockCollection);
63
+
64
+ //must return no tabs
65
+ $this->assertEquals(
66
+ 0,
67
+ count($tabs)
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Test method MDN_Antidot_Helper_Data getActiveResultTabs Case 1 :
73
+ *
74
+ * In the fixture all tabs are configured, actives, with show_noresult=true
75
+ *
76
+ * @loadFixture
77
+ */
78
+ function testGetActiveResultTabsCase1()
79
+ {
80
+ /** @var $observer MDN_Antidot_Helper_Data */
81
+ $helper = Mage::helper('Antidot');
82
+
83
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
84
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
85
+ ->getMock();
86
+
87
+ //There's results in the 3 tabs
88
+ $mockCollection->expects($this->any())->method('getTotalResult')
89
+ ->will($this->returnValueMap(
90
+ array(
91
+ array('products', 10),
92
+ array('articles', 11),
93
+ array('stores', 12),
94
+ array(null, 33),
95
+ )
96
+ ));
97
+
98
+ $tabs = $helper->getActiveResultTabs($mockCollection);
99
+
100
+ //must return 3 tabs, there're all configured in BO
101
+ $this->assertEquals(
102
+ 3,
103
+ count($tabs)
104
+ );
105
+ $this->assertTrue($tabs[0]['selected']);
106
+ $this->assertFalse(isset($tabs[1]['selected']));
107
+ $this->assertFalse(isset($tabs[2]['selected']));
108
+
109
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
110
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
111
+ ->getMock();
112
+
113
+ //There's no results in any tabs
114
+ $mockCollection->expects($this->any())->method('getTotalResult')
115
+ ->will($this->returnValueMap(
116
+ array(
117
+ array('products', 0),
118
+ array('articles', 0),
119
+ array('stores', 0),
120
+ array(null, 0),
121
+ )
122
+ ));
123
+
124
+ $tabs = $helper->getActiveResultTabs($mockCollection);
125
+
126
+ //must return 3 tabs, there're all configured in BO, with show_noresult=true
127
+ $this->assertEquals(
128
+ 3,
129
+ count($tabs)
130
+ );
131
+ $this->assertTrue($tabs[0]['selected']);
132
+ $this->assertFalse(isset($tabs[1]['selected']));
133
+ $this->assertFalse(isset($tabs[2]['selected']));
134
+
135
+
136
+ }
137
+
138
+ /**
139
+ * Test method MDN_Antidot_Helper_Data getActiveResultTabs Case 2 :
140
+ *
141
+ * In the fixture only product and articles tabs are configured actives, without show_noresult=true
142
+ *
143
+ * @loadFixture
144
+ */
145
+ function testGetActiveResultTabsCase2()
146
+ {
147
+ /** @var $observer MDN_Antidot_Helper_Data */
148
+ $helper = Mage::helper('Antidot');
149
+
150
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
151
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
152
+ ->getMock();
153
+
154
+ //There's results in the 3 tabs
155
+ $mockCollection->expects($this->any())->method('getTotalResult')
156
+ ->will($this->returnValueMap(
157
+ array(
158
+ array('products', 10),
159
+ array('articles', 11),
160
+ array('stores', 12),
161
+ array(null, 33),
162
+ )
163
+ ));
164
+
165
+ $tabs = $helper->getActiveResultTabs($mockCollection);
166
+
167
+ //must return the 2 tabs actived in BO , only products and articles
168
+ $this->assertEquals(
169
+ 2,
170
+ count($tabs)
171
+ );
172
+
173
+ $this->assertEquals(
174
+ 'products',
175
+ $tabs[0]['tab']
176
+ );
177
+ $this->assertEquals(
178
+ 'articles',
179
+ $tabs[1]['tab']
180
+ );
181
+ $this->assertTrue($tabs[0]['selected']);
182
+ $this->assertFalse(isset($tabs[1]['selected']));
183
+
184
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
185
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
186
+ ->getMock();
187
+
188
+ //There's no results in any tabs
189
+ $mockCollection->expects($this->any())->method('getTotalResult')
190
+ ->will($this->returnValueMap(
191
+ array(
192
+ array('products', 0),
193
+ array('articles', 0),
194
+ array('stores', 0),
195
+ array(null, 0),
196
+ )
197
+ ));
198
+
199
+ $tabs = $helper->getActiveResultTabs($mockCollection);
200
+
201
+ // only the first tab product is displayed, for messaing
202
+ $this->assertEquals(
203
+ 1,
204
+ count($tabs)
205
+ );
206
+
207
+ $this->assertEquals(
208
+ 'products',
209
+ $tabs[0]['tab']
210
+ );
211
+
212
+ $this->assertTrue($tabs[0]['selected']);
213
+
214
+
215
+ // Create a stub for simulate MDN_Antidot_Model_Resource_Catalog_Product_Collection getTotalResult
216
+ $mockCollection = $this->getMockBuilder('MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock')
217
+ ->getMock();
218
+
219
+ //There's only result on articles
220
+ $mockCollection->expects($this->any())->method('getTotalResult')
221
+ ->will($this->returnValueMap(
222
+ array(
223
+ array('products', 0),
224
+ array('articles', 12),
225
+ array('stores', 0),
226
+ array(null, 12),
227
+ )
228
+ ));
229
+
230
+ $tabs = $helper->getActiveResultTabs($mockCollection);
231
+
232
+ //must return the 2 tabs actived in BO without show_noresult => only the first tab product is displayed
233
+ $this->assertEquals(
234
+ 1,
235
+ count($tabs)
236
+ );
237
+
238
+ $this->assertEquals(
239
+ 'articles',
240
+ $tabs[0]['tab']
241
+ );
242
+
243
+ $this->assertTrue($tabs[0]['selected']);
244
+
245
+ }
246
+
247
+
248
+ }
249
+
250
+ class MDN_Antidot_Model_Resource_Catalog_Product_Collection_Mock {
251
+ public function getTotalResult($tab = null) {
252
+ return;
253
+ }
254
  }
app/code/community/MDN/Antidot/Test/Helper/Data/fixtures/testGetActiveResultTabsCase1.yaml ADDED
@@ -0,0 +1,2 @@
 
 
1
+ config:
2
+ default/antidot/engine/result_tabs: a:3:{s:20:"_result_tab_products";a:3:{s:3:"tab";s:8:"products";s:6:"active";s:2:"on";s:13:"show_noresult";s:4:"true";}s:20:"_result_tab_articles";a:3:{s:3:"tab";s:8:"articles";s:6:"active";s:2:"on";s:13:"show_noresult";s:4:"true";}s:18:"_result_tab_stores";a:3:{s:3:"tab";s:6:"stores";s:6:"active";s:2:"on";s:13:"show_noresult";s:4:"true";}}
app/code/community/MDN/Antidot/Test/Helper/Data/fixtures/testGetActiveResultTabsCase2.yaml ADDED
@@ -0,0 +1,2 @@
 
 
1
+ config:
2
+ default/antidot/engine/result_tabs: a:3:{s:20:"_result_tab_products";a:2:{s:3:"tab";s:8:"products";s:6:"active";s:2:"on";}s:20:"_result_tab_articles";a:2:{s:3:"tab";s:8:"articles";s:6:"active";s:2:"on";}s:18:"_result_tab_stores";a:2:{s:3:"tab";s:6:"stores";s:13:"show_noresult";s:4:"true";}}
app/code/community/MDN/Antidot/Test/Model/Export/Abstract.php CHANGED
@@ -56,6 +56,18 @@ class MDN_Antidot_Test_Model_Export_Abstract extends EcomDev_PHPUnit_Test_Case
56
  $url = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($export, 'getExactUrl', array($url, false));
57
  $this->assertEquals("http://magento.jmale.local.amg-dev.fr/index.php/essai-1.html", $url);
58
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
  }
61
  }
56
  $url = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($export, 'getExactUrl', array($url, false));
57
  $this->assertEquals("http://magento.jmale.local.amg-dev.fr/index.php/essai-1.html", $url);
58
 
59
+ $url = "http://magento.jmale.local.amg-dev.fr/catalogsearch/result/?q=TEST";
60
+ $url = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($export, 'getExactUrl', array($url));
61
+ $this->assertEquals("/catalogsearch/result/?q=TEST", $url);
62
+
63
+ $url = "http://magento.jmale.local.amg-dev.fr/catalogsearch/result/?SID=c9kg93cu6721ahmt774e2sb7n0&q=TEST";
64
+ $url = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($export, 'getExactUrl', array($url));
65
+ $this->assertEquals("/catalogsearch/result/?q=TEST", $url);
66
+
67
+ $url = "http://magento.jmale.local.amg-dev.fr/catalogsearch/result/?q=TEST&SID=c9kg93cu6721ahmt774e2sb7n0";
68
+ $url = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($export, 'getExactUrl', array($url));
69
+ $this->assertEquals("/catalogsearch/result/?q=TEST", $url);
70
+
71
 
72
  }
73
  }
app/code/community/MDN/Antidot/Test/Model/Export/Article.php CHANGED
@@ -4,6 +4,22 @@
4
  class MDN_Antidot_Test_Model_Export_Article extends EcomDev_PHPUnit_Test_Case
5
  {
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  /*
8
  * MCNX-56 add version number and run context in the feed tag
9
  */
@@ -22,4 +38,94 @@ class MDN_Antidot_Test_Model_Export_Article extends EcomDev_PHPUnit_Test_Case
22
 
23
  }
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
4
  class MDN_Antidot_Test_Model_Export_Article extends EcomDev_PHPUnit_Test_Case
5
  {
6
 
7
+ public static function setUpBeforeClass()
8
+ {
9
+ //avoid errors when session_start is called during the test
10
+ @session_start();
11
+
12
+ $setup = Mage::getResourceModel('core/setup', 'core_setup');
13
+ $setup->startSetup();
14
+
15
+ $table = $setup->getTable('cms_page');
16
+
17
+ $setup->run("DELETE FROM $table");
18
+
19
+ $setup->endSetup();
20
+
21
+ }
22
+
23
  /*
24
  * MCNX-56 add version number and run context in the feed tag
25
  */
38
 
39
  }
40
 
41
+ /**
42
+ * Test Full file export
43
+ * @test
44
+ * @loadFixture
45
+ */
46
+ public function testWriteXml() {
47
+
48
+ /* @var $export \MDN_Antidot_Model_Export_Article */
49
+ $export = Mage::getModel('Antidot/export_article');
50
+
51
+ $context = Mage::getModel('Antidot/export_context', array('fr', 'PHPUNIT'));
52
+ //Store id 3 : site FR, id5 : site FR discount
53
+ $context->addStore(Mage::getModel('core/store')->load(3));
54
+ $context->addStore(Mage::getModel('core/store')->load(5));
55
+
56
+ $type = MDN_Antidot_Model_Observer::GENERATE_FULL;
57
+
58
+ $filename = sys_get_temp_dir().DS.sprintf(MDN_Antidot_Model_Export_Article::FILENAME_XML, 'jetpulp', $type, $context->getLang());
59
+
60
+ $items = $export->writeXml($context, $filename, $type);
61
+
62
+ /*
63
+ * test three articles are exported, number returned by the method: 2 articles, one one 2 websites => 3 article exported
64
+ */
65
+ $this->assertEquals(3, $items);
66
+
67
+ //replace generated_at by the one in the expected result
68
+ $result = file_get_contents($filename);
69
+
70
+ /**
71
+ * test the xml contains the correct owner tag
72
+ */
73
+ $xml = new SimpleXMLElement($result);
74
+ $this->assertEquals("JETPULP", (string)$xml->header->owner);
75
+
76
+ /**
77
+ * test the xml contains the correct feed tag
78
+ */
79
+ $this->assertEquals('article PHPUNIT v'.Mage::getConfig()->getNode()->modules->MDN_Antidot->version, (string)$xml->header->feed);
80
+
81
+ /**
82
+ * test the xml contains the correct websites tag
83
+ */
84
+ $this->assertEquals('3', $xml->article[0]->websites->website[0]['id']);
85
+ $this->assertEquals('French Website', (string)$xml->article[0]->websites->website[0]);
86
+ $this->assertEquals('3', $xml->article[1]->websites->website[0]['id']);
87
+ $this->assertEquals('French Website', (string)$xml->article[1]->websites->website[0]);
88
+ $this->assertEquals('5', $xml->article[2]->websites->website[0]['id']);
89
+ $this->assertEquals('France Website_discount', (string)$xml->article[2]->websites->website[0]);
90
+
91
+ /**
92
+ * test the xml contains the correct name tag
93
+ */
94
+ $this->assertEquals('Article A', (string)$xml->article[0]->title);
95
+ $this->assertEquals('Article B', (string)$xml->article[1]->title);
96
+ $this->assertEquals('Article B', (string)$xml->article[2]->title);
97
+
98
+
99
+ /**
100
+ * test the xml contains the correct text tag
101
+ */
102
+ $this->assertEquals('test contenu A<br>test', (string)$xml->article[0]->text);
103
+ $this->assertEquals('test contenu B<br>test', (string)$xml->article[1]->text);
104
+ $this->assertEquals('test contenu B<br>test', (string)$xml->article[2]->text);
105
+
106
+
107
+ /**
108
+ * test the xml contains the correct url tags
109
+ */
110
+ $this->assertEquals('http://www.monsiteweb.fr/AA/', (string)$xml->article[0]->url);
111
+ $this->assertEquals('http://www.monsiteweb.fr/BB/', (string)$xml->article[1]->url);
112
+ $this->assertEquals('http://www.monsitediscount.fr/BB/', (string)$xml->article[2]->url);
113
+
114
+
115
+ /**
116
+ * test the xml contains the identifier
117
+ */
118
+ $this->assertEquals('identifier', $xml->article[0]->identifiers->identifier[0]['type']);
119
+ $this->assertEquals('identifier', $xml->article[1]->identifiers->identifier[0]['type']);
120
+ $this->assertEquals('identifier', $xml->article[2]->identifiers->identifier[0]['type']);
121
+ $this->assertEquals('AA', $xml->article[0]->identifiers->identifier[0]);
122
+ $this->assertEquals('BB', $xml->article[1]->identifiers->identifier[0]);
123
+ $this->assertEquals('BB', $xml->article[2]->identifiers->identifier[0]);
124
+
125
+
126
+
127
+
128
+ }
129
+
130
+
131
  }
app/code/community/MDN/Antidot/Test/Model/Export/Article/fixtures/testWriteXml.yaml ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ scope:
2
+ website: # Initialize websites
3
+ - website_id: 2
4
+ code: usa_website
5
+ name: USA Website
6
+ default_group_id: 2
7
+ - website_id: 3
8
+ code: french_website
9
+ name: French Website
10
+ default_group_id: 3
11
+ - website_id: 4
12
+ code: german_website
13
+ name: German Website
14
+ default_group_id: 4
15
+ - website_id: 5
16
+ code: french_website_discount
17
+ name: France Website_discount
18
+ default_group_id: 5
19
+ group: # Initializes store groups
20
+ - group_id: 2
21
+ website_id: 2
22
+ name: USA Store Group
23
+ default_store_id: 2
24
+ root_category_id: 2 # Default Category
25
+ - group_id: 3
26
+ website_id: 3
27
+ name: French Store Group
28
+ default_store_id: 3
29
+ root_category_id: 2 # Default Category
30
+ - group_id: 4
31
+ website_id: 4
32
+ name: German Store Group
33
+ default_store_id: 4
34
+ root_category_id: 2 # Default Category
35
+ - group_id: 5
36
+ website_id: 5
37
+ name: French Store Group Discount
38
+ default_store_id: 5
39
+ root_category_id: 2 # Default Category
40
+ store: # Initializes store views
41
+ - store_id: 2
42
+ website_id: 2
43
+ group_id: 2
44
+ code: usa
45
+ name: USA Store
46
+ is_active: 1
47
+ - store_id: 3
48
+ website_id: 3
49
+ group_id: 3
50
+ code: france
51
+ name: France Store
52
+ is_active: 1
53
+ - store_id: 4
54
+ website_id: 4
55
+ group_id: 4
56
+ code: germany
57
+ name: Germany Store
58
+ is_active: 1
59
+ - store_id: 5
60
+ website_id: 5
61
+ group_id: 5
62
+ code: france_discount
63
+ name: France Store Discount
64
+ is_active: 1
65
+
66
+ config:
67
+ default/antidot/general/owner: JETPULP
68
+ default/antidot/fields_product/properties: a:2:{s:18:"_1426953698813_813";a:2:{s:5:"value";s:7:"authors";s:12:"autocomplete";s:1:"0";}s:18:"_1426953714346_346";a:2:{s:5:"value";s:6:"editor";s:12:"autocomplete";s:1:"0";}}
69
+ default/web/secure/base_url: http://www.mywebsite.com/
70
+ default/web/unsecure/base_url: http://www.mywebsite.com/
71
+ default/general/locale/code: zz_ZZ
72
+ stores/usa/web/secure/base_url: http://www.mywebsite.com/
73
+ stores/usa/web/unsecure/base_url: http://www.mywebsite.com/
74
+ stores/usa/general/locale/code: en_US
75
+ stores/france/web/secure/base_url: http://www.monsiteweb.fr/
76
+ stores/france/web/unsecure/base_url: http://www.monsiteweb.fr/
77
+ stores/france/general/locale/code: fr_FR
78
+ stores/germany/web/secure/base_url: http://www.meinwebseite.de/
79
+ stores/germany/web/unsecure/base_url: http://www.meinwebseite.de/
80
+ stores/germany/general/locale/code: de_DE
81
+ stores/france_discount/web/secure/base_url: http://www.monsitediscount.fr/
82
+ stores/france_discount/web/unsecure/base_url: http://www.monsitediscount.fr/
83
+ stores/france_discount/general/locale/code: fr_FR
84
+ stores/france/currency/options/default: EUR
85
+
86
+ tables:
87
+ cms_page:
88
+ - page_id: 1
89
+ title: Article A
90
+ identifier: AA
91
+ content: test contenu A<br>test
92
+ is_active: 1
93
+ - page_id: 2
94
+ title: Article B
95
+ identifier: BB
96
+ content: test contenu B<br>test
97
+ is_active: 1
98
+ - page_id: 3
99
+ title: Article C
100
+ identifier: CC
101
+ content: test contenu C<br>test
102
+ is_active: 0
103
+ - page_id: 4
104
+ title: No route 404
105
+ identifier: no-route
106
+ content: oups
107
+ is_active: 1
108
+ cms_page_store:
109
+ - page_id: 1
110
+ store_id: 3
111
+ - page_id: 2
112
+ store_id: 0
113
+ - page_id: 3
114
+ store_id: 0
115
+ - page_id: 4
116
+ store_id: 0
117
+
app/code/community/MDN/Antidot/Test/Model/Export/Store.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class MDN_Antidot_Test_Model_Export_Store extends EcomDev_PHPUnit_Test_Case
5
+ {
6
+
7
+ /*
8
+ * MCNX-56 add version number and run context in the feed tag
9
+ */
10
+ public function testGetFeed() {
11
+
12
+ $export = Mage::getModel('Antidot/export_store');
13
+
14
+ $context = Mage::getModel('Antidot/export_context', array('fr', 'phpunit'));
15
+
16
+ $feed = $export->getFeed($context);
17
+
18
+ $this->assertEquals(
19
+ 'store phpunit v'.Mage::getConfig()->getNode()->modules->MDN_Antidot->version,
20
+ $feed
21
+ );
22
+
23
+ }
24
+
25
+
26
+ }
app/code/community/MDN/Antidot/Test/Model/Observer.php CHANGED
@@ -130,4 +130,34 @@ class MDN_Antidot_Test_Model_Observer extends EcomDev_PHPUnit_Test_Case
130
 
131
  unlink($filename);
132
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
130
 
131
  unlink($filename);
132
  }
133
+
134
+
135
+ /**
136
+ * MCNX-81 : Add export for Magento Stores
137
+ */
138
+ function testStoresFullExport() {
139
+
140
+ /** @var $observer MDN_Antidot_Model_Observer */
141
+ $observer = Mage::getModel('Antidot/observer');
142
+
143
+ $filepath = Mage::getStoreConfig('antidot/'.MDN_Antidot_Model_Export_Store::FILE_PATH_CONF.'/file_path', Mage_Core_Model_App::ADMIN_STORE_ID);
144
+ if (strpos($filepath, '/') !==0) {
145
+ $filepath = Mage::getBaseDir() . DS . $filepath;
146
+ }
147
+ $filename = $filepath .DS . 'unittest_full_magento_stores.zip';
148
+ file_put_contents($filename, 'testStoresFullExport');
149
+
150
+ $mock = $this->getModelMock('Antidot/transport', array('send'));
151
+ $mock->expects($this->once())
152
+ ->method('send')
153
+ ->willReturn(true);
154
+
155
+ $this->replaceByMock('model', 'Antidot/transport', $mock);
156
+
157
+ $observer->storesFullExport('phpunit');
158
+
159
+ $this->assertTrue(!file_exists($filename));
160
+
161
+ }
162
+
163
  }
app/code/community/MDN/Antidot/Test/Model/Search/Search.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ *
12
+ * @copyright Copyright (c) 2015 Antidot (http://www.antidot.net)
13
+ * @author : Antidot devmagento@antidot.net
14
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
15
+ */
16
+ class MDN_Antidot_Test_Model_Search_Search extends EcomDev_PHPUnit_Test_Case
17
+ {
18
+
19
+ public static function setUpBeforeClass()
20
+ {
21
+ //avoid errors when session_start is called during the test
22
+ @session_start();
23
+ }
24
+
25
+ /**
26
+ * Check the filters genrated for each feed
27
+ * @test
28
+ */
29
+ public function testGetQuery() {
30
+
31
+
32
+ /** @var $search MDN_Antidot_Model_Search_Search */
33
+ $search = Mage::getModel('Antidot/search_search');
34
+
35
+ $params = array( 'page' => 1, 'limit'=>9, 'lang'=>'fr', 'sort'=>array("afs:relevance,DESC"));
36
+ $params['filters'] = array(array('store'=>'"5"', 'website'=>'"2"'));
37
+ $afsQuery = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($search, 'getQuery', array("test", $params));
38
+
39
+ $filtersCatalog = $afsQuery->get_filters('Catalog');
40
+ $this->assertEquals(
41
+ array('store','website'),
42
+ $filtersCatalog
43
+ );
44
+
45
+ $filtersArticles = $afsQuery->get_filters('Articles');
46
+ $this->assertEquals(
47
+ array('website'),
48
+ $filtersArticles
49
+ );
50
+
51
+
52
+
53
+ }
54
+
55
+ }
app/code/community/MDN/Antidot/Test/Model/Search/Suggest.php CHANGED
@@ -26,15 +26,71 @@ class MDN_Antidot_Test_Model_Search_Suggest extends EcomDev_PHPUnit_Test_Case
26
 
27
  Mage::app()->setCurrentStore(5);
28
 
29
- /** @var $observer MDN_Antidot_Model_Search_Suggest */
30
  $suggest = Mage::getModel('Antidot/search_suggest');
31
 
32
- $feeds = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($suggest, 'getFeeds', array('products'));
33
 
34
  $this->assertEquals(
35
- 'featured_products_5_fr&afs:feed=categories_3_fr&afs:feed=brands_3_fr&afs:feed=articles_3_fr&afs:feed=stores_3_fr',
36
  $feeds
37
  );
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
40
  }
26
 
27
  Mage::app()->setCurrentStore(5);
28
 
29
+ /** @var $suggest MDN_Antidot_Model_Search_Suggest */
30
  $suggest = Mage::getModel('Antidot/search_suggest');
31
 
32
+ $feeds = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($suggest, 'getFeeds', array());
33
 
34
  $this->assertEquals(
35
+ 'featured_products_5_fr&afs:feed=categories_3_fr&afs:feed=brands_3_fr',
36
  $feeds
37
  );
38
 
39
+
40
+ }
41
+
42
+ /**
43
+ *
44
+ * @test
45
+ * @loadFixture
46
+ */
47
+ public function testFeedConfig() {
48
+
49
+ Mage::app()->setCurrentStore(5);
50
+
51
+ /** @var $suggest MDN_Antidot_Model_Search_Suggest */
52
+ $suggest = Mage::getModel('Antidot/search_suggest');
53
+
54
+ $feeds = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($suggest, 'getFeeds', array());
55
+
56
+ $this->assertEquals(
57
+ 'featured_products_5_fr&afs:feed=categories_3_fr&afs:feed=articles_3_fr',
58
+ $feeds
59
+ );
60
+
61
+ $feedOrder = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($suggest, 'getFeedOrder', array('products'));
62
+
63
+ $this->assertEquals(
64
+ 'featured_products_5_fr,categories_3_fr,articles_3_fr',
65
+ $feedOrder
66
+ );
67
+
68
+
69
+ }
70
+
71
+ public function testPostProcessXml() {
72
+
73
+ Mage::app()->setCurrentStore(1);
74
+
75
+ /** @var $suggest MDN_Antidot_Model_Search_Suggest */
76
+ $suggest = Mage::getModel('Antidot/search_suggest');
77
+
78
+ $xml = new SimpleXMLElement('<afs:replies xmlns:afs="http://ref.antidot.net/v7/afs#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ref.antidot.net/v7/afs# http://ref.antidot.net/v7.8/acp-reply.xsd" status="true">
79
+ <afs:header>
80
+ <afs:query textQuery="test"/>
81
+ </afs:header>
82
+ <afs:replySet name="featured_products_1_en">
83
+ <afs:meta uri="featured_products_1_en" totalItems="1" producer="acp"/>
84
+ <afs:reply label="Gaming Computer">
85
+ <afs:option key="url_thumbnail" value="http://magento.antidot.com/media/catalog/product/g/a/gaming-computer.jpg"/>
86
+ </afs:reply>
87
+ </afs:replySet>
88
+ </afs:replies>');
89
+ $xmlProcessed = MDN_Antidot_Test_PHPUnitUtil::callPrivateMethod($suggest, 'postProcessXml', array(&$xml));
90
+
91
+
92
+ $this->assertRegExp('#media\/catalog\/product\/cache\/1\/thumbnail\/40x\/#', $xmlProcessed->asXML());
93
+
94
+
95
  }
96
  }
app/code/community/MDN/Antidot/Test/Model/Search/Suggest/fixtures/testFeedConfig.yaml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ scope:
2
+ website: # Initialize websites
3
+ - website_id: 3
4
+ code: french_website
5
+ name: French Website
6
+ default_group_id: 3
7
+ group: # Initializes store groups
8
+ - group_id: 3
9
+ website_id: 3
10
+ name: French Store Group
11
+ default_store_id: 3
12
+ root_category_id: 2 # Default Category
13
+ - group_id: 5
14
+ website_id: 3
15
+ name: French Store Group Discount
16
+ default_store_id: 5
17
+ root_category_id: 2 # Default Category
18
+ store: # Initializes store views
19
+ - store_id: 3
20
+ website_id: 3
21
+ group_id: 3
22
+ code: france
23
+ name: France Store
24
+ is_active: 1
25
+ - store_id: 5
26
+ website_id: 3
27
+ group_id: 5
28
+ code: france_discount
29
+ name: France Store Discount
30
+ is_active: 1
31
+ config:
32
+ default/general/locale/code: zz_ZZ
33
+ default/antidot/suggest/feeds: a:5:{s:15:"_feeds_products";a:3:{s:4:"feed";s:8:"products";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"5";}s:17:"_feeds_categories";a:3:{s:4:"feed";s:10:"categories";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"3";}s:13:"_feeds_brands";a:2:{s:4:"feed";s:6:"brands";s:14:"suggest_number";s:2:"10";}s:15:"_feeds_articles";a:3:{s:4:"feed";s:8:"articles";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"6";}s:13:"_feeds_stores";a:2:{s:4:"feed";s:6:"stores";s:14:"suggest_number";s:2:"10";}}
34
+ stores/france/general/locale/code: fr_FR
35
+ stores/france_discount/general/locale/code: fr_FR
36
+ stores/france_discount/antidot/suggest/feeds: a:5:{s:15:"_feeds_products";a:3:{s:4:"feed";s:8:"products";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"5";}s:17:"_feeds_categories";a:3:{s:4:"feed";s:10:"categories";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"3";}s:13:"_feeds_brands";a:2:{s:4:"feed";s:6:"brands";s:14:"suggest_number";s:2:"10";}s:15:"_feeds_articles";a:3:{s:4:"feed";s:8:"articles";s:6:"active";s:2:"on";s:14:"suggest_number";s:1:"6";}s:13:"_feeds_stores";a:2:{s:4:"feed";s:6:"stores";s:14:"suggest_number";s:2:"10";}}
app/code/community/MDN/Antidot/Test/Model/Transport/Http.php CHANGED
@@ -23,11 +23,55 @@ class MDN_Antidot_Test_Model_Transport_Http extends EcomDev_PHPUnit_Test_Case
23
  /** @var $observer MDN_Antidot_Model_Transport_Http */
24
  $transport = Mage::getModel('Antidot/transport_http');
25
 
26
- $file = "/tmp/antidot/unittest_send.xml";
 
 
 
 
 
 
 
 
 
 
27
  file_put_contents($file,"<categories xmlns=\"http://ref.antidot.net/store/afs#\"></categories>");
28
 
29
  $exportModel = Mage::getModel('Antidot/export_product');
30
  $curlConnector = new SAI_CurlStub();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  //Set response for upload
32
  $pafLiveResponse = <<<JSON
33
  {"x:type":"ws.response","query":{"x:type":"ws.response.query","locale":"*","parameters":{"x:type":"collection","x:values":[]},"properties":{"x:type":"x:dynamic"}},"result":{"x:type":"PushPafContentReply","jobId":3641,"started":true,"uuid":"e4fe5bfa-dcc7-409d-b688-288cc62e314e"}}
@@ -38,6 +82,8 @@ JSON;
38
 
39
  $this->assertNull($result);
40
 
 
 
41
  }
42
 
43
  }
23
  /** @var $observer MDN_Antidot_Model_Transport_Http */
24
  $transport = Mage::getModel('Antidot/transport_http');
25
 
26
+ $baseDirectory = sys_get_temp_dir().DS;
27
+ if (Mage::getStoreConfig('antidot/ftp/working_directory'))
28
+ $baseDirectory = Mage::getStoreConfig('antidot/ftp/working_directory').DS;
29
+
30
+ $tmpDirectory = $baseDirectory.'antidot'.DS;
31
+
32
+ if(!is_dir($tmpDirectory)) {
33
+ mkdir($tmpDirectory, 0775, true);
34
+ }
35
+
36
+ $file = $tmpDirectory . DS . "unittest_send.xml";
37
  file_put_contents($file,"<categories xmlns=\"http://ref.antidot.net/store/afs#\"></categories>");
38
 
39
  $exportModel = Mage::getModel('Antidot/export_product');
40
  $curlConnector = new SAI_CurlStub();
41
+
42
+ //Set BO response for AboutConnector
43
+ $aboutRequestOpts = array(CURLOPT_URL => "https://bo-store.afs-antidot.net/bo-ws/about");
44
+ $aboutResponse = <<<JSON
45
+ {
46
+ "x:type":"ws.response",
47
+ "query":{
48
+ "x:type":"ws.response.query",
49
+ "parameters":{
50
+ "x:type":"collection",
51
+ "x:values":[
52
+
53
+ ]
54
+ },
55
+ "properties":{
56
+ "x:type":"x:dynamic"
57
+ }
58
+ },
59
+ "result":{
60
+ "x:type":"bows.about",
61
+ "boWsVersion":{
62
+ "x:type":"AfsVersion",
63
+ "build":"3eaebfd1f1fe261780347cbc35bfbd65d613575e",
64
+ "gen":"7.7",
65
+ "major":"4",
66
+ "minor":"0",
67
+ "motto":"Pink Dolphin"
68
+ },
69
+ "copyright":"Copyright (C) 1999-2013 Antidot"
70
+ }
71
+ }
72
+ JSON;
73
+ $curlConnector->setResponse($aboutResponse, $aboutRequestOpts);
74
+
75
  //Set response for upload
76
  $pafLiveResponse = <<<JSON
77
  {"x:type":"ws.response","query":{"x:type":"ws.response.query","locale":"*","parameters":{"x:type":"collection","x:values":[]},"properties":{"x:type":"x:dynamic"}},"result":{"x:type":"PushPafContentReply","jobId":3641,"started":true,"uuid":"e4fe5bfa-dcc7-409d-b688-288cc62e314e"}}
82
 
83
  $this->assertNull($result);
84
 
85
+ unlink($file);
86
+
87
  }
88
 
89
  }
app/code/community/MDN/Antidot/controllers/Adminhtml/Antidot/PushController.php CHANGED
@@ -73,4 +73,54 @@ class MDN_Antidot_Adminhtml_Antidot_PushController extends Mage_Adminhtml_Contro
73
  }
74
  $this->_redirectReferer();
75
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  }
73
  }
74
  $this->_redirectReferer();
75
  }
76
+
77
+ /**
78
+ * Generate the articles file, call from back office
79
+ */
80
+ public function articleAction()
81
+ {
82
+ try {
83
+ if (Mage::getModel('Antidot/observer')->articlesFullExport('UI')) {
84
+ Mage::getSingleton('adminhtml/session')->addSuccess(
85
+ Mage::helper('Antidot')->__('Articles exported')
86
+ );
87
+ } else {
88
+ Mage::getSingleton('adminhtml/session')->addWarning(
89
+ Mage::helper('Antidot')->__('No Article to export')
90
+ );
91
+ }
92
+ }
93
+ catch(Exception $ex) {
94
+ Mage::getSingleton('adminhtml/session')->addError(
95
+ Mage::helper('Antidot')->__('An error occured : %s', $ex->getMessage())
96
+ );
97
+ }
98
+ $this->_redirectReferer();
99
+ }
100
+
101
+
102
+ /**
103
+ * Generate the stores file, call from back office
104
+ */
105
+ public function storeAction()
106
+ {
107
+ try {
108
+ if (Mage::getModel('Antidot/observer')->storesFullExport('UI')) {
109
+ Mage::getSingleton('adminhtml/session')->addSuccess(
110
+ Mage::helper('Antidot')->__('Stores exported')
111
+ );
112
+ } else {
113
+ Mage::getSingleton('adminhtml/session')->addWarning(
114
+ Mage::helper('Antidot')->__('No store to export')
115
+ );
116
+ }
117
+ }
118
+ catch(Exception $ex) {
119
+ Mage::getSingleton('adminhtml/session')->addError(
120
+ Mage::helper('Antidot')->__('An error occured : %s', $ex->getMessage())
121
+ );
122
+ }
123
+ $this->_redirectReferer();
124
+ }
125
+
126
  }
app/code/community/MDN/Antidot/etc/config.xml CHANGED
@@ -14,11 +14,19 @@
14
  <schedule><cron_expr>00 21 * * *</cron_expr></schedule>
15
  <run><model>Antidot/Observer::categoriesFullExport</model></run>
16
  </antidot_categories_full_export>
 
 
 
 
 
 
 
 
17
  </jobs>
18
  </crontab>
19
  <modules>
20
  <MDN_Antidot>
21
- <version>1.2.2</version>
22
  </MDN_Antidot>
23
  </modules>
24
  <global>
@@ -196,23 +204,21 @@
196
  </engine>
197
  <suggest>
198
  <enable>1</enable>
199
- <products>1</products>
200
- <brands>1</brands>
201
- <categories>1</categories>
202
- <products_displayed>10</products_displayed>
203
- <brands_displayed>10</brands_displayed>
204
- <categories_displayed>10</categories_displayed>
205
  <template>
206
  <![CDATA[
207
  <?xml version="1.0" encoding="UTF-8"?>
208
  <xsl:stylesheet xmlns:afs="http://ref.antidot.net/v7/afs#"
209
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
210
  <!-- Titles to translate in localized storeviews -->
211
  <xsl:variable name="see-more-products">See more products</xsl:variable>
212
  <!-- Column titles -->
213
  <xsl:variable name="products-title">Products</xsl:variable>
214
  <xsl:variable name="categories-title">Categories</xsl:variable>
215
  <xsl:variable name="brands-title">Brands</xsl:variable>
 
 
216
  <!-- Thumbnail settings -->
217
  <xsl:variable name="thumbnail_width">40</xsl:variable>
218
  <!-- Price settings -->
@@ -229,12 +235,14 @@
229
  <xsl:variable name="display_promo" select="true()"/>
230
  <xsl:variable name="display_price_off" select="true()"/>
231
  <xsl:variable name="promo_text">PROMO</xsl:variable>
232
-
233
  <!-- Main HTML template -->
234
  <xsl:template match="afs:replies">
235
  <xsl:if test="afs:replySet">
236
  <ul class="ajax-search">
237
- <li class="search-container-top"/>
 
 
238
  <xsl:apply-templates select="afs:replySet"/>
239
  <a style="float:right;">
240
  <xsl:attribute name="href"><xsl:value-of select="$searchUrl"/><xsl:value-of
@@ -244,7 +252,6 @@
244
  </ul>
245
  </xsl:if>
246
  </xsl:template>
247
-
248
  <!-- Suggestions column main template -->
249
  <xsl:template match="afs:replySet">
250
  <xsl:variable name="title">
@@ -259,6 +266,12 @@
259
  <xsl:when test="starts-with(@name,'brands')">
260
  <xsl:value-of select="$brands-title"/>
261
  </xsl:when>
 
 
 
 
 
 
262
  <xsl:when test="starts-with(@name,'property_')">
263
  <xsl:call-template name="upperCaseFirstLetter">
264
  <xsl:with-param name="str">
@@ -284,15 +297,29 @@
284
  </xsl:otherwise>
285
  </xsl:choose>
286
  </xsl:variable>
287
- <xsl:element name="li">
288
- <xsl:attribute name="class">title</xsl:attribute>
289
- <xsl:element name="span">
290
- <xsl:value-of select="$title"/>
 
 
291
  </xsl:element>
292
- </xsl:element>
293
- <xsl:apply-templates select="afs:reply"/>
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  </xsl:template>
295
-
296
  <!-- Template common to basic and products replies -->
297
  <xsl:template match="afs:reply">
298
  <xsl:variable name="parent" select="parent::afs:replySet/@name"/>
@@ -303,6 +330,8 @@
303
  <xsl:when test="starts-with($parent,'categories')">category</xsl:when>
304
  <xsl:when test="starts-with($parent,'featured_products')">product</xsl:when>
305
  <xsl:when test="starts-with($parent,'brands')">brand</xsl:when>
 
 
306
  <xsl:when test="starts-with($parent,'property_')">
307
  <xsl:value-of
308
  select="substring(substring-after($parent,'property_'),1,string-length($parent)-14)"
@@ -385,7 +414,6 @@
385
  <div style="clear:both;"/>
386
  </xsl:element>
387
  </xsl:template>
388
-
389
  <!-- Price discount percentage -->
390
  <xsl:template match="afs:option" mode="price_off">
391
  <xsl:element name="span">
@@ -405,7 +433,6 @@
405
  </xsl:choose>
406
  </xsl:element>
407
  </xsl:template>
408
-
409
  <!-- Thumbnail display -->
410
  <xsl:template match="afs:option" mode="url_thumbnail">
411
  <xsl:element name="div">
@@ -426,14 +453,12 @@
426
  </xsl:element>
427
  </xsl:element>
428
  </xsl:template>
429
-
430
  <!-- Creates href link -->
431
  <xsl:template match="afs:option" mode="href">
432
  <xsl:attribute name="href">
433
  <xsl:apply-templates select="@value"/>
434
  </xsl:attribute>
435
  </xsl:template>
436
-
437
  <!-- Basic suggestion template with a custom rendering for categories -->
438
  <xsl:template match="afs:reply" mode="basic">
439
  <xsl:element name="div">
@@ -446,7 +471,6 @@
446
  </xsl:if>
447
  </xsl:element>
448
  </xsl:template>
449
-
450
  <!-- Display parent category -->
451
  <xsl:template match="afs:option" mode="parent">
452
  <xsl:text>(</xsl:text>
@@ -455,7 +479,6 @@
455
  <xsl:value-of select="@value"/>
456
  <xsl:text>)</xsl:text>
457
  </xsl:template>
458
-
459
  <!-- Product rich template: uses custom metadata like price -->
460
  <xsl:template match="afs:reply" mode="product">
461
  <xsl:element name="div">
@@ -481,7 +504,6 @@
481
  </xsl:if>
482
  </xsl:element>
483
  </xsl:template>
484
-
485
  <!-- Display price using regional settings -->
486
  <xsl:template match="afs:option" mode="price_display">
487
  <xsl:variable name="currency">
@@ -515,7 +537,6 @@
515
  </xsl:otherwise>
516
  </xsl:choose>
517
  </xsl:template>
518
-
519
  <!-- Translate first letter of a string into a upper case if it was lower -->
520
  <xsl:template name="upperCaseFirstLetter">
521
  <xsl:param name="str"/>
@@ -524,7 +545,6 @@
524
  <xsl:value-of
525
  select="concat(translate(substring($str,1,1),$vLower,$vUpper),substring($str,2))"/>
526
  </xsl:template>
527
-
528
  </xsl:stylesheet>
529
  ]]>
530
  </template>
@@ -580,9 +600,6 @@
580
  &lt;/feeds&gt;
581
  ]]>
582
  </suggest_xml>
583
- <order_1>categories</order_1>
584
- <order_2>products</order_2>
585
- <order_3>brands</order_3>
586
  </suggest>
587
  <fields_category>
588
  <name>name</name>
14
  <schedule><cron_expr>00 21 * * *</cron_expr></schedule>
15
  <run><model>Antidot/Observer::categoriesFullExport</model></run>
16
  </antidot_categories_full_export>
17
+ <antidot_articles_full_export>
18
+ <schedule><cron_expr>00 26 * * *</cron_expr></schedule>
19
+ <run><model>Antidot/Observer::articlesFullExport</model></run>
20
+ </antidot_articles_full_export>
21
+ <antidot_stores_full_export>
22
+ <schedule><cron_expr>00 31 * * *</cron_expr></schedule>
23
+ <run><model>Antidot/Observer::storesFullExport</model></run>
24
+ </antidot_stores_full_export>
25
  </jobs>
26
  </crontab>
27
  <modules>
28
  <MDN_Antidot>
29
+ <version>1.2.3</version>
30
  </MDN_Antidot>
31
  </modules>
32
  <global>
204
  </engine>
205
  <suggest>
206
  <enable>1</enable>
207
+ <feeds>a:5:{s:17:"_feeds_categories";a:3:{s:4:"feed";s:10:"categories";s:6:"active";s:2:"on";s:14:"suggest_number";s:2:"10";}s:15:"_feeds_products";a:3:{s:4:"feed";s:8:"products";s:6:"active";s:2:"on";s:14:"suggest_number";s:2:"10";}s:13:"_feeds_brands";a:3:{s:4:"feed";s:6:"brands";s:6:"active";s:2:"on";s:14:"suggest_number";s:2:"10";}s:15:"_feeds_articles";a:2:{s:4:"feed";s:8:"articles";s:14:"suggest_number";s:2:"10";}s:13:"_feeds_stores";a:2:{s:4:"feed";s:6:"stores";s:14:"suggest_number";s:2:"10";}}</feeds>
 
 
 
 
 
208
  <template>
209
  <![CDATA[
210
  <?xml version="1.0" encoding="UTF-8"?>
211
  <xsl:stylesheet xmlns:afs="http://ref.antidot.net/v7/afs#"
212
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
213
+ <xsl:output indent="yes"/>
214
  <!-- Titles to translate in localized storeviews -->
215
  <xsl:variable name="see-more-products">See more products</xsl:variable>
216
  <!-- Column titles -->
217
  <xsl:variable name="products-title">Products</xsl:variable>
218
  <xsl:variable name="categories-title">Categories</xsl:variable>
219
  <xsl:variable name="brands-title">Brands</xsl:variable>
220
+ <xsl:variable name="articles-title">Articles</xsl:variable>
221
+ <xsl:variable name="stores-title">Stores</xsl:variable>
222
  <!-- Thumbnail settings -->
223
  <xsl:variable name="thumbnail_width">40</xsl:variable>
224
  <!-- Price settings -->
235
  <xsl:variable name="display_promo" select="true()"/>
236
  <xsl:variable name="display_price_off" select="true()"/>
237
  <xsl:variable name="promo_text">PROMO</xsl:variable>
238
+ <xsl:variable name="display_block" select="false()"/>
239
  <!-- Main HTML template -->
240
  <xsl:template match="afs:replies">
241
  <xsl:if test="afs:replySet">
242
  <ul class="ajax-search">
243
+ <li class="search-container-top">
244
+ <div class="empty_column"/>
245
+ </li>
246
  <xsl:apply-templates select="afs:replySet"/>
247
  <a style="float:right;">
248
  <xsl:attribute name="href"><xsl:value-of select="$searchUrl"/><xsl:value-of
252
  </ul>
253
  </xsl:if>
254
  </xsl:template>
 
255
  <!-- Suggestions column main template -->
256
  <xsl:template match="afs:replySet">
257
  <xsl:variable name="title">
266
  <xsl:when test="starts-with(@name,'brands')">
267
  <xsl:value-of select="$brands-title"/>
268
  </xsl:when>
269
+ <xsl:when test="starts-with(@name,'articles')">
270
+ <xsl:value-of select="$articles-title"/>
271
+ </xsl:when>
272
+ <xsl:when test="starts-with(@name,'stores')">
273
+ <xsl:value-of select="$stores-title"/>
274
+ </xsl:when>
275
  <xsl:when test="starts-with(@name,'property_')">
276
  <xsl:call-template name="upperCaseFirstLetter">
277
  <xsl:with-param name="str">
297
  </xsl:otherwise>
298
  </xsl:choose>
299
  </xsl:variable>
300
+ <xsl:variable name="block_content">
301
+ <xsl:element name="li">
302
+ <xsl:attribute name="class">title</xsl:attribute>
303
+ <xsl:element name="span">
304
+ <xsl:value-of select="$title"/>
305
+ </xsl:element>
306
  </xsl:element>
307
+ <xsl:apply-templates select="afs:reply"/>
308
+ </xsl:variable>
309
+ <xsl:choose>
310
+ <xsl:when test="$display_block">
311
+ <div>
312
+ <xsl:attribute name="class">
313
+ <xsl:value-of select="concat('column_',format-number(position(),'00'))"/>
314
+ </xsl:attribute>
315
+ <xsl:copy-of select="$block_content"/>
316
+ </div>
317
+ </xsl:when>
318
+ <xsl:otherwise>
319
+ <xsl:copy-of select="$block_content"/>
320
+ </xsl:otherwise>
321
+ </xsl:choose>
322
  </xsl:template>
 
323
  <!-- Template common to basic and products replies -->
324
  <xsl:template match="afs:reply">
325
  <xsl:variable name="parent" select="parent::afs:replySet/@name"/>
330
  <xsl:when test="starts-with($parent,'categories')">category</xsl:when>
331
  <xsl:when test="starts-with($parent,'featured_products')">product</xsl:when>
332
  <xsl:when test="starts-with($parent,'brands')">brand</xsl:when>
333
+ <xsl:when test="starts-with($parent,'articles')">article</xsl:when>
334
+ <xsl:when test="starts-with($parent,'stores')">store</xsl:when>
335
  <xsl:when test="starts-with($parent,'property_')">
336
  <xsl:value-of
337
  select="substring(substring-after($parent,'property_'),1,string-length($parent)-14)"
414
  <div style="clear:both;"/>
415
  </xsl:element>
416
  </xsl:template>
 
417
  <!-- Price discount percentage -->
418
  <xsl:template match="afs:option" mode="price_off">
419
  <xsl:element name="span">
433
  </xsl:choose>
434
  </xsl:element>
435
  </xsl:template>
 
436
  <!-- Thumbnail display -->
437
  <xsl:template match="afs:option" mode="url_thumbnail">
438
  <xsl:element name="div">
453
  </xsl:element>
454
  </xsl:element>
455
  </xsl:template>
 
456
  <!-- Creates href link -->
457
  <xsl:template match="afs:option" mode="href">
458
  <xsl:attribute name="href">
459
  <xsl:apply-templates select="@value"/>
460
  </xsl:attribute>
461
  </xsl:template>
 
462
  <!-- Basic suggestion template with a custom rendering for categories -->
463
  <xsl:template match="afs:reply" mode="basic">
464
  <xsl:element name="div">
471
  </xsl:if>
472
  </xsl:element>
473
  </xsl:template>
 
474
  <!-- Display parent category -->
475
  <xsl:template match="afs:option" mode="parent">
476
  <xsl:text>(</xsl:text>
479
  <xsl:value-of select="@value"/>
480
  <xsl:text>)</xsl:text>
481
  </xsl:template>
 
482
  <!-- Product rich template: uses custom metadata like price -->
483
  <xsl:template match="afs:reply" mode="product">
484
  <xsl:element name="div">
504
  </xsl:if>
505
  </xsl:element>
506
  </xsl:template>
 
507
  <!-- Display price using regional settings -->
508
  <xsl:template match="afs:option" mode="price_display">
509
  <xsl:variable name="currency">
537
  </xsl:otherwise>
538
  </xsl:choose>
539
  </xsl:template>
 
540
  <!-- Translate first letter of a string into a upper case if it was lower -->
541
  <xsl:template name="upperCaseFirstLetter">
542
  <xsl:param name="str"/>
545
  <xsl:value-of
546
  select="concat(translate(substring($str,1,1),$vLower,$vUpper),substring($str,2))"/>
547
  </xsl:template>
 
548
  </xsl:stylesheet>
549
  ]]>
550
  </template>
600
  &lt;/feeds&gt;
601
  ]]>
602
  </suggest_xml>
 
 
 
603
  </suggest>
604
  <fields_category>
605
  <name>name</name>
app/code/community/MDN/Antidot/etc/system.xml CHANGED
@@ -133,7 +133,6 @@
133
  <sort_order>6</sort_order>
134
  <show_in_default>1</show_in_default>
135
  <comment>Local directory to use to generate xml files. If empty, /tmp will be used</comment>
136
- <depends><upload_type>ftp</upload_type></depends>
137
  </working_directory>
138
  </fields>
139
  </ftp>
@@ -404,66 +403,16 @@
404
  <show_in_store>1</show_in_store>
405
  <comment>Select Magento or AFS@Store (recommended) autocomplete engine. Rollback to Magento only if you experience issues</comment>
406
  </enable>
407
- <products translate="label">
408
- <label>Display products ?</label>
409
- <frontend_type>select</frontend_type>
410
- <source_model>adminhtml/system_config_source_enabledisable</source_model>
411
- <sort_order>20</sort_order>
412
- <show_in_default>1</show_in_default>
413
- <show_in_website>1</show_in_website>
414
- <show_in_store>1</show_in_store>
415
- <comment>Display products in auto complete results</comment>
416
- </products>
417
- <products_displayed translate="label">
418
- <label>Number of products displayed</label>
419
- <frontend_type>text</frontend_type>
420
- <validate>validate-digits</validate>
421
- <sort_order>21</sort_order>
422
- <show_in_default>1</show_in_default>
423
- <show_in_website>1</show_in_website>
424
- <show_in_store>1</show_in_store>
425
- <comment>Select the maximum number of products to display</comment>
426
- </products_displayed>
427
- <brands translate="label">
428
- <label>Display brands</label>
429
- <frontend_type>select</frontend_type>
430
- <source_model>adminhtml/system_config_source_enabledisable</source_model>
431
- <sort_order>30</sort_order>
432
- <show_in_default>1</show_in_default>
433
- <show_in_website>1</show_in_website>
434
- <show_in_store>1</show_in_store>
435
- <comment>Display brands in auto complete results</comment>
436
- </brands>
437
- <brands_displayed translate="label">
438
- <label>Number of brands displayed</label>
439
- <frontend_type>text</frontend_type>
440
- <validate>validate-digits</validate>
441
- <sort_order>31</sort_order>
442
- <show_in_default>1</show_in_default>
443
- <show_in_website>1</show_in_website>
444
- <show_in_store>1</show_in_store>
445
- <comment>Select the maximum number of brands to display</comment>
446
- </brands_displayed>
447
- <categories translate="label">
448
- <label>Categories</label>
449
- <frontend_type>select</frontend_type>
450
- <source_model>adminhtml/system_config_source_enabledisable</source_model>
451
- <sort_order>40</sort_order>
452
- <show_in_default>1</show_in_default>
453
- <show_in_website>1</show_in_website>
454
- <show_in_store>1</show_in_store>
455
- <comment>Display categories in auto complete results</comment>
456
- </categories>
457
- <categories_displayed translate="label">
458
- <label>Number of categories displayed</label>
459
- <frontend_type>text</frontend_type>
460
- <validate>validate-digits</validate>
461
- <sort_order>41</sort_order>
462
  <show_in_default>1</show_in_default>
463
  <show_in_website>1</show_in_website>
464
  <show_in_store>1</show_in_store>
465
- <comment>Select the maximum number of categories to display</comment>
466
- </categories_displayed>
467
  <template translate="label">
468
  <label>Template</label>
469
  <frontend_type>textarea</frontend_type>
@@ -502,34 +451,6 @@
502
  <show_in_store>0</show_in_store>
503
  <comment>Restore the default XSLT template (usefull if you broke it !)</comment>
504
  </restore_template>
505
- <order_1 translate="label">
506
- <label>Sort order</label>
507
- <frontend_type>select</frontend_type>
508
- <source_model>Antidot/System_Config_Suggest_Type</source_model>
509
- <sort_order>42</sort_order>
510
- <show_in_default>1</show_in_default>
511
- <show_in_website>1</show_in_website>
512
- <show_in_store>1</show_in_store>
513
- <comment>First collection to display in suggest</comment>
514
- </order_1>
515
- <order_2 translate="label">
516
- <frontend_type>select</frontend_type>
517
- <source_model>Antidot/System_Config_Suggest_Type</source_model>
518
- <sort_order>43</sort_order>
519
- <show_in_default>1</show_in_default>
520
- <show_in_website>1</show_in_website>
521
- <show_in_store>1</show_in_store>
522
- <comment>Second collection to display in suggest</comment>
523
- </order_2>
524
- <order_3 translate="label">
525
- <frontend_type>select</frontend_type>
526
- <source_model>Antidot/System_Config_Suggest_Type</source_model>
527
- <sort_order>44</sort_order>
528
- <show_in_default>1</show_in_default>
529
- <show_in_website>1</show_in_website>
530
- <show_in_store>1</show_in_store>
531
- <comment>Third collection to display in suggest</comment>
532
- </order_3>
533
  </fields>
534
  </suggest>
535
 
@@ -552,6 +473,16 @@
552
  <show_in_store>1</show_in_store>
553
  <comment>Select Magento or AFS@Store (recommended) search engine. Rollback to Magento only if you experience issues</comment>
554
  </engine>
 
 
 
 
 
 
 
 
 
 
555
  <feed_categories translate="label">
556
  <label>Display categories</label>
557
  <frontend_type>select</frontend_type>
@@ -662,16 +593,66 @@
662
  </redirect>
663
  </fields>
664
  </promote>
665
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666
  <action>
667
  <label>On-demand Data Upload</label>
668
  <frontend_type>text</frontend_type>
669
- <sort_order>10</sort_order>
670
  <show_in_default>1</show_in_default>
671
  <show_in_website>0</show_in_website>
672
  <show_in_store>0</show_in_store>
673
  <fields>
674
- <push_products>
675
  <label>Push products</label>
676
  <frontend_model>Antidot/System_Config_Button_PushProducts</frontend_model>
677
  <sort_order>2</sort_order>
@@ -680,15 +661,33 @@
680
  <show_in_store>0</show_in_store>
681
  <comment>Manually push products index to AFS@Store (usefull when you change configuration above)</comment>
682
  </push_products>
683
- <push_categories>
684
  <label>Push categories</label>
685
  <frontend_model>Antidot/System_Config_Button_PushCategories</frontend_model>
686
  <sort_order>1</sort_order>
687
  <show_in_default>1</show_in_default>
688
  <show_in_website>0</show_in_website>
689
  <show_in_store>0</show_in_store>
690
- <comment>Manually push category index to AFS@Store (usefull when you change configuration above)</comment>
691
  </push_categories>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
692
  </fields>
693
  </action>
694
 
133
  <sort_order>6</sort_order>
134
  <show_in_default>1</show_in_default>
135
  <comment>Local directory to use to generate xml files. If empty, /tmp will be used</comment>
 
136
  </working_directory>
137
  </fields>
138
  </ftp>
403
  <show_in_store>1</show_in_store>
404
  <comment>Select Magento or AFS@Store (recommended) autocomplete engine. Rollback to Magento only if you experience issues</comment>
405
  </enable>
406
+ <feeds translate="label">
407
+ <label>Feeds</label>
408
+ <frontend_model>Antidot/system_config_form_field_array_acpFeeds</frontend_model>
409
+ <backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
410
+ <sort_order>2</sort_order>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  <show_in_default>1</show_in_default>
412
  <show_in_website>1</show_in_website>
413
  <show_in_store>1</show_in_store>
414
+ <comment>Définissez l'ordre des flux en les faisant glisser en drag'n drop, définissez pour chaque flux si ils doivent apparaitre, et le nombre de résultats à afficher</comment>
415
+ </feeds>
416
  <template translate="label">
417
  <label>Template</label>
418
  <frontend_type>textarea</frontend_type>
451
  <show_in_store>0</show_in_store>
452
  <comment>Restore the default XSLT template (usefull if you broke it !)</comment>
453
  </restore_template>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
  </fields>
455
  </suggest>
456
 
473
  <show_in_store>1</show_in_store>
474
  <comment>Select Magento or AFS@Store (recommended) search engine. Rollback to Magento only if you experience issues</comment>
475
  </engine>
476
+ <result_tabs translate="label">
477
+ <label>Result Tabs</label>
478
+ <frontend_model>Antidot/system_config_form_field_array_tabs</frontend_model>
479
+ <backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
480
+ <sort_order>30</sort_order>
481
+ <show_in_default>1</show_in_default>
482
+ <show_in_website>1</show_in_website>
483
+ <show_in_store>1</show_in_store>
484
+ <comment>Définissez l'ordre des onglets en les faisant glisser en drag'n drop, définissez pour chaque onglet si ils doivent apparaitre, et leur ordre de priorité</comment>
485
+ </result_tabs>
486
  <feed_categories translate="label">
487
  <label>Display categories</label>
488
  <frontend_type>select</frontend_type>
593
  </redirect>
594
  </fields>
595
  </promote>
596
+
597
+ <articles>
598
+ <label>Articles</label>
599
+ <frontend_type>text</frontend_type>
600
+ <sort_order>9</sort_order>
601
+ <show_in_default>1</show_in_default>
602
+ <show_in_website>0</show_in_website>
603
+ <show_in_store>0</show_in_store>
604
+ <fields>
605
+ <index_cms translate="label">
606
+ <label>Index magento CMS pages</label>
607
+ <frontend_type>select</frontend_type>
608
+ <source_model>adminhtml/system_config_source_yesno</source_model>
609
+ <sort_order>1</sort_order>
610
+ <show_in_default>1</show_in_default>
611
+ <show_in_website>0</show_in_website>
612
+ <show_in_store>0</show_in_store>
613
+ </index_cms>
614
+ <file_path translate="label,comment">
615
+ <label>Articles directory</label>
616
+ <frontend_type>text</frontend_type>
617
+ <sort_order>2</sort_order>
618
+ <show_in_default>1</show_in_default>
619
+ <show_in_website>0</show_in_website>
620
+ <show_in_store>0</show_in_store>
621
+ <comment>Local directory where the articles zip file is expected</comment>
622
+ <depends><index_cms>0</index_cms></depends>
623
+ </file_path>
624
+ </fields>
625
+ </articles>
626
+
627
+ <stores>
628
+ <label>Stores</label>
629
+ <frontend_type>text</frontend_type>
630
+ <sort_order>10</sort_order>
631
+ <show_in_default>1</show_in_default>
632
+ <show_in_website>0</show_in_website>
633
+ <show_in_store>0</show_in_store>
634
+ <fields>
635
+ <file_path translate="label,comment">
636
+ <label>Stores directory</label>
637
+ <frontend_type>text</frontend_type>
638
+ <sort_order>2</sort_order>
639
+ <show_in_default>1</show_in_default>
640
+ <show_in_website>0</show_in_website>
641
+ <show_in_store>0</show_in_store>
642
+ <comment>Local directory where the stores zip file is expected</comment>
643
+ </file_path>
644
+ </fields>
645
+ </stores>
646
+
647
  <action>
648
  <label>On-demand Data Upload</label>
649
  <frontend_type>text</frontend_type>
650
+ <sort_order>11</sort_order>
651
  <show_in_default>1</show_in_default>
652
  <show_in_website>0</show_in_website>
653
  <show_in_store>0</show_in_store>
654
  <fields>
655
+ <push_products translate="label,comment">
656
  <label>Push products</label>
657
  <frontend_model>Antidot/System_Config_Button_PushProducts</frontend_model>
658
  <sort_order>2</sort_order>
661
  <show_in_store>0</show_in_store>
662
  <comment>Manually push products index to AFS@Store (usefull when you change configuration above)</comment>
663
  </push_products>
664
+ <push_categories translate="label,comment">
665
  <label>Push categories</label>
666
  <frontend_model>Antidot/System_Config_Button_PushCategories</frontend_model>
667
  <sort_order>1</sort_order>
668
  <show_in_default>1</show_in_default>
669
  <show_in_website>0</show_in_website>
670
  <show_in_store>0</show_in_store>
671
+ <comment>Manually push categories index to AFS@Store</comment>
672
  </push_categories>
673
+ <push_articles translate="label,comment">
674
+ <label>Push articles</label>
675
+ <frontend_model>Antidot/System_Config_Button_PushArticles</frontend_model>
676
+ <sort_order>3</sort_order>
677
+ <show_in_default>1</show_in_default>
678
+ <show_in_website>0</show_in_website>
679
+ <show_in_store>0</show_in_store>
680
+ <comment>Manually push articles index to AFS@Store</comment>
681
+ </push_articles>
682
+ <push_stores translate="label,comment">
683
+ <label>Push stores</label>
684
+ <frontend_model>Antidot/System_Config_Button_PushStores</frontend_model>
685
+ <sort_order>4</sort_order>
686
+ <show_in_default>1</show_in_default>
687
+ <show_in_website>0</show_in_website>
688
+ <show_in_store>0</show_in_store>
689
+ <comment>Manually push stores index to AFS@Store</comment>
690
+ </push_stores>
691
  </fields>
692
  </action>
693
 
app/code/community/MDN/Antidot/sql/Antidot_setup/mysql4-upgrade-1.2.2-1.2.3.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $installer = $this;
4
+
5
+ $installer->startSetup();
6
+
7
+ /**
8
+ * Alter table 'antidot/export'
9
+ */
10
+ $installer->run("
11
+ ALTER TABLE `antidot_export` CHANGE COLUMN `element` `element` ENUM('CATALOG', 'CATEGORY', 'STORE', 'ARTICLE') NOT NULL ;
12
+ ");
13
+
14
+ /**
15
+ * Upgrade core_config_data vars fro suggest config
16
+ * replace olds vars by the new antidot/suggest/feeds one
17
+ */
18
+
19
+ $storeIds = array(Mage_Core_Model_App::ADMIN_STORE_ID);
20
+ $storeCollection = Mage::getModel('core/store')->getCollection();
21
+ foreach ($storeCollection as $store) {
22
+ $storeIds[] = $store->getId();
23
+ }
24
+ foreach ($storeIds as $storeId) {
25
+
26
+ /**
27
+ * Get the old config var directly in database because, cache has been flushed and is not yet reloaded when upgrade modules is precessed
28
+ *
29
+ * First : get ADMIN scope value
30
+ * Second : override with store scope value
31
+ */
32
+ $coll = Mage::getResourceModel('core/config_data_collection')
33
+ ->addScopeFilter('default', Mage_Core_Model_App::ADMIN_STORE_ID, 'antidot/suggest');
34
+
35
+ foreach ($coll as $config) {
36
+ switch ($config->getPath()) {
37
+ case 'antidot/suggest/products':
38
+ $products = $config->getValue();
39
+ break;
40
+ case 'antidot/suggest/categories':
41
+ $categories = $config->getValue();
42
+ break;
43
+ case 'antidot/suggest/brands':
44
+ $brands = $config->getValue();
45
+ break;
46
+ case 'antidot/suggest/products_displayed':
47
+ $products_displayed = $config->getValue();
48
+ break;
49
+ case 'antidot/suggest/categories_displayed':
50
+ $categories_displayed = $config->getValue();
51
+ break;
52
+ case 'antidot/suggest/brands_displayed':
53
+ $brands_displayed = $config->getValue();
54
+ break;
55
+ case 'antidot/suggest/order1':
56
+ $order1 = $config->getValue();
57
+ break;
58
+ case 'antidot/suggest/order2':
59
+ $order2 = $config->getValue();
60
+ break;
61
+ case 'antidot/suggest/order3':
62
+ $order3 = $config->getValue();
63
+ break;
64
+ }
65
+ }
66
+
67
+ $coll = Mage::getResourceModel('core/config_data_collection')
68
+ ->addScopeFilter($storeId==Mage_Core_Model_App::ADMIN_STORE_ID?'default':'stores', $storeId, 'antidot/suggest');
69
+
70
+ foreach ($coll as $config) {
71
+ switch ($config->getPath()) {
72
+ case 'antidot/suggest/products':
73
+ $products = $config->getValue();
74
+ break;
75
+ case 'antidot/suggest/categories':
76
+ $categories = $config->getValue();
77
+ break;
78
+ case 'antidot/suggest/brands':
79
+ $brands = $config->getValue();
80
+ break;
81
+ case 'antidot/suggest/products_displayed':
82
+ $products_displayed = $config->getValue();
83
+ break;
84
+ case 'antidot/suggest/categories_displayed':
85
+ $categories_displayed = $config->getValue();
86
+ break;
87
+ case 'antidot/suggest/brands_displayed':
88
+ $brands_displayed = $config->getValue();
89
+ break;
90
+ case 'antidot/suggest/order1':
91
+ $order1 = $config->getValue();
92
+ break;
93
+ case 'antidot/suggest/order2':
94
+ $order2 = $config->getValue();
95
+ break;
96
+ case 'antidot/suggest/order3':
97
+ $order3 = $config->getValue();
98
+ break;
99
+ }
100
+ }
101
+
102
+ if (!isset($order1)) { //In case of installation not upgrade, default values :
103
+ $order1='categories';
104
+ $categories=1;
105
+ $categories_displayed='10';
106
+ }
107
+ if (!isset($order2)) { //In case of installation not upgrade, default values :
108
+ $order2='products';
109
+ $products=1;
110
+ $products_displayed='10';
111
+ }
112
+ if (!isset($order3)) { //In case of installation not upgrade, default values :
113
+ $order3='brands';
114
+ $brands=1;
115
+ $brands_displayed='10';
116
+ }
117
+
118
+ /**
119
+ * construct the antidot/suggest/feeds array
120
+ */
121
+ $categoriesArray = array('feed' => 'categories');
122
+ if ($categories) {
123
+ $categoriesArray['active'] = 'on';
124
+ }
125
+ $categoriesArray['suggest_number'] = $categories_displayed;
126
+ $productsArray = array('feed' => 'products');
127
+ if ($products) {
128
+ $productsArray['active'] = 'on';
129
+ }
130
+ $productsArray['suggest_number'] = $products_displayed;
131
+ $brandsArray = array('feed' => 'brands');
132
+ if ($brands) {
133
+ $brandsArray['active'] = 'on';
134
+ }
135
+ $brandsArray['suggest_number'] = $brands_displayed;
136
+ $articlesArray = array('feed' => 'articles', 'suggest_number' => '10');
137
+ $storesArray = array('feed' => 'stores', 'suggest_number' => '10');
138
+
139
+ $finalArray = array();
140
+ foreach (array($order1, $order2, $order3) as $order) {
141
+ switch ($order) {
142
+ case 'categories':
143
+ $finalArray[] = $categoriesArray;
144
+ break;
145
+ case 'products':
146
+ $finalArray[] = $productsArray;
147
+ break;
148
+ case 'brands':
149
+ $finalArray[] = $brandsArray;
150
+ break;
151
+ }
152
+ }
153
+ $finalArray[] = $articlesArray;
154
+ $finalArray[] = $storesArray;
155
+ $final = serialize($finalArray);
156
+
157
+ if ($storeId == Mage_Core_Model_App::ADMIN_STORE_ID) {
158
+ $finalAdmin = $final;
159
+ // Save on admin scope
160
+ Mage::getConfig()->saveConfig('antidot/suggest/feeds', $finalAdmin, 'default', Mage_Core_Model_App::ADMIN_STORE_ID);
161
+ } else {
162
+ if ($final != $finalAdmin) {
163
+ // Save on scopes that are different from admin
164
+ Mage::getConfig()->saveConfig('antidot/suggest/feeds', $final, 'stores', $storeId);
165
+ }
166
+ }
167
+ }
168
+
169
+ $installer->endSetup();
app/design/adminhtml/default/default/template/antidot/system/config/form/field/acpfeeds.phtml ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package default_default
23
+ * @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+
28
+ <?php
29
+ $_htmlId = $this->getHtmlId() ? $this->getHtmlId() : '_' . uniqid();
30
+
31
+ ?>
32
+
33
+ <div class="grid" id="grid<?php echo $_htmlId ?>">
34
+
35
+ <ul id="feeds-container-<?php echo $_htmlId ?>" class="super-attributes">
36
+ <?php foreach ($this->getArrayRows() as $_rowId => $_row): ?>
37
+ <?php $inputName = $this->getElement()->getName().'['.$_row['_id'].']'; ?>
38
+ <li id="<?php echo $_rowId ?>" class="sortable-row attribute">
39
+ <div class="attribute-name-container left"><?php echo $_row['name'] ?><input type="hidden" name="<?php echo $inputName ?>[feed]" value="<?php echo $_row['feed'] ?>" /></div>
40
+ <div class="values-container right" >
41
+ <label><?php echo Mage::helper('Antidot')->__('Active') ?> : <input type="checkbox" name="<?php echo $inputName; ?>[active]" <?php if ($_row['active']): ?>checked="checked<?php endif; ?> value="true" style="width: 50px"></label>
42
+ <label><?php echo Mage::helper('Antidot')->__('Number of suggestions') ?> : <input type="text" name="<?php echo $inputName; ?>[suggest_number]" value="<?php echo $_row['suggest_number'] ?>" style="width: 50px" class="input-text validate-digits"></label>
43
+ </div>
44
+ </li>
45
+ <?php endforeach;?>
46
+ </ul>
47
+
48
+ </div>
49
+ <script type="text/javascript">
50
+ //<![CDATA[
51
+
52
+ Sortable.create($('feeds-container-<?php echo $_htmlId ?>'), {
53
+ handle :'sortable-row',
54
+ onUpdate : function() {alert(this)}
55
+ });
56
+
57
+ //]]>
58
+ </script>
app/design/adminhtml/default/default/template/antidot/system/config/form/field/tabs.phtml ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package default_default
23
+ * @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+
28
+ <?php
29
+ $_htmlId = $this->getHtmlId() ? $this->getHtmlId() : '_' . uniqid();
30
+
31
+ ?>
32
+
33
+ <div class="grid" id="grid<?php echo $_htmlId ?>">
34
+
35
+ <ul id="tabs-container-<?php echo $_htmlId ?>" class="super-attributes">
36
+ <?php foreach ($this->getArrayRows() as $_rowId => $_row): ?>
37
+ <?php $inputName = $this->getElement()->getName().'['.$_row['_id'].']'; ?>
38
+ <li id="<?php echo $_rowId ?>" class="sortable-row attribute">
39
+ <div class="attribute-name-container left"><?php echo $_row['name'] ?><input type="hidden" name="<?php echo $inputName ?>[tab]" value="<?php echo $_row['tab'] ?>" /></div>
40
+ <div class="values-container right" >
41
+ <label><?php echo Mage::helper('Antidot')->__('Active') ?> : <input type="checkbox" name="<?php echo $inputName; ?>[active]" <?php if ($_row['active']): ?>checked="checked<?php endif; ?> value="true" style="width: 50px"></label>
42
+ <label><?php echo Mage::helper('Antidot')->__('Show even without result') ?> : <input type="checkbox" name="<?php echo $inputName; ?>[show_noresult]" <?php if ($_row['show_noresult']): ?>checked="checked<?php endif; ?> value="true" style="width: 50px"></label>
43
+ </div>
44
+ </li>
45
+ <?php endforeach;?>
46
+ </ul>
47
+
48
+ </div>
49
+ <script type="text/javascript">
50
+ //<![CDATA[
51
+
52
+ Sortable.create($('tabs-container-<?php echo $_htmlId ?>'), {
53
+ handle :'sortable-row',
54
+ onUpdate : function() {alert(this)}
55
+ });
56
+
57
+ //]]>
58
+ </script>
app/design/frontend/base/default/layout/antidot.xml CHANGED
@@ -3,6 +3,17 @@
3
  <layout version="0.1.0">
4
 
5
  <catalogsearch_result_index>
 
 
 
 
 
 
 
 
 
 
 
6
  <reference name="search.result">
7
  <action method="setTemplate"><template>antidot/catalogsearch/result.phtml</template></action>
8
  <block type="Antidot/catalogsearch_category" name="search_result_category" as="search_result_category" template="antidot/catalogsearch/result/category.phtml" />
3
  <layout version="0.1.0">
4
 
5
  <catalogsearch_result_index>
6
+
7
+ <reference name="head">
8
+ <action method="addCss"><stylesheet>css/antidot/catalogsearch.css</stylesheet></action>
9
+ </reference>
10
+
11
+ <reference name="root" >
12
+ <action method="setTemplate"><template>antidot/page/antidot_results.phtml</template></action>
13
+ <block type="Antidot/catalogsearch_articles" name="search_result_articles" as="search_result_articles" template="antidot/catalogsearch/result/articles.phtml" />
14
+ <block type="Antidot/catalogsearch_stores" name="search_result_stores" as="search_result_stores" template="antidot/catalogsearch/result/stores.phtml" />
15
+ </reference>
16
+
17
  <reference name="search.result">
18
  <action method="setTemplate"><template>antidot/catalogsearch/result.phtml</template></action>
19
  <block type="Antidot/catalogsearch_category" name="search_result_category" as="search_result_category" template="antidot/catalogsearch/result/category.phtml" />
app/design/frontend/base/default/template/antidot/catalogsearch/result/articles.phtml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ($this->hasArticle()): ?>
2
+ <ul>
3
+ <?php foreach ($this->getArticles() as $article): ?>
4
+ <li>
5
+ <h2><a href="<?php if (strpos($article->getUrl(), 'http') !== 0) : echo $this->getUrl($article->getUrl()); else: echo $article->getUrl(); endif; ?>" ><?php echo $article->getTitle(); ?></a></h2>
6
+ <span><?php echo $article->getSubtitle(); ?></span>
7
+ <span><?php echo $article->getPublishedAt(); ?></span>
8
+ <p><?php echo $article->getAbstract(); ?></p>
9
+ <?php if ($article->getUrlThumbnail()) : ?>
10
+ <img src="<?php echo $article->getUrlThumbnail(); ?>" />
11
+ <?php endif; ?>
12
+ </li>
13
+ <?php endforeach; ?>
14
+ </ul>
15
+ <?php else: ?>
16
+ <?php echo $this->__('No Article Found'); ?>
17
+ <?php endif; ?>
app/design/frontend/base/default/template/antidot/catalogsearch/result/stores.phtml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ($this->hasStore()): ?>
2
+ <ul>
3
+ <?php foreach ($this->getStores() as $store): ?>
4
+ <li>
5
+ <h2><a href="<?php echo $store->getUrl(); ?>" ><?php echo $store->getName(); ?></a></h2>
6
+ <p><?php echo $store->getAddress() ?><br/>
7
+ <?php echo $store->getZipcode().' '.$store->getCity().' '.$store->getCountry(); ?>
8
+ </p>
9
+ <?php if ($store->getDescriptions()):
10
+ foreach ($store->getDescriptions() as $desc) : ?>
11
+ <p><?php echo $desc ?></p>
12
+ <?php endforeach; ?>
13
+ <?php endif; ?>
14
+ <?php if ($store->getUrlThumbnail()) : ?>
15
+ <img src="<?php echo $store->getUrlThumbnail(); ?>" />
16
+ <?php endif; ?>
17
+ </li>
18
+ <?php endforeach; ?>
19
+ </ul>
20
+ <?php else: ?>
21
+ <?php echo $this->__('No Store Found'); ?>
22
+ <?php endif; ?>
app/design/frontend/base/default/template/antidot/page/antidot_results.phtml ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package base_default
23
+ * @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+ <?php
28
+ /**
29
+ * Template for Mage_Page_Block_Html
30
+ */
31
+ ?>
32
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
33
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->getLang() ?>" lang="<?php echo $this->getLang() ?>">
34
+ <head>
35
+ <?php echo $this->getChildHtml('head') ?>
36
+ </head>
37
+ <body<?php echo $this->getBodyClass()?' class="'.$this->getBodyClass().'"':'' ?>>
38
+ <?php echo $this->getChildHtml('after_body_start') ?>
39
+ <div class="wrapper">
40
+ <?php echo $this->getChildHtml('global_notices') ?>
41
+ <div class="page">
42
+ <?php echo $this->getChildHtml('header') ?>
43
+ <div class="main-container col3-layout">
44
+ <div class="main">
45
+ <?php echo $this->getChildHtml('breadcrumbs') ?>
46
+ <?php
47
+ //the layer bloc must be called first, in order to generate antidot WS call with facets
48
+ $_left = $this->getChildHtml('left');
49
+
50
+ $helper = $this->helper('Antidot');
51
+ if ($helper->isActiveEngine() && $helper->hasResultTabs()):
52
+ $collection = Mage::getSingleton('Antidot/catalogsearch_layer')->getProductCollection();
53
+ $tabs = $helper->getActiveResultTabs($collection);
54
+ ?>
55
+ <div class="antidot-tabs">
56
+ <?php foreach($tabs as $tab): ?>
57
+ <input type="radio" name="antidot_tabs" id="antidot-tab-<?php echo $tab['tab'] ?>" <?php if (isset($tab['selected'])) : ?>checked<?php endif; ?> >
58
+ <label for="antidot-tab-<?php echo $tab['tab'] ?>">
59
+ <i class="fa fa-html5"><span><?php echo $tab['name'] ?> (<?php echo $collection->getTotalResult($tab['tab']);?>)</span></i>
60
+ </label>
61
+ <?php endforeach; ?>
62
+ <?php foreach($tabs as $tab): ?>
63
+ <div id="antidot-tab-content-<?php echo $tab['tab'] ?>" class="antidot-tab-content">
64
+ <?php switch ($tab['tab']) :
65
+ case 'products': ?>
66
+ <div class="col-wrapper">
67
+ <div class="col-main">
68
+ <?php echo $this->getChildHtml('global_messages') ?>
69
+ <?php echo $this->getChildHtml('content') ?>
70
+ </div>
71
+ <div class="col-left sidebar"><?php echo $_left ?></div>
72
+ </div>
73
+ <div class="col-right sidebar"><?php echo $this->getChildHtml('right') ?></div>
74
+ <?php break;
75
+ case 'articles': ?>
76
+ <div class="col-wrapper">
77
+ <div class="col-main">
78
+ <?php echo $this->getChildHtml('search_result_articles') ?>
79
+ </div>
80
+ </div>
81
+ <?php break;
82
+ case 'stores': ?>
83
+ <div class="col-wrapper">
84
+ <div class="col-main">
85
+ <?php echo $this->getChildHtml('search_result_stores') ?>
86
+ </div>
87
+ </div>
88
+ <?php break; ?>
89
+ <?php endswitch; ?>
90
+ </div>
91
+ <?php endforeach; ?>
92
+ </div>
93
+ <?php else: ?>
94
+ <div class="col-wrapper">
95
+ <div class="col-main">
96
+ <?php echo $this->getChildHtml('global_messages') ?>
97
+ <?php echo $this->getChildHtml('content') ?>
98
+ </div>
99
+ <div class="col-left sidebar"><?php echo $this->getChildHtml('left') ?></div>
100
+ </div>
101
+ <div class="col-right sidebar"><?php echo $this->getChildHtml('right') ?></div>
102
+ <?php endif; ?>
103
+ </div>
104
+ </div>
105
+ <?php echo $this->getChildHtml('footer') ?>
106
+ <?php echo $this->getChildHtml('global_cookie_notice') ?>
107
+ <?php echo $this->getChildHtml('before_body_end') ?>
108
+ </div>
109
+ </div>
110
+ <?php echo $this->getAbsoluteFooter() ?>
111
+ </body>
112
+ </html>
app/design/frontend/rwd/default/template/antidot/page/antidot_results.phtml ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package rwd_default
23
+ * @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+ <?php
28
+ /**
29
+ * Template for Mage_Page_Block_Html
30
+ */
31
+ ?>
32
+
33
+ <!DOCTYPE html>
34
+
35
+ <!--[if lt IE 7 ]> <html lang="<?php echo $this->getLang(); ?>" id="top" class="no-js ie6"> <![endif]-->
36
+ <!--[if IE 7 ]> <html lang="<?php echo $this->getLang(); ?>" id="top" class="no-js ie7"> <![endif]-->
37
+ <!--[if IE 8 ]> <html lang="<?php echo $this->getLang(); ?>" id="top" class="no-js ie8"> <![endif]-->
38
+ <!--[if IE 9 ]> <html lang="<?php echo $this->getLang(); ?>" id="top" class="no-js ie9"> <![endif]-->
39
+ <!--[if (gt IE 9)|!(IE)]><!--> <html lang="<?php echo $this->getLang(); ?>" id="top" class="no-js"> <!--<![endif]-->
40
+
41
+ <head>
42
+ <?php echo $this->getChildHtml('head') ?>
43
+ </head>
44
+ <body<?php echo $this->getBodyClass()?' class="'.$this->getBodyClass().'"':'' ?>>
45
+ <?php echo $this->getChildHtml('after_body_start') ?>
46
+ <div class="wrapper">
47
+ <?php echo $this->getChildHtml('global_notices') ?>
48
+ <div class="page">
49
+ <?php echo $this->getChildHtml('header') ?>
50
+ <div class="main-container col3-layout">
51
+ <div class="main">
52
+ <?php echo $this->getChildHtml('breadcrumbs') ?>
53
+ <?php
54
+ //the layer bloc must be called first, in order to generate antidot WS call with facets
55
+ $_leftContent = $this->getChildHtml('left_first');
56
+
57
+ $helper = $this->helper('Antidot');
58
+
59
+ if ($helper->isActiveEngine() && $helper->hasResultTabs()) :
60
+ $collection = Mage::getSingleton('Antidot/catalogsearch_layer')->getProductCollection();
61
+ $tabs = $helper->getActiveResultTabs($collection);
62
+ ?>
63
+ <div class="antidot-tabs">
64
+ <?php foreach($tabs as $tab): ?>
65
+ <input type="radio" name="antidot_tabs" id="antidot-tab-<?php echo $tab['tab'] ?>" <?php if (isset($tab['selected'])) : ?>checked<?php endif; ?> >
66
+ <label for="antidot-tab-<?php echo $tab['tab'] ?>">
67
+ <i class="fa fa-html5"><span><?php echo $tab['name'] ?> (<?php echo $collection->getTotalResult($tab['tab']);?>)</span></i>
68
+ </label>
69
+ <?php endforeach; ?>
70
+ <?php foreach($tabs as $tab): ?>
71
+ <div id="antidot-tab-content-<?php echo $tab['tab'] ?>" class="antidot-tab-content">
72
+ <?php switch ($tab['tab']) :
73
+ case 'products': ?>
74
+ <div class="col-wrapper">
75
+ <?php // This left_first block will display above the main content on smaller viewports ?>
76
+ <?php if ($_leftContent): ?>
77
+ <div class="col-left sidebar col-left-first"><?php echo $_leftContent; ?></div>
78
+ <?php endif; ?>
79
+ <div class="col-main">
80
+ <?php echo $this->getChildHtml('global_messages') ?>
81
+ <?php echo $this->getChildHtml('content') ?>
82
+ </div>
83
+ <div class="col-left sidebar"><?php echo $this->getChildHtml('left') ?></div>
84
+ </div>
85
+ <div class="col-right sidebar"><?php echo $this->getChildHtml('right') ?></div>
86
+ <?php break;
87
+ case 'articles': ?>
88
+ <div class="col-wrapper">
89
+ <div class="col-main">
90
+ <?php echo $this->getChildHtml('search_result_articles') ?>
91
+ </div>
92
+ </div>
93
+ <?php break;
94
+ case 'stores': ?>
95
+ <div class="col-wrapper">
96
+ <div class="col-main">
97
+ <?php echo $this->getChildHtml('search_result_stores') ?>
98
+ </div>
99
+ </div>
100
+ <?php break; ?>
101
+ <?php endswitch; ?>
102
+ </div>
103
+ <?php endforeach; ?>
104
+ </div>
105
+ <?php else: ?>
106
+ <div class="col-wrapper">
107
+ <?php // This left_first block will display above the main content on smaller viewports ?>
108
+ <?php if ($_leftContent = $this->getChildHtml('left_first')): ?>
109
+ <div class="col-left sidebar col-left-first"><?php echo $_leftContent; ?></div>
110
+ <?php endif; ?>
111
+ <div class="col-main">
112
+ <?php echo $this->getChildHtml('global_messages') ?>
113
+ <?php echo $this->getChildHtml('content') ?>
114
+ </div>
115
+ <div class="col-left sidebar"><?php echo $this->getChildHtml('left') ?></div>
116
+ </div>
117
+ <div class="col-right sidebar"><?php echo $this->getChildHtml('right') ?></div>
118
+ <?php endif; ?>
119
+ </div>
120
+ </div>
121
+ <?php echo $this->getChildHtml('footer_before') ?>
122
+ <?php echo $this->getChildHtml('footer') ?>
123
+ <?php echo $this->getChildHtml('global_cookie_notice') ?>
124
+ <?php echo $this->getChildHtml('before_body_end') ?>
125
+ </div>
126
+ </div>
127
+ <?php echo $this->getAbsoluteFooter() ?>
128
+ </body>
129
+ </html>
app/locale/de_AT/MDN_Antidot.csv CHANGED
@@ -153,4 +153,27 @@ Price,Preis
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
- "Never","Nie"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
+ "Never","Nie"
157
+ "Result Tabs","Ergebnis Tabs"
158
+ "Active","Aktiv"
159
+ "Show even without result","Zeigen Sie sogar noch ohne Ergebnis"
160
+ "Products","Produkte"
161
+ "Articles","Artikel"
162
+ "Stores","Geschäfte"
163
+ "No Article Found","keine Artikel gefunden"
164
+ "No Store Found","keine Geschäfte gefunden"
165
+ "Index magento CMS pages","Index der Seiten Magento CMS"
166
+ "Articles directory","Artikel-Verzeichnis"
167
+ "Stores directory","Geschäfte-Verzeichnis"
168
+ "Local directory where the articles zip file is expected","Pfad, wo die Zip-Datei Artikel erwartet wird"
169
+ "Local directory where the stores zip file is expected","Pfad, wo die Zip-Datei Geschäfte erwartet wird"
170
+ "Push articles","senden Artikel"
171
+ "Manually push categories index to AFS@Store","Kategorien der manuellen Versand für die Indizierung AFS@Shop"
172
+ "Manually push articles index to AFS@Store","Artikel der manuellen Versand für die Indizierung AFS@Shop"
173
+ "Push stores","senden Geschäfte"
174
+ "Manually push stores index to AFS@Store","Geschäfte der manuellen Versand für die Indizierung AFS@Shop"
175
+ "Articles exported","Artikel exportiert"
176
+ "No Article to export","Kein Artikel Export"
177
+ "Stores exported","Geschäfte exportiert"
178
+ "No store to export","Kein Geschäfte Export"
179
+ "Number of suggestions","viele Vorschläge"
app/locale/de_CH/MDN_Antidot.csv CHANGED
@@ -153,4 +153,27 @@ Price,Preis
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
- "Never","Nie"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
+ "Never","Nie"
157
+ "Result Tabs","Ergebnis Tabs"
158
+ "Active","Aktiv"
159
+ "Show even without result","Zeigen Sie sogar noch ohne Ergebnis"
160
+ "Products","Produkte"
161
+ "Articles","Artikel"
162
+ "Stores","Geschäfte"
163
+ "No Article Found","keine Artikel gefunden"
164
+ "No Store Found","keine Geschäfte gefunden"
165
+ "Index magento CMS pages","Index der Seiten Magento CMS"
166
+ "Articles directory","Artikel-Verzeichnis"
167
+ "Stores directory","Geschäfte-Verzeichnis"
168
+ "Local directory where the articles zip file is expected","Pfad, wo die Zip-Datei Artikel erwartet wird"
169
+ "Local directory where the stores zip file is expected","Pfad, wo die Zip-Datei Geschäfte erwartet wird"
170
+ "Push articles","senden Artikel"
171
+ "Manually push categories index to AFS@Store","Kategorien der manuellen Versand für die Indizierung AFS@Shop"
172
+ "Manually push articles index to AFS@Store","Artikel der manuellen Versand für die Indizierung AFS@Shop"
173
+ "Push stores","senden Geschäfte"
174
+ "Manually push stores index to AFS@Store","Geschäfte der manuellen Versand für die Indizierung AFS@Shop"
175
+ "Articles exported","Artikel exportiert"
176
+ "No Article to export","Kein Artikel Export"
177
+ "Stores exported","Geschäfte exportiert"
178
+ "No store to export","Kein Geschäfte Export"
179
+ "Number of suggestions","viele Vorschläge"
app/locale/de_DE/MDN_Antidot.csv CHANGED
@@ -153,4 +153,27 @@ Price,Preis
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
- "Never","Nie"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  "In case there's only one result : redirect to product page","Für den Fall, es gibt nur ein Ergebnis: redirect zur Produktseite"
154
  "Always","Immer"
155
  "Unless there's a spellcheck","Es sei denn, es gibt eine Rechtschreibprüfung"
156
+ "Never","Nie"
157
+ "Result Tabs","Ergebnis Tabs"
158
+ "Active","Aktiv"
159
+ "Show even without result","Zeigen Sie sogar noch ohne Ergebnis"
160
+ "Products","Produkte"
161
+ "Articles","Artikel"
162
+ "Stores","Geschäfte"
163
+ "No Article Found","keine Artikel gefunden"
164
+ "No Store Found","keine Geschäfte gefunden"
165
+ "Index magento CMS pages","Index der Seiten Magento CMS"
166
+ "Articles directory","Artikel-Verzeichnis"
167
+ "Stores directory","Geschäfte-Verzeichnis"
168
+ "Local directory where the articles zip file is expected","Pfad, wo die Zip-Datei Artikel erwartet wird"
169
+ "Local directory where the stores zip file is expected","Pfad, wo die Zip-Datei Geschäfte erwartet wird"
170
+ "Push articles","senden Artikel"
171
+ "Manually push categories index to AFS@Store","Kategorien der manuellen Versand für die Indizierung AFS@Shop"
172
+ "Manually push articles index to AFS@Store","Artikel der manuellen Versand für die Indizierung AFS@Shop"
173
+ "Push stores","senden Geschäfte"
174
+ "Manually push stores index to AFS@Store","Geschäfte der manuellen Versand für die Indizierung AFS@Shop"
175
+ "Articles exported","Artikel exportiert"
176
+ "No Article to export","Kein Artikel Export"
177
+ "Stores exported","Geschäfte exportiert"
178
+ "No store to export","Kein Geschäfte Export"
179
+ "Number of suggestions","viele Vorschläge"
app/locale/es_AR/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_CL/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_CO/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_CR/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_ES/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_MX/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_PA/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_PE/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/es_VE/MDN_Antidot.csv CHANGED
@@ -152,4 +152,27 @@ Price,Precio
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
- "Never","Nunca"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  "In case there's only one result : redirect to product page","Hay en el cuadro de un solo resultado: redirigir a la página del producto"
153
  "Always","Siempre"
154
  "Unless there's a spellcheck","Menos Hay una corrección ortográfica"
155
+ "Never","Nunca"
156
+ "Result Tabs","Pestaña resultados"
157
+ "Active","Activo"
158
+ "Show even without result","Mostrar incluso sin resultado"
159
+ "Products","Productos"
160
+ "Articles","Páginas"
161
+ "Stores","Tiendas"
162
+ "No Article Found","No se encontró la página"
163
+ "No Store Found","No se encontraron tienda"
164
+ "Index magento CMS pages","Índice de las páginas CMS Magento"
165
+ "Articles directory","Páginas Directorio"
166
+ "Stores directory","Tiendas Directorio"
167
+ "Local directory where the articles zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
168
+ "Local directory where the stores zip file is expected","Ruta del directorio en las páginas del archivo zip espera"
169
+ "Push articles","Enviar páginas"
170
+ "Manually push categories index to AFS@Store","Manual de envío de categorías de AFS@Store de indexación"
171
+ "Manually push articles index to AFS@Store","Manual de envío de páginas de AFS@Store de indexación"
172
+ "Push stores","Enviar tiendas"
173
+ "Manually push stores index to AFS@Store","Manual de envío de tiendas de AFS@Store de indexación"
174
+ "Articles exported","Páginas exportadas"
175
+ "No Article to export","No hay páginas para exportar"
176
+ "Stores exported","Tiendas exportadas"
177
+ "No store to export","No hay tiendas para exportar"
178
+ "Number of suggestions","Número de sugerencias"
app/locale/fr_CA/MDN_Antidot.csv CHANGED
@@ -76,7 +76,7 @@ Enable,"Moteur d'autocomplétion"
76
  "Display brands in auto complete results","Affiche les marques dans les suggestions"
77
  "Number of brands displayed","Nombre de marques à afficher"
78
  "Select the maximum number of brands to display","Choisissez le nombre maximal de marques à afficher"
79
- Categories,"Afficher les catégories ?"
80
  "Display categories in auto complete results","Affiche les catégories dans les suggestions"
81
  "Number of categories displayed","Nombre de catégories à afficher"
82
  "Select the maximum number of categories to display","Choisissez le nombre maximal de catégories à afficher"
@@ -146,11 +146,35 @@ Price,Prix
146
  "The curl php extension is not installed, it's required to upload export files","L'extension php curl n'est pas installée, elle est nécéssaire à l'upload des fichiers d'export"
147
  "The curl php extension doesn't support https protocol, libcurl must be upgraded on your system, otherwise the export files won't be uploaded","L'extension php curl ne supporte pas le protocol https, libcurl doit être mis à jour sur le système, sinon l'upload des fichiers d'export ne se fera pas"
148
  "Upload Type","Type d'envoi"
 
 
 
149
  "Redirect to the product page","Rediriger vers la page prdouit"
150
  "In case there's only one result : redirect to product page","Dans le cas où il n'y a qu'un seul résultat : rediriger vers la page produit"
151
  "Always","Toujours"
152
  "Unless there's a spellcheck","Sauf si il y a une suggestion orthographique"
153
- "Never","Jamais""Query Spellcheck sentence","Phrase de recherche basée sur la suggestion orthographique"
154
- "Text to display when a spellcheck based query has been made. Use {originalQuery} and {spellcheck} keyword to include the original query and the spellcheck in your text, leave empty to disable the functionality","Texte à afficher quand une recherche basée sur une suggestion orthographique a été faite. Utilisez {originalQuery} et {spellcheck} pour inclure la recherche original et la correction dans votre texte, laissez vide pour désactiver la fonctionnalité"
155
- "No result found for '{originalQuery}'. Here the results for '{spellcheck}'.","Aucun résultat trouvé à partir de votre recherche initiale '{originalQuery}'. Voici les résultats pour la recherche '{spellcheck}'."
156
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  "Display brands in auto complete results","Affiche les marques dans les suggestions"
77
  "Number of brands displayed","Nombre de marques à afficher"
78
  "Select the maximum number of brands to display","Choisissez le nombre maximal de marques à afficher"
79
+ Categories,"Catégories"
80
  "Display categories in auto complete results","Affiche les catégories dans les suggestions"
81
  "Number of categories displayed","Nombre de catégories à afficher"
82
  "Select the maximum number of categories to display","Choisissez le nombre maximal de catégories à afficher"
146
  "The curl php extension is not installed, it's required to upload export files","L'extension php curl n'est pas installée, elle est nécéssaire à l'upload des fichiers d'export"
147
  "The curl php extension doesn't support https protocol, libcurl must be upgraded on your system, otherwise the export files won't be uploaded","L'extension php curl ne supporte pas le protocol https, libcurl doit être mis à jour sur le système, sinon l'upload des fichiers d'export ne se fera pas"
148
  "Upload Type","Type d'envoi"
149
+ "Query Spellcheck sentence","Phrase de recherche basée sur la suggestion orthographique"
150
+ "Text to display when a spellcheck based query has been made. Use {originalQuery} and {spellcheck} keyword to include the original query and the spellcheck in your text, leave empty to disable the functionality","Texte à afficher quand une recherche basée sur une suggestion orthographique a été faite. Utilisez {originalQuery} et {spellcheck} pour inclure la recherche original et la correction dans votre texte, laissez vide pour désactiver la fonctionnalité"
151
+ "No result found for '{originalQuery}'. Here the results for '{spellcheck}'.","Aucun résultat trouvé à partir de votre recherche initiale '{originalQuery}'. Voici les résultats pour la recherche '{spellcheck}'."
152
  "Redirect to the product page","Rediriger vers la page prdouit"
153
  "In case there's only one result : redirect to product page","Dans le cas où il n'y a qu'un seul résultat : rediriger vers la page produit"
154
  "Always","Toujours"
155
  "Unless there's a spellcheck","Sauf si il y a une suggestion orthographique"
156
+ "Never","Jamais"
157
+ "Result Tabs","Onglets Résultats"
158
+ "Active","Actif"
159
+ "Show even without result","Afficher même sans résultat"
160
+ "Products","Produits"
161
+ "Articles","Articles"
162
+ "Stores","Magasins"
163
+ "No Article Found","Aucun article trouvé"
164
+ "No Store Found","Aucun magasin trouvé"
165
+ "Index magento CMS pages","Indexer les pages CMS magento"
166
+ "Articles directory","Répertoire articles"
167
+ "Stores directory","Répertoire magasins"
168
+ "Local directory where the articles zip file is expected","Chemin du répertoire où le fichier zip des articles est attendu"
169
+ "Local directory where the stores zip file is expected","Chemin du répertoire où le fichier zip des magasins est attendu"
170
+ "Push articles","Envoyez les articles"
171
+ "Manually push categories index to AFS@Store","Envoi manuel des categories pour l'indexation AFS@Store"
172
+ "Manually push articles index to AFS@Store","Envoi manuel des articles pour l'indexation AFS@Store"
173
+ "Push stores","Envoyez les magasins"
174
+ "Manually push stores index to AFS@Store","Envoi manuel des magasins pour l'indexation AFS@Store"
175
+ "Articles exported","Articles exportés"
176
+ "No Article to export","Aucun article à exporter"
177
+ "Stores exported","Magasins exportés"
178
+ "No store to export","Aucun magasin à exporter"
179
+ "Feeds","Flux"
180
+ "Number of suggestions","Nombre de suggestions"
app/locale/fr_FR/MDN_Antidot.csv CHANGED
@@ -76,7 +76,7 @@ Enable,"Moteur d'autocomplétion"
76
  "Display brands in auto complete results","Affiche les marques dans les suggestions"
77
  "Number of brands displayed","Nombre de marques à afficher"
78
  "Select the maximum number of brands to display","Choisissez le nombre maximal de marques à afficher"
79
- Categories,"Afficher les catégories ?"
80
  "Display categories in auto complete results","Affiche les catégories dans les suggestions"
81
  "Number of categories displayed","Nombre de catégories à afficher"
82
  "Select the maximum number of categories to display","Choisissez le nombre maximal de catégories à afficher"
@@ -153,4 +153,28 @@ Price,Prix
153
  "In case there's only one result : redirect to product page","Dans le cas où il n'y a qu'un seul résultat : rediriger vers la page produit"
154
  "Always","Toujours"
155
  "Unless there's a spellcheck","Sauf si il y a une suggestion orthographique"
156
- "Never","Jamais"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  "Display brands in auto complete results","Affiche les marques dans les suggestions"
77
  "Number of brands displayed","Nombre de marques à afficher"
78
  "Select the maximum number of brands to display","Choisissez le nombre maximal de marques à afficher"
79
+ Categories,"Catégories"
80
  "Display categories in auto complete results","Affiche les catégories dans les suggestions"
81
  "Number of categories displayed","Nombre de catégories à afficher"
82
  "Select the maximum number of categories to display","Choisissez le nombre maximal de catégories à afficher"
153
  "In case there's only one result : redirect to product page","Dans le cas où il n'y a qu'un seul résultat : rediriger vers la page produit"
154
  "Always","Toujours"
155
  "Unless there's a spellcheck","Sauf si il y a une suggestion orthographique"
156
+ "Never","Jamais"
157
+ "Result Tabs","Onglets Résultats"
158
+ "Active","Actif"
159
+ "Show even without result","Afficher même sans résultat"
160
+ "Products","Produits"
161
+ "Articles","Articles"
162
+ "Stores","Magasins"
163
+ "No Article Found","Aucun article trouvé"
164
+ "No Store Found","Aucun magasin trouvé"
165
+ "Index magento CMS pages","Indexer les pages CMS magento"
166
+ "Articles directory","Répertoire articles"
167
+ "Stores directory","Répertoire magasins"
168
+ "Local directory where the articles zip file is expected","Chemin du répertoire où le fichier zip des articles est attendu"
169
+ "Local directory where the stores zip file is expected","Chemin du répertoire où le fichier zip des magasins est attendu"
170
+ "Push articles","Envoyez les articles"
171
+ "Manually push categories index to AFS@Store","Envoi manuel des categories pour l'indexation AFS@Store"
172
+ "Manually push articles index to AFS@Store","Envoi manuel des articles pour l'indexation AFS@Store"
173
+ "Push stores","Envoyez les magasins"
174
+ "Manually push stores index to AFS@Store","Envoi manuel des magasins pour l'indexation AFS@Store"
175
+ "Articles exported","Articles exportés"
176
+ "No Article to export","Aucun article à exporter"
177
+ "Stores exported","Magasins exportés"
178
+ "No store to export","Aucun magasin à exporter"
179
+ "Feeds","Flux"
180
+ "Number of suggestions","Nombre de suggestions"
lib/antidot/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
  language: php
2
 
3
  php:
 
4
  - 5.5
5
  - 5.4
6
  - 5.3
1
  language: php
2
 
3
  php:
4
+ - 5.6
5
  - 5.5
6
  - 5.4
7
  - 5.3
lib/antidot/AFS/SEARCH/TEST/DATA/introspection_responses.php ADDED
@@ -0,0 +1,468 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by PhpStorm.
4
+ * User: ct
5
+ * Date: 11/18/15
6
+ * Time: 2:03 PM
7
+ */
8
+
9
+ define('RESULT_WITHOUT_FACETS', '{
10
+ "header": {
11
+ "query": {
12
+ "userId": "249716644",
13
+ "userId": "368eca82-7270-4770-8751-860d57e4a696",
14
+ "date": "2015-11-11T12:00:12+0100",
15
+ "queryParam": [
16
+ {
17
+ "name": "afs:service",
18
+ "value": "7123"
19
+ },
20
+ {
21
+ "name": "afs:status",
22
+ "value": "stable"
23
+ },
24
+ {
25
+ "name": "afs:what",
26
+ "value": "meta"
27
+ },
28
+ {
29
+ "name": "afs:output",
30
+ "value": "json,2"
31
+ },
32
+ {
33
+ "name": "afs:facetDefault",
34
+ "value": "replies=100"
35
+ },
36
+ {
37
+ "name": "afs:replies",
38
+ "value": "20"
39
+ },
40
+ {
41
+ "name": "afs:sort",
42
+ "value": "afs:relevance,DESC;category_level,ASC;category_broader_length,ASC;category_name_length,ASC"
43
+ }
44
+ ],
45
+ "mainCtx": {
46
+ "textquery": ""
47
+ },
48
+ "textquery": ""
49
+ },
50
+ "metadata": [
51
+ {
52
+ "uri": "Catalog",
53
+ "meta": {
54
+ "producer": [],
55
+ "info": {
56
+ "sizeKb": 409093,
57
+ "date": 1447110000,
58
+ "searchFeedInfo": {
59
+ "nbDocs": 33210,
60
+ "nbShards": 1,
61
+ "setInfos": []
62
+ }
63
+ }
64
+ }
65
+ }
66
+ ]
67
+ }
68
+ }');
69
+
70
+ define('RESULT_WITH_FACETS_FLAT', '{
71
+ "header": {
72
+ "query": {
73
+ "userId": "249716644",
74
+ "userId": "368eca82-7270-4770-8751-860d57e4a696",
75
+ "date": "2015-11-11T12:00:12+0100",
76
+ "queryParam": [
77
+ {
78
+ "name": "afs:service",
79
+ "value": "7123"
80
+ },
81
+ {
82
+ "name": "afs:status",
83
+ "value": "stable"
84
+ },
85
+ {
86
+ "name": "afs:what",
87
+ "value": "meta"
88
+ },
89
+ {
90
+ "name": "afs:output",
91
+ "value": "json,2"
92
+ },
93
+ {
94
+ "name": "afs:facetDefault",
95
+ "value": "replies=100"
96
+ },
97
+ {
98
+ "name": "afs:replies",
99
+ "value": "20"
100
+ },
101
+ {
102
+ "name": "afs:sort",
103
+ "value": "afs:relevance,DESC;category_level,ASC;category_broader_length,ASC;category_name_length,ASC"
104
+ }
105
+ ],
106
+ "mainCtx": {
107
+ "textquery": ""
108
+ },
109
+ "textquery": ""
110
+ }
111
+ },
112
+ "metadata": [
113
+ {
114
+ "uri": "Catalog",
115
+ "meta": {
116
+ "producer": [],
117
+ "info": {
118
+ "sizeKb": 409093,
119
+ "date": 1447110000,
120
+ "searchFeedInfo": {
121
+ "nbDocs": 33210,
122
+ "nbShards": 1,
123
+ "setInfos": [
124
+ {
125
+ "setId": "Antidot_Root_Field",
126
+ "childrenInfos": [],
127
+ "facetInfos": [
128
+ {
129
+ "afs:t": "FacetTree",
130
+ "layout": "TREE",
131
+ "type": "INTEGER",
132
+ "id": "product_id",
133
+ "sticky": false,
134
+ "filter": true
135
+ },
136
+ {
137
+ "afs:t": "FacetTree",
138
+ "layout": "TREE",
139
+ "type": "STRING",
140
+ "id": "name",
141
+ "sticky": false,
142
+ "filter": true
143
+ },
144
+ {
145
+ "afs:t": "FacetTree",
146
+ "layout": "TREE",
147
+ "type": "REAL",
148
+ "id": "price_from",
149
+ "sticky": false,
150
+ "filter": true
151
+ }
152
+ ]
153
+ }
154
+ ]
155
+ }
156
+ }
157
+ }
158
+ }
159
+ ]
160
+ }');
161
+
162
+ define('RESULT_WITH_FACETS_MULTILEVEL', '{
163
+ "header": {
164
+ "query": {
165
+ "userId": "249716644",
166
+ "userId": "368eca82-7270-4770-8751-860d57e4a696",
167
+ "date": "2015-11-11T12:00:12+0100",
168
+ "queryParam": [
169
+ {
170
+ "name": "afs:service",
171
+ "value": "7123"
172
+ },
173
+ {
174
+ "name": "afs:status",
175
+ "value": "stable"
176
+ },
177
+ {
178
+ "name": "afs:what",
179
+ "value": "meta"
180
+ },
181
+ {
182
+ "name": "afs:output",
183
+ "value": "json,2"
184
+ },
185
+ {
186
+ "name": "afs:facetDefault",
187
+ "value": "replies=100"
188
+ },
189
+ {
190
+ "name": "afs:replies",
191
+ "value": "20"
192
+ },
193
+ {
194
+ "name": "afs:sort",
195
+ "value": "afs:relevance,DESC;category_level,ASC;category_broader_length,ASC;category_name_length,ASC"
196
+ }
197
+ ],
198
+ "mainCtx": {
199
+ "textquery": ""
200
+ },
201
+ "textquery": ""
202
+ }
203
+ },
204
+ "metadata": [
205
+ {
206
+ "uri": "Catalog",
207
+ "meta": {
208
+ "producer": [],
209
+ "info": {
210
+ "sizeKb": 409093,
211
+ "date": 1447110000,
212
+ "searchFeedInfo": {
213
+ "nbDocs": 33210,
214
+ "nbShards": 1,
215
+ "setInfos": [
216
+ {
217
+ "setId": "Antidot_Root_Field",
218
+ "childrenInfos": [
219
+ {
220
+ "setId": "variant",
221
+ "childrenInfos": [],
222
+ "facetInfos": [
223
+ {
224
+ "afs:t": "FacetTree",
225
+ "layout": "TREE",
226
+ "type": "STRING",
227
+ "id": "product",
228
+ "sticky": false,
229
+ "filter": true
230
+ },
231
+ {
232
+ "afs:t": "FacetTree",
233
+ "layout": "TREE",
234
+ "type": "STRING",
235
+ "id": "model",
236
+ "labels": [
237
+ {
238
+ "lang": "FR",
239
+ "label": "Modèle"
240
+ },
241
+ {
242
+ "lang": "NL",
243
+ "label": "model"
244
+ }
245
+ ],
246
+ "sticky": false,
247
+ "filter": false
248
+ }
249
+ ]
250
+ }
251
+ ],
252
+ "facetInfos": [
253
+ {
254
+ "afs:t": "FacetTree",
255
+ "layout": "TREE",
256
+ "type": "INTEGER",
257
+ "id": "product_id",
258
+ "sticky": false,
259
+ "filter": true
260
+ },
261
+ {
262
+ "afs:t": "FacetTree",
263
+ "layout": "TREE",
264
+ "type": "STRING",
265
+ "id": "name",
266
+ "sticky": false,
267
+ "filter": true
268
+ },
269
+ {
270
+ "afs:t": "FacetTree",
271
+ "layout": "TREE",
272
+ "type": "REAL",
273
+ "id": "price_from",
274
+ "sticky": false,
275
+ "filter": true
276
+ }
277
+ ]
278
+ }
279
+ ]
280
+ }
281
+ }
282
+ }
283
+ }
284
+ ]
285
+ }');
286
+
287
+ define('RESPONSE_FACETS_MULTIFEED', '{
288
+ "header": {
289
+ "query": {
290
+ "userId": "249716644",
291
+ "userId": "368eca82-7270-4770-8751-860d57e4a696",
292
+ "date": "2015-11-11T12:00:12+0100",
293
+ "queryParam": [
294
+ {
295
+ "name": "afs:service",
296
+ "value": "7123"
297
+ },
298
+ {
299
+ "name": "afs:status",
300
+ "value": "stable"
301
+ },
302
+ {
303
+ "name": "afs:what",
304
+ "value": "meta"
305
+ },
306
+ {
307
+ "name": "afs:output",
308
+ "value": "json,2"
309
+ },
310
+ {
311
+ "name": "afs:facetDefault",
312
+ "value": "replies=100"
313
+ },
314
+ {
315
+ "name": "afs:replies",
316
+ "value": "20"
317
+ },
318
+ {
319
+ "name": "afs:sort",
320
+ "value": "afs:relevance,DESC;category_level,ASC;category_broader_length,ASC;category_name_length,ASC"
321
+ }
322
+ ],
323
+ "mainCtx": {
324
+ "textquery": ""
325
+ },
326
+ "textquery": ""
327
+ }
328
+ },
329
+ "metadata": [
330
+ {
331
+ "uri": "Catalog",
332
+ "meta": {
333
+ "producer": [],
334
+ "info": {
335
+ "sizeKb": 409093,
336
+ "date": 1447110000,
337
+ "searchFeedInfo": {
338
+ "nbDocs": 33210,
339
+ "nbShards": 1,
340
+ "setInfos": [
341
+ {
342
+ "setId": "Antidot_Root_Field",
343
+ "childrenInfos": [
344
+ {
345
+ "setId": "variant",
346
+ "childrenInfos": [],
347
+ "facetInfos": [
348
+ {
349
+ "afs:t": "FacetTree",
350
+ "layout": "TREE",
351
+ "type": "STRING",
352
+ "id": "product",
353
+ "sticky": false,
354
+ "filter": true
355
+ },
356
+ {
357
+ "afs:t": "FacetTree",
358
+ "layout": "TREE",
359
+ "type": "STRING",
360
+ "id": "model",
361
+ "labels": [
362
+ {
363
+ "lang": "FR",
364
+ "label": "Modèle"
365
+ },
366
+ {
367
+ "lang": "NL",
368
+ "label": "model"
369
+ }
370
+ ],
371
+ "sticky": false,
372
+ "filter": false
373
+ }
374
+ ]
375
+ }
376
+ ],
377
+ "facetInfos": [
378
+ {
379
+ "afs:t": "FacetTree",
380
+ "layout": "TREE",
381
+ "type": "INTEGER",
382
+ "id": "product_id",
383
+ "sticky": false,
384
+ "filter": true
385
+ },
386
+ {
387
+ "afs:t": "FacetTree",
388
+ "layout": "TREE",
389
+ "type": "STRING",
390
+ "id": "name",
391
+ "sticky": false,
392
+ "filter": true
393
+ },
394
+ {
395
+ "afs:t": "FacetTree",
396
+ "layout": "TREE",
397
+ "type": "REAL",
398
+ "id": "price_from",
399
+ "sticky": false,
400
+ "filter": true
401
+ }
402
+ ]
403
+ }
404
+ ]
405
+ }
406
+ }
407
+ }
408
+ },
409
+ {
410
+ "uri": "Categories",
411
+ "meta": {
412
+ "producer": [],
413
+ "info": {
414
+ "sizeKb": 409093,
415
+ "date": 1447110000,
416
+ "searchFeedInfo": {
417
+ "nbDocs": 33210,
418
+ "nbShards": 1,
419
+ "setInfos": [
420
+ {
421
+ "setId": "Antidot_Root_Field",
422
+ "childrenInfos": [],
423
+ "facetInfos": [
424
+ {
425
+ "afs:t": "FacetTree",
426
+ "layout": "TREE",
427
+ "type": "INTEGER",
428
+ "id": "category_id",
429
+ "sticky": false,
430
+ "filter": true
431
+ }
432
+ ]
433
+ }
434
+ ]
435
+ }
436
+ }
437
+ }
438
+ }
439
+ ]
440
+ }');
441
+
442
+ define('ABOUT_RESPONSE', '{
443
+ "x:type":"ws.response",
444
+ "query":{
445
+ "x:type":"ws.response.query",
446
+ "parameters":{
447
+ "x:type":"collection",
448
+ "x:values":[
449
+
450
+ ]
451
+ },
452
+ "properties":{
453
+ "x:type":"x:dynamic"
454
+ }
455
+ },
456
+ "result":{
457
+ "x:type":"bows.about",
458
+ "boWsVersion":{
459
+ "x:type":"AfsVersion",
460
+ "build":"3eaebfd1f1fe261780347cbc35bfbd65d613575e",
461
+ "gen":"7.6",
462
+ "major":"4",
463
+ "minor":"0",
464
+ "motto":"Pink Dolphin"
465
+ },
466
+ "copyright":"Copyright (C) 1999-2013 Antidot"
467
+ }
468
+ }');
lib/antidot/AFS/SEARCH/TEST/introspectionTest.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by PhpStorm.
4
+ * User: ct
5
+ * "date": 11/11/15
6
+ * Time: 11:48 AM
7
+ */
8
+ require_once('AFS/SEARCH/afs_introspection.php');
9
+ require_once('AFS/SEARCH/afs_search.php');
10
+ require_once('COMMON/php-SAI/lib/CurlStub.php');
11
+ require_once('AIF/afs_user_authentication.php');
12
+ require_once('AFS/SEARCH/TEST/DATA/introspection_responses.php');
13
+
14
+
15
+ class IntrospectionTest extends PHPUnit_Framework_TestCase {
16
+
17
+ public function testGetFeedListBasics() {
18
+ $introspector = $this->init_introspector(RESPONSE_FACETS_MULTIFEED);
19
+ $expected_feeds_list = array('Categories', 'Catalog');
20
+ $actual_feed_list = $introspector->get_feeds_list();
21
+ $this->assertEquals(sort($expected_feeds_list), sort($actual_feed_list));
22
+ }
23
+
24
+ public function testHasFeedBasic() {
25
+ $intropsector = $this->init_introspector(RESULT_WITH_FACETS_FLAT);
26
+ $this->assertTrue($intropsector->has_feed('Catalog'));
27
+ $this->assertFalse($intropsector->has_feed('Categories'));
28
+ }
29
+
30
+ public function testGetFeedMetadataShouldReturnNull() {
31
+ $introspector = $this->init_introspector(RESULT_WITHOUT_FACETS);
32
+ $this->assertEquals($introspector->get_feed_metadata('toto'), null);
33
+ }
34
+
35
+ public function testGetAllMetadataBasic() {
36
+ $intropsector = $this->init_introspector(RESULT_WITH_FACETS_FLAT);
37
+ $all_metadata = $intropsector->get_all_metadata();
38
+ $this->assertEquals(count($all_metadata), 1);
39
+ }
40
+
41
+ public function testIntrospectionWithNoFacets() {
42
+ $intropsector = $this->init_introspector(RESULT_WITHOUT_FACETS);
43
+ $all_meta= $intropsector->get_all_metadata();
44
+ $this->assertEquals(count($all_meta), 0);
45
+ }
46
+
47
+ public function testIntrospectionWithFlatFacets() {
48
+ $intropsector = $this->init_introspector(RESULT_WITH_FACETS_FLAT);
49
+ $catalog_metadata= $intropsector->get_feed_metadata('Catalog');
50
+ $catalog_filters_info = $catalog_metadata->get_filters_info();
51
+ $this->assertEquals(count($catalog_filters_info), 3);
52
+
53
+ $product= $catalog_filters_info['product_id'];
54
+ $this->check_facet_info($product, 'product_id', false, true, 'INTEGER', 'TREE');
55
+
56
+ $name = $catalog_filters_info['name'];
57
+ $this->check_facet_info($name, 'name', false, true, 'STRING', 'TREE');
58
+
59
+ $price_from = $catalog_filters_info['price_from'];
60
+ $this->check_facet_info($price_from, 'price_from', false, true, 'REAL', 'TREE');
61
+ }
62
+
63
+ public function testIntrospectionWithMultiLevelFacets() {
64
+ $intropsector = $this->init_introspector(RESULT_WITH_FACETS_MULTILEVEL);
65
+ $all_meta= $intropsector->get_all_metadata();
66
+ $this->assertEquals(count($all_meta), 1);
67
+ $catalog_facets_info = $all_meta['Catalog']->get_facets_and_filters_info();
68
+ $this->assertEquals(count($catalog_facets_info), 5);
69
+
70
+ $product= $catalog_facets_info['product_id'];
71
+ $this->check_facet_info($product, 'product_id', false, true, 'INTEGER', 'TREE');
72
+
73
+ $name = $catalog_facets_info['name'];
74
+ $this->check_facet_info($name, 'name', false, true, 'STRING', 'TREE');
75
+
76
+ $price_from = $catalog_facets_info['price_from'];
77
+ $this->check_facet_info($price_from, 'price_from', false, true, 'REAL', 'TREE');
78
+
79
+ $product= $catalog_facets_info['product'];
80
+ $this->check_facet_info($product, 'product', false, true, 'STRING', 'TREE');
81
+
82
+ $model= $catalog_facets_info['model'];
83
+ $expected_labels = array('FR' => 'Modèle', 'NL' => 'model');
84
+ $this->check_facet_info($model, 'model', false, false, 'STRING', 'TREE', $expected_labels);
85
+ }
86
+
87
+ private function check_facet_info($facet_info, $expected_name, $is_sticky, $is_filter, $expected_type,
88
+ $expected_layout, $expected_labels=null)
89
+ {
90
+ $this->assertEquals($facet_info->get_id(), $expected_name);
91
+ $this->assertEquals($facet_info->is_sticky(), $is_sticky);
92
+ $this->assertEquals($facet_info->is_filter(), $is_filter);
93
+ $this->assertEquals($facet_info->get_type(), $expected_type);
94
+ $this->assertEquals($facet_info->get_layout(), $expected_layout);
95
+ if (! is_null($expected_labels)) {
96
+ $this->assertEquals($facet_info->get_labels(), $expected_labels);
97
+ }
98
+ }
99
+
100
+ private function init_introspector($response)
101
+ {
102
+ $curlConnector = new SAI_CurlStub();
103
+ $mockBaseUrl = "localhost";
104
+ $aboutRequestOpts = array(CURLOPT_URL => "http://$mockBaseUrl/bo-ws/about");
105
+ $aboutResponse = ABOUT_RESPONSE;
106
+
107
+ $curlConnector->setResponse($aboutResponse, $aboutRequestOpts);
108
+ $curlConnector->setResponse($response);
109
+ $search = new AfsSearch($mockBaseUrl, '71003', AfsServiceStatus::STABLE, $curlConnector);
110
+
111
+ $intropsector = new AfsIntrospection($search);
112
+ return $intropsector;
113
+ }
114
+ }
115
+
lib/antidot/AFS/SEARCH/TEST/metadataHelperTest.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Created by PhpStorm.
4
+ * User: ct
5
+ * Date: 11/13/15
6
+ * Time: 1:47 PM
7
+ */
8
+ require_once 'AFS/SEARCH/afs_metadata_helper.php';
9
+
10
+ class MetadataHelperTest extends PHPUnit_Framework_TestCase {
11
+
12
+ private $metadata = null;
13
+
14
+ public function setup() {
15
+ $this->metadata = json_decode('
16
+ {
17
+ "uri": "Catalog",
18
+ "meta": {
19
+ "producer": [],
20
+ "info": {
21
+ "sizeKb": 409093,
22
+ "date": 1447110000,
23
+ "searchFeedInfo": {
24
+ "nbDocs": 33210,
25
+ "nbShards": 1,
26
+ "setInfos": [
27
+ {
28
+ "setId": "Antidot_Root_Field",
29
+ "childrenInfos": [],
30
+ "facetInfos": [
31
+ {
32
+ "afs:t": "FacetTree",
33
+ "layout": "TREE",
34
+ "type": "INTEGER",
35
+ "id": "product_id",
36
+ "sticky": false,
37
+ "filter": true
38
+ },
39
+ {
40
+ "afs:t": "FacetTree",
41
+ "layout": "TREE",
42
+ "type": "STRING",
43
+ "id": "name",
44
+ "sticky": false,
45
+ "filter": true
46
+ },
47
+ {
48
+ "afs:t": "FacetTree",
49
+ "layout": "TREE",
50
+ "type": "REAL",
51
+ "id": "price_from",
52
+ "sticky": false,
53
+ "filter": false
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ');
63
+ }
64
+
65
+ public function testFiltersList() {
66
+ $metadata_helper = new AfsMetadataHelper($this->metadata);
67
+ $filters_info = $metadata_helper->get_filters_info();
68
+ $this->assertEquals(count($filters_info), 2);
69
+ }
70
+
71
+ public function testFacetslist() {
72
+ $metadata_helper = new AfsMetadataHelper($this->metadata);
73
+ $filters_info = $metadata_helper->get_facets_info();
74
+ $this->assertEquals(count($filters_info), 1);
75
+ }
76
+
77
+ public function testFacetsInfoData() {
78
+ $metadata_helper = new AfsMetadataHelper($this->metadata);
79
+ $facets_info = $metadata_helper->get_facets_and_filters_info();
80
+ $this->assertEquals(count($facets_info), 3);
81
+
82
+ $this->assertTrue(array_key_exists('product_id', $facets_info));
83
+ $product_id = $facets_info['product_id'];
84
+ $this->assertEquals($product_id->get_id(), 'product_id');
85
+ $this->assertFalse($product_id->is_sticky());
86
+ $this->assertTrue($product_id->is_filter());
87
+ $this->assertEquals($product_id->get_type(), 'INTEGER');
88
+ $this->assertEquals($product_id->get_layout(), 'TREE');
89
+
90
+ $this->assertTrue(array_key_exists('name', $facets_info));
91
+ $name = $facets_info['name'];
92
+ $this->assertEquals($name->get_id(), 'name');
93
+ $this->assertFalse($name->is_sticky());
94
+ $this->assertTrue($name->is_filter());
95
+ $this->assertEquals($name->get_type(), 'STRING');
96
+ $this->assertEquals($name->get_layout(), 'TREE');
97
+
98
+ $this->assertTrue(array_key_exists('price_from', $facets_info));
99
+ $price_from = $facets_info['price_from'];
100
+ $this->assertEquals($price_from->get_id(), 'price_from');
101
+ $this->assertFalse($price_from->is_sticky());
102
+ $this->assertFalse($price_from->is_filter());
103
+ $this->assertEquals($price_from->get_type(), 'REAL');
104
+ $this->assertEquals($price_from->get_layout(), 'TREE');
105
+ }
106
+ }
lib/antidot/AFS/SEARCH/TEST/responseHelperTest.php CHANGED
@@ -536,6 +536,76 @@ class ResponseHelperTest extends PHPUnit_Framework_TestCase
536
  $this->assertEquals(AfsOrigin::FACET, $elements[0]->query->get_from());
537
 
538
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
539
  }
540
 
541
 
536
  $this->assertEquals(AfsOrigin::FACET, $elements[0]->query->get_from());
537
 
538
  }
539
+
540
+ public function testIntrospectionResponseShouldInitializeMetadata() {
541
+ $input = json_decode('{
542
+ "header": {
543
+ "query": {
544
+ "userId": "afd070b6-4315-40cc-975d-747e28bf132a",
545
+ "sessionId": "5bf5642d-a262-4608-9901-45aa6e87325d"
546
+ },
547
+ "performance": {
548
+ "durationMs": 666
549
+ }
550
+ },
551
+ "metadata": [
552
+ {
553
+ "uri": "Catalog",
554
+ "meta": {
555
+ "producer": [],
556
+ "info": {
557
+ "sizeKb": 409093,
558
+ "date": 1447110000,
559
+ "searchFeedInfo": {
560
+ "nbDocs": 33210,
561
+ "nbShards": 1,
562
+ "setInfos": [
563
+ {
564
+ "setId": "Antidot_Root_Field",
565
+ "childrenInfos": [],
566
+ "facetInfos": [
567
+ {
568
+ "afs:t": "FacetTree",
569
+ "layout": "TREE",
570
+ "type": "INTEGER",
571
+ "id": "product_id",
572
+ "sticky": false,
573
+ "filter": true
574
+ },
575
+ {
576
+ "afs:t": "FacetTree",
577
+ "layout": "TREE",
578
+ "type": "STRING",
579
+ "id": "name",
580
+ "sticky": false,
581
+ "filter": true
582
+ },
583
+ {
584
+ "afs:t": "FacetTree",
585
+ "layout": "TREE",
586
+ "type": "REAL",
587
+ "id": "price_from",
588
+ "sticky": false,
589
+ "filter": true
590
+ }
591
+ ]
592
+ }
593
+ ]
594
+ }
595
+ }
596
+ }
597
+ }
598
+ ]
599
+ }');
600
+
601
+ $config = new AfsHelperConfiguration();
602
+ $config->set_helper_format(AfsHelperFormat::HELPERS);
603
+ $response_helper = new AfsResponseHelper($input, new AfsQuery(), $config);
604
+
605
+ $this->assertNotEmpty($response_helper->get_all_metadata());
606
+ $this->assertTrue($response_helper->has_metadata('Catalog'));
607
+ $this->assertNotNull($response_helper->get_feed_metadata('Catalog'));
608
+ }
609
  }
610
 
611
 
lib/antidot/AFS/SEARCH/afs_introspection.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Created by PhpStorm.
5
+ * User: ct
6
+ * Date: 11/10/15
7
+ * Time: 5:00 PM
8
+ */
9
+ class AfsIntrospection {
10
+ private $feeds_metadata = array();
11
+
12
+ public function __construct($search) {
13
+ $this->build_metadata($search);
14
+ }
15
+
16
+ /**
17
+ * @param $feed
18
+ * @return bool: true if there is metadata for given feed, otherwise false
19
+ */
20
+ public function has_feed($feed) {
21
+ return array_key_exists($feed, $this->feeds_metadata);
22
+ }
23
+
24
+ /**
25
+ * @return array: list of available feed's metadata
26
+ */
27
+ public function get_feeds_list() {
28
+ return array_keys($this->feeds_metadata);
29
+ }
30
+
31
+ /**
32
+ * @return array: list of feed's metadata (AfsMetadataHelper)
33
+ */
34
+ public function get_all_metadata() {
35
+ return $this->feeds_metadata;
36
+ }
37
+
38
+ /**
39
+ * @param $feed_name
40
+ * @return AfsMetadata: metadata for given feed name, or null if there is no metadata for given feed name
41
+ */
42
+ public function get_feed_metadata($feed_name) {
43
+ if (array_key_exists($feed_name, $this->feeds_metadata)) {
44
+ return $this->feeds_metadata[$feed_name];
45
+ } else {
46
+ return null;
47
+ }
48
+ }
49
+
50
+ private function build_metadata($search) {
51
+ $params = array('afs:what' => 'meta');
52
+ $query = AfsQuery::create_from_parameters($params);
53
+ $result = $search->execute($query);
54
+ $this->feeds_metadata = $result->get_all_metadata();
55
+ }
56
+
57
+ private function setup_feeds_filters($search) {
58
+ $query = AfsQuery::create_from_parameters(array());
59
+ $result = $search->execute($query);
60
+ if (property_exists($result, 'replysets')) {
61
+ foreach ($this->feeds_metadata as $metadata_feed => $metadata_helper) {
62
+ $this->setup_feed_filters($result->replysets, $metadata_feed, $metadata_helper);
63
+ }
64
+ }
65
+ }
66
+ }
lib/antidot/AFS/SEARCH/afs_metadata_helper.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Created by PhpStorm.
5
+ * User: ct
6
+ * Date: 11/11/15
7
+ * Time: 10:38 AM
8
+ */
9
+ class AfsMetadataHelper {
10
+
11
+ private $facetsInfo = array();
12
+
13
+ public function __construct($data) {
14
+ $this->initialize_facets_info($data);
15
+ }
16
+
17
+ private function initialize_facets_info($meta) {
18
+ $this->initialize_facets_info_rec($meta->meta->info->searchFeedInfo->setInfos);
19
+ }
20
+
21
+ private function initialize_facets_info_rec($setInfos) {
22
+ foreach ($setInfos as $setInfo) {
23
+ foreach ($setInfo->facetInfos as $facetInfo) {
24
+ $this->facetsInfo[$facetInfo->id] = new AfsFacetInfoHelper($facetInfo);
25
+ }
26
+ if (property_exists($setInfo, 'childrenInfos')) {
27
+ $this->initialize_facets_info_rec($setInfo->childrenInfos);
28
+ }
29
+ }
30
+ }
31
+
32
+ /**
33
+ * @brief retreives only facets info
34
+ * @return array of AfsFacetInfo objects
35
+ */
36
+ public function get_facets_info() {
37
+ return array_filter($this->facetsInfo, function($facet_info) {
38
+ return ! $facet_info->is_filter();
39
+ });
40
+ }
41
+
42
+ /**
43
+ * @brief retreives only filters info
44
+ * @return array of AfsFacetInfo objects
45
+ */
46
+ public function get_filters_info() {
47
+ return array_filter($this->facetsInfo, function($facet_info) {
48
+ return $facet_info->is_filter();
49
+ });
50
+ }
51
+
52
+ /**
53
+ * @brief retrieves all facets and filters info
54
+ * @return array of AfsFacetInfo objects
55
+ */
56
+ public function get_facets_and_filters_info() {
57
+ return $this->facetsInfo;
58
+ }
59
+ }
60
+
61
+
62
+
63
+ class AfsFacetInfoHelper {
64
+
65
+ private $labels = array();
66
+ private $is_sticky = null;
67
+ private $is_filter = null;
68
+ private $type = null;
69
+ private $layout = null;
70
+ private $id = null;
71
+
72
+ public function __construct($facetInfo) {
73
+ $this->type = $facetInfo->type;
74
+ if (property_exists($facetInfo, 'labels')) {
75
+ foreach ($facetInfo->labels as $label) {
76
+ if (property_exists($label, 'lang')) {
77
+ $this->labels[$label->lang] = $label->label;
78
+ } elseif (property_exists($label, 'label')) {
79
+ $this->labels[$label->label] = $label->label;
80
+ }
81
+ }
82
+ }
83
+
84
+ if (property_exists($facetInfo, 'filter')) {
85
+ $this->is_filter = $facetInfo->filter;
86
+ }
87
+ if (property_exists($facetInfo, 'sticky')) {
88
+ $this->is_sticky = $facetInfo->sticky;
89
+ }
90
+ $this->id = $facetInfo->id;
91
+ $this->layout = $facetInfo->layout;
92
+ }
93
+
94
+ /**
95
+ * @brief retrieves all facet's labels
96
+ * @return array of labels of language => label
97
+ */
98
+ public function get_labels() {
99
+ return $this->labels;
100
+ }
101
+
102
+ /**
103
+ * @return boolean: true if current facet is sticky
104
+ */
105
+ public function is_sticky() {
106
+ return $this->is_sticky;
107
+ }
108
+
109
+ /**
110
+ * @return boolean: true if current facet is a filter, otherwise false
111
+ */
112
+ public function is_filter() {
113
+ return $this->is_filter;
114
+ }
115
+
116
+ /**
117
+ * @param $value
118
+ */
119
+ public function set_is_filter($value) {
120
+ $this->is_filter = $value;
121
+ }
122
+
123
+ /**
124
+ * @return integer: current facet's ID
125
+ */
126
+ public function get_id() {
127
+ return $this->id;
128
+ }
129
+
130
+ /**
131
+ * @return string: current facet's type
132
+ */
133
+ public function get_type() {
134
+ return $this->type;
135
+ }
136
+
137
+ /**
138
+ * @return string: current facet's layout
139
+ */
140
+ public function get_layout() {
141
+ return $this->layout;
142
+ }
143
+ }
144
+
lib/antidot/AFS/SEARCH/afs_response_helper.php CHANGED
@@ -9,6 +9,7 @@ require_once 'AFS/SEARCH/afs_producer.php';
9
  require_once 'AFS/SEARCH/afs_helper_configuration.php';
10
  require_once 'AFS/SEARCH/afs_response_exception.php';
11
  require_once 'COMMON/afs_helper_format.php';
 
12
 
13
  /** @brief Main helper for AFS search reply.
14
  *
@@ -21,8 +22,10 @@ class AfsResponseHelper extends AfsResponseHelperBase
21
  {
22
  private $config = null;
23
  private $has_reply = false;
 
24
  private $header = null;
25
  private $replysets = array();
 
26
  private $spellcheck_mgr = null;
27
  private $promote = null;
28
  private $concepts = null;
@@ -54,11 +57,20 @@ class AfsResponseHelper extends AfsResponseHelperBase
54
  $this->concepts = new AfsConceptManager();
55
 
56
  $this->initialize_replysets($response->replySet, $query, $config);
 
 
 
57
  } elseif ($this->header->in_error()) {
58
  $this->set_error_msg($this->header->get_error());
59
  }
60
  }
61
 
 
 
 
 
 
 
62
  private function initialize_replysets($replysets, AfsQuery $query,
63
  AfsHelperConfiguration $config)
64
  {
@@ -181,6 +193,33 @@ class AfsResponseHelper extends AfsResponseHelperBase
181
  $this->check_reply('spellcheck_mgr');
182
  return $this->spellcheck_mgr->get_spellcheck($feed);
183
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  /** @} */
185
 
186
  /** @name Promote
9
  require_once 'AFS/SEARCH/afs_helper_configuration.php';
10
  require_once 'AFS/SEARCH/afs_response_exception.php';
11
  require_once 'COMMON/afs_helper_format.php';
12
+ require_once 'AFS/SEARCH/afs_metadata_helper.php';
13
 
14
  /** @brief Main helper for AFS search reply.
15
  *
22
  {
23
  private $config = null;
24
  private $has_reply = false;
25
+ private $has_metadata = false;
26
  private $header = null;
27
  private $replysets = array();
28
+ private $metadata = array();
29
  private $spellcheck_mgr = null;
30
  private $promote = null;
31
  private $concepts = null;
57
  $this->concepts = new AfsConceptManager();
58
 
59
  $this->initialize_replysets($response->replySet, $query, $config);
60
+ } elseif (property_exists($response, 'metadata')) {
61
+ $this->has_metadata = true;
62
+ $this->initialize_metadata($response->metadata);
63
  } elseif ($this->header->in_error()) {
64
  $this->set_error_msg($this->header->get_error());
65
  }
66
  }
67
 
68
+ private function initialize_metadata($metadata) {
69
+ foreach ($metadata as $meta) {
70
+ $this->metadata[$meta->uri] = new AfsMetadataHelper($meta);
71
+ }
72
+ }
73
+
74
  private function initialize_replysets($replysets, AfsQuery $query,
75
  AfsHelperConfiguration $config)
76
  {
193
  $this->check_reply('spellcheck_mgr');
194
  return $this->spellcheck_mgr->get_spellcheck($feed);
195
  }
196
+
197
+ /** @brief Retrieves metadata for all feeds */
198
+ public function get_all_metadata() {
199
+ return $this->metadata;
200
+ }
201
+
202
+ /**
203
+ * @brief Retrieves metadata for given feed
204
+ * @param $feed
205
+ */
206
+ public function get_feed_metadata($feed=null) {
207
+ return $this->metadata[$feed];
208
+ }
209
+
210
+ /**@brief Check if metadata is defined in response stream
211
+ * @param $feed. If not null, check if metadata is defined for this feed.
212
+ * If null, check if at least one feed contains metadata.
213
+ * @return bool
214
+ */
215
+ public function has_metadata($feed=null)
216
+ {
217
+ if (! is_null($feed)) {
218
+ return array_key_exists($feed, $this->metadata);
219
+ } else {
220
+ return $this->has_metadata;
221
+ }
222
+ }
223
  /** @} */
224
 
225
  /** @name Promote
lib/antidot/AIF/TEST/authenticationTest.php CHANGED
@@ -16,7 +16,12 @@ class AuthenticationTest extends PHPUnit_Framework_TestCase
16
  $this->assertEquals(array('Authorization' => 'Basic ' . base64_encode('foo:bar')), $auth->format_as_header_param());
17
  }
18
 
19
- public function testTokenAuthenticationFormatNew()
 
 
 
 
 
20
  {
21
  $auth = new AfsTokenAuthentication('foo');
22
  $this->assertEquals(array('access-token' => 'foo'), $auth->format_as_header_param());
16
  $this->assertEquals(array('Authorization' => 'Basic ' . base64_encode('foo:bar')), $auth->format_as_header_param());
17
  }
18
 
19
+ public function testTokenAuthenticationFormat76()
20
+ {
21
+ $auth = new AfsTokenAuthentication('foo');
22
+ $this->assertEquals(array('afs:login' => 'login://foo@SSO'), $auth->format_as_url_param('7.6'));
23
+ }
24
+ public function testTokenAuthenticationFormatNew()
25
  {
26
  $auth = new AfsTokenAuthentication('foo');
27
  $this->assertEquals(array('access-token' => 'foo'), $auth->format_as_header_param());
lib/antidot/AIF/TEST/pafConnectorTest.php CHANGED
@@ -1,17 +1,17 @@
1
  <?php ob_start();
2
  require_once('AIF/afs_paf_connector.php');
3
- require_once('AIF/afs_user_authentication.php');
4
 
5
 
6
  class PafConnectorTest extends PHPUnit_Framework_TestCase
7
  {
8
  public function testOneShot()
9
  {
 
10
  $auth = new AfsUserAuthentication('antidot', 'change_on_install', AFS_AUTH_ANTIDOT);
11
- $service = new AfsService(42, AfsServiceStatus::BETA);
12
  $content = '<?xml version="1.0"?><root><uri>http://generated.doc.<?php ob_start();</uri><title>Generated doc</title><content>Generated content</content></root>';
13
  $doc = new AfsDocument($content);
14
- $connector = new AfsPafConnector('kaio:8085', $service, 'Catalog', $auth);
15
  $result = $connector->upload_doc($doc);
16
  $this->assertTrue($result->has_result());
17
  $this->assertFalse($result->in_error());
1
  <?php ob_start();
2
  require_once('AIF/afs_paf_connector.php');
 
3
 
4
 
5
  class PafConnectorTest extends PHPUnit_Framework_TestCase
6
  {
7
  public function testOneShot()
8
  {
9
+ return;
10
  $auth = new AfsUserAuthentication('antidot', 'change_on_install', AFS_AUTH_ANTIDOT);
11
+ $service = new AfsService(42);
12
  $content = '<?xml version="1.0"?><root><uri>http://generated.doc.<?php ob_start();</uri><title>Generated doc</title><content>Generated content</content></root>';
13
  $doc = new AfsDocument($content);
14
+ $connector = new AfsPafConnector('quigon', $service, 'TestPaF', $auth);
15
  $result = $connector->upload_doc($doc);
16
  $this->assertTrue($result->has_result());
17
  $this->assertFalse($result->in_error());
lib/antidot/AIF/afs_about_connector.php CHANGED
@@ -7,7 +7,7 @@ require_once 'AIF/afs_bows_information.php';
7
  /** @brief Simple connector to retrieve AFS Back Office information. */
8
  class AfsAboutConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterface
9
  {
10
- public function __construct($host, AfsService $service=null, $scheme=AFS_SCHEME_HTTP, SAI_CurlInterface $curlConnector=null, $params=null)
11
  {
12
  parent::__construct($host, $service, $scheme, $curlConnector);
13
  }
7
  /** @brief Simple connector to retrieve AFS Back Office information. */
8
  class AfsAboutConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterface
9
  {
10
+ public function __construct($host, AfsService $service=null, $scheme=AFS_SCHEME_HTTP, SAI_CurlInterface $curlConnector=null)
11
  {
12
  parent::__construct($host, $service, $scheme, $curlConnector);
13
  }
lib/antidot/AIF/afs_authentication.php CHANGED
@@ -24,14 +24,14 @@ interface AfsAuthentication
24
  * version information.
25
  * @return string representing authentication.
26
  */
27
- public function format_as_url_param();
28
 
29
  /** @brief Formats authentication parameters.
30
  * @param $version [in] Format string representation according to provided
31
  * version information.
32
  * @return array representing authentication.
33
  */
34
- public function format_as_header_param();
35
  }
36
 
37
 
24
  * version information.
25
  * @return string representing authentication.
26
  */
27
+ public function format_as_url_param($version=null);
28
 
29
  /** @brief Formats authentication parameters.
30
  * @param $version [in] Format string representation according to provided
31
  * version information.
32
  * @return array representing authentication.
33
  */
34
+ public function format_as_header_param($version=null);
35
  }
36
 
37
 
lib/antidot/AIF/afs_bows_connector.php CHANGED
@@ -105,7 +105,7 @@ abstract class AfsBOWSConnector extends AfsConnectorBase
105
  throw new Exception("Code : " . $r->error->code . "\nMessage : " .$r->error->message . "\nDescription : " . $r->error->description);
106
  }
107
  $this->curlConnector->curl_close($request);
108
- Mage::log($result, null, 'antidot.log');
109
  return $result;
110
  }
111
 
105
  throw new Exception("Code : " . $r->error->code . "\nMessage : " .$r->error->message . "\nDescription : " . $r->error->description);
106
  }
107
  $this->curlConnector->curl_close($request);
108
+
109
  return $result;
110
  }
111
 
lib/antidot/AIF/afs_paf_connector.php CHANGED
@@ -5,12 +5,22 @@ require_once 'AIF/afs_paf_upload_reply.php';
5
  require_once 'AIF/afs_bows_information_cache.php';
6
  require_once 'COMMON/afs_connector_base.php';
7
 
 
 
 
 
 
 
 
 
 
8
  /** @brief AFS PaF connector.
9
  */
10
  class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterface
11
  {
12
  private $paf_name;
13
  private $authentication;
 
14
 
15
  /** @brief Construct new PaF connector.
16
  *
@@ -40,11 +50,11 @@ class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterf
40
  *
41
  * @exception see @a upload_docs method.
42
  */
43
- public function upload_doc(AfsDocument $doc, $comment=null)
44
  {
45
  $mgr = new AfsDocumentManager();
46
  $mgr->add_document($doc);
47
- return $this->upload_docs($mgr, $comment);
48
  }
49
 
50
  /** @brief Upload one or more documents through document manager.
@@ -57,13 +67,14 @@ class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterf
57
  * @exception Exception when error occured while initializing or executing
58
  * request.
59
  */
60
- public function upload_docs(AfsDocumentManager $mgr, $comment=null)
61
  {
 
62
  if (! $mgr->has_document())
63
  throw new InvalidArgumentException('No document to be sent');
64
 
65
- // $version = $this->get_bo_version();
66
- $context = new AfsPafConnectorContext($mgr, $comment);
67
  return new AfsPafUploadReply(json_decode($this->query($context)));
68
  }
69
 
@@ -76,13 +87,14 @@ class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterf
76
  {
77
  $url = parent::get_base_url('service');
78
 
79
- // $params = $this->authentication->format_as_url_param($context->version);
 
80
  if (! is_null($context->comment))
81
  $params['comment'] = $context->comment;
82
 
83
  return sprintf($url . '/%d/instance/%s/paf/%s/upload?%s',
84
  $this->service->id, $this->service->status, $this->paf_name,
85
- $this->format_parameters(array()));
86
  }
87
 
88
  /** @brief Retrieves authentication as HTTP header for new authentication policy (>=v7.7)
@@ -91,7 +103,7 @@ class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterf
91
  */
92
  public function get_http_headers($context=null)
93
  {
94
- return $this->authentication->format_as_header_param();
95
  }
96
 
97
  public function set_post_content(&$request, $context)
@@ -100,11 +112,26 @@ class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterf
100
  $doc_no = 1;
101
  $documents = array();
102
  foreach ($mgr->get_documents() as $doc) {
103
- $documents['file' . $doc_no] = '@' . $doc->get_filename() . ';type='
104
- . $doc->get_mime_type() . ';filename=' . basename($doc->get_filename());
 
 
 
 
 
 
 
 
 
 
 
 
105
  $doc_no++;
106
  }
107
- if ($this->curlConnector->curl_setopt($request, CURLOPT_POSTFIELDS, $documents) === false) {
 
 
 
108
  throw new Exception('Cannot set documents to be sent');
109
  }
110
  }
@@ -140,9 +167,9 @@ class AfsPafConnectorContext
140
  * sent to Back Office.
141
  * @param $comment [in] Optional comment for uploaded files.
142
  */
143
- public function __construct(AfsDocumentManager $doc_mgr, $comment)
144
  {
145
- // $this->version = $version;
146
  $this->doc_mgr = $doc_mgr;
147
  $this->comment = $comment;
148
  }
5
  require_once 'AIF/afs_bows_information_cache.php';
6
  require_once 'COMMON/afs_connector_base.php';
7
 
8
+
9
+ abstract class PaFMode
10
+ {
11
+ const Full = 'FULL';
12
+ const Incremental = 'INCREMENTAL';
13
+ }
14
+
15
+
16
+
17
  /** @brief AFS PaF connector.
18
  */
19
  class AfsPafConnector extends AfsBOWSConnector implements AfsBOWSConnectorInterface
20
  {
21
  private $paf_name;
22
  private $authentication;
23
+ private $paf_mode = PaFMode::Incremental;
24
 
25
  /** @brief Construct new PaF connector.
26
  *
50
  *
51
  * @exception see @a upload_docs method.
52
  */
53
+ public function upload_doc(AfsDocument $doc, $comment=null, $paf_mode=PaFMode::Incremental)
54
  {
55
  $mgr = new AfsDocumentManager();
56
  $mgr->add_document($doc);
57
+ return $this->upload_docs($mgr, $comment, $paf_mode);
58
  }
59
 
60
  /** @brief Upload one or more documents through document manager.
67
  * @exception Exception when error occured while initializing or executing
68
  * request.
69
  */
70
+ public function upload_docs(AfsDocumentManager $mgr, $comment=null, $paf_mode=PaFMode::Incremental)
71
  {
72
+ $this->paf_mode = $paf_mode;
73
  if (! $mgr->has_document())
74
  throw new InvalidArgumentException('No document to be sent');
75
 
76
+ $version = $this->get_bo_version();
77
+ $context = new AfsPafConnectorContext($version, $mgr, $comment, $paf_mode);
78
  return new AfsPafUploadReply(json_decode($this->query($context)));
79
  }
80
 
87
  {
88
  $url = parent::get_base_url('service');
89
 
90
+ $params = $this->authentication->format_as_url_param($context->version);
91
+ $params['afs:type'] = $this->paf_mode;
92
  if (! is_null($context->comment))
93
  $params['comment'] = $context->comment;
94
 
95
  return sprintf($url . '/%d/instance/%s/paf/%s/upload?%s',
96
  $this->service->id, $this->service->status, $this->paf_name,
97
+ $this->format_parameters($params));
98
  }
99
 
100
  /** @brief Retrieves authentication as HTTP header for new authentication policy (>=v7.7)
103
  */
104
  public function get_http_headers($context=null)
105
  {
106
+ return $this->authentication->format_as_header_param($context->version);
107
  }
108
 
109
  public function set_post_content(&$request, $context)
112
  $doc_no = 1;
113
  $documents = array();
114
  foreach ($mgr->get_documents() as $doc) {
115
+
116
+ // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax
117
+ // See: https://wiki.php.net/rfc/curl-file-upload
118
+ if (function_exists('curl_file_create')) {
119
+ $documents['file'.$doc_no] = curl_file_create(
120
+ $doc->get_filename(),
121
+ $doc->get_mime_type(),
122
+ basename($doc->get_filename())
123
+ );
124
+ } else {
125
+ $documents['file'.$doc_no] = '@'.$doc->get_filename().';type='
126
+ .$doc->get_mime_type().';filename='.basename($doc->get_filename());
127
+ }
128
+
129
  $doc_no++;
130
  }
131
+ $opts = array(CURLOPT_POSTFIELDS => $documents);
132
+ $this->post_add_opts($opts);
133
+
134
+ if ($this->curlConnector->curl_setopt_array($request, $opts) === false) {
135
  throw new Exception('Cannot set documents to be sent');
136
  }
137
  }
167
  * sent to Back Office.
168
  * @param $comment [in] Optional comment for uploaded files.
169
  */
170
+ public function __construct($version, AfsDocumentManager $doc_mgr, $comment)
171
  {
172
+ $this->version = $version;
173
  $this->doc_mgr = $doc_mgr;
174
  $this->comment = $comment;
175
  }
lib/antidot/AIF/afs_paf_live_connector.php CHANGED
@@ -42,7 +42,7 @@ class AfsPafLiveConnector extends AfsBOWSConnector implements AfsBOWSConnectorIn
42
  {
43
  $url = parent::get_base_url('service');
44
 
45
- $params = array();
46
  $params['afs:layers'] = $context['layers'];
47
 
48
  return sprintf($url . '/%d/instance/%s/paf/%s/process?%s',
@@ -70,7 +70,10 @@ class AfsPafLiveConnector extends AfsBOWSConnector implements AfsBOWSConnectorIn
70
  $doc = $context['document'];
71
  $document = '@' . $doc->get_filename() . ';type='
72
  . $doc->get_mime_type();
73
- if ($this->curlConnector->curl_setopt($request, CURLOPT_POSTFIELDS, array($document)) === false) {
 
 
 
74
  throw new Exception('Cannot set documents to be sent');
75
  }
76
  }
42
  {
43
  $url = parent::get_base_url('service');
44
 
45
+ $params = $this->authentication->format_as_url_param($context['version']);
46
  $params['afs:layers'] = $context['layers'];
47
 
48
  return sprintf($url . '/%d/instance/%s/paf/%s/process?%s',
70
  $doc = $context['document'];
71
  $document = '@' . $doc->get_filename() . ';type='
72
  . $doc->get_mime_type();
73
+
74
+ $opts = array(CURLOPT_POSTFIELDS => array($document));
75
+ $this->post_add_opts($opts);
76
+ if ($this->curlConnector->curl_setopt_array($request, $opts) === false) {
77
  throw new Exception('Cannot set documents to be sent');
78
  }
79
  }
lib/antidot/AIF/afs_token_authentication.php CHANGED
@@ -24,17 +24,23 @@ class AfsTokenAuthentication implements AfsAuthentication
24
  * version information.
25
  * @return array representing authentication.
26
  */
27
- public function format_as_url_param()
28
  {
29
- return array();
 
 
 
30
  }
31
  /** @brief Formats authentication parameters.
32
  * @param $version [in] Format string representation according to provided
33
  * version information.
34
  * @return array representing authentication.
35
  */
36
- public function format_as_header_param()
37
  {
38
- return array('access-token' => $this->token);
 
 
 
39
  }
40
  }
24
  * version information.
25
  * @return array representing authentication.
26
  */
27
+ public function format_as_url_param($version=null)
28
  {
29
+ if ('7.6' == $version)
30
+ return array('afs:login' => sprintf('login://%s@%s', $this->token, AFS_AUTH_SSO));
31
+ else
32
+ return array();
33
  }
34
  /** @brief Formats authentication parameters.
35
  * @param $version [in] Format string representation according to provided
36
  * version information.
37
  * @return array representing authentication.
38
  */
39
+ public function format_as_header_param($version=null)
40
  {
41
+ if ('7.6' == $version)
42
+ return array();
43
+ else
44
+ return array('access-token' => $this->token);
45
  }
46
  }
lib/antidot/AIF/afs_user_authentication.php CHANGED
@@ -33,25 +33,27 @@ class AfsUserAuthentication implements AfsAuthentication
33
  * version information.
34
  * @return array representing authentication.
35
  */
36
- public function format_as_url_param()
37
  {
38
- return array();
39
- // // if ('7.6' == $version) {
40
- // if (is_null($this->authority))
41
- // throw new InvalidArgumentException('In version ' . $version
42
- // . ' authority parameter is mandatory!');
43
- // return array('afs:login' => sprintf('login://%s:%s@%s', $this->user, $this->password, $this->authority));
44
- // // } else {
45
- // // return array();
46
- // // }
47
  }
48
  /** @brief Formats authentication parameters.
49
  * @param $version [in] Format string representation according to provided
50
  * version information.
51
  * @return array representing authentication.
52
  */
53
- public function format_as_header_param()
54
  {
55
- return array('Authorization' => 'Basic ' . base64_encode($this->user . ':' . $this->password));
 
 
 
56
  }
57
  }
33
  * version information.
34
  * @return array representing authentication.
35
  */
36
+ public function format_as_url_param($version=null)
37
  {
38
+ if ('7.6' == $version) {
39
+ if (is_null($this->authority))
40
+ throw new InvalidArgumentException('In version ' . $version
41
+ . ' authority parameter is mandatory!');
42
+ return array('afs:login' => sprintf('login://%s:%s@%s', $this->user, $this->password, $this->authority));
43
+ } else {
44
+ return array();
45
+ }
 
46
  }
47
  /** @brief Formats authentication parameters.
48
  * @param $version [in] Format string representation according to provided
49
  * version information.
50
  * @return array representing authentication.
51
  */
52
+ public function format_as_header_param($version=null)
53
  {
54
+ if ('7.6' == $version)
55
+ return array();
56
+ else
57
+ return array('Authorization' => 'Basic ' . base64_encode($this->user . ':' . $this->password));
58
  }
59
  }
lib/antidot/COMMON/afs_connector_base.php CHANGED
@@ -74,6 +74,12 @@ abstract class AfsConnectorBase
74
  {
75
  return urlencode($key) . '=' . urlencode($value);
76
  }
 
 
 
 
 
 
77
  }
78
 
79
 
74
  {
75
  return urlencode($key) . '=' . urlencode($value);
76
  }
77
+
78
+ protected function post_add_opts(&$opts) {
79
+ if (strpos(phpversion(), '5.6') !== false) {
80
+ $opts[CURLOPT_SAFE_UPLOAD] = false;
81
+ }
82
+ }
83
  }
84
 
85
 
lib/antidot/afs_lib.php CHANGED
@@ -10,7 +10,7 @@ require_once 'AFS/SEARCH/afs_response_helper.php';
10
  require_once 'AFS/SEARCH/afs_query_coder.php';
11
 
12
  require_once 'AFS/SEARCH/afs_text_visitor.php';
13
-
14
  require_once 'AFS/SEARCH/afs_search.php';
15
  require_once 'AFS/SEARCH/FILTER/afs_filter.php';
16
 
10
  require_once 'AFS/SEARCH/afs_query_coder.php';
11
 
12
  require_once 'AFS/SEARCH/afs_text_visitor.php';
13
+ require_once 'AFS/SEARCH/afs_introspection.php';
14
  require_once 'AFS/SEARCH/afs_search.php';
15
  require_once 'AFS/SEARCH/FILTER/afs_filter.php';
16
 
lib/antidot/afs_version.php CHANGED
@@ -15,7 +15,7 @@ define('AFS_API_VERSION_MINOR', 16);
15
  /** @brief API fix version number.
16
  *
17
  * You should increase this number as soon as a bug is fixed.*/
18
- define('AFS_API_VERSION_FIX', 4);
19
 
20
  /** @brief API full version number. */
21
  define('AFS_API_VERSION', implode('.', array(AFS_API_VERSION_MAJOR, AFS_API_VERSION_MINOR, AFS_API_VERSION_FIX)));
15
  /** @brief API fix version number.
16
  *
17
  * You should increase this number as soon as a bug is fixed.*/
18
+ define('AFS_API_VERSION_FIX', 6);
19
 
20
  /** @brief API full version number. */
21
  define('AFS_API_VERSION', implode('.', array(AFS_API_VERSION_MAJOR, AFS_API_VERSION_MINOR, AFS_API_VERSION_FIX)));
lib/antidot/doc/data/raw_example.php CHANGED
@@ -2,30 +2,355 @@
2
  /** @file raw_example.php
3
  * @example raw_example.php
4
  */
5
- require_once "/home/ct/Dev/PHP_API/afs_lib.php";
6
- $search = new AfsSearch('3suisses-be.afs-antidot.net', 7123);
7
  $query = $search->build_query_from_url_parameters();
8
  $query = $query->set_lang('fr'); // language is set manually in order to get spellcheck results
9
  $query = $query->set_multi_selection_facets('classification');
10
  $query = $query->set_mono_selection_facets('afs:lang', 'has_variants', 'has_image');
11
  $query = $query->set_facet_order('price_eur', 'marketing', 'classification', 'has_variants', 'has_image');
12
  $query = $query->set_facets_values_sort_order(AfsFacetValuesSortMode::ITEMS, AfsSortOrder::DESC);
13
- $query = $query->set_page(2, 'Catalog');
14
  $helper = $search->execute($query);
15
  $generated_url = $search->get_generated_url();
16
  $clustering_is_active = $query->has_cluster();
 
 
17
 
18
- $reply_set = $helper->get_replyset('Catalog');
19
- $pager = $reply_set->get_pager();
20
- $pages = $pager->get_all_pages();
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  if ($helper->has_replyset()) {
23
- $replyset = $helper->get_replyset('Catalog'); // Retrieves only first replyset
24
  if ($replyset->has_facet()) {
25
- foreach ($replyset->get_facets() as $facet) {
26
- foreach ($facet->get_labels() as $lang => $label) {
27
- echo $facet->id + " " + $lang + " " + $label + "\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
- }
30
- }
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /** @file raw_example.php
3
  * @example raw_example.php
4
  */
5
+ require_once "PHP_API/afs_lib.php";
6
+ $search = new AfsSearch('eval.partners.antidot.net', 48000);
7
  $query = $search->build_query_from_url_parameters();
8
  $query = $query->set_lang('fr'); // language is set manually in order to get spellcheck results
9
  $query = $query->set_multi_selection_facets('classification');
10
  $query = $query->set_mono_selection_facets('afs:lang', 'has_variants', 'has_image');
11
  $query = $query->set_facet_order('price_eur', 'marketing', 'classification', 'has_variants', 'has_image');
12
  $query = $query->set_facets_values_sort_order(AfsFacetValuesSortMode::ITEMS, AfsSortOrder::DESC);
 
13
  $helper = $search->execute($query);
14
  $generated_url = $search->get_generated_url();
15
  $clustering_is_active = $query->has_cluster();
16
+ $nsmap = array('ns' => 'http://ref.antidot.net/store/afs#');
17
+ ?>
18
 
 
 
 
19
 
20
+ <html>
21
+ <head>
22
+ <title>Antidot PHP API - Raw example</title>
23
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
24
+ <meta charset="UTF-8">
25
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
26
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css">
27
+ <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
28
+ <!--[if lt IE 9]>
29
+ <script src="../../assets/js/html5shiv.js"></script>
30
+ <script src="../../assets/js/respond.min.js"></script>
31
+ <![endif]-->
32
+ </head>
33
+ <body>
34
+ <div>
35
+ <a href="<?php echo $generated_url; ?>" target="_blank"><?php echo $generated_url; ?></a>
36
+ </div>
37
+ <div class="page-header">
38
+ <h1>Raw example <small>based on the Antidot PHP API</small></h1>
39
+ </div>
40
+ <!-- ####################### Search box ########################### -->
41
+ <div class="row">
42
+ <div class="col-md-5"></div>
43
+ <div class="input-group col-md-2">
44
+ <form method="get" action="" role="form" class="input-group">
45
+ <span class="input-group-addon">Search</span>
46
+ <input type="search" name="query" class="form-control" placeholder="Keywords" />
47
+ <span class="input-group-btn">
48
+ <button class="btn btn-primary" type="submit"><span class="glyphicon glyphicon-search"></span></button>
49
+ </span>
50
+ </form>
51
+ </div>
52
+ </div>
53
+
54
+ <!-- ####################### Current filter parameters ########################### -->
55
+ <?php
56
+ $params = $query->get_parameters(false);
57
+ if (array_key_exists('filter', $params) && is_array($params['filter'])) {
58
+ echo '
59
+ <div class="row">
60
+ <div class="col-md-8">';
61
+ foreach ($params['filter'] as $filter => $values) {
62
+ echo '
63
+ <ul>Filter: <strong>' . $filter . '</strong>';
64
+ foreach ($values as $value) {
65
+ echo '
66
+ <li>Value: ' . $value . '</li>';
67
+ }
68
+ echo '
69
+ </ul>';
70
+ }
71
+ echo '
72
+ </div>
73
+ </div>';
74
+ } ?>
75
+
76
+ <!-- ####################### Promote ########################### -->
77
+ <?php
78
+ if ($helper->has_promote()) {
79
+ echo '
80
+ <div class="row">
81
+ <div class="col-md-3"></div>';
82
+ foreach ($helper->get_promotes() as $promote) {
83
+ echo '
84
+ <div class="col-md-2">
85
+ <h4><span class="label label-danger">' . $promote->get_title() . '</span></h4>
86
+ <p>' . $promote->get_abstract() . '</p>
87
+ <ul>Some custom data:
88
+ <li>tag: ' . $promote->get_custom_data('tag') . '</li>
89
+ <li>identifier: ' . $promote->get_custom_data('id') . '</li>
90
+ </ul>
91
+ <ul>Or loop on custom data:';
92
+ foreach ($promote->get_custom_data() as $key => $value) {
93
+ echo '
94
+ <li><strong>' . $key . '</strong>: ' . $value . '</li>';
95
+ }
96
+ echo '
97
+ </ul>
98
+ </div>';
99
+ }
100
+ echo '
101
+ </div>
102
+ </div>';
103
+ } ?>
104
+
105
+ <?php
106
+ // checks whether there is at least one replyset
107
  if ($helper->has_replyset()) {
108
+ $replyset = $helper->get_replyset(); // Retrieves only first replyset
109
  if ($replyset->has_facet()) {
110
+ /* if (in_array('facets', $replyset)) */
111
+ ?>
112
+ <div class="row">
113
+ <div class="col-md-3">
114
+ <h2>Filters</h2>
115
+ <!-- ####################### Filters ########################### -->
116
+ <?php
117
+ foreach ($replyset->get_facets() as $facet) {
118
+ /* foreach ($replyset->facets->facet as $facet) */
119
+ ?>
120
+ <div class="panel panel-default">
121
+ <div class="panel-heading"><?php echo $facet->get_label() ?></div> <!-- $facet->labels[0]->label -->
122
+ <div class="panel-body">
123
+ <div class="list-group">
124
+ <div class="list-group">
125
+ <?php
126
+ foreach ($facet->get_elements() as $value) {
127
+ /* $item = null;
128
+ * if ($facet->{'afs:t'} == 'FacetTree') {
129
+ * $item = 'node';
130
+ * } elif ($facet->{'afs:t'} == 'FacetInterval') {
131
+ * $item = 'interval;
132
+ * } else {
133
+ * throw new Exception('Unknown facet layout: ' . $facet->{'afs:t'});
134
+ * }
135
+ * foreach ($facet->$item as $value) */
136
+ ?>
137
+ <a class="list-group-item <?php echo ($value->active ? 'active' : '') ?>" href="<?php echo $value->link ?>"><?php echo $value->label ?><span class="badge"><?php echo $value->count ?></span></a>
138
+ <!-- $active = $query->has_filter($facet->id, $value->key);
139
+ ...
140
+ -->
141
+ <?php } ?>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ <?php } ?>
147
+ </div>
148
+ <?php } ?>
149
+
150
+ <div class="col-md-9">
151
+ <div class="row page-header">
152
+ <div class="col-md-1"></div>
153
+ <div class="col-md-2">
154
+ <h2>Results <span class="label label-success"><?php echo $replyset->get_meta()->get_total_replies() ?></span></h2>
155
+ <h4><span class="label label-info">Duration <?php echo $replyset->get_meta()->get_duration() ?> ms</span></h4>
156
+ </div>
157
+ <div class="col-md-1"></div>
158
+ <div class="col-md-2">
159
+ <!-- ####################### Relevance ########################### -->
160
+ <?php
161
+ if ($query->has_sort(AfsSortBuiltins::RELEVANCE)) {
162
+ if ($query->get_sort_order(AfsSortBuiltins::RELEVANCE) == AfsSortOrder::ASC) {
163
+ $relevance_icon = 'glyphicon-arrow-up';
164
+ $relevance_query = $query->add_sort(AfsSortBuiltins::RELEVANCE, AfsSortOrder::DESC);
165
+ } else {
166
+ $relevance_icon = 'glyphicon-arrow-down';
167
+ $relevance_query = $query->add_sort(AfsSortBuiltins::RELEVANCE, AfsSortOrder::ASC);
168
+ }
169
+ } else {
170
+ $relevance_query = $query->add_sort(AfsSortBuiltins::RELEVANCE, AfsSortOrder::ASC);
171
+ $relevance_icon = 'glyphicon-arrow-down';
172
+ }
173
+ $relevance_link = $search->get_helpers_configuration()->get_query_coder()->generate_link($relevance_query);
174
+ ?>
175
+ <a href="<?php echo $relevance_link ?>" class="btn btn-default btn-lg active" role="button"><span class="glyphicon <?php echo $relevance_icon; ?>"></span> Relevance</a>
176
+ </div>
177
+ <div class="col-md-2">
178
+ <?php
179
+ $query_coder = $search->get_helpers_configuration()->get_query_coder();
180
+ if ($clustering_is_active) {
181
+ $cluster_query = $query->unset_cluster();
182
+ $cluster_link = $query_coder->generate_link($query->unset_cluster());
183
+ $cluster_label = 'Remove clusters';
184
+ } else {
185
+ $cluster_link = $query_coder->generate_link($query->set_cluster('marketing', 1)->set_overspill());
186
+ $cluster_label = 'Create cluster on "marketing" filter';
187
+ } ?>
188
+ <a href="<?php echo $cluster_link ?>" class="btn btn-default btn-lg active" role="button"><?php echo $cluster_label ?></a>
189
+ </div>
190
+ </div>
191
+
192
+ <!-- ####################### Clusters ########################### -->
193
+ <?php
194
+ if ($clustering_is_active) {
195
+ foreach ($replyset->get_clusters() as $cluster) {
196
+ echo '
197
+ <div class="row">
198
+ <div class="col-md-1"></div>
199
+ <div class="col-md-5">
200
+ <h3>
201
+ <span class="label label-success">
202
+ <a href="' . $query_coder->generate_link($cluster->get_query()) . '">' . $cluster->get_label() . '<a>
203
+ </span>
204
+ </h3>
205
+ </div>
206
+ </div>
207
+ <ul class="list-unstyled">';
208
+ foreach ($cluster->get_replies() as $reply) {
209
+ echo '
210
+ <li>
211
+ <h3>' . $reply->get_title() . '</h3>
212
+ <p><a href="' . $reply->get_uri() . '">' . $reply->get_uri() . '</a></p>
213
+ <p>' . $reply->get_abstract() . '</p>
214
+ <p>Some client data:
215
+ <ul>
216
+ <li>Name: ' . $reply->get_clientdata()->get_value('/ns:product/ns:name', $nsmap) . '</li>
217
+ <li>Availability: ' . $reply->get_clientdata()->get_value('/ns:product/ns:is_available', $nsmap) . '</li>
218
+ <li>Prices:
219
+ <ul>';
220
+ // Here multiple values are retrieved from client data
221
+ foreach ($reply->get_clientdata()->get_values('/ns:product/ns:prices/ns:price', $nsmap) as $value)
222
+ echo '<li>' . $value . '</li>';
223
+ echo '
224
+ </ul>
225
+ </li>
226
+ </ul>
227
+ </p>
228
+ </li>';
229
+ }
230
+ echo '
231
+ </ul>';
232
  }
233
+ echo '
234
+ <div class="row">
235
+ <div class="col-md-1"></div>
236
+ <div class="col-md-5">
237
+ <h3><span class="label label-success">Other results</span></h3>
238
+ </div>
239
+ </div>';
240
+ } ?>
241
+
242
+ <!-- ####################### Replies ########################### -->
243
+ <?php
244
+ echo '
245
+ <ul class="list-unstyled">';
246
+ foreach ($replyset->get_replies() as $reply) {
247
+ ?>
248
+ <li>
249
+ <h3><?php echo $reply->get_title() ?></h3>
250
+ <p><a href="<?php echo $reply->get_uri() ?>"><?php echo $reply->get_uri() ?></a></p>
251
+ <p><?php echo $reply->get_abstract() ?></p>
252
+ <p>Some client data:
253
+ <ul>
254
+ <li>Name: <?php echo $reply->get_clientdata()->get_value('/ns:product/ns:name', $nsmap) ?></li>
255
+ <li>Availability: <?php echo $reply->get_clientdata()->get_value('/ns:product/ns:is_available', $nsmap) ?></li>
256
+ <li>Prices:
257
+ <ul>
258
+ <?php
259
+ // Here multiple values are retrieved from client data
260
+ foreach ($reply->get_clientdata()->get_values('/ns:product/ns:prices/ns:price', $nsmap) as $value) {
261
+ echo '<li>' . $value . '</li>';
262
+ } ?>
263
+ </ul>
264
+ </li>
265
+ </ul>
266
+ </p>
267
+ </li>
268
+ <?php } ?>
269
+ </ul>
270
+ </div>
271
+ </div>
272
+
273
+ <!-- ####################### Pager ########################### -->
274
+ <?php
275
+ if ($replyset->has_pager()) {
276
+ $pager = $replyset->get_pager();
277
+ ?>
278
+ <div class="row">
279
+ <div class="row">
280
+ <div class="col-md-5"></div>
281
+ <div class="input-group col-md-3">
282
+ <ul class="pagination">
283
+ <?php
284
+ foreach ($pager->get_all_pages() as $page => $url) {
285
+ if ($page == $pager->get_current_no()) {
286
+ $active = 'active';
287
+ } else {
288
+ $active = '';
289
+ }
290
+ ?>
291
+ <li class="<?php echo $active ?>"><a href="<?php echo $url ?>"><?php echo $page ?></a></li>
292
+ <?php } ?>
293
+
294
+ </ul>
295
+ </div>
296
+ </div>
297
+ <?php } ?>
298
+
299
+ </div>
300
+
301
+ <!-- ####################### Spellcheck ########################### -->
302
+ <?php } elseif ($helper->has_spellcheck()) { // if no replyset, let's check spellcheck ?>
303
+ <div class="row">
304
+ <div class="col-md-9">
305
+ <div class="row">
306
+ <div class="col-md-1"></div>
307
+ <div class="col-md-4">
308
+ <h2>Typo ?</h2>
309
+ </div>
310
+ </div>
311
+ <?php
312
+ foreach ($helper->get_spellchecks() as $feed => $suggestions) {
313
+ ?>
314
+ <div class="row">
315
+ <div class="col-md-6">
316
+ <h4><?php echo $feed ?></h4>
317
+ <ul class="list-unstyled">
318
+ <?php
319
+ foreach ($suggestions as $suggest) {
320
+ ?>
321
+ <li>
322
+ <h3>Did you mean...</h3>
323
+ <p><a href="<?php echo $suggest->get_link() ?>"><?php echo $suggest->get_formatted_text() ?></a></p>
324
+ </li>
325
+ <?php } ?>
326
+ </ul>
327
+ </div>
328
+ </div>
329
+ <?php } ?>
330
+ </div>
331
+ </div>
332
+ <!-- ####################### Error ########################### -->
333
+ <?php } elseif ($helper->in_error()) { // no spellcheck... is there any error? ?>
334
+ <div class="row">
335
+ <div class="col-md-9">
336
+ <div class="row">
337
+ <div class="col-md-1"></div>
338
+ <div class="col-md-4">
339
+ <h2>Really bad error occured</h2>
340
+ </div>
341
+ </div>
342
+ <div class="row">
343
+ <div class="col-md-10">
344
+ <h2><?php echo $helper->get_error_msg() ?></h2>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ </div>
349
+ <?php } ?>
350
+
351
+ <!-- jQuery (necessary for Bootstrap\'s JavaScript plugins) -->
352
+ <script src="//code.jquery.com/jquery.js"></script>
353
+ <!-- Include all compiled plugins (below), or include individual files as needed -->
354
+ <script src="js/bootstrap.min.js"></script>
355
+ </body>
356
+ </html>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Antidot_Antidot</name>
4
- <version>1.2.2</version>
5
  <stability>stable</stability>
6
  <license>LGPL</license>
7
  <channel>community</channel>
@@ -17,9 +17,9 @@ Prevent to export empty categories node&amp;#xD;
17
  Add cdata for variant name&amp;#xD;
18
  Add variant details for grouped products</notes>
19
  <authors><author><name>Antidot</name><user>antidot</user><email>contact@antidot.net</email></author><author><name>Antidot</name><user>antidot</user><email>contact@antidot.net</email></author></authors>
20
- <date>2015-11-23</date>
21
- <time>16:47:02</time>
22
- <contents><target name="mage"><dir name="shell"><file name="antidotExport.php" hash="a4e184cdf1add5d42484e6997ea6f59c"/><file name="antidotExportCategory.php" hash="10de34988223fc8ca26e6f30c4070733"/><file name="antidotExportInc.php" hash="18f1b60b93245e2daf423c614dcd7efa"/><file name="antidotExportProduct.php" hash="9ddd7f0ba8e54b24665a32d26e5231b4"/></dir><dir name="i18n"><file name="de_DE" hash="f166a5ff29213a44fca77277b053897e"/><file name="en_US" hash="63c821044fda6f7c2a26dc84670b25bd"/><file name="es_ES" hash="f9319039054998955d63d51ed0930f3f"/><file name="fr_FR" hash="632367797f2fa9fef06e0b0c69377e01"/><file name="i18n.php" hash="0780b44563432f6e70de78f7a9d60f54"/></dir></target><target name="magecommunity"><dir name="MDN"><dir name="Antidot"><dir name="Block"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="2158b991ccdf394c8cd47cab00829e4d"/><file name="Boolean.php" hash="d17b08e1ec9047cf4050442ababd0808"/><file name="Category.php" hash="78cb53233ad74a2b5496d6f7857d8837"/><file name="Decimal.php" hash="75b31617bca2a8f20ee7fe113e3534f2"/><file name="Price.php" hash="244068a33e8ba64423c126baf883d2b5"/></dir><file name="View.php" hash="bbdd9bb31663415001ab3751c6737cde"/></dir></dir><dir name="Catalogsearch"><file name="Banner.php" hash="cfc866a6c1cfb2ee9cb690bed84781fe"/><file name="Category.php" hash="e9605415ba85929115a443b1b4f00ab0"/><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="2b274bf7d8f8dbd915bdf73f65e694fc"/></dir></dir><file name="Layer.php" hash="3ba32c0f20c4b7447229843f45b06d3f"/><file name="Result.php" hash="887530a08ce375d1722fc327eebc64fc"/></dir><dir name="Html"><file name="Select.php" hash="fc7fb19df1dd378d4e9e0860d2d47d07"/></dir><dir name="System"><dir name="Config"><dir name="Button"><file name="AfsStore.php" hash="4f00570d46d27d1cf89785e8db42a332"/><file name="Forward.php" hash="3917a1882c3d55837138782e60791167"/><file name="PushArticles.php" hash="c7d0ce7326c7f706c0432a2ffb57fee2"/><file name="PushCategories.php" hash="2caeb40ae6a5abe77be2ca666c01ed81"/><file name="PushProducts.php" hash="3eb6538ab55257b0a83021ff1ecbf632"/><file name="RestoreTemplate.php" hash="ffbbb0a73ff1ede611262a6a4da1a188"/><file name="ShowXml.php" hash="417ba0c9c62d8070b63f90397887dcc0"/></dir><dir name="Fieldset"><file name="Notice.php" hash="47601ca6e7732a9d22ecd25f3f1cd7bb"/></dir><dir name="Form"><dir name="Field"><dir name="Array"><file name="Additional.php" hash="d62316e3631c1c2b6a0119134c8002a8"/><file name="AdditionalFeed.php" hash="dcfb6d37d765a10e4a07465e70133dda"/><file name="ArticleAdditional.php" hash="38c62d610f585c460151841f7350348b"/><file name="ArticleIdentifier.php" hash="ec9479fd1ca087a1fe924795cc9ff5f6"/><file name="DefaultSort.php" hash="4989d99a73f57bed1fb994060cc38a72"/><file name="Facet.php" hash="7217f2296afaf11f514e4212a7a82cb9"/><file name="Identifier.php" hash="a9fa99227182bd72e59c9a315d580247"/><file name="ProductAdditionalFacet.php" hash="8d46e427d9efbac7e6ba04fdc88d4728"/><file name="ProductAdditionalField.php" hash="9c9f9c9c1c940963e1a24c039a392cc4"/><file name="ProductIdentifier.php" hash="d30809119cb35018697533075f7ee485"/><file name="Sort.php" hash="f986fbb048bf3f6aec813cdc1c70ec15"/></dir><file name="CategoryAttribute.php" hash="c119ca65f23950e7abb1f0d60e8b4755"/><file name="ProductAttribute.php" hash="6a61b98a9f6ac883a5e162e3edab300d"/></dir></dir><dir name="Html"><file name="Export.php" hash="f36beeca11c51e1a2e9678955d8cf1b8"/><file name="ShowXml.php" hash="7b70f39937aa9d24336edde6bdbdf97c"/><file name="Version.php" hash="34c624c382f3061cf322cfed52c416ac"/></dir></dir></dir></dir><dir name="Helper"><file name="Antidot.php" hash="7bbd2866c65a847e1415badb1ef0d015"/><dir name="CatalogSearch"><file name="Data.php" hash="81cc908609e68035d5714488f913e688"/></dir><file name="Compress.php" hash="12fa64a9c9f519a3f249954ab780e01c"/><file name="Data.php" hash="db586edb739ad7f7b0281a887e252a61"/><dir name="Enterprise"><dir name="Search"><file name="Data.php" hash="8bfe0146c64511f86cb796638b65112f"/></dir></dir><file name="LogExport.php" hash="6d6b262327bf1d920fc2b5b112edfef6"/><dir name="ManaFilters"><file name="Data.php" hash="f4f4e92c5e33c6142904cf27a75f6d23"/></dir><file name="Url.php" hash="1d2ee02a8e135bfc4b866f5219f62acd"/><file name="XmlWriter.php" hash="66cf65d950caddf895c823c5575a1912"/></dir><dir name="Model"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="3cd18414abccea60c5497931bc95e21e"/><file name="Boolean.php" hash="dd0414e0d96833bec6e32aac321c2763"/><file name="Category.php" hash="4dea470cb36708e0ae4b95bd0a24a85f"/><file name="Decimal.php" hash="b9b1e2cff1d0332fab77d101dca4c3d2"/><file name="Item.php" hash="c89bbca267af18a0447e0daf3e7cc8eb"/><file name="Price.php" hash="7529be0313a19896993f92eeb9dfc8a9"/></dir></dir><file name="Layer.php" hash="706000dd944a45f30826eccba2942862"/></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="a83d6761a949c8196cba33948a48c8bf"/></dir></dir><file name="Layer.php" hash="b5aa8e2cc24f1b1362749049f1cdec32"/><dir name="Resource"><file name="Attribute.php" hash="80d2a34d746f307109b6bf910b0f2958"/></dir></dir><dir name="Export"><file name="Abstract.php" hash="76d9e775c5cbdcb45c02cd2af1779b60"/><file name="Article.php" hash="3fd18081b1013360d2f151931e16a4eb"/><file name="Category.php" hash="e4c1f09bd75f6cda693ab6aab084e5b4"/><file name="Context.php" hash="d63d33f2dfa968e90ed11a6f76f41a34"/><dir name="Model"><dir name="Product"><file name="Link.php" hash="6f764a25fcde9b315d10f46189a428d1"/><dir name="Type"><file name="Configurable.php" hash="4bb627c1f5d1fbadd37a6b54e681406f"/><file name="Grouped.php" hash="8770d1ddf8228a2db136325da494de51"/></dir></dir><file name="Product.php" hash="a56c7e50bbd95c57570e38d911976962"/></dir><file name="Product.php" hash="008cb58f7dab43f01ec5a2ef65dd7d58"/></dir><file name="Observer.php" hash="dbe10b9c6996878f06db435b6321d8f2"/><dir name="Resource"><file name="Advanced.php" hash="989026021706cbcfb269451187002c19"/><dir name="Catalog"><dir name="Product"><file name="Collection.php" hash="a761f935c0e3c4da1fec329c2c80f5b1"/></dir></dir><dir name="Engine"><file name="Abstract.php" hash="a341a04e6c7fe367a7da0e91ce205034"/><file name="Antidot.php" hash="eda85b16354da0f3d87cb4186c5bad43"/></dir><dir name="Export"><dir name="Product"><file name="Collection.php" hash="dfa31e927797fb1887aec5fcec2747d1"/><dir name="Link"><dir name="Product"><file name="Collection.php" hash="a50b67c39520422770b4b16d4ab51ba0"/></dir></dir><dir name="Type"><dir name="Configurable"><dir name="Product"><file name="Collection.php" hash="79d359ae0e176d3499225452d983c210"/></dir></dir></dir></dir><file name="Product.php" hash="f3e87d35ea55e911948f3909274e29b3"/></dir></dir><dir name="Search"><file name="Abstract.php" hash="fd71154b987b16f8d13bc3e10a3faeac"/><file name="Search.php" hash="823655bc366531ba97bd707adc723aa9"/><file name="Suggest.php" hash="6caac0bb7683b1d330049ed0d606f36f"/></dir><dir name="System"><dir name="Config"><file name="ArticleAttribute.php" hash="f3a9596d45f275299f16530a56845c96"/><dir name="Backend"><file name="Engine.php" hash="68c93651655a77c74fd79d1de6d19be3"/></dir><file name="CategoryAttribute.php" hash="9f19b99e16c99b0e8052b1e31d2a6317"/><file name="Dir.php" hash="c80d83280ebc5ab91fd45d246ec47ba3"/><file name="DisableEnable.php" hash="6d08f33a1580b2fd1d58d87248104166"/><file name="ExportType.php" hash="940a74862d74f7873258b35c33b7b87a"/><file name="Facet.php" hash="8b771072a32f32e81a087581ace7fd72"/><file name="Number.php" hash="7985ea6c495a35173d68291389319f93"/><file name="Options.php" hash="06930da994dec4bb05ebc3f3e8c8abb8"/><file name="ProductAttribute.php" hash="c74ad00177c3a12b03c8684928d12c40"/><file name="PromoteRedirect.php" hash="c167973ea7a0ef09f0e5fa0fd0a08926"/><file name="Sort.php" hash="e0d2c1e72f56894b75baebcb6c4b8609"/><dir name="Source"><file name="Acpengine.php" hash="fdf8d5030d8823c325d707d8bb5b7208"/><file name="Engine.php" hash="0491592c4612779ffc7890456f6b946d"/><file name="Redirect.php" hash="ea6cb67ab98a0303d5c30c49099f5708"/></dir><dir name="Suggest"><file name="Type.php" hash="cef491efdb9fcef86d0df75030206a78"/></dir><file name="WSStatus.php" hash="ff4954e15d75dd3139290d96773d0abf"/></dir></dir><dir name="Transport"><file name="Abstract.php" hash="3272c44b08523a9836aa15c835e2ed25"/><file name="File.php" hash="4b0b2ef7940fc8cd60e96cc74a2c84f0"/><file name="Ftp.php" hash="73056ec4decef2fe9c459641e0a0ae7e"/><file name="Http.php" hash="61f334dead64bcc6b9882e1f72d64eb8"/><file name="Interface.php" hash="40cfaad8efccad7dc3ff7a920dee871a"/></dir><file name="Transport.php" hash="dfbe060f5575304736ba805f597f7393"/></dir><dir name="Test"><dir name="Block"><dir name="Catalogsearch"><file name="Layer.php" hash="49725570e661d72db50daab46e0e18af"/><dir name="Result"><dir name="fixtures"><file name="testSetListOrders.yaml" hash="3077a3199216b898963f1bcf9f4d7396"/></dir></dir><file name="Result.php" hash="a780e377612d4481c4f0c96311005620"/></dir><dir name="System"><dir name="Config"><dir name="Button"><file name="AfsStore.php" hash="dcbfefb440b8512b1298b624a3582076"/></dir></dir></dir></dir><dir name="Helper"><dir name="CatalogSearch"><file name="Data.php" hash="a40c1e58b5000432763aa07dd49d4b5d"/></dir><file name="Data.php" hash="9c21bd8bfa43dab48d95a886812587e6"/></dir><dir name="Model"><dir name="Export"><dir name="Abstract"><dir name="fixtures"><file name="testGarbageCollection.yaml" hash="de6c8672be0c24a102ebfed004f2361b"/></dir></dir><file name="Abstract.php" hash="a0768006a76b1e3004f8839988dc2d4d"/><file name="Article.php" hash="157dc12608521f1ad255142f0143ef18"/><dir name="Category"><dir name="fixtures"><file name="testEmptyFile.yaml" hash="9573e620466cfe8260f8a87e274c8261"/></dir></dir><file name="Category.php" hash="42164121852311eb200af116e0a20d58"/><dir name="Context"><dir name="fixtures"><file name="testContext.yaml" hash="d912a7bd71a209f591043a3644de3ceb"/></dir></dir><file name="Context.php" hash="c5af056a47ee7acdacbe7072a825ce90"/><dir name="Model"><dir name="Product"><dir name="fixtures"><file name="testGetIsInStock.yaml" hash="b9a95c8ad5b3999221d027192d79fe55"/></dir></dir><file name="Product.php" hash="a3b6765c5c663caa1a50dc511c78db5e"/></dir><dir name="Product"><dir name="fixtures"><file name="testInactiveParentCategory.yaml" hash="3ef9bcefae6399ccdc23e026746a1743"/><file name="testWriteImageUrl.yaml" hash="a4e08b8f1565eba67a16553cf57e1004"/><file name="testWritePricesFixedtax.yaml" hash="698da07581100c1eff5a1a85e2be6d3b"/><file name="testWriteProductNoVariant.yaml" hash="626a27b35977e5a52b02f85011c5e216"/><file name="testWriteProductNoVariantInStock.yaml" hash="9aa7736a422276842350ac73c6f4ba55"/><file name="testWriteProductUrl.yaml" hash="a4e08b8f1565eba67a16553cf57e1004"/><file name="testWriteProperties.yaml" hash="d434749b80908bbceefd5781e2d0e998"/><file name="testWriteXml.yaml" hash="8a702dfbd07f2d773d991679a2c219a0"/></dir><dir name="providers"><file name="testWriteImageUrl.yaml" hash="666c33585c611bcc0b0ebe6e87dce1fc"/><file name="testWriteProductUrl.yaml" hash="18f511460efea04586fc888f5c85b3ea"/></dir></dir><file name="Product.php" hash="032f8ca084fb1ec71aeac8ca0ffb2d6f"/></dir><dir name="Observer"><dir name="fixtures"><file name="testGetDefaultContext.yaml" hash="d77af9c502bf7e7c90fdb3aad609c087"/></dir><dir name="providers"><file name="testGetOwnerForFilename.yaml" hash="c5c07e73f536f9ffacc0c3ff6b5a13d1"/></dir></dir><file name="Observer.php" hash="c69240a8fe5a637c3aa447c94550e268"/><dir name="Resource"><dir name="Catalog"><dir name="Product"><file name="Collection.php" hash="2ad006d8e096ade9043a9a370177782d"/></dir></dir><dir name="Engine"><dir name="Antidot"><dir name="fixtures"><file name="testFormatResult.yaml" hash="f4aa0a050156b55c5733c5d30f4255ed"/></dir></dir><file name="Antidot.php" hash="5dff5053128f275557772330716da04c"/></dir></dir><dir name="Search"><dir name="Suggest"><dir name="fixtures"><file name="testSuggest.yaml" hash="e845f0311d93608e3221fb0678f429cc"/></dir></dir><file name="Suggest.php" hash="d97172c8ec094146f953a9704f8e1936"/></dir><dir name="System"><dir name="Config"><dir name="Facet"><dir name="fixtures"><file name="testToOptionArray.yaml" hash="b76143bd57f68be024a31d905da9cabe"/></dir></dir><file name="Facet.php" hash="0115c27c5881ff9d35f18a251686dc68"/><dir name="Sort"><dir name="expectations"><file name="testToOptionArray.yaml" hash="13fc5b4c17962fb267f443d03a2219b2"/></dir><dir name="fixtures"><file name="testToOptionArray1.yaml" hash="3160d541123737644dfea5c70db35f41"/><file name="testToOptionArray2.yaml" hash="74fd97f93892920908ab7eab0124eeb6"/><file name="testToOptionArray3.yaml" hash="fe9c8a5da75f3c0d66304a39c473a3bb"/></dir></dir><file name="Sort.php" hash="3435402ae9aa30d18c8265433d643d21"/><dir name="Source"><file name="Acpengine.php" hash="482bcb056949d9d52eda623ee9bdca0d"/><file name="Engine.php" hash="dcbee0d360773c28faa8a894cbed22ad"/><file name="Redirect.php" hash="2dbbaecbb8453ba1025e2e9b5a5957c3"/></dir></dir></dir><dir name="Transport"><file name="Http.php" hash="e517ff2ab7ddf5ba61bfe6ffb0227ad9"/><dir name="fixtures"><file name="testSend.yaml" hash="af0bc3c97a109e63aaf018f57ddad6cd"/></dir></dir></dir><file name="PHPUnitUtil.php" hash="2a128a7c19f4c37cb9dd7fc60e679693"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Antidot"><file name="PushController.php" hash="6dc15f43dbaef76efa4e0462cf6cf3aa"/></dir></dir><dir name="Front"><file name="SearchController.php" hash="d220bd4628830ea238775ed9788e0674"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="7190cd220b09b657ba9b767614aeebb2"/><file name="config.xml" hash="045a13091daac0b33bee10d17f0be393"/><file name="system.xml" hash="38a2d1d570abe54b646b6f598fc952fc"/></dir><dir name="sql"><dir name="Antidot_setup"><file name="mysql4-install-0.9.php" hash="62672bc47ea92dbd46966fb76e4251e0"/><file name="mysql4-upgrade-1.2.1-1.2.2.php" hash="fe774495c51921c2affeb8a472c049ff"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="antidot.xml" hash="5124433ec044f619ae99afb074ed6efc"/></dir><dir name="template"><dir name="antidot"><dir name="catalog"><dir name="layer"><file name="category.phtml" hash="125de3812ded3b341ab6f1a1f2f92777"/><file name="filter.phtml" hash="2304baebff9b798e0ebd977fbc891346"/></dir></dir><dir name="catalogsearch"><dir name="result"><file name="banner.phtml" hash="4dc4b69ef2dd51aad9689dbfb2bf8f48"/><file name="category.phtml" hash="7413580b825508f2cfc08566d62369ae"/></dir><file name="result.phtml" hash="de6eecf5bd733d3440c843133afea8b6"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="MDN_Antidot.xml" hash="988c6b7e9da4e50f1727956833ab1696"/></dir></target><target name="magelocale"><dir name="de_AT"><file name="MDN_Antidot.csv" hash="bd59e534fb9a44fdb706867d43479b85"/></dir><dir name="de_CH"><file name="MDN_Antidot.csv" hash="bd59e534fb9a44fdb706867d43479b85"/></dir><dir name="de_DE"><file name="MDN_Antidot.csv" hash="bd59e534fb9a44fdb706867d43479b85"/></dir><dir name="es_AR"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_CL"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_CO"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_CR"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_ES"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_MX"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_PA"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_PE"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="es_VE"><file name="MDN_Antidot.csv" hash="58b985f371a2e1a5af049365267cc318"/></dir><dir name="fr_CA"><file name="MDN_Antidot.csv" hash="5d362c657f256fd1b6a0fb4993f48cd0"/></dir><dir name="fr_FR"><file name="MDN_Antidot.csv" hash="fff8f36a7da80f27f3075ba84b6cf748"/></dir></target><target name="mageweb"><dir name="js"><dir name="mdn"><dir name="antidot"><file name="CollapsibleLists.js" hash="86792ecde0c2759ba85e0d863dd147ce"/></dir></dir></dir></target><target name="magelib"><dir name="antidot"><dir name="AFS"><dir name="ACP"><file name="Makefile" hash="0f76232bfabc275a3dac973666fb5dae"/><dir name="TEST"><file name="Makefile" hash="ce56cc786e1df50148e1d3222c05e5f8"/><file name="acpConnectorTest.php" hash="25a8194f3dc8895640df4f4bba895d8e"/><file name="acpQueryTest.php" hash="74ad65a4af639a409ee72a75a2a043d6"/><file name="acpReplysetHelperTest.php" hash="4f0a0d471a06e139cd11c715b67ebe81"/><file name="acpResponseHelperTest.php" hash="6d30f99108db0d9956aef9ba5e1d88df"/><file name="acpTest.php" hash="d6119d150543e7943ba4e9907901ae5d"/></dir><file name="afs_acp.php" hash="78dbfbc92f68469c92898f1da4263e68"/><file name="afs_acp_configuration.php" hash="2d644cc6c5bf2cdaeca5780576c4bf0e"/><file name="afs_acp_connector.php" hash="b72439562b02024e0b9629c18394985d"/><file name="afs_acp_exception.php" hash="f610d2cc37a15d4b981d7b43939414ad"/><file name="afs_acp_query.php" hash="ced0629355f5d4fc1c219d1adb03297d"/><file name="afs_acp_query_manager.php" hash="b3348972a850c904fc664b4e27671439"/><file name="afs_acp_reply_helper.php" hash="b0259f24f10d2e92ed6e3b8cdaaacc44"/><file name="afs_acp_replyset_helper.php" hash="07e7fdb88a42a399c96261c47ffb0231"/><file name="afs_acp_response_helper.php" hash="33a66106fd3a94194514a0d8d39af1cd"/></dir><file name="Makefile" hash="7bb31592939024f74745d6b6cb7fec0b"/><dir name="SEARCH"><dir name="FILTER"><file name="Makefile" hash="d42338199c6857ded179af2117b9f571"/><dir name="TEST"><file name="Makefile" hash="ab37090c6c5e7af1b260376237737700"/><file name="filterBuilderTest.php" hash="161ff5c8e73914eef884d17456afa133"/><file name="filterCombinationTest.php" hash="2162288d5255d3b24fe94d75b939aa51"/><file name="filterTest.php" hash="1682c0a4d50158a8d2c9369d30e45a18"/><file name="groupFilterTest.php" hash="1ebe8ce7344ed64b93cf94632d3b0184"/></dir><file name="afs_combinable_filter.php" hash="336e6c6bc9ebae3f58602d23ef734182"/><file name="afs_combinator_filter.php" hash="e2fc560b9c0c31f20c73f2057a8b7b69"/><file name="afs_filter.php" hash="6dbfc8c668cd48510cc9a9243d1bf4c3"/><file name="afs_filter_exception.php" hash="ccce583c63a4a65f7f0a27fc4a487505"/><file name="afs_filter_wrapper.php" hash="30dec104456abc037019ad93922b5afd"/><file name="afs_group_filter.php" hash="b95fa3bc0e26bc39dfc53a6010bce32f"/><file name="afs_native_function_filter.php" hash="37176bdbc66cc3dca18149132921f0a5"/><file name="afs_operator_filter.php" hash="c7ea43c8d64eedbe33397f61737e0226"/><file name="afs_valued_filter.php" hash="483653071734f77972c9b9771e187d82"/></dir><file name="Makefile" hash="0f76232bfabc275a3dac973666fb5dae"/><dir name="TEST"><file name="Makefile" hash="ce56cc786e1df50148e1d3222c05e5f8"/><file name="clientDataHelperTest.php" hash="1556ab047e1df23447586d529768befd"/><file name="clusterHelperTest.php" hash="e112e7c756f63c8e8ceb554281b418c9"/><file name="conceptHelperTest.php" hash="b44e39b62d0537bf1f7b7feb23f8111f"/><file name="facetDefaultTest.php" hash="382e4ea35e1c7173371b4a84046a38e5"/><file name="facetHelperTest.php" hash="4af0256294abbea651d1b8d06832556b"/><file name="facetManagerTest.php" hash="bbef8e207c387dbe6a26142fd55264d5"/><file name="facetTest.php" hash="26123aa75cb2597a3ededfa9d778095d"/><file name="facetValuesSortOrderTest.php" hash="b650080bf9b2cce2ac42a245cb84c911"/><file name="feedCoderTest.php" hash="f2b5dfdd4fa3c4e5d14c790d15235146"/><file name="filterCoderTest.php" hash="46249fa13edccf1e5d5000daf2573b77"/><file name="headerHelperTest.php" hash="62185c34e1e9015bb12014d719287f06"/><file name="helperConfigurationTest.php" hash="be3f74e53e27744e8214f3c341172796"/><file name="intervalTest.php" hash="912389dad049853f6bf0b4eab2af5034"/><file name="metaHelperTest.php" hash="080f160b54636c4eee743544a6a12bee"/><file name="pagerHelperTest.php" hash="d96a9891523e453647493f3219e86357"/><file name="promoteBannerReplyHelper.php" hash="94c3c14517536437e9800eaa706fbe29"/><file name="promoteRedirectReplyHelper.php" hash="ed00c66be5127d8b374f6416abf328ef"/><file name="promoteReplyHelperTest.php" hash="7cbb68a7f50c2bd2ef11a085ac94deb2"/><file name="promoteReplysetHelperTest.php" hash="ac2f1e3073015143dc7b2b705711c845"/><file name="queryCoderTest.php" hash="03983a114c6697464f8bf016822ff4a3"/><file name="queryOrchestrationTest.php" hash="02867da7662cdb9f005eb9c1e73dfa30"/><file name="queryTest.php" hash="338264d8e6dbbc09e88bd9a8179e8be4"/><file name="replyHelperTest.php" hash="4d86f19ea7de2aece5d7fd9c143c3dbc"/><file name="replysetHelperTest.php" hash="897f074b8382c6853f51b06a5ee50b0a"/><file name="responseHelperTest.php" hash="ebb167e1c330af6aa0e6a2b917431040"/><file name="searchConnectorTest.php" hash="9201de573884b643041b6c32bc535e7e"/><file name="searchQueryManagerTest.php" hash="2188b262a1c11422bcc8133f68fa6dd9"/><file name="searchTest.php" hash="fa47a7819b5c7c71172d6b1f1e7a02f7"/><file name="spellcheckHelperTest.php" hash="49960fb90055dcf265ef41e491c11325"/><file name="spellcheckTextVisitorTest.php" hash="203f0d08f548a39135517a41f6e9e43a"/><file name="textVisitorTest.php" hash="b722845dd0f5f953574cb51284ad025b"/></dir><file name="afs_base_reply_helper.php" hash="57abe4828b7ed7126db963764faa718a"/><file name="afs_base_replyset_helper.php" hash="096b124a3ebdc6e8d6beb359bd8bb7c5"/><file name="afs_client_data_exception.php" hash="899957af974d04aa7eaca44903a7f86c"/><file name="afs_client_data_helper.php" hash="4700218e2400350014fde428bc86806b"/><file name="afs_cluster_exception.php" hash="86d97623db7aebaa28a20857ce2cf17f"/><file name="afs_cluster_helper.php" hash="60b7fbcc869a672929ef9fc6d840d2b2"/><file name="afs_cluster_parameter.php" hash="20ed527d3ed1a6cf2bc80e032ecd2c7e"/><file name="afs_coder_base.php" hash="fb87fbea43d12695154b3b6102e2a019"/><file name="afs_coder_interface.php" hash="3b179b2513e215751ee4edd190b2a719"/><file name="afs_concept_helper.php" hash="982cf3d2063c565cf19cc6136b049066"/><file name="afs_count.php" hash="9f83f3baa3cf4462c0db786f4eea479a"/><file name="afs_facet.php" hash="1b4d7d35ebe8ed4894fda4881d0b168f"/><file name="afs_facet_combination.php" hash="005e9742ee032194b86856195dd59f7d"/><file name="afs_facet_default.php" hash="cbcb5d28b7b00815ce5248017065e84b"/><file name="afs_facet_exception.php" hash="f1f0afdbf9a727b53c4731e5a40ac417"/><file name="afs_facet_helper.php" hash="b8ad96c57ec80f40bd21a39bb9b5fbb5"/><file name="afs_facet_helper_retriever.php" hash="5628cc41c50ab25fd3336df302d903f4"/><file name="afs_facet_layout.php" hash="c83f6fef1c13ba3cda667c611841ff87"/><file name="afs_facet_manager.php" hash="a3fabb34d56a9614d4a0a2917f6fea0c"/><file name="afs_facet_mode.php" hash="8dcac389a37f8267a367400377631dba"/><file name="afs_facet_sort.php" hash="0d7ba4059b10da9981b9c801355cb874"/><file name="afs_facet_type.php" hash="6df82cbfa627629f9523437994d1fbb1"/><file name="afs_facet_value_formatter.php" hash="d6580281f9ef5c0820615ac385aae863"/><file name="afs_facet_values_sort_mode.php" hash="17def98365132c810515f8cf3c6fb006"/><file name="afs_facet_values_sort_order.php" hash="f95f77cb5dd7015e4f2e6094ddba49a6"/><file name="afs_feed_coder.php" hash="ed7b40e872a7ed5aa30adbcffc05de56"/><file name="afs_filter_coder.php" hash="4edbdcf6760d80465e5d2533014ba307"/><file name="afs_filter_parameter.php" hash="2b03c2c83ffe2e2968aaf50ad4903921"/><file name="afs_fts_mode.php" hash="edbd9342cd9625183e1e01ed81b79fc3"/><file name="afs_header_helper.php" hash="c123aeb736bf2e0506e56831fe516800"/><file name="afs_helper_configuration.php" hash="dbd0378574fbc5729babfbddfef0fd67"/><file name="afs_interval.php" hash="dbf9749881be0a2b063f8a33dff214f3"/><file name="afs_interval_exception.php" hash="40f223de231df03aae59596c1a493065"/><file name="afs_meta_helper.php" hash="8403689868c98db725ebd11748508c8b"/><file name="afs_pager_helper.php" hash="077052931e0cffb1e589c21b57156b38"/><file name="afs_producer.php" hash="7c8c515ccb8126523fa0d09a7f759dd5"/><file name="afs_promote_banner_reply_helper.php" hash="418702b3c053029b3aa8fcb2775c65bd"/><file name="afs_promote_redirect_reply_helper.php" hash="be17eda6f8b4552b9ec21183362171a2"/><file name="afs_promote_reply_helper.php" hash="0e2a4f67cd307f74e8b64cd3b158235c"/><file name="afs_promote_replyset_helper.php" hash="fdefc6f8a686addb31ea9b6c0a3fa5ad"/><file name="afs_query.php" hash="bd969a62cd4bbbcb5b9996eaa19353f7"/><file name="afs_query_coder.php" hash="ca0bfad66b8d8549ab3f33380d716732"/><file name="afs_query_coder_interface.php" hash="dd16f17b3606a7418c1c714475b19b51"/><file name="afs_query_object_interface.php" hash="a9af13e2c856e4136ccadfff60f72d36"/><file name="afs_raw_text_visitor.php" hash="fd574583c4c9110165c1cadc67b832de"/><file name="afs_reply_helper.php" hash="3919f9e83cba62be9bc67117b1087b03"/><file name="afs_reply_helper_factory.php" hash="f159f7d0ef7e5a209fb872a970d0d582"/><file name="afs_replyset_helper.php" hash="cb8f81391d9a59904dcb0c3d6ae31999"/><file name="afs_response_exception.php" hash="0a865bb92fb700ae555dcb5ae675f644"/><file name="afs_response_helper.php" hash="048910936a0fc00705d3fd4ad39a0270"/><file name="afs_search.php" hash="3f2e3ef447515a2fa05b270654ef2969"/><file name="afs_search_connector.php" hash="17242fb6536f4596b2c0198a16986310"/><file name="afs_search_query_manager.php" hash="77e30683ee4ba9e004e9c7c12d9c811d"/><file name="afs_sort_builtins.php" hash="0cc1617a62f1a834a28d7d2ac249b081"/><file name="afs_sort_coder.php" hash="1dfe2d32278383d8465df67535cb91dd"/><file name="afs_sort_order.php" hash="7755deb99386650c9974871474168cda"/><file name="afs_sort_parameter.php" hash="bfb8c59c1560ec8a3b597dc45aa8ecd5"/><file name="afs_spellcheck_helper.php" hash="bb5465848ada7a9df9875f2565fb9686"/><file name="afs_spellcheck_text_helper.php" hash="3ca5c3118660aa600aadb504ceff6c4c"/><file name="afs_spellcheck_text_visitor.php" hash="c44c23ae21f61b065e457911bbc45ed2"/><file name="afs_text_helper.php" hash="59c4ae24560948c3af0f4adbf6bd1803"/><file name="afs_text_visitor.php" hash="867b44a280403cd4567358ec6d59588a"/></dir><file name="afs_configuration_base.php" hash="f26dd9efda4923cc2c71057f21be97d9"/><file name="afs_connector.php" hash="aa04a21163b57ef338bf96bd55e95882"/><file name="afs_exception.php" hash="c1840fe279f9cb313cec151012ed4513"/><file name="afs_feed.php" hash="005305cace79a3aa7719a3c942df9da7"/><file name="afs_multiple_values_parameter.php" hash="96dc30f1fbf137cbfd73c2b195d9f9ef"/><file name="afs_origin.php" hash="a6b7e39a687210572c116afcbea0e7cb"/><file name="afs_query_base.php" hash="7209115a714d9b7de209a0af691c1d22"/><file name="afs_query_parameter.php" hash="6552428d955d0a48c015e1f98ba62815"/><file name="afs_response_helper_base.php" hash="b087f7bdad35ed0526566042ef9afc8c"/><file name="afs_single_value_parameter.php" hash="65d002d7ac6b6e8dd6170309b4c84649"/><file name="orchestration_type.php" hash="047eab54be2eba5500ef747ab7f139b9"/></dir><dir name="AIF"><file name="Makefile" hash="2d232abf9913fcabb44033d5e5d1ebfd"/><dir name="TEST"><file name="Makefile" hash="24d3030d27e88732028d14fb1d81c203"/><file name="afsMultipartResponseTest.php" hash="70a64d0d599ea01806fac2126fb3680a"/><file name="authenticationTest.php" hash="e3a84092f7eb76bc3e44335a3a47bcdd"/><file name="bowsInformationTest.php" hash="3bbfe71f431a35f0285afdca40906874"/><file name="documentManagerTest.php" hash="ad90a6146f5aeee383355bb05425b3dd"/><file name="documentTest.php" hash="59b204b10b90cd764b259ad4c2bc043a"/><file name="pafConnectorTest.php" hash="f77eb3a317443916c8e8f2774ea732ec"/><file name="pafLiveTest.php" hash="92862c31d151c34b2caf44bff9d0fb80"/></dir><file name="afs_about_connector.php" hash="dd52b41d37d47867467165203de1d1ce"/><file name="afs_authentication.php" hash="90a2405786726a6c05c7b339dff7017f"/><file name="afs_bows_connector.php" hash="0f07eea36c8c1794e46fc34c3a8a7819"/><file name="afs_bows_connector_interface.php" hash="8fdf9749f0500a39741d696feb55af14"/><file name="afs_bows_exception.php" hash="1bd8657a37b8b4a9e08bfc4eb6b7e416"/><file name="afs_bows_information.php" hash="1f96a4cd84b2332f1186f9e0cea8542d"/><file name="afs_bows_information_cache.php" hash="1ae9a9243342c4e58a52e70473b68472"/><file name="afs_document.php" hash="c0003ec962a79b9d3f642b17bade0fff"/><file name="afs_document_manager.php" hash="8c5c0105d9337b7ae6a9f041f643ea88"/><file name="afs_multipart_response.php" hash="f2077c9eaf121fabdb2fc26c23b2e256"/><file name="afs_paf_connector.php" hash="519a81178af37c7aec9dbfa460bfa7cb"/><file name="afs_paf_live_connector.php" hash="0e91807cbe49dad1428c2de5200997fd"/><file name="afs_paf_upload_reply.php" hash="0cb4905d1c894637d5e6acbd2cffc112"/><file name="afs_token_authentication.php" hash="6329f0f7b6840d610a4b3078fb4dcce9"/><file name="afs_user_authentication.php" hash="8330376642778e0e0191f66b1783896c"/></dir><dir name="COMMON"><file name="Makefile" hash="7bb31592939024f74745d6b6cb7fec0b"/><dir name="TEST"><file name="Makefile" hash="d568cfe3683543f363312aa4b6d2bbad"/><file name="languageTest.php" hash="ad0f75b1c2f320c81eba32cade86191c"/><file name="toolsTest.php" hash="9276cb1a275d697f8e8365f2ac340cdf"/><file name="userSessionManagerTest.php" hash="b2b78d6fa156f1a61065f8ee5bfc6e0b"/></dir><file name="afs_connector_base.php" hash="b6b1f091ec71e5b92e4a1e5ca958255f"/><file name="afs_connector_interface.php" hash="68ad5e20a861b85dbf198f79cd2afd4c"/><file name="afs_exception.php" hash="b8eed4376088ae3003d0b77cc523e732"/><file name="afs_helper_base.php" hash="839cca78a663c3a22b4a8e35d1460129"/><file name="afs_helper_format.php" hash="30a3f6e945db7412ef95e83e7b0b5898"/><file name="afs_language.php" hash="277acb15b86089b37c812c47f2141d3c"/><file name="afs_service.php" hash="12c00c906e130860120552c40fa9dbc2"/><file name="afs_service_status.php" hash="1dee172850a76b46987534df89013878"/><file name="afs_tools.php" hash="26f6c01c5a61987925385e7a35260399"/><file name="afs_user_session_manager.php" hash="abd625f6b7b5cecf386dac9d82887764"/><file name="afs_versions.php" hash="556c912ff7f19f5083c4fb44d4d40ac6"/><dir name="lib"><dir name="JsonPath"><file name="JsonPath.php" hash="baa12e1baa9f8a20a095463042e96ad3"/><file name="JsonStore.php" hash="a9632aeb2126e98db9a49403a8f2ff77"/></dir></dir><dir name="php-SAI"><file name="README.md" hash="63ab581c83fe44918e6d074e20f08f95"/><dir name="lib"><dir name="Curl"><file name="Handle.php" hash="0fc7132737da7cee7df6b974447864ac"/></dir><file name="Curl.php" hash="358e4d3afca2035ee4d3f99f372ed15a"/><file name="CurlInterface.php" hash="714fa045dd4546d0c92cd022efb09422"/><file name="CurlStub.php" hash="fbdc0ece6321c5b5a1e27a65449f4a1f"/><dir name="rb_temp"><file name="HttpClient.php" hash="091b91c98acf9f1cd6c3d6d75cddfb88"/><file name="MultiCurl.php" hash="916e85d73bae6e136f889166ebc6db17"/><file name="SimpleCurl.php" hash="c296966a8bda96e03b464a1d3a9c8e06"/></dir></dir><dir name="tests"><file name="SAI_CurlStubTest.php" hash="bce69cbb17a40bd4eeba6bad1133216e"/></dir><file name=".gitignore" hash="09e625dea07b4d4098b19ec998d266f9"/></dir></dir><file name="COPYING" hash="b234ee4d69f5fce4486a80fdaf4a4263"/><file name="COPYING.LESSER" hash="4fbd65380cdd255951079008b364516c"/><file name="FAQ.md" hash="7d7c886674d70a0047303c5d93de6165"/><file name="Makefile" hash="225475a5a4a0204cecbb77621ff38bb2"/><file name="README.md" hash="7ecfd33825a0e6bc50cca099c1c0e50e"/><file name="afs_lib.doxygen" hash="8128d53d894cc57e08142377d13c72f4"/><file name="afs_lib.php" hash="5d49433720f05b707dae0206c1ec1dbf"/><file name="afs_version.php" hash="15ef21883652ec9da0da0f4830f153d7"/><file name="composer.json" hash="39190df70fafa99d7eb5ab566e8edf3f"/><dir name="doc"><file name="afs_filter_documentation.dox" hash="3bf4b96e25d95ce5953b822038c6f135"/><file name="afs_paf_upload.dox" hash="d36893db0234f171e6cfb43f6e13d47c"/><file name="afs_search.dox" hash="b1c5ab8728703822f910852cd17561f4"/><file name="afs_search_coder.dox" hash="77709e1bc691301017f0982e0348a9b9"/><file name="afs_search_query.dox" hash="21dcd1734a165a4cb3b4f62c42a6a0be"/><file name="afs_search_reply.dox" hash="cdb1d42447671f4352927b40b3f8f37d"/><dir name="data"><file name="acp_helper_example.php" hash="2815890e7afbae78e7eb4e6fc5c88f6f"/><file name="full_example.php" hash="e152a964d06e55de460c596070c714d8"/><file name="full_lightweight_example.php" hash="eac3bb2d251052f547a9f737e5cd0461"/><file name="raw_example.php" hash="f1f9d547fe0d89f129c9bbb050eb263e"/><dir name="templates"><file name="error_template.html" hash="70f44bd0f45470d379a11d0a2fe507e4"/><file name="facet_template.html" hash="6836005a7dae45e9415273f1eb6b78e2"/><file name="facet_values_template.html" hash="9b41f2b55a1cecae5724b4fcd4a46cfb"/><file name="meta_template.html" hash="e664a3bb222d272ce2451fb10bf46de4"/><file name="pager_template.html" hash="2700ab5b60a1f9553b1c39374fda63d4"/><file name="result_template.html" hash="1572a4ef4e8dda0b3db1ea77bbed4a98"/><file name="spellcheck_template.html" hash="8042054a1f5a271b47c77f81436c4791"/></dir></dir><file name="detailled_integration_example_with_template.dox" hash="26ef377a6ef546b636a0e254d11d01f5"/><file name="lightweight_integration_example_with_template.dox" hash="5a388d2dbfad63ad6ec353407b79a6bb"/><file name="logo-antidot-long-200x41.png" hash="1ceac3fff767fb5e395bd767344a3d13"/><file name="main.dox" hash="ca3e97f95deead927fb3298ecafbad5e"/><file name="raw_integration_example.dox" hash="56a7126d008c2e49abdf9bf0b5ec9717"/><file name="template_prerequisites.dox" hash="baa24a943e19ff3654227850bd316abb"/><file name="templates_in_details.dox" hash="5e8db94382f1fbd6c4e0b424a9edc9a3"/></dir><file name="rules.mk" hash="ff48aa6a5c40e31b3f38aba1267e9a71"/><dir name="scripts"><file name="gen_doc.sh" hash="0f6fc60aca94da563397d3c710bd9d33"/><file name="increment_version.sh" hash="431db9c60d2f94d251be07957787fcb0"/><file name="print_version.sh" hash="a05ddc19cd27ff185721fe2bd0cffc25"/><file name="version_management.sh" hash="3d5ecd39f45ba081144b3033dbd14330"/></dir><file name=".gitignore" hash="0292f51c0906b2092255872c69603f29"/><file name=".travis.yml" hash="4330b9c449e9cd0e97829f679c2a2786"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="mdn"><dir name="antidot"><file name="CollapsibleLists.css" hash="c956d83facc41a97bf14726dcb953edb"/></dir></dir></dir><dir name="images"><dir name="mdn"><dir name="antidot"><file name="base.gif" hash="1f71b021e061a4948d69adc4ff10ccad"/><file name="button-closed.png" hash="563b78324e0712c0902cb4f77cb9eb86"/><file name="button-open.png" hash="c710849a0d2b61ad1f0fc36c0e59d131"/><file name="button.png" hash="97f3055c5046c851eea2dad7e5227508"/><file name="cd.gif" hash="f41037663522fab5c5c31530c7fa43d8"/><file name="empty.gif" hash="df22aff6e941ff1cc577333d1712b584"/><file name="folder.gif" hash="ea16980ab437fa6ba4aba3d480e83e9e"/><file name="folderopen.gif" hash="18aa3d75315bf95bf080357733437fcc"/><file name="globe.gif" hash="d6b48614cf8dc9553e077c19197637d2"/><file name="imgfolder.gif" hash="1d488d377762e65ab4e8b691ba01e5a4"/><file name="join.gif" hash="4d5d614e0da056df815a4306d6368692"/><file name="joinbottom.gif" hash="4b3daa7f2cc584f1aac0d142275d7cba"/><file name="line.gif" hash="63ab38a6203262f15ca46c631232ea2c"/><file name="list-item-contents.png" hash="00ae24d5bc76df9eedaea597859963e4"/><file name="list-item-last-open.png" hash="615ddd71f81b240e9ed7d4e383b2c01a"/><file name="list-item-last.png" hash="e2bfb790f46855c378e50f3c0a82ea01"/><file name="list-item-open.png" hash="732d1cc59f3a488c89c624eb434eac98"/><file name="list-item-root.png" hash="5529d21e7ec68e9cb750a4895ff0b480"/><file name="list-item.png" hash="e03ec1bf3d9e16bb3005ccf8d26eaa6c"/><file name="minus.gif" hash="d647fbbd0ec410b8f3bb3357b62eedcf"/><file name="minusbottom.gif" hash="b09d684cca7135ef728141aaf2464baa"/><file name="musicfolder.gif" hash="21ece951734f23adb2f75befe1f31fc1"/><file name="nolines_minus.gif" hash="eb2243a354ffcfac93ba0fe948f7167d"/><file name="nolines_plus.gif" hash="ec92b634b63608fb4b0dbf114e3b89e1"/><file name="page.gif" hash="c25b136c1cb3bb145495c25b35d93754"/><file name="plus.gif" hash="5c55d798909c553deca31d610bd18fac"/><file name="plusbottom.gif" hash="1924ce363c38a992f888a4df48c0b274"/><file name="question.gif" hash="ea0ca196ce0ebfd625cc1210abfdec6c"/><file name="trash.gif" hash="6cbfd3ed29531044aed9b4edb3cca9ad"/></dir></dir></dir></dir></dir></dir></target></contents>
23
  <compatible/>
24
  <dependencies><required><php><min>5.2.0</min><max>5.6.0</max></php><extension><name>curl</name><min/><max/></extension></required></dependencies>
25
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Antidot_Antidot</name>
4
+ <version>1.2.3</version>
5
  <stability>stable</stability>
6
  <license>LGPL</license>
7
  <channel>community</channel>
17
  Add cdata for variant name&amp;#xD;
18
  Add variant details for grouped products</notes>
19
  <authors><author><name>Antidot</name><user>antidot</user><email>contact@antidot.net</email></author><author><name>Antidot</name><user>antidot</user><email>contact@antidot.net</email></author></authors>
20
+ <date>2016-04-14</date>
21
+ <time>08:33:28</time>
22
+ <contents><target name="mage"><dir name="shell"><file name="antidotExport.php" hash="a4e184cdf1add5d42484e6997ea6f59c"/><file name="antidotExportCategory.php" hash="10de34988223fc8ca26e6f30c4070733"/><file name="antidotExportInc.php" hash="18f1b60b93245e2daf423c614dcd7efa"/><file name="antidotExportProduct.php" hash="9ddd7f0ba8e54b24665a32d26e5231b4"/></dir><dir name="i18n"><file name="de_DE" hash="f166a5ff29213a44fca77277b053897e"/><file name="en_US" hash="63c821044fda6f7c2a26dc84670b25bd"/><file name="es_ES" hash="f9319039054998955d63d51ed0930f3f"/><file name="fr_FR" hash="632367797f2fa9fef06e0b0c69377e01"/><file name="i18n.php" hash="0780b44563432f6e70de78f7a9d60f54"/></dir></target><target name="magecommunity"><dir name="MDN"><dir name="Antidot"><dir name="Block"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="2158b991ccdf394c8cd47cab00829e4d"/><file name="Boolean.php" hash="d17b08e1ec9047cf4050442ababd0808"/><file name="Category.php" hash="78cb53233ad74a2b5496d6f7857d8837"/><file name="Decimal.php" hash="75b31617bca2a8f20ee7fe113e3534f2"/><file name="Price.php" hash="244068a33e8ba64423c126baf883d2b5"/></dir><file name="View.php" hash="bbdd9bb31663415001ab3751c6737cde"/></dir></dir><dir name="Catalogsearch"><file name="Articles.php" hash="6c3bff571dce7e4141af09ded261773f"/><file name="Banner.php" hash="cbeb4d71c146a75cbbd0eb15a0f5727f"/><file name="Category.php" hash="e9605415ba85929115a443b1b4f00ab0"/><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="2b274bf7d8f8dbd915bdf73f65e694fc"/></dir></dir><file name="Layer.php" hash="3ba32c0f20c4b7447229843f45b06d3f"/><file name="Result.php" hash="887530a08ce375d1722fc327eebc64fc"/><file name="Stores.php" hash="3e5caa7f44d4634ed40a9f520dbed9e7"/></dir><dir name="Html"><file name="Select.php" hash="fc7fb19df1dd378d4e9e0860d2d47d07"/></dir><dir name="System"><dir name="Config"><dir name="Button"><file name="AfsStore.php" hash="4f00570d46d27d1cf89785e8db42a332"/><file name="Forward.php" hash="3917a1882c3d55837138782e60791167"/><file name="PushArticles.php" hash="c7d0ce7326c7f706c0432a2ffb57fee2"/><file name="PushCategories.php" hash="2caeb40ae6a5abe77be2ca666c01ed81"/><file name="PushProducts.php" hash="3eb6538ab55257b0a83021ff1ecbf632"/><file name="PushStores.php" hash="665af5f753ed11a077e03a0c77628573"/><file name="RestoreTemplate.php" hash="ffbbb0a73ff1ede611262a6a4da1a188"/><file name="ShowXml.php" hash="417ba0c9c62d8070b63f90397887dcc0"/></dir><dir name="Fieldset"><file name="Notice.php" hash="cf5aa45ebac84546ede622b9beb9d588"/></dir><dir name="Form"><dir name="Field"><dir name="Array"><file name="AcpFeeds.php" hash="27d2e08c2efb798f6e675b4db6479ca3"/><file name="Additional.php" hash="d62316e3631c1c2b6a0119134c8002a8"/><file name="AdditionalFeed.php" hash="dcfb6d37d765a10e4a07465e70133dda"/><file name="ArticleAdditional.php" hash="38c62d610f585c460151841f7350348b"/><file name="ArticleIdentifier.php" hash="ec9479fd1ca087a1fe924795cc9ff5f6"/><file name="DefaultSort.php" hash="4989d99a73f57bed1fb994060cc38a72"/><file name="Facet.php" hash="43146cf961a469f371aeb24418a6f401"/><file name="Identifier.php" hash="a9fa99227182bd72e59c9a315d580247"/><file name="ProductAdditionalFacet.php" hash="8d46e427d9efbac7e6ba04fdc88d4728"/><file name="ProductAdditionalField.php" hash="9c9f9c9c1c940963e1a24c039a392cc4"/><file name="ProductIdentifier.php" hash="d30809119cb35018697533075f7ee485"/><file name="Sort.php" hash="f986fbb048bf3f6aec813cdc1c70ec15"/><file name="Tabs.php" hash="3d1d5d89ae6263b0a0ec61eb549658ec"/></dir><file name="CategoryAttribute.php" hash="c119ca65f23950e7abb1f0d60e8b4755"/><file name="ProductAttribute.php" hash="6a61b98a9f6ac883a5e162e3edab300d"/></dir></dir><dir name="Html"><file name="Export.php" hash="f36beeca11c51e1a2e9678955d8cf1b8"/><file name="ShowXml.php" hash="7b70f39937aa9d24336edde6bdbdf97c"/><file name="Version.php" hash="34c624c382f3061cf322cfed52c416ac"/></dir></dir></dir></dir><dir name="Helper"><file name="Antidot.php" hash="7bbd2866c65a847e1415badb1ef0d015"/><dir name="CatalogSearch"><file name="Data.php" hash="25d8f53c6165bbe8f90c83108654fcf8"/></dir><file name="Compress.php" hash="12fa64a9c9f519a3f249954ab780e01c"/><file name="Data.php" hash="453edcc9b2810e4e554fc3828e22452e"/><dir name="Enterprise"><dir name="Search"><file name="Data.php" hash="8bfe0146c64511f86cb796638b65112f"/></dir></dir><file name="LogExport.php" hash="bb599102015fef0d060f3d4d47adb3cb"/><dir name="ManaFilters"><file name="Data.php" hash="f4f4e92c5e33c6142904cf27a75f6d23"/></dir><file name="Url.php" hash="1d2ee02a8e135bfc4b866f5219f62acd"/><file name="XmlWriter.php" hash="66cf65d950caddf895c823c5575a1912"/></dir><dir name="Model"><dir name="Catalog"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="3cd18414abccea60c5497931bc95e21e"/><file name="Boolean.php" hash="dd0414e0d96833bec6e32aac321c2763"/><file name="Category.php" hash="4dea470cb36708e0ae4b95bd0a24a85f"/><file name="Decimal.php" hash="b9b1e2cff1d0332fab77d101dca4c3d2"/><file name="Item.php" hash="c89bbca267af18a0447e0daf3e7cc8eb"/><file name="Price.php" hash="7529be0313a19896993f92eeb9dfc8a9"/></dir></dir><file name="Layer.php" hash="706000dd944a45f30826eccba2942862"/></dir><dir name="Catalogsearch"><dir name="Layer"><dir name="Filter"><file name="Attribute.php" hash="a83d6761a949c8196cba33948a48c8bf"/></dir></dir><file name="Layer.php" hash="b5aa8e2cc24f1b1362749049f1cdec32"/><dir name="Resource"><file name="Attribute.php" hash="80d2a34d746f307109b6bf910b0f2958"/></dir></dir><dir name="Export"><file name="Abstract.php" hash="8d20574426b00a9103b26597205abe12"/><file name="Article.php" hash="7237e30c0f9253af4477cbe0b63a3c73"/><file name="Category.php" hash="e4c1f09bd75f6cda693ab6aab084e5b4"/><file name="Context.php" hash="4b453ee785553ed148ed8459ac9258e9"/><dir name="Model"><dir name="Product"><file name="Link.php" hash="6f764a25fcde9b315d10f46189a428d1"/><dir name="Type"><file name="Configurable.php" hash="4bb627c1f5d1fbadd37a6b54e681406f"/><file name="Grouped.php" hash="8770d1ddf8228a2db136325da494de51"/></dir></dir><file name="Product.php" hash="a56c7e50bbd95c57570e38d911976962"/></dir><file name="Product.php" hash="b6944fe749783a600c27fa516884e8a0"/><file name="Store.php" hash="3503a5e743efa257755a76c2c017bbd2"/></dir><file name="Observer.php" hash="c7916b674f1388985328e3af7695fa93"/><dir name="Resource"><file name="Advanced.php" hash="989026021706cbcfb269451187002c19"/><dir name="Catalog"><dir name="Product"><file name="Collection.php" hash="7c0a02eeda1d6c0ada06ea49493f2b01"/></dir></dir><dir name="Engine"><file name="Abstract.php" hash="bdd9813de433ae197ee1bc290ff88bce"/><file name="Antidot.php" hash="4e19a0fe05be0a1e0aa2be26eedf6ffd"/></dir><dir name="Export"><dir name="Product"><file name="Collection.php" hash="dfa31e927797fb1887aec5fcec2747d1"/><dir name="Link"><dir name="Product"><file name="Collection.php" hash="a50b67c39520422770b4b16d4ab51ba0"/></dir></dir><dir name="Type"><dir name="Configurable"><dir name="Product"><file name="Collection.php" hash="79d359ae0e176d3499225452d983c210"/></dir></dir></dir></dir><file name="Product.php" hash="f3e87d35ea55e911948f3909274e29b3"/></dir></dir><dir name="Search"><file name="Abstract.php" hash="fd71154b987b16f8d13bc3e10a3faeac"/><file name="Search.php" hash="fa499c1b185ced3eb1be2b4940037e24"/><file name="Suggest.php" hash="668438520f2e91b6b332f044c676b769"/></dir><dir name="System"><dir name="Config"><file name="ArticleAttribute.php" hash="f3a9596d45f275299f16530a56845c96"/><dir name="Backend"><file name="Engine.php" hash="68c93651655a77c74fd79d1de6d19be3"/></dir><file name="CategoryAttribute.php" hash="9f19b99e16c99b0e8052b1e31d2a6317"/><file name="Dir.php" hash="c80d83280ebc5ab91fd45d246ec47ba3"/><file name="DisableEnable.php" hash="6d08f33a1580b2fd1d58d87248104166"/><file name="ExportType.php" hash="940a74862d74f7873258b35c33b7b87a"/><file name="Facet.php" hash="8b771072a32f32e81a087581ace7fd72"/><file name="Number.php" hash="7985ea6c495a35173d68291389319f93"/><file name="Options.php" hash="06930da994dec4bb05ebc3f3e8c8abb8"/><file name="ProductAttribute.php" hash="c74ad00177c3a12b03c8684928d12c40"/><file name="PromoteRedirect.php" hash="c167973ea7a0ef09f0e5fa0fd0a08926"/><file name="Sort.php" hash="e0d2c1e72f56894b75baebcb6c4b8609"/><dir name="Source"><file name="Acpengine.php" hash="fdf8d5030d8823c325d707d8bb5b7208"/><file name="Engine.php" hash="0491592c4612779ffc7890456f6b946d"/><file name="Redirect.php" hash="ea6cb67ab98a0303d5c30c49099f5708"/></dir><dir name="Suggest"><file name="Type.php" hash="cef491efdb9fcef86d0df75030206a78"/></dir><file name="WSStatus.php" hash="ff4954e15d75dd3139290d96773d0abf"/></dir></dir><dir name="Transport"><file name="Abstract.php" hash="3272c44b08523a9836aa15c835e2ed25"/><file name="File.php" hash="4b0b2ef7940fc8cd60e96cc74a2c84f0"/><file name="Ftp.php" hash="73056ec4decef2fe9c459641e0a0ae7e"/><file name="Http.php" hash="807dfd219fad274e5a0f959c5ca2accc"/><file name="Interface.php" hash="40cfaad8efccad7dc3ff7a920dee871a"/></dir><file name="Transport.php" hash="dfbe060f5575304736ba805f597f7393"/></dir><dir name="Test"><dir name="Block"><dir name="Catalogsearch"><file name="Layer.php" hash="49725570e661d72db50daab46e0e18af"/><dir name="Result"><dir name="fixtures"><file name="testSetListOrders.yaml" hash="3077a3199216b898963f1bcf9f4d7396"/></dir></dir><file name="Result.php" hash="a780e377612d4481c4f0c96311005620"/></dir><dir name="System"><dir name="Config"><dir name="Button"><file name="AfsStore.php" hash="dcbfefb440b8512b1298b624a3582076"/></dir><dir name="Form"><dir name="Field"><dir name="Array"><file name="AcpFeeds.php" hash="11c6c503d9af481d7872d7a43994a9c3"/></dir></dir></dir></dir></dir></dir><dir name="Helper"><dir name="CatalogSearch"><file name="Data.php" hash="a40c1e58b5000432763aa07dd49d4b5d"/></dir><dir name="Data"><dir name="fixtures"><file name="testGetActiveResultTabsCase1.yaml" hash="3b8a646c590f59910155a0a7e3d9283c"/><file name="testGetActiveResultTabsCase2.yaml" hash="4a0f99d4ea1b63cf51abc9ff83c822ea"/></dir></dir><file name="Data.php" hash="8cfba839e315c050c42dc2798d18bf8b"/></dir><dir name="Model"><dir name="Export"><dir name="Abstract"><dir name="fixtures"><file name="testGarbageCollection.yaml" hash="de6c8672be0c24a102ebfed004f2361b"/></dir></dir><file name="Abstract.php" hash="434f7a81228d7cb4554bbd2da4c86d5f"/><dir name="Article"><dir name="fixtures"><file name="testWriteXml.yaml" hash="e8f832fb8e943b78920495e0ca4d55e9"/></dir></dir><file name="Article.php" hash="8b250685c1575480754c31969cb1edfd"/><dir name="Category"><dir name="fixtures"><file name="testEmptyFile.yaml" hash="9573e620466cfe8260f8a87e274c8261"/></dir></dir><file name="Category.php" hash="42164121852311eb200af116e0a20d58"/><dir name="Context"><dir name="fixtures"><file name="testContext.yaml" hash="d912a7bd71a209f591043a3644de3ceb"/></dir></dir><file name="Context.php" hash="c5af056a47ee7acdacbe7072a825ce90"/><dir name="Model"><dir name="Product"><dir name="fixtures"><file name="testGetIsInStock.yaml" hash="b9a95c8ad5b3999221d027192d79fe55"/></dir></dir><file name="Product.php" hash="a3b6765c5c663caa1a50dc511c78db5e"/></dir><dir name="Product"><dir name="fixtures"><file name="testInactiveParentCategory.yaml" hash="3ef9bcefae6399ccdc23e026746a1743"/><file name="testWriteImageUrl.yaml" hash="a4e08b8f1565eba67a16553cf57e1004"/><file name="testWritePricesFixedtax.yaml" hash="698da07581100c1eff5a1a85e2be6d3b"/><file name="testWriteProductNoVariant.yaml" hash="626a27b35977e5a52b02f85011c5e216"/><file name="testWriteProductNoVariantInStock.yaml" hash="9aa7736a422276842350ac73c6f4ba55"/><file name="testWriteProductUrl.yaml" hash="a4e08b8f1565eba67a16553cf57e1004"/><file name="testWriteProperties.yaml" hash="d434749b80908bbceefd5781e2d0e998"/><file name="testWriteXml.yaml" hash="8a702dfbd07f2d773d991679a2c219a0"/></dir><dir name="providers"><file name="testWriteImageUrl.yaml" hash="666c33585c611bcc0b0ebe6e87dce1fc"/><file name="testWriteProductUrl.yaml" hash="18f511460efea04586fc888f5c85b3ea"/></dir></dir><file name="Product.php" hash="032f8ca084fb1ec71aeac8ca0ffb2d6f"/><file name="Store.php" hash="cc5f45a688f200b19f538ae3924f2b08"/></dir><dir name="Observer"><dir name="fixtures"><file name="testGetDefaultContext.yaml" hash="d77af9c502bf7e7c90fdb3aad609c087"/></dir><dir name="providers"><file name="testGetOwnerForFilename.yaml" hash="c5c07e73f536f9ffacc0c3ff6b5a13d1"/></dir></dir><file name="Observer.php" hash="f4eef1f9853d0a95e7380a4c0d89ca78"/><dir name="Resource"><dir name="Catalog"><dir name="Product"><file name="Collection.php" hash="2ad006d8e096ade9043a9a370177782d"/></dir></dir><dir name="Engine"><dir name="Antidot"><dir name="fixtures"><file name="testFormatResult.yaml" hash="f4aa0a050156b55c5733c5d30f4255ed"/></dir></dir><file name="Antidot.php" hash="5dff5053128f275557772330716da04c"/></dir></dir><dir name="Search"><file name="Search.php" hash="508a9b666ae171344224cd59ed70e59d"/><dir name="Suggest"><dir name="fixtures"><file name="testFeedConfig.yaml" hash="e20aa186fc8b152840b889a7c7956592"/><file name="testSuggest.yaml" hash="e845f0311d93608e3221fb0678f429cc"/></dir></dir><file name="Suggest.php" hash="76ba005020802384a7ad4da5322562dc"/></dir><dir name="System"><dir name="Config"><dir name="Facet"><dir name="fixtures"><file name="testToOptionArray.yaml" hash="b76143bd57f68be024a31d905da9cabe"/></dir></dir><file name="Facet.php" hash="0115c27c5881ff9d35f18a251686dc68"/><dir name="Sort"><dir name="expectations"><file name="testToOptionArray.yaml" hash="13fc5b4c17962fb267f443d03a2219b2"/></dir><dir name="fixtures"><file name="testToOptionArray1.yaml" hash="3160d541123737644dfea5c70db35f41"/><file name="testToOptionArray2.yaml" hash="74fd97f93892920908ab7eab0124eeb6"/><file name="testToOptionArray3.yaml" hash="fe9c8a5da75f3c0d66304a39c473a3bb"/></dir></dir><file name="Sort.php" hash="3435402ae9aa30d18c8265433d643d21"/><dir name="Source"><file name="Acpengine.php" hash="482bcb056949d9d52eda623ee9bdca0d"/><file name="Engine.php" hash="dcbee0d360773c28faa8a894cbed22ad"/><file name="Redirect.php" hash="2dbbaecbb8453ba1025e2e9b5a5957c3"/></dir></dir></dir><dir name="Transport"><file name="Http.php" hash="6ca0294a1e1b076bca777dc34500623d"/><dir name="fixtures"><file name="testSend.yaml" hash="af0bc3c97a109e63aaf018f57ddad6cd"/></dir></dir></dir><file name="PHPUnitUtil.php" hash="2a128a7c19f4c37cb9dd7fc60e679693"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Antidot"><file name="PushController.php" hash="328ec7b1c8198ca714468fff8937f2f3"/></dir></dir><dir name="Front"><file name="SearchController.php" hash="d220bd4628830ea238775ed9788e0674"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="7190cd220b09b657ba9b767614aeebb2"/><file name="config.xml" hash="18c1950a48be4c9a97aec9daf04321a0"/><file name="system.xml" hash="b5113a4b6a2012ef82f81c337ed5ed51"/></dir><dir name="sql"><dir name="Antidot_setup"><file name="mysql4-install-0.9.php" hash="62672bc47ea92dbd46966fb76e4251e0"/><file name="mysql4-upgrade-1.2.1-1.2.2.php" hash="fe774495c51921c2affeb8a472c049ff"/><file name="mysql4-upgrade-1.2.2-1.2.3.php" hash="d48b875617e5acd372e7e91d95babe13"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="antidot"><dir name="system"><dir name="config"><dir name="form"><dir name="field"><file name="acpfeeds.phtml" hash="df37a23d2bd1e2d351eeffa97e97998c"/><file name="tabs.phtml" hash="7ae0f16afb6783b48ed965825dcfa356"/></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="antidot.xml" hash="090bfc2f9ca454bbb58f629be359ea03"/></dir><dir name="template"><dir name="antidot"><dir name="catalog"><dir name="layer"><file name="category.phtml" hash="125de3812ded3b341ab6f1a1f2f92777"/><file name="filter.phtml" hash="2304baebff9b798e0ebd977fbc891346"/></dir></dir><dir name="catalogsearch"><dir name="result"><file name="articles.phtml" hash="5131ea46e2c4c9db67b07991e848e59a"/><file name="banner.phtml" hash="4dc4b69ef2dd51aad9689dbfb2bf8f48"/><file name="category.phtml" hash="7413580b825508f2cfc08566d62369ae"/><file name="stores.phtml" hash="fd33169d4d4bf1d7dbeefc31cb3b91be"/></dir><file name="result.phtml" hash="de6eecf5bd733d3440c843133afea8b6"/></dir><dir name="page"><file name="antidot_results.phtml" hash="32a5e10491b1e856514841e9ae90727e"/></dir></dir></dir></dir></dir><dir name="rwd"><dir name="default"><dir name="template"><dir name="antidot"><dir name="page"><file name="antidot_results.phtml" hash="544cac2df5b1e6e20b9eb2673a869774"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="MDN_Antidot.xml" hash="988c6b7e9da4e50f1727956833ab1696"/></dir></target><target name="magelocale"><dir name="de_AT"><file name="MDN_Antidot.csv" hash="1ad37187a5e7327ab3a5abf797c06d3c"/></dir><dir name="de_CH"><file name="MDN_Antidot.csv" hash="1ad37187a5e7327ab3a5abf797c06d3c"/></dir><dir name="de_DE"><file name="MDN_Antidot.csv" hash="1ad37187a5e7327ab3a5abf797c06d3c"/></dir><dir name="es_AR"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_CL"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_CO"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_CR"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_ES"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_MX"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_PA"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_PE"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="es_VE"><file name="MDN_Antidot.csv" hash="2481c7e88271fc44b1105e9d63adb8d7"/></dir><dir name="fr_CA"><file name="MDN_Antidot.csv" hash="fb817b50d4bba5e35dbb50cc17c523f8"/></dir><dir name="fr_FR"><file name="MDN_Antidot.csv" hash="fb817b50d4bba5e35dbb50cc17c523f8"/></dir></target><target name="mageweb"><dir name="js"><dir name="mdn"><dir name="antidot"><file name="CollapsibleLists.js" hash="86792ecde0c2759ba85e0d863dd147ce"/></dir></dir></dir></target><target name="magelib"><dir name="antidot"><dir name="AFS"><dir name="ACP"><file name="Makefile" hash="0f76232bfabc275a3dac973666fb5dae"/><dir name="TEST"><file name="Makefile" hash="ce56cc786e1df50148e1d3222c05e5f8"/><file name="acpConnectorTest.php" hash="25a8194f3dc8895640df4f4bba895d8e"/><file name="acpQueryTest.php" hash="74ad65a4af639a409ee72a75a2a043d6"/><file name="acpReplysetHelperTest.php" hash="4f0a0d471a06e139cd11c715b67ebe81"/><file name="acpResponseHelperTest.php" hash="6d30f99108db0d9956aef9ba5e1d88df"/><file name="acpTest.php" hash="d6119d150543e7943ba4e9907901ae5d"/></dir><file name="afs_acp.php" hash="78dbfbc92f68469c92898f1da4263e68"/><file name="afs_acp_configuration.php" hash="2d644cc6c5bf2cdaeca5780576c4bf0e"/><file name="afs_acp_connector.php" hash="b72439562b02024e0b9629c18394985d"/><file name="afs_acp_exception.php" hash="f610d2cc37a15d4b981d7b43939414ad"/><file name="afs_acp_query.php" hash="ced0629355f5d4fc1c219d1adb03297d"/><file name="afs_acp_query_manager.php" hash="b3348972a850c904fc664b4e27671439"/><file name="afs_acp_reply_helper.php" hash="b0259f24f10d2e92ed6e3b8cdaaacc44"/><file name="afs_acp_replyset_helper.php" hash="07e7fdb88a42a399c96261c47ffb0231"/><file name="afs_acp_response_helper.php" hash="33a66106fd3a94194514a0d8d39af1cd"/></dir><file name="Makefile" hash="7bb31592939024f74745d6b6cb7fec0b"/><dir name="SEARCH"><dir name="FILTER"><file name="Makefile" hash="d42338199c6857ded179af2117b9f571"/><dir name="TEST"><file name="Makefile" hash="ab37090c6c5e7af1b260376237737700"/><file name="filterBuilderTest.php" hash="161ff5c8e73914eef884d17456afa133"/><file name="filterCombinationTest.php" hash="2162288d5255d3b24fe94d75b939aa51"/><file name="filterTest.php" hash="1682c0a4d50158a8d2c9369d30e45a18"/><file name="groupFilterTest.php" hash="1ebe8ce7344ed64b93cf94632d3b0184"/></dir><file name="afs_combinable_filter.php" hash="336e6c6bc9ebae3f58602d23ef734182"/><file name="afs_combinator_filter.php" hash="e2fc560b9c0c31f20c73f2057a8b7b69"/><file name="afs_filter.php" hash="6dbfc8c668cd48510cc9a9243d1bf4c3"/><file name="afs_filter_exception.php" hash="ccce583c63a4a65f7f0a27fc4a487505"/><file name="afs_filter_wrapper.php" hash="30dec104456abc037019ad93922b5afd"/><file name="afs_group_filter.php" hash="b95fa3bc0e26bc39dfc53a6010bce32f"/><file name="afs_native_function_filter.php" hash="37176bdbc66cc3dca18149132921f0a5"/><file name="afs_operator_filter.php" hash="c7ea43c8d64eedbe33397f61737e0226"/><file name="afs_valued_filter.php" hash="483653071734f77972c9b9771e187d82"/></dir><file name="Makefile" hash="0f76232bfabc275a3dac973666fb5dae"/><dir name="TEST"><dir name="DATA"><file name="introspection_responses.php" hash="f07c0b4031d798b80e9a2647cc44f20c"/></dir><file name="Makefile" hash="ce56cc786e1df50148e1d3222c05e5f8"/><file name="clientDataHelperTest.php" hash="1556ab047e1df23447586d529768befd"/><file name="clusterHelperTest.php" hash="e112e7c756f63c8e8ceb554281b418c9"/><file name="conceptHelperTest.php" hash="b44e39b62d0537bf1f7b7feb23f8111f"/><file name="facetDefaultTest.php" hash="382e4ea35e1c7173371b4a84046a38e5"/><file name="facetHelperTest.php" hash="4af0256294abbea651d1b8d06832556b"/><file name="facetManagerTest.php" hash="bbef8e207c387dbe6a26142fd55264d5"/><file name="facetTest.php" hash="26123aa75cb2597a3ededfa9d778095d"/><file name="facetValuesSortOrderTest.php" hash="b650080bf9b2cce2ac42a245cb84c911"/><file name="feedCoderTest.php" hash="f2b5dfdd4fa3c4e5d14c790d15235146"/><file name="filterCoderTest.php" hash="46249fa13edccf1e5d5000daf2573b77"/><file name="headerHelperTest.php" hash="62185c34e1e9015bb12014d719287f06"/><file name="helperConfigurationTest.php" hash="be3f74e53e27744e8214f3c341172796"/><file name="intervalTest.php" hash="912389dad049853f6bf0b4eab2af5034"/><file name="introspectionTest.php" hash="351c963d3e1b077c74d029a0d0f58539"/><file name="metaHelperTest.php" hash="080f160b54636c4eee743544a6a12bee"/><file name="metadataHelperTest.php" hash="15435661053dbc0b780f57fdcc343b33"/><file name="pagerHelperTest.php" hash="d96a9891523e453647493f3219e86357"/><file name="promoteBannerReplyHelper.php" hash="94c3c14517536437e9800eaa706fbe29"/><file name="promoteRedirectReplyHelper.php" hash="ed00c66be5127d8b374f6416abf328ef"/><file name="promoteReplyHelperTest.php" hash="7cbb68a7f50c2bd2ef11a085ac94deb2"/><file name="promoteReplysetHelperTest.php" hash="ac2f1e3073015143dc7b2b705711c845"/><file name="queryCoderTest.php" hash="03983a114c6697464f8bf016822ff4a3"/><file name="queryOrchestrationTest.php" hash="02867da7662cdb9f005eb9c1e73dfa30"/><file name="queryTest.php" hash="338264d8e6dbbc09e88bd9a8179e8be4"/><file name="replyHelperTest.php" hash="4d86f19ea7de2aece5d7fd9c143c3dbc"/><file name="replysetHelperTest.php" hash="897f074b8382c6853f51b06a5ee50b0a"/><file name="responseHelperTest.php" hash="269c1af42785d8bcc90ff9139565b0d3"/><file name="searchConnectorTest.php" hash="9201de573884b643041b6c32bc535e7e"/><file name="searchQueryManagerTest.php" hash="2188b262a1c11422bcc8133f68fa6dd9"/><file name="searchTest.php" hash="fa47a7819b5c7c71172d6b1f1e7a02f7"/><file name="spellcheckHelperTest.php" hash="49960fb90055dcf265ef41e491c11325"/><file name="spellcheckTextVisitorTest.php" hash="203f0d08f548a39135517a41f6e9e43a"/><file name="textVisitorTest.php" hash="b722845dd0f5f953574cb51284ad025b"/></dir><file name="afs_base_reply_helper.php" hash="57abe4828b7ed7126db963764faa718a"/><file name="afs_base_replyset_helper.php" hash="096b124a3ebdc6e8d6beb359bd8bb7c5"/><file name="afs_client_data_exception.php" hash="899957af974d04aa7eaca44903a7f86c"/><file name="afs_client_data_helper.php" hash="4700218e2400350014fde428bc86806b"/><file name="afs_cluster_exception.php" hash="86d97623db7aebaa28a20857ce2cf17f"/><file name="afs_cluster_helper.php" hash="60b7fbcc869a672929ef9fc6d840d2b2"/><file name="afs_cluster_parameter.php" hash="20ed527d3ed1a6cf2bc80e032ecd2c7e"/><file name="afs_coder_base.php" hash="fb87fbea43d12695154b3b6102e2a019"/><file name="afs_coder_interface.php" hash="3b179b2513e215751ee4edd190b2a719"/><file name="afs_concept_helper.php" hash="982cf3d2063c565cf19cc6136b049066"/><file name="afs_count.php" hash="9f83f3baa3cf4462c0db786f4eea479a"/><file name="afs_facet.php" hash="1b4d7d35ebe8ed4894fda4881d0b168f"/><file name="afs_facet_combination.php" hash="005e9742ee032194b86856195dd59f7d"/><file name="afs_facet_default.php" hash="cbcb5d28b7b00815ce5248017065e84b"/><file name="afs_facet_exception.php" hash="f1f0afdbf9a727b53c4731e5a40ac417"/><file name="afs_facet_helper.php" hash="b8ad96c57ec80f40bd21a39bb9b5fbb5"/><file name="afs_facet_helper_retriever.php" hash="5628cc41c50ab25fd3336df302d903f4"/><file name="afs_facet_layout.php" hash="c83f6fef1c13ba3cda667c611841ff87"/><file name="afs_facet_manager.php" hash="a3fabb34d56a9614d4a0a2917f6fea0c"/><file name="afs_facet_mode.php" hash="8dcac389a37f8267a367400377631dba"/><file name="afs_facet_sort.php" hash="0d7ba4059b10da9981b9c801355cb874"/><file name="afs_facet_type.php" hash="6df82cbfa627629f9523437994d1fbb1"/><file name="afs_facet_value_formatter.php" hash="d6580281f9ef5c0820615ac385aae863"/><file name="afs_facet_values_sort_mode.php" hash="17def98365132c810515f8cf3c6fb006"/><file name="afs_facet_values_sort_order.php" hash="f95f77cb5dd7015e4f2e6094ddba49a6"/><file name="afs_feed_coder.php" hash="ed7b40e872a7ed5aa30adbcffc05de56"/><file name="afs_filter_coder.php" hash="4edbdcf6760d80465e5d2533014ba307"/><file name="afs_filter_parameter.php" hash="2b03c2c83ffe2e2968aaf50ad4903921"/><file name="afs_fts_mode.php" hash="edbd9342cd9625183e1e01ed81b79fc3"/><file name="afs_header_helper.php" hash="c123aeb736bf2e0506e56831fe516800"/><file name="afs_helper_configuration.php" hash="dbd0378574fbc5729babfbddfef0fd67"/><file name="afs_interval.php" hash="dbf9749881be0a2b063f8a33dff214f3"/><file name="afs_interval_exception.php" hash="40f223de231df03aae59596c1a493065"/><file name="afs_introspection.php" hash="24fdebf9ce3ca4755f6c67233661684c"/><file name="afs_meta_helper.php" hash="8403689868c98db725ebd11748508c8b"/><file name="afs_metadata_helper.php" hash="749c506ea001f63e483934a0647067e6"/><file name="afs_pager_helper.php" hash="077052931e0cffb1e589c21b57156b38"/><file name="afs_producer.php" hash="7c8c515ccb8126523fa0d09a7f759dd5"/><file name="afs_promote_banner_reply_helper.php" hash="418702b3c053029b3aa8fcb2775c65bd"/><file name="afs_promote_redirect_reply_helper.php" hash="be17eda6f8b4552b9ec21183362171a2"/><file name="afs_promote_reply_helper.php" hash="0e2a4f67cd307f74e8b64cd3b158235c"/><file name="afs_promote_replyset_helper.php" hash="fdefc6f8a686addb31ea9b6c0a3fa5ad"/><file name="afs_query.php" hash="bd969a62cd4bbbcb5b9996eaa19353f7"/><file name="afs_query_coder.php" hash="ca0bfad66b8d8549ab3f33380d716732"/><file name="afs_query_coder_interface.php" hash="dd16f17b3606a7418c1c714475b19b51"/><file name="afs_query_object_interface.php" hash="a9af13e2c856e4136ccadfff60f72d36"/><file name="afs_raw_text_visitor.php" hash="fd574583c4c9110165c1cadc67b832de"/><file name="afs_reply_helper.php" hash="3919f9e83cba62be9bc67117b1087b03"/><file name="afs_reply_helper_factory.php" hash="f159f7d0ef7e5a209fb872a970d0d582"/><file name="afs_replyset_helper.php" hash="cb8f81391d9a59904dcb0c3d6ae31999"/><file name="afs_response_exception.php" hash="0a865bb92fb700ae555dcb5ae675f644"/><file name="afs_response_helper.php" hash="f14628e4a9b9d1259af466dd5dadae26"/><file name="afs_search.php" hash="3f2e3ef447515a2fa05b270654ef2969"/><file name="afs_search_connector.php" hash="17242fb6536f4596b2c0198a16986310"/><file name="afs_search_query_manager.php" hash="77e30683ee4ba9e004e9c7c12d9c811d"/><file name="afs_sort_builtins.php" hash="0cc1617a62f1a834a28d7d2ac249b081"/><file name="afs_sort_coder.php" hash="1dfe2d32278383d8465df67535cb91dd"/><file name="afs_sort_order.php" hash="7755deb99386650c9974871474168cda"/><file name="afs_sort_parameter.php" hash="bfb8c59c1560ec8a3b597dc45aa8ecd5"/><file name="afs_spellcheck_helper.php" hash="bb5465848ada7a9df9875f2565fb9686"/><file name="afs_spellcheck_text_helper.php" hash="3ca5c3118660aa600aadb504ceff6c4c"/><file name="afs_spellcheck_text_visitor.php" hash="c44c23ae21f61b065e457911bbc45ed2"/><file name="afs_text_helper.php" hash="59c4ae24560948c3af0f4adbf6bd1803"/><file name="afs_text_visitor.php" hash="867b44a280403cd4567358ec6d59588a"/></dir><file name="afs_configuration_base.php" hash="f26dd9efda4923cc2c71057f21be97d9"/><file name="afs_connector.php" hash="aa04a21163b57ef338bf96bd55e95882"/><file name="afs_exception.php" hash="c1840fe279f9cb313cec151012ed4513"/><file name="afs_feed.php" hash="005305cace79a3aa7719a3c942df9da7"/><file name="afs_multiple_values_parameter.php" hash="96dc30f1fbf137cbfd73c2b195d9f9ef"/><file name="afs_origin.php" hash="a6b7e39a687210572c116afcbea0e7cb"/><file name="afs_query_base.php" hash="7209115a714d9b7de209a0af691c1d22"/><file name="afs_query_parameter.php" hash="6552428d955d0a48c015e1f98ba62815"/><file name="afs_response_helper_base.php" hash="b087f7bdad35ed0526566042ef9afc8c"/><file name="afs_single_value_parameter.php" hash="65d002d7ac6b6e8dd6170309b4c84649"/><file name="orchestration_type.php" hash="047eab54be2eba5500ef747ab7f139b9"/></dir><dir name="AIF"><file name="Makefile" hash="2d232abf9913fcabb44033d5e5d1ebfd"/><dir name="TEST"><file name="Makefile" hash="24d3030d27e88732028d14fb1d81c203"/><file name="afsMultipartResponseTest.php" hash="70a64d0d599ea01806fac2126fb3680a"/><file name="authenticationTest.php" hash="2e476e9ab15ee221ddd63bb555262a28"/><file name="bowsInformationTest.php" hash="3bbfe71f431a35f0285afdca40906874"/><file name="documentManagerTest.php" hash="ad90a6146f5aeee383355bb05425b3dd"/><file name="documentTest.php" hash="59b204b10b90cd764b259ad4c2bc043a"/><file name="pafConnectorTest.php" hash="ac2928b501d9ea167af43dbf3adafa7d"/><file name="pafLiveTest.php" hash="92862c31d151c34b2caf44bff9d0fb80"/></dir><file name="afs_about_connector.php" hash="8972264a9b7cce237ad1a4b47852b529"/><file name="afs_authentication.php" hash="4285035550c9681a047b85abbca64936"/><file name="afs_bows_connector.php" hash="47a6bcafd5eba2361d2cea409f60d3f7"/><file name="afs_bows_connector_interface.php" hash="8fdf9749f0500a39741d696feb55af14"/><file name="afs_bows_exception.php" hash="1bd8657a37b8b4a9e08bfc4eb6b7e416"/><file name="afs_bows_information.php" hash="1f96a4cd84b2332f1186f9e0cea8542d"/><file name="afs_bows_information_cache.php" hash="1ae9a9243342c4e58a52e70473b68472"/><file name="afs_document.php" hash="c0003ec962a79b9d3f642b17bade0fff"/><file name="afs_document_manager.php" hash="8c5c0105d9337b7ae6a9f041f643ea88"/><file name="afs_multipart_response.php" hash="f2077c9eaf121fabdb2fc26c23b2e256"/><file name="afs_paf_connector.php" hash="e787ede85ec77a7bb2c25e666e0c0403"/><file name="afs_paf_live_connector.php" hash="87be0a822a7e18c24ed770050523b4cf"/><file name="afs_paf_upload_reply.php" hash="0cb4905d1c894637d5e6acbd2cffc112"/><file name="afs_token_authentication.php" hash="1f003310f156f0a71db1d273375172d8"/><file name="afs_user_authentication.php" hash="03deeead93ee32753f2f7f80cfc011f4"/></dir><dir name="COMMON"><file name="Makefile" hash="7bb31592939024f74745d6b6cb7fec0b"/><dir name="TEST"><file name="Makefile" hash="d568cfe3683543f363312aa4b6d2bbad"/><file name="languageTest.php" hash="ad0f75b1c2f320c81eba32cade86191c"/><file name="toolsTest.php" hash="9276cb1a275d697f8e8365f2ac340cdf"/><file name="userSessionManagerTest.php" hash="b2b78d6fa156f1a61065f8ee5bfc6e0b"/></dir><file name="afs_connector_base.php" hash="e9fc1284316d907b98f61ce7a43e1721"/><file name="afs_connector_interface.php" hash="68ad5e20a861b85dbf198f79cd2afd4c"/><file name="afs_exception.php" hash="b8eed4376088ae3003d0b77cc523e732"/><file name="afs_helper_base.php" hash="839cca78a663c3a22b4a8e35d1460129"/><file name="afs_helper_format.php" hash="30a3f6e945db7412ef95e83e7b0b5898"/><file name="afs_language.php" hash="277acb15b86089b37c812c47f2141d3c"/><file name="afs_service.php" hash="12c00c906e130860120552c40fa9dbc2"/><file name="afs_service_status.php" hash="1dee172850a76b46987534df89013878"/><file name="afs_tools.php" hash="26f6c01c5a61987925385e7a35260399"/><file name="afs_user_session_manager.php" hash="abd625f6b7b5cecf386dac9d82887764"/><file name="afs_versions.php" hash="556c912ff7f19f5083c4fb44d4d40ac6"/><dir name="lib"><dir name="JsonPath"><file name="JsonPath.php" hash="baa12e1baa9f8a20a095463042e96ad3"/><file name="JsonStore.php" hash="a9632aeb2126e98db9a49403a8f2ff77"/></dir></dir><dir name="php-SAI"><file name="README.md" hash="63ab581c83fe44918e6d074e20f08f95"/><dir name="lib"><dir name="Curl"><file name="Handle.php" hash="0fc7132737da7cee7df6b974447864ac"/></dir><file name="Curl.php" hash="358e4d3afca2035ee4d3f99f372ed15a"/><file name="CurlInterface.php" hash="714fa045dd4546d0c92cd022efb09422"/><file name="CurlStub.php" hash="fbdc0ece6321c5b5a1e27a65449f4a1f"/><dir name="rb_temp"><file name="HttpClient.php" hash="091b91c98acf9f1cd6c3d6d75cddfb88"/><file name="MultiCurl.php" hash="916e85d73bae6e136f889166ebc6db17"/><file name="SimpleCurl.php" hash="c296966a8bda96e03b464a1d3a9c8e06"/></dir></dir><dir name="tests"><file name="SAI_CurlStubTest.php" hash="bce69cbb17a40bd4eeba6bad1133216e"/></dir><file name=".gitignore" hash="09e625dea07b4d4098b19ec998d266f9"/></dir></dir><file name="COPYING" hash="b234ee4d69f5fce4486a80fdaf4a4263"/><file name="COPYING.LESSER" hash="4fbd65380cdd255951079008b364516c"/><file name="FAQ.md" hash="7d7c886674d70a0047303c5d93de6165"/><file name="Makefile" hash="225475a5a4a0204cecbb77621ff38bb2"/><file name="README.md" hash="7ecfd33825a0e6bc50cca099c1c0e50e"/><file name="afs_lib.doxygen" hash="8128d53d894cc57e08142377d13c72f4"/><file name="afs_lib.php" hash="3983ce6bee84b7aeb3f8769f06547978"/><file name="afs_version.php" hash="d6c378547ae2155e8756e6abb9cb7ddd"/><file name="composer.json" hash="39190df70fafa99d7eb5ab566e8edf3f"/><dir name="doc"><file name="afs_filter_documentation.dox" hash="3bf4b96e25d95ce5953b822038c6f135"/><file name="afs_paf_upload.dox" hash="d36893db0234f171e6cfb43f6e13d47c"/><file name="afs_search.dox" hash="b1c5ab8728703822f910852cd17561f4"/><file name="afs_search_coder.dox" hash="77709e1bc691301017f0982e0348a9b9"/><file name="afs_search_query.dox" hash="21dcd1734a165a4cb3b4f62c42a6a0be"/><file name="afs_search_reply.dox" hash="cdb1d42447671f4352927b40b3f8f37d"/><dir name="data"><file name="acp_helper_example.php" hash="2815890e7afbae78e7eb4e6fc5c88f6f"/><file name="full_example.php" hash="e152a964d06e55de460c596070c714d8"/><file name="full_lightweight_example.php" hash="eac3bb2d251052f547a9f737e5cd0461"/><file name="raw_example.php" hash="703356b9284e7fe904cf1334abbe08c9"/><dir name="templates"><file name="error_template.html" hash="70f44bd0f45470d379a11d0a2fe507e4"/><file name="facet_template.html" hash="6836005a7dae45e9415273f1eb6b78e2"/><file name="facet_values_template.html" hash="9b41f2b55a1cecae5724b4fcd4a46cfb"/><file name="meta_template.html" hash="e664a3bb222d272ce2451fb10bf46de4"/><file name="pager_template.html" hash="2700ab5b60a1f9553b1c39374fda63d4"/><file name="result_template.html" hash="1572a4ef4e8dda0b3db1ea77bbed4a98"/><file name="spellcheck_template.html" hash="8042054a1f5a271b47c77f81436c4791"/></dir></dir><file name="detailled_integration_example_with_template.dox" hash="26ef377a6ef546b636a0e254d11d01f5"/><file name="lightweight_integration_example_with_template.dox" hash="5a388d2dbfad63ad6ec353407b79a6bb"/><file name="logo-antidot-long-200x41.png" hash="1ceac3fff767fb5e395bd767344a3d13"/><file name="main.dox" hash="ca3e97f95deead927fb3298ecafbad5e"/><file name="raw_integration_example.dox" hash="56a7126d008c2e49abdf9bf0b5ec9717"/><file name="template_prerequisites.dox" hash="baa24a943e19ff3654227850bd316abb"/><file name="templates_in_details.dox" hash="5e8db94382f1fbd6c4e0b424a9edc9a3"/></dir><file name="rules.mk" hash="ff48aa6a5c40e31b3f38aba1267e9a71"/><dir name="scripts"><file name="gen_doc.sh" hash="0f6fc60aca94da563397d3c710bd9d33"/><file name="increment_version.sh" hash="431db9c60d2f94d251be07957787fcb0"/><file name="print_version.sh" hash="a05ddc19cd27ff185721fe2bd0cffc25"/><file name="version_management.sh" hash="3d5ecd39f45ba081144b3033dbd14330"/></dir><file name=".gitignore" hash="0292f51c0906b2092255872c69603f29"/><file name=".travis.yml" hash="583ae2ce82dac5eb2fac498ae3ce1dec"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="antidot"><file name="CollapsibleLists.css" hash="fa3d62a3b773c4a3cd7559843761f6d8"/><file name="catalogsearch.css" hash="88f7b8e6175e017a3f5d64548d2a0203"/></dir></dir><dir name="images"><dir name="antidot"><file name="button-closed.png" hash="563b78324e0712c0902cb4f77cb9eb86"/><file name="button-open.png" hash="c710849a0d2b61ad1f0fc36c0e59d131"/><file name="button.png" hash="97f3055c5046c851eea2dad7e5227508"/></dir></dir></dir></dir></dir></target></contents>
23
  <compatible/>
24
  <dependencies><required><php><min>5.2.0</min><max>5.6.0</max></php><extension><name>curl</name><min/><max/></extension></required></dependencies>
25
  </package>
skin/frontend/base/default/css/antidot/CollapsibleLists.css ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .treeView {
2
+ -moz-user-select: none;
3
+ position: relative;
4
+ }
5
+ .treeView ul {
6
+ margin: 0 0 0 -1.5em !important;
7
+ padding: 0 0 0 1.5em;
8
+ }
9
+ .treeView li.lastChild > ul {
10
+ background-image: none;
11
+ }
12
+ .treeView li {
13
+ cursor: auto;
14
+ list-style-image: url("../../images/antidot/button.png");
15
+ list-style-position: inside;
16
+ margin: 0;
17
+ padding: 0;
18
+ margin-left: 0px !important;
19
+ }
20
+ .treeView li.collapsibleListOpen {
21
+ cursor: pointer;
22
+ list-style-image: url("../../images/antidot/button-open.png");
23
+ }
24
+ .treeView li.collapsibleListClosed {
25
+ cursor: pointer;
26
+ list-style-image: url("../../images/antidot/button-closed.png");
27
+ }
28
+ .treeView li li {
29
+ padding-left: 1.5em;
30
+ }
skin/frontend/base/default/css/antidot/catalogsearch.css ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .antidot-tabs {
2
+ max-width: 100%;
3
+ float: none;
4
+ list-style: none;
5
+ padding: 0;
6
+ }
7
+
8
+ .antidot-tabs:after {
9
+ content: '';
10
+ display: table;
11
+ clear: both;
12
+ }
13
+
14
+ .antidot-tabs > input[type=radio] {
15
+ display:none;
16
+ }
17
+
18
+ .antidot-tabs > label {
19
+ display: block;
20
+ float: left;
21
+ width: 25%;
22
+
23
+ font-size: 20px;
24
+ font-weight: normal;
25
+ text-decoration: none;
26
+ text-align: center;
27
+ line-height: 2;
28
+
29
+ cursor: pointer;
30
+ box-shadow: inset 0 4px #ccc;
31
+ border-bottom: 4px solid #ccc;
32
+
33
+ -webkit-transition: all 0.5s; /* Safari 3.1 to 6.0 */
34
+ transition: all 0.5s;
35
+ }
36
+
37
+ .antidot-tabs > label i {
38
+ padding: 5px;
39
+ margin-right: 0;
40
+ }
41
+
42
+ .antidot-tabs > label:hover {
43
+ color: #3498db;
44
+ box-shadow: inset 0 4px #3498db;
45
+ border-bottom: 4px solid #3498db;
46
+ }
47
+
48
+ .antidot-tab-content {
49
+ display: none;
50
+ width: 100%;
51
+ float: left;
52
+ padding: 15px;
53
+ box-sizing: border-box;
54
+
55
+ }
56
+
57
+ .antidot-tabs [id^="antidot-tab"]:checked + label {
58
+ background: #FFF;
59
+ box-shadow: inset 0 4px #3498db;
60
+ border-bottom: 4px solid #3498db;
61
+ color: #3498db;
62
+ }
63
+
64
+ #antidot-tab-products:checked ~ #antidot-tab-content-products,
65
+ #antidot-tab-articles:checked ~ #antidot-tab-content-articles,
66
+ #antidot-tab-stores:checked ~ #antidot-tab-content-stores {
67
+ display: block;
68
+ }
skin/frontend/base/default/css/mdn/antidot/CollapsibleLists.css DELETED
@@ -1,44 +0,0 @@
1
- .treeView {
2
- -moz-user-select: none;
3
- position: relative;
4
- }
5
- .treeView ul {
6
- margin: 0 0 0 -1.5em !important;
7
- padding: 0 0 0 1.5em;
8
- }
9
- .treeView ul ul {
10
- /*background: url("../../../images/mdn/antidot/list-item-contents.png") repeat-y scroll left center rgba(0, 0, 0, 0);*/
11
- }
12
- .treeView li.lastChild > ul {
13
- background-image: none;
14
- }
15
- .treeView li {
16
- /*background: url("../../../images/mdn/antidot/list-item-root.png") no-repeat scroll left top rgba(0, 0, 0, 0);*/
17
- cursor: auto;
18
- list-style-image: url("../../../images/mdn/antidot/button.png");
19
- list-style-position: inside;
20
- margin: 0;
21
- padding: 0;
22
- margin-left: 0px !important;
23
- }
24
- .treeView li.collapsibleListOpen {
25
- cursor: pointer;
26
- list-style-image: url("../../../images/mdn/antidot/button-open.png");
27
- }
28
- .treeView li.collapsibleListClosed {
29
- cursor: pointer;
30
- list-style-image: url("../../../images/mdn/antidot/button-closed.png");
31
- }
32
- .treeView li li {
33
- /*background-image: url("../../../images/mdn/antidot/list-item.png");*/
34
- padding-left: 1.5em;
35
- }
36
- .treeView li.lastChild {
37
- /*background-image: url("../../../images/mdn/antidot/list-item-last.png");*/
38
- }
39
- .treeView li.collapsibleListOpen {
40
- /*background-image: url("../../../images/mdn/antidot/list-item-open.png");*/
41
- }
42
- .treeView li.collapsibleListOpen.lastChild {
43
- /*background-image: url("../../../images/mdn/antidot/list-item-last-open.png");*/
44
- }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
skin/frontend/base/default/images/{mdn/antidot → antidot}/button-closed.png RENAMED
File without changes
skin/frontend/base/default/images/{mdn/antidot → antidot}/button-open.png RENAMED
File without changes
skin/frontend/base/default/images/{mdn/antidot → antidot}/button.png RENAMED
File without changes
skin/frontend/base/default/images/mdn/antidot/base.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/cd.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/empty.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/folder.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/folderopen.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/globe.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/imgfolder.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/join.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/joinbottom.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/line.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item-contents.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item-last-open.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item-last.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item-open.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item-root.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/list-item.png DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/minus.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/minusbottom.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/musicfolder.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/nolines_minus.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/nolines_plus.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/page.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/plus.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/plusbottom.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/question.gif DELETED
Binary file
skin/frontend/base/default/images/mdn/antidot/trash.gif DELETED
Binary file