SearchSpring_Manager - Version 1.10.0

Version Notes

Added configuration for the product feed sales data timespan settings
Fixed the TBT Rewards Feed Operation
Changed the way product visibility filter works, allowing implicit Catalog/Search visibilities
Fixed issue where optional dropdown type attributes, that weren't set, were exporting as 'No'

Download this release

Release Info

Developer SearchSpring Development Team
Extension SearchSpring_Manager
Version 1.10.0
Comparing to
See all releases


Code changes from version 1.9.0 to 1.10.0

app/code/community/SearchSpring/Manager/Block/Adminhtml/System/Config/Field/Timespan.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SearchSpring_Manager_Block_Adminhtml_System_Config_Field_Timespan extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ /**
7
+ * Get country selector html
8
+ *
9
+ * @param Varien_Data_Form_Element_Abstract $element
10
+ * @return string
11
+ */
12
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
13
+ {
14
+
15
+ // Get the value for the main element
16
+ $values = explode(',', $element->getValue());
17
+ $number = array_shift($values);
18
+ $increment = array_shift($values);
19
+
20
+ // Set the Value for the increment dropdown, year, month, day...
21
+ $element->setValue($increment);
22
+ $element->setName( $element->getName() . "[]" );
23
+ $element->setStyle('width: 211px;');
24
+
25
+ $box = new Varien_Data_Form_Element_Text(array(
26
+ 'name' => $element->getName(),
27
+ 'value' => "need to figure this out",
28
+ 'no_span' => true,
29
+ 'style' => 'width: 60px;',
30
+ ));
31
+ $box->setForm($element->getForm());
32
+ // Set the Value for the number
33
+ $box->setValue($number);
34
+
35
+ // Put them together
36
+ return $box->getHtml(). $element->getElementHtml();
37
+ }
38
+
39
+ }
app/code/community/SearchSpring/Manager/Factory/GeneratorFactory.php CHANGED
@@ -133,6 +133,8 @@ class SearchSpring_Manager_Factory_GeneratorFactory
133
  SearchSpring_Manager_Entity_OperationsCollection $operationsCollection,
134
  SearchSpring_Manager_Entity_RecordsCollection $productRecords
135
  ) {
 
 
136
  $operationsBuilder->setSanitizer(new SearchSpring_Manager_String_Sanitizer())
137
  ->setRecords($productRecords)
138
  ->setClassPrefix(SearchSpring_Manager_Operation_Product::OPERATION_CLASS_PREFIX);
@@ -142,13 +144,20 @@ class SearchSpring_Manager_Factory_GeneratorFactory
142
  $operationsCollection->append($operationsBuilder->build('SetImages'));
143
  $operationsCollection->append($operationsBuilder->build('SetOptions'));
144
  $operationsCollection->append($operationsBuilder->build('SetCategories'));
145
- $operationsCollection->append($operationsBuilder->build('SetReport'));
 
 
 
 
 
 
 
146
 
147
  // add pricing factory and if we should display zero priced products as additional data
148
  $operationsCollection->append($operationsBuilder->build('SetPricing',
149
  array(
150
  'pricingFactory' => new SearchSpring_Manager_Factory_PricingFactory(),
151
- 'displayZeroPrice' => (int)Mage::helper('searchspring_manager')->isZeroPriceIndexingEnabled(),
152
  )
153
  )
154
  );
133
  SearchSpring_Manager_Entity_OperationsCollection $operationsCollection,
134
  SearchSpring_Manager_Entity_RecordsCollection $productRecords
135
  ) {
136
+ $hlp = Mage::helper('searchspring_manager');
137
+
138
  $operationsBuilder->setSanitizer(new SearchSpring_Manager_String_Sanitizer())
139
  ->setRecords($productRecords)
140
  ->setClassPrefix(SearchSpring_Manager_Operation_Product::OPERATION_CLASS_PREFIX);
144
  $operationsCollection->append($operationsBuilder->build('SetImages'));
145
  $operationsCollection->append($operationsBuilder->build('SetOptions'));
146
  $operationsCollection->append($operationsBuilder->build('SetCategories'));
147
+
148
+ // Parameter for timespan comes from user configuration, by default
149
+ $operationsCollection->append($operationsBuilder->build('SetReport',
150
+ array(
151
+ 'timespan' => $hlp->getSalesRankTimespan(),
152
+ )
153
+ )
154
+ );
155
 
156
  // add pricing factory and if we should display zero priced products as additional data
157
  $operationsCollection->append($operationsBuilder->build('SetPricing',
158
  array(
159
  'pricingFactory' => new SearchSpring_Manager_Factory_PricingFactory(),
160
+ 'displayZeroPrice' => (int)$hlp->isZeroPriceIndexingEnabled(),
161
  )
162
  )
163
  );
app/code/community/SearchSpring/Manager/Helper/Data.php CHANGED
@@ -18,7 +18,10 @@ class SearchSpring_Manager_Helper_Data extends Mage_Core_Helper_Abstract
18
  const XML_PATH_GLOBAL_LIVE_INDEXING_ENABLE_FL = 'ssmanager/ssmanager_general/live_indexing';
19
  const XML_PATH_INDEX_ZERO_PRICE = 'ssmanager/ssmanager_general/index_zero_price';
20
  const XML_PATH_INDEX_OUT_OF_STOCK = 'ssmanager/ssmanager_general/index_out_of_stock';
21
- const XML_PATH_FEED_PATH = 'ssmanager/ssmanager_general/feed_path';
 
 
 
22
 
23
  const XML_PATH_GLOBAL_CATEGORY_ENABLE_FL = 'ssmanager/ssmanager_catalog/enable_categories';
24
 
@@ -72,9 +75,14 @@ class SearchSpring_Manager_Helper_Data extends Mage_Core_Helper_Abstract
72
  return Mage::getStoreConfigFlag(self::XML_PATH_INDEX_OUT_OF_STOCK);
73
  }
74
 
 
 
 
 
 
75
  public function getFeedPath()
76
  {
77
- return Mage::getStoreConfig(self::XML_PATH_FEED_PATH);
78
  }
79
 
80
  public function getApiFeedId()
18
  const XML_PATH_GLOBAL_LIVE_INDEXING_ENABLE_FL = 'ssmanager/ssmanager_general/live_indexing';
19
  const XML_PATH_INDEX_ZERO_PRICE = 'ssmanager/ssmanager_general/index_zero_price';
20
  const XML_PATH_INDEX_OUT_OF_STOCK = 'ssmanager/ssmanager_general/index_out_of_stock';
21
+
22
+ const XML_PATH_FEED_SETTING_PATH = 'ssmanager/ssmanager_feed/feed_path';
23
+
24
+ const XML_PATH_SALES_RANK_TIMESPAN = 'ssmanager/ssmanager_sales_rank/timespan';
25
 
26
  const XML_PATH_GLOBAL_CATEGORY_ENABLE_FL = 'ssmanager/ssmanager_catalog/enable_categories';
27
 
75
  return Mage::getStoreConfigFlag(self::XML_PATH_INDEX_OUT_OF_STOCK);
76
  }
77
 
78
+ public function getSalesRankTimespan()
79
+ {
80
+ return Mage::getStoreConfig(self::XML_PATH_SALES_RANK_TIMESPAN);
81
+ }
82
+
83
  public function getFeedPath()
84
  {
85
+ return Mage::getStoreConfig(self::XML_PATH_FEED_SETTING_PATH);
86
  }
87
 
88
  public function getApiFeedId()
app/code/community/SearchSpring/Manager/Helper/Product.php CHANGED
@@ -17,15 +17,28 @@ class SearchSpring_Manager_Helper_Product extends Mage_Core_Helper_Abstract
17
 
18
  public function getAttributeText($product, $attributeCode) {
19
 
20
- $attribute = $product->getResource()->getAttribute($attributeCode);
 
 
 
 
 
21
 
22
- // If the attribute type uses a set number of options, we need to resolve the id
23
- if ($attribute->getFrontendInput() === 'select' ||
24
- $attribute->getFrontendInput() === 'multiselect'
25
  ) {
 
 
 
 
 
 
26
  return $product->getAttributeText($attributeCode);
 
27
  } else {
28
- return $product->getData($attributeCode);
 
 
29
  }
30
 
31
  }
17
 
18
  public function getAttributeText($product, $attributeCode) {
19
 
20
+ if ($attributeCode instanceof Mage_Eav_Model_Entity_Attribute) {
21
+ $attribute = $attributeCode;
22
+ $attributeCode = $attribute->getAttributeCode();
23
+ } else {
24
+ $attribute = $product->getResource()->getAttribute($attributeCode);
25
+ }
26
 
27
+ if ($attribute->getFrontendInput() === 'boolean' ||
28
+ $attribute->getFrontendInput() === 'select'
 
29
  ) {
30
+
31
+ // Magento's Attribute Frontend getValue() function
32
+ // returns 'No' for optional attributes with nothing
33
+ // set, specifically for these types...
34
+ // So we'll just try and resolve from the attribute
35
+ // options map, or empty if the value isn't set.
36
  return $product->getAttributeText($attributeCode);
37
+
38
  } else {
39
+
40
+ return $attribute->getFrontend()->getValue($product);
41
+
42
  }
43
 
44
  }
app/code/community/SearchSpring/Manager/Model/Source.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SearchSpring_Manager_Model_Source extends SearchSpring_Manager_Model_Source_Abstract
4
+ {
5
+
6
+ public function toOptionHash($selector=false)
7
+ {
8
+ $hlp = Mage::helper('searchspring_manager');
9
+
10
+ $options = array();
11
+
12
+ switch ($this->getPath()) {
13
+
14
+ case SearchSpring_Manager_Helper_Data::XML_PATH_SALES_RANK_TIMESPAN:
15
+
16
+ $options = array(
17
+ 'day' => $hlp->__('Day(s)'),
18
+ 'week' => $hlp->__('Week(s)'),
19
+ 'month' => $hlp->__('Month(s)'),
20
+ 'year' => $hlp->__('Year(s)'),
21
+ );
22
+
23
+ break;
24
+
25
+ default:
26
+ Mage::throwException($hlp->__('Invalid request for source options: '.$this->getPath()));
27
+
28
+ }
29
+
30
+ if ($selector) {
31
+ $options = array(''=>$hlp->__('* Please select')) + $options;
32
+ }
33
+
34
+ return $options;
35
+ }
36
+
37
+ }
38
+
app/code/community/SearchSpring/Manager/Model/Source/Abstract.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ abstract class SearchSpring_Manager_Model_Source_Abstract extends Varien_Object
4
+ {
5
+ abstract public function toOptionHash($selector=false);
6
+
7
+ public function toOptionArray($selector=false)
8
+ {
9
+ $arr = array();
10
+ foreach ($this->toOptionHash($selector) as $v=>$l) {
11
+ if (!is_array($l)) {
12
+ $arr[] = array('label'=>$l, 'value'=>$v);
13
+ } else {
14
+ $options = array();
15
+ foreach ($l as $v1=>$l1) {
16
+ $options[] = array('value'=>$v1, 'label'=>$l1);
17
+ }
18
+ $arr[] = array('label'=>$v, 'value'=>$options);
19
+ }
20
+ }
21
+ return $arr;
22
+ }
23
+
24
+ public function getOptionLabel($value)
25
+ {
26
+ $options = $this->toOptionHash();
27
+ if (is_array($value)) {
28
+ $result = array();
29
+ foreach ($value as $v) {
30
+ $result[$v] = isset($options[$v]) ? $options[$v] : $v;
31
+ }
32
+ } else {
33
+ $result = isset($options[$value]) ? $options[$value] : $value;
34
+ }
35
+ return $result;
36
+ }
37
+ }
38
+
app/code/community/SearchSpring/Manager/Operation/Product/SetCoreFields.php CHANGED
@@ -31,6 +31,8 @@ class SearchSpring_Manager_Operation_Product_SetCoreFields extends SearchSpring_
31
  const FEED_CHILD_SKU = 'child_sku';
32
  const FEED_CHILD_NAME = 'child_name';
33
  const FEED_DAYS_OLD = 'days_old';
 
 
34
  /**#@-*/
35
 
36
 
@@ -55,6 +57,8 @@ class SearchSpring_Manager_Operation_Product_SetCoreFields extends SearchSpring_
55
  * - child_name
56
  * - child_sku
57
  * - days_old
 
 
58
  *
59
  * @param Mage_Catalog_Model_Product $product
60
  *
@@ -87,6 +91,8 @@ class SearchSpring_Manager_Operation_Product_SetCoreFields extends SearchSpring_
87
 
88
  $this->setDaysOld($product);
89
 
 
 
90
  return $this;
91
  }
92
 
@@ -182,4 +188,17 @@ class SearchSpring_Manager_Operation_Product_SetCoreFields extends SearchSpring_
182
 
183
  return $quantity;
184
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  }
31
  const FEED_CHILD_SKU = 'child_sku';
32
  const FEED_CHILD_NAME = 'child_name';
33
  const FEED_DAYS_OLD = 'days_old';
34
+ const FEED_VISIBILITY_IN_SEARCH = 'visible_in_search';
35
+ const FEED_VISIBILITY_IN_CATALOG = 'visible_in_catalog';
36
  /**#@-*/
37
 
38
 
57
  * - child_name
58
  * - child_sku
59
  * - days_old
60
+ * - visible_in_search
61
+ * - visible_in_catalog
62
  *
63
  * @param Mage_Catalog_Model_Product $product
64
  *
91
 
92
  $this->setDaysOld($product);
93
 
94
+ $this->setVisibility($product);
95
+
96
  return $this;
97
  }
98
 
188
 
189
  return $quantity;
190
  }
191
+
192
+ private function setVisibility($product) {
193
+
194
+ $vis = Mage::getSingleton('catalog/product_visibility');
195
+
196
+ $searchFl = in_array($product->getVisibility(), $vis->getVisibleInSearchIds());
197
+ $catalogFl = in_array($product->getVisibility(), $vis->getVisibleInCatalogIds());
198
+
199
+ $this->getRecords()->set(self::FEED_VISIBILITY_IN_SEARCH, (int) $searchFl);
200
+ $this->getRecords()->set(self::FEED_VISIBILITY_IN_CATALOG, (int) $catalogFl);
201
+
202
+ }
203
+
204
  }
app/code/community/SearchSpring/Manager/Operation/Product/SetFields.php CHANGED
@@ -25,40 +25,18 @@ class SearchSpring_Manager_Operation_Product_SetFields extends SearchSpring_Mana
25
  /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
26
  foreach($product->getAttributes() as $key => $attribute) {
27
  $value = $this->getAttributeValue($product, $attribute);
28
- if (!is_array($value)) {
29
- $this->getRecords()->add($key, $value);
30
- } else {
31
  foreach($value as $v) {
32
  $this->getRecords()->add($key, $v);
33
  }
 
 
34
  }
35
  }
36
 
37
  return $this;
38
  }
39
 
40
- /**
41
- * If product is not enabled or visible, set invalid
42
- *
43
- * @param Mage_Catalog_Model_Product $product
44
- *
45
- * @return bool
46
- */
47
- public function isValid(Mage_Catalog_Model_Product $product)
48
- {
49
- // product must be enabled
50
- if ((int)$product->getData('status') !== Mage_Catalog_Model_Product_Status::STATUS_ENABLED) {
51
- return false;
52
- }
53
-
54
- // product must be visible in catalog and search
55
- if ((int)$product->getData('visibility') !== Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) {
56
- return false;
57
- }
58
-
59
- return true;
60
- }
61
-
62
  /**
63
  * Get the attribute value from the attribute object
64
  *
@@ -69,15 +47,18 @@ class SearchSpring_Manager_Operation_Product_SetFields extends SearchSpring_Mana
69
  */
70
  private function getAttributeValue(Mage_Catalog_Model_Product $product, Mage_Eav_Model_Entity_Attribute $attribute)
71
  {
72
- $attributeValue = $attribute->getFrontend()->getValue($product);
73
- $returnValue = null;
74
 
75
  if (is_array($attributeValue)) {
 
76
  foreach ($attributeValue as $v) {
77
  $returnValue[] = json_encode($v);
78
  }
79
- } else {
80
  $returnValue = $this->getSanitizer()->sanitizeForRequest($attributeValue);
 
 
 
81
  }
82
 
83
  return $returnValue;
25
  /** @var Mage_Catalog_Model_Resource_Eav_Attribute $attribute */
26
  foreach($product->getAttributes() as $key => $attribute) {
27
  $value = $this->getAttributeValue($product, $attribute);
28
+ if (is_array($value)) {
 
 
29
  foreach($value as $v) {
30
  $this->getRecords()->add($key, $v);
31
  }
32
+ } else if ($value !== false) {
33
+ $this->getRecords()->set($key, $value);
34
  }
35
  }
36
 
37
  return $this;
38
  }
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  /**
41
  * Get the attribute value from the attribute object
42
  *
47
  */
48
  private function getAttributeValue(Mage_Catalog_Model_Product $product, Mage_Eav_Model_Entity_Attribute $attribute)
49
  {
50
+ $attributeValue = Mage::helper('searchspring_manager/product')->getAttributeText($product, $attribute);
 
51
 
52
  if (is_array($attributeValue)) {
53
+ $returnValue = null;
54
  foreach ($attributeValue as $v) {
55
  $returnValue[] = json_encode($v);
56
  }
57
+ } else if ($attributeValue !== false && $attributeValue !== null) {
58
  $returnValue = $this->getSanitizer()->sanitizeForRequest($attributeValue);
59
+ } else {
60
+ // This means there should be no value for this attribute
61
+ $returnValue = false;
62
  }
63
 
64
  return $returnValue;
app/code/community/SearchSpring/Manager/Operation/Product/SetReport.php CHANGED
@@ -31,9 +31,6 @@ class SearchSpring_Manager_Operation_Product_SetReport extends SearchSpring_Mana
31
  const FEED_ORDERS_COUNT = 'report_orders_count';
32
  const FEED_ORDERS_QTY = 'report_orders_qty';
33
 
34
- // Default timespan, 1 year, so we don't accidentally overload their database
35
- const DEFAULT_REPORT_TIMESPAN = '1 year';
36
-
37
  public function prepare(Mage_Catalog_Model_Resource_Product_Collection $productCollection) {
38
 
39
  $this->fetchReportData(
@@ -81,14 +78,14 @@ class SearchSpring_Manager_Operation_Product_SetReport extends SearchSpring_Mana
81
  public function getProductReport(Mage_Catalog_Model_Product $product) {
82
 
83
  // Make sure we have report data
84
- if (!$this->_reportData) {
85
  // If we don't have data, then we'll fetch it with the requested product
86
  // NOTE: This should only happen if the person using the class didn't request
87
  // preparation with a product collection
88
  $this->fetchReportData(array($product->getId()), $product->getStoreId());
89
 
90
  // If we still don't have the data, then we can't support this feature
91
- if (!$this->_reportData) {
92
  return false;
93
  }
94
  }
@@ -169,14 +166,29 @@ class SearchSpring_Manager_Operation_Product_SetReport extends SearchSpring_Mana
169
  return $reportCollection;
170
  }
171
 
172
- // TODO -- Figure out how to add from and to dates as parameters, might need to add them as configuration items as well
173
  public function getParamReportStartDate() {
174
- return date('Y-m-d H:i:s', strtotime('-' . self::DEFAULT_REPORT_TIMESPAN));
 
 
 
 
 
 
 
 
 
 
175
  }
176
 
177
  public function getParamReportEndDate() {
 
178
  // Up till now
179
  return date('Y-m-d H:i:s');
180
  }
181
 
 
 
 
 
 
182
  }
31
  const FEED_ORDERS_COUNT = 'report_orders_count';
32
  const FEED_ORDERS_QTY = 'report_orders_qty';
33
 
 
 
 
34
  public function prepare(Mage_Catalog_Model_Resource_Product_Collection $productCollection) {
35
 
36
  $this->fetchReportData(
78
  public function getProductReport(Mage_Catalog_Model_Product $product) {
79
 
80
  // Make sure we have report data
81
+ if (is_null($this->_reportData)) {
82
  // If we don't have data, then we'll fetch it with the requested product
83
  // NOTE: This should only happen if the person using the class didn't request
84
  // preparation with a product collection
85
  $this->fetchReportData(array($product->getId()), $product->getStoreId());
86
 
87
  // If we still don't have the data, then we can't support this feature
88
+ if (is_null($this->_reportData)) {
89
  return false;
90
  }
91
  }
166
  return $reportCollection;
167
  }
168
 
 
169
  public function getParamReportStartDate() {
170
+
171
+ $fromTime = strtotime('-' . $this->getTimespan());
172
+
173
+ // If we can't convert the timespan to a time, we can't do anything with it
174
+ if ($fromTime === false) {
175
+ // TODO -- log when we have a debug logger
176
+ // Mage::helper('searchspring_manager/debug')->log("Can't convert timespan to time: " . $this->getTimespan());
177
+ return '';
178
+ }
179
+
180
+ return date('Y-m-d H:i:s', $fromTime);
181
  }
182
 
183
  public function getParamReportEndDate() {
184
+
185
  // Up till now
186
  return date('Y-m-d H:i:s');
187
  }
188
 
189
+ public function getTimespan() {
190
+ $timespan = $this->getParameter('timespan');
191
+ return implode(' ', explode(',', $timespan) );
192
+ }
193
+
194
  }
app/code/community/SearchSpring/Manager/Provider/ProductCollection/FeedProvider.php CHANGED
@@ -62,8 +62,8 @@ class SearchSpring_Manager_Provider_ProductCollection_FeedProvider
62
  $collection->addStoreFilter(Mage::app()->getStore($this->requestParams->getStore())->getId());
63
  $collection->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
64
  $collection->addAttributeToFilter('type_id', array('in' => SearchSpring_Manager_Validator_ProductValidator::$allowableTypes));
65
- $collection->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
66
 
 
67
 
68
  if (!Mage::helper('searchspring_manager')->isOutOfStockIndexingEnabled()) {
69
  Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
62
  $collection->addStoreFilter(Mage::app()->getStore($this->requestParams->getStore())->getId());
63
  $collection->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
64
  $collection->addAttributeToFilter('type_id', array('in' => SearchSpring_Manager_Validator_ProductValidator::$allowableTypes));
 
65
 
66
+ Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection);
67
 
68
  if (!Mage::helper('searchspring_manager')->isOutOfStockIndexingEnabled()) {
69
  Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
app/code/community/SearchSpring/Manager/Provider/ProductCollection/ProductProvider.php CHANGED
@@ -69,8 +69,10 @@ class SearchSpring_Manager_Provider_ProductCollection_ProductProvider
69
  /** @var Mage_Catalog_Model_Resource_Product_Collection $collection */
70
  $collection = Mage::getModel('catalog/product')
71
  ->getCollection()
72
- ->addAttributeToFilter('entity_id', array('in' => $this->ids))
73
- ->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
 
 
74
 
75
  if (null !== $this->requestParams) {
76
  $collection->getSelect()->limit($this->requestParams->getCount(), $this->requestParams->getOffset());
69
  /** @var Mage_Catalog_Model_Resource_Product_Collection $collection */
70
  $collection = Mage::getModel('catalog/product')
71
  ->getCollection()
72
+ ->addAttributeToFilter('entity_id', array('in' => $this->ids))
73
+ ;
74
+
75
+ Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection);
76
 
77
  if (null !== $this->requestParams) {
78
  $collection->getSelect()->limit($this->requestParams->getCount(), $this->requestParams->getOffset());
app/code/community/SearchSpring/Manager/ThirdParty/TBT/RewardsOperation.php CHANGED
@@ -17,14 +17,25 @@ class SearchSpring_Manager_ThirdParty_TBT_RewardsOperation extends SearchSpring_
17
 
18
  public function perform(Mage_Catalog_Model_Product $product)
19
  {
 
20
 
21
- $value = $product->getEarnablePoints();
 
 
 
 
 
 
 
 
 
22
 
23
- if (is_array($value)) {
24
- $value = current($value);
 
25
  }
26
 
27
- $this->getRecords()->add('TBT_Rewards_earnable_points', $value);
28
 
29
  return $this;
30
  }
17
 
18
  public function perform(Mage_Catalog_Model_Product $product)
19
  {
20
+ // This might look a little weird, but bear with me...
21
 
22
+ // Make sure the base TBT product class exists, you never know...
23
+ if (!class_exists('TBT_Rewards_Model_Catalog_Product')) {
24
+ return $this;
25
+ }
26
+
27
+ // Create new product model, with Magento service locator, in case someone is overwriting
28
+ $rewardsProduct = Mage::getModel('rewards/catalog_product', $product->getData());
29
+
30
+ // Now we have a rewards product model, without having to touch the database again
31
+ $points = $rewardsProduct->getEarnablePoints();
32
 
33
+ // It should be returned as an array...
34
+ if (is_array($points)) {
35
+ $points = current($points);
36
  }
37
 
38
+ $this->getRecords()->add('TBT_Rewards_earnable_points', $points);
39
 
40
  return $this;
41
  }
app/code/community/SearchSpring/Manager/Validator/ProductValidator.php CHANGED
@@ -59,8 +59,8 @@ class SearchSpring_Manager_Validator_ProductValidator implements Zend_Validate_I
59
 
60
  // if product became not visible
61
  if (
62
- $visibility !== Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH
63
- && $origVisibility === Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH
64
  ) {
65
  return true;
66
  }
@@ -111,9 +111,9 @@ class SearchSpring_Manager_Validator_ProductValidator implements Zend_Validate_I
111
  $this->messages[] = 'Product is not an allowable type.';
112
  }
113
 
114
- // product must be visible in catalog and search
115
- if ((int)$product->getData('visibility') !== Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) {
116
- $this->messages[] = 'Product must be visible in catalog and search';
117
  }
118
 
119
  // if we have errors, return false
59
 
60
  // if product became not visible
61
  if (
62
+ $visibility === Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE
63
+ && $origVisibility !== Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE
64
  ) {
65
  return true;
66
  }
111
  $this->messages[] = 'Product is not an allowable type.';
112
  }
113
 
114
+ // product must be visible in either catalog and search
115
+ if (!$product->isVisibleInSiteVisibility()) {
116
+ $this->messages[] = 'Product must be visible in either catalog and search';
117
  }
118
 
119
  // if we have errors, return false
app/code/community/SearchSpring/Manager/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <SearchSpring_Manager>
5
- <version>1.9.0</version>
6
  </SearchSpring_Manager>
7
  </modules>
8
  <global>
@@ -169,7 +169,6 @@
169
  <ssmanager>
170
  <ssmanager_general>
171
  <live_indexing>0</live_indexing>
172
- <feed_path>media/searchspring/feed/</feed_path>
173
  </ssmanager_general>
174
  <ssmanager_catalog>
175
  <enable_categories>0</enable_categories>
@@ -177,6 +176,12 @@
177
  <ssmanager_images>
178
  <generate_cache_images>1</generate_cache_images>
179
  </ssmanager_images>
 
 
 
 
 
 
180
  <ssmanager_api>
181
  <authentication_method>simple</authentication_method>
182
  </ssmanager_api>
2
  <config>
3
  <modules>
4
  <SearchSpring_Manager>
5
+ <version>1.10.0</version>
6
  </SearchSpring_Manager>
7
  </modules>
8
  <global>
169
  <ssmanager>
170
  <ssmanager_general>
171
  <live_indexing>0</live_indexing>
 
172
  </ssmanager_general>
173
  <ssmanager_catalog>
174
  <enable_categories>0</enable_categories>
176
  <ssmanager_images>
177
  <generate_cache_images>1</generate_cache_images>
178
  </ssmanager_images>
179
+ <ssmanager_feed>
180
+ <feed_path>media/searchspring/feed/</feed_path>
181
+ </ssmanager_feed>
182
+ <ssmanager_sales_rank>
183
+ <timespan>6,month</timespan>
184
+ </ssmanager_sales_rank>
185
  <ssmanager_api>
186
  <authentication_method>simple</authentication_method>
187
  </ssmanager_api>
app/code/community/SearchSpring/Manager/etc/system.xml CHANGED
@@ -77,15 +77,6 @@
77
  <show_in_website>1</show_in_website>
78
  <show_in_store>1</show_in_store>
79
  </index_out_of_stock>
80
- <feed_path translate="label">
81
- <label>Feed Path</label>
82
- <comment>Relative to the base Magento installation directory. Must be writable. Recommended: media/searchspring/feed/</comment>
83
- <frontend_type>text</frontend_type>
84
- <sort_order>20</sort_order>
85
- <show_in_default>1</show_in_default>
86
- <show_in_website>0</show_in_website>
87
- <show_in_store>0</show_in_store>
88
- </feed_path>
89
  </fields>
90
  </ssmanager_general>
91
  <ssmanager_images translate="label" module="searchspring_manager">
@@ -126,6 +117,46 @@
126
  </image_height>
127
  </fields>
128
  </ssmanager_images>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  <ssmanager_catalog translate="label" module="searchspring_manager">
130
  <label>Catalog Configuration</label>
131
  <frontend_type>text</frontend_type>
77
  <show_in_website>1</show_in_website>
78
  <show_in_store>1</show_in_store>
79
  </index_out_of_stock>
 
 
 
 
 
 
 
 
 
80
  </fields>
81
  </ssmanager_general>
82
  <ssmanager_images translate="label" module="searchspring_manager">
117
  </image_height>
118
  </fields>
119
  </ssmanager_images>
120
+ <ssmanager_feed translate="label" module="searchspring_manager">
121
+ <label>Feed Settings</label>
122
+ <frontend_type>text</frontend_type>
123
+ <sort_order>180</sort_order>
124
+ <show_in_default>1</show_in_default>
125
+ <show_in_website>1</show_in_website>
126
+ <show_in_store>1</show_in_store>
127
+ <fields>
128
+ <feed_path translate="label">
129
+ <label>Feed Path</label>
130
+ <comment>Relative to the base Magento installation directory. Must be writable. Recommended: media/searchspring/feed/</comment>
131
+ <frontend_type>text</frontend_type>
132
+ <sort_order>100</sort_order>
133
+ <show_in_default>1</show_in_default>
134
+ <show_in_website>0</show_in_website>
135
+ <show_in_store>0</show_in_store>
136
+ </feed_path>
137
+ </fields>
138
+ </ssmanager_feed>
139
+ <ssmanager_sales_rank translate="label" module="searchspring_manager">
140
+ <label>Sales Rank Settings</label>
141
+ <frontend_type>text</frontend_type>
142
+ <sort_order>190</sort_order>
143
+ <show_in_default>1</show_in_default>
144
+ <show_in_website>1</show_in_website>
145
+ <show_in_store>1</show_in_store>
146
+ <fields>
147
+ <timespan translate="label">
148
+ <label>Sales Rank Timespan</label>
149
+ <comment>How far back should we go to fetch sales rank numbers? This setting can affect performance of the feed regeneration.</comment>
150
+ <frontend_model>searchspring_manager/adminhtml_system_config_field_timespan</frontend_model>
151
+ <frontend_type>select</frontend_type>
152
+ <source_model>searchspring_manager/source</source_model>
153
+ <sort_order>100</sort_order>
154
+ <show_in_default>1</show_in_default>
155
+ <show_in_website>1</show_in_website>
156
+ <show_in_store>1</show_in_store>
157
+ </timespan>
158
+ </fields>
159
+ </ssmanager_sales_rank>
160
  <ssmanager_catalog translate="label" module="searchspring_manager">
161
  <label>Catalog Configuration</label>
162
  <frontend_type>text</frontend_type>
package.xml CHANGED
@@ -1,6 +1,5 @@
1
  <?xml version="1.0"?>
2
- <package><name>SearchSpring_Manager</name><version>1.9.0</version><stability>stable</stability><license>SearchSpring Terms of Service</license><channel>community</channel><extends></extends><summary>Connects your Magento store to SearchSpring's subscription-based site search and category navigation services.</summary><description>SearchSpring improves the default Magento site search. Providing merchants with flexible, learning technology that enhances site search functionality, optimizes product results in real-time, allows for custom navigation, automates product SEO and provides fully configurable merchandising. Shoppers will find your products quickly and easily, generating repeat visits and increased sales!</description><notes>Speed Optimizations for Feed Regeneration
3
- Better Root Category skipping logic
4
- Added Support for Amasty Labels
5
- Added Support for TBT Rewards (product earnable points)
6
- Added Support for product qty sales data</notes><authors><author><name>SearchSpring Development Team</name><user>searchspring</user><email>info@searchspring.com</email></author></authors><date>2015-02-05</date><time>10:12:29</time><compatible></compatible><dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies><contents><target name="mage"><dir name="app"><dir name="code"><dir name="community"><dir name="SearchSpring"><file name="ErrorCodes.php" hash="fd8f65524b8f8708471f106aad294d0a"/><dir name="Manager"><file name="Collection.php" hash="0ebd621892bccd5d59ed3edcafada89b"/><file name="Iterator.php" hash="6f68effbe5452c1a6abd97cbf4b528ee"/><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Fieldset"><file name="Hint.php" hash="82ff17ab23c59b1c5fd095dfdfe153bb"/><file name="Setup.php" hash="5f467825780852b12cba72abfbe9e596"/></dir></dir></dir></dir><dir name="Layer"><file name="View.php" hash="ae69c24e04b03048cc2cd9b7cc436603"/><dir name="Filter"><file name="SearchSpringCategory.php" hash="39fc479e15275db637c227e596d040f5"/><file name="SearchSpringList.php" hash="743bb9cb690c9df3d74e9de2c206d020"/></dir></dir></dir><dir name="Builder"><file name="OperationBuilder.php" hash="d85ad0a561091d34b3b98efd95646962"/></dir><dir name="controllers"><file name="GenerateController.php" hash="a8b0e0bd6d735ce33ca7ed09ecea3a24"/></dir><dir name="Entity"><file name="IndexingRequestBody.php" hash="6bdab2264cbb8dbafa666f493bf9bd60"/><file name="OperationsCollection.php" hash="be19c06bb1be447bd57601e67ac87557"/><file name="RecordsCollection.php" hash="c336526a10625a859c093d2b25dff911"/><file name="RequestBody.php" hash="4b6d7fd23f57527e9d53dd938d69a88d"/><file name="RequestParams.php" hash="f4778075264cd441c87e8de220fdd2a9"/><file name="SearchCollection.php" hash="e64543d4315c16d7a0717da8ec081e09"/><file name="SearchRequestBody.php" hash="bdfd9a2244ce1f9a7db8daca6e613176"/><file name="SearchResult.php" hash="863a720b8a837bd7e56e8a7fa781a1a1"/><dir name="SearchResult"><file name="Result.php" hash="ea4e36fe95e4c412af8d525a4628db5d"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="879a64f061de25cbd1292f4ead6c5b15"/><file name="api2.xml" hash="c958f2f25b6fcd0b467dc20fb945f1b4"/><file name="composer.json" hash="6a36df77eee995788585f7a8a535fa27"/><file name="config.xml" hash="6d87f085ce5b36604a47db301a0b4527"/><file name="readme.md" hash="30d24e1aae89696090dcf22203802ad2"/><file name="system.xml" hash="2d51547a4619f7f81eab4bdba265211e"/></dir><dir name="Factory"><file name="ApiFactory.php" hash="2a0b31683e75cfa4c10bf6476a7346bf"/><file name="GeneratorFactory.php" hash="83662be86412dff1705b32bf2ba76402"/><file name="IndexingRequestBodyFactory.php" hash="10e0717f6d938a06a9cfc68f6ac1ceaf"/><file name="PricingFactory.php" hash="bbba11efb7a2fd6ebf8c47d896c365a2"/><file name="SearchRequestBodyFactory.php" hash="4eb409f25d480ca11b08f206f7f4facc"/></dir><dir name="Generator"><file name="ProductGenerator.php" hash="69147879853105d0a388596b479a0b81"/></dir><dir name="Handler"><file name="ApiErrorHandler.php" hash="a287ed86d8d83a88b5a8f555015f2e80"/></dir><dir name="Helper"><file name="Data.php" hash="78fddf7a5cae29ea3054309d4c4f46bd"/><file name="Http.php" hash="13d41de08d623892f6526817bf4ee971"/><file name="Oauth.php" hash="b6dd04c07e1322c38b76668b88d7d1e4"/><file name="Product.php" hash="6cdbcdaa30691ff3023b93557018b497"/><file name="Webservice.php" hash="054d23d7db9da73b44bcbad083bd813e"/></dir><dir name="Model"><file name="Layer.php" hash="54afafde0cff2fcf2de2240bbb6cdb20"/><dir name="Api2"><dir name="Auth"><file name="Adapter.php" hash="909c416381a44ef80b0665926a9e4ab2"/></dir><dir name="Indexing"><dir name="Rest"><dir name="Admin"><file name="V1.php" hash="3a306d75dccab962e7c81ecb82d35c60"/></dir></dir></dir></dir><dir name="Catalog"><dir name="Category"><dir name="Attribute"><dir name="EnableSearchSpring"><file name="Backend.php" hash="12d9799f273951ca22717df93088e6bb"/><file name="Source.php" hash="03fad199c925e07fffd5e42f63cbb1bb"/></dir></dir></dir></dir><dir name="Layer"><dir name="Filter"><file name="SearchSpring.php" hash="128a0a569e7d7a4e19b74bc947a4c01a"/><file name="SearchSpringCategory.php" hash="6654bdad88ca43917dbe072b6dfb21f8"/><file name="SearchSpringCategoryItem.php" hash="2dc143031706d2c6a7f4481ef7434bf4"/><file name="SearchSpringItem.php" hash="459fae0c48c411a58ae885d56124b1f3"/></dir></dir><dir name="Oauth"><file name="Server.php" hash="c5c2df03bc419caa49c8b1e3fe7d50ac"/></dir><dir name="Observer"><file name="CategorySaveObserver.php" hash="cfbbaabb8eb31d79d8106d490758f3d7"/><file name="ConfigObserver.php" hash="209a8f8b97e5b7a0c1c7539d493371e6"/><file name="LiveIndexer.php" hash="0fb8e5738d9431c9e00a928477343d2f"/><file name="ProductSaveObserver.php" hash="68bd69b0e7a810e9eb9c29c09cc61d39"/></dir></dir><dir name="Operation"><file name="Product.php" hash="e190aa6864082e1b8dfe011f41f9f1df"/><file name="ProductOperation.php" hash="84df2df9055b52753680d4ccd94b6f68"/><dir name="Product"><file name="SetCategories.php" hash="0762e4f5975c98e87c6dcedbb9bb621c"/><file name="SetCoreFields.php" hash="bbd2f4a5506da61201edd0dfe783efe8"/><file name="SetFields.php" hash="4ced933a717710d1a4ad80c533570ff5"/><file name="SetId.php" hash="792f08d85b399d57afca103e9d0eabd1"/><file name="SetImages.php" hash="964cd029a1a7bbffb21039bffb5ee68f"/><file name="SetOptions.php" hash="3db65aee252c0eb6a5c65eac1b641bfb"/><file name="SetPricing.php" hash="a2bb94df706c1c62c5b1cbe26d8afdf6"/><file name="SetRatings.php" hash="d04ad0e2f5e1820b4b8b94880a83aef7"/><file name="SetReport.php" hash="834e7c62388c3e3655c80e2a96020ba2"/></dir></dir><dir name="Provider"><file name="ProductCollectionProvider.php" hash="e639e1667ed0f2bc59f2272ad36d3107"/><dir name="ProductCollection"><file name="FeedProvider.php" hash="50ea56af40e5dc044d6c6cbb4b7c64c3"/><file name="ProductProvider.php" hash="bdb5b820343e060bb7cf2bea807a7607"/></dir></dir><dir name="Request"><file name="JSON.php" hash="541d9331b620bc92820abe5630824e41"/></dir><dir name="Service"><dir name="SearchSpring"><file name="ApiAdapter.php" hash="6878323855ef8a7bd3de8e707e104610"/><file name="IndexingApiAdapter.php" hash="92fa5e7682ec42e3c1f8b62c490488cc"/><file name="SearchApiAdapter.php" hash="bda32ec16f53054e75fb331ffcc0c155"/></dir></dir><dir name="sql"><dir name="searchspring_manager"><file name="mysql4-install-1.0.0.php" hash="c0de6de0b74290978f65d7896768e89f"/><file name="mysql4-upgrade-0.4.0-1.0.0.php" hash="1f59325ef181499292deb7775a5e4dc2"/></dir></dir><dir name="Strategy"><file name="PricingStrategy.php" hash="ee021066a76db7fc2710e329daed1a4b"/><dir name="Pricing"><file name="BundleStrategy.php" hash="df2aee59e4a6ff19acf13bbc5f9ad5b9"/><file name="ConfigurableStrategy.php" hash="403e8298c4799ba2b7701255db86a941"/><file name="GroupedStrategy.php" hash="383c482098f502d6cde5dd9ed5cf9e13"/><file name="SimpleStrategy.php" hash="a1b9e7bae38c2def28a7b0a9e6fd456e"/><file name="Strategy.php" hash="9d0fda2a4ff168ab319fd0c2240501fd"/></dir></dir><dir name="String"><file name="Sanitizer.php" hash="e89fa5f86714621ea554aea9aa3f796c"/></dir><dir name="ThirdParty"><dir name="Amasty"><file name="LabelsOperation.php" hash="a1536050cafdf2ede093cb11530d723c"/></dir><dir name="TBT"><file name="RewardsOperation.php" hash="cd83a97c7231b1ec623b78247f2bd93e"/></dir></dir><dir name="Transformer"><file name="ProductCollectionToRecordCollectionTransformer.php" hash="44bdf6ecf2c06c6a5bc0f96cff427b4e"/></dir><dir name="Validator"><file name="ProductValidator.php" hash="6051f15723e69b05a2fe5fbae62a841d"/></dir><dir name="VarienObject"><file name="Data.php" hash="44f184dabbf0db1958d1f922af92f6a8"/></dir><dir name="Writer"><file name="ProductWriter.php" hash="c7b218d215e68b5e3076ef654a41b141"/><dir name="Product"><file name="FileWriter.php" hash="b296be56f236635afc20e817e6277c80"/><file name="ResponseWriter.php" hash="c1af0cc22a9e823ec07175e2d8e34c9f"/><dir name="Params"><file name="FileWriterParams.php" hash="24080fdf866bdac26ed4571c4c7fc9f9"/><file name="ResponseWriterParams.php" hash="bf66753a5952a78c0049f69ccaa6e74d"/></dir></dir></dir></dir></dir></dir></dir><dir name="design"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="searchspring"><dir name="manager"><dir name="system"><dir name="config"><dir name="fieldset"><file name="hint.phtml" hash="a0e3da8cd870432cce2849a41aa1c5b9"/><file name="setup.phtml" hash="e019e039a41992ecf72a0ad956de7630"/></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="searchspring_manager.xml" hash="32227434f5770ddfd93de42d7feeff71"/></dir><dir name="template"><dir name="searchspring_manager"><dir name="layer"><file name="category_filter.phtml" hash="a9dd8c95a1d63b514cc8e9c5939168c5"/><file name="filter.phtml" hash="79888aac8f72d3597f2980d471237d64"/><file name="state.phtml" hash="168546af0f48a42c31c5a5d66b1de1c3"/><file name="view.phtml" hash="509776f71bc643839ade8d7e025764cb"/></dir><dir name="product"><file name="list.phtml" hash="9849b76e4fefac8ce181b428b5c6a148"/><dir name="list"><file name="toolbar.phtml" hash="aa2235708f7e861c63ba3e3e33ec041f"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="etc"><dir name="modules"><file name="SearchSpring_SearchSpringManager.xml" hash="613ec81afc8d858f60dee96d91719c09"/></dir></dir><dir name="locale"><dir name="en_US"><dir name="template"><dir name="email"><file name="searchspring_api_error.html" hash="20bc8d923f96ca22dd2fe8cd876c49fe"/></dir></dir></dir></dir></dir><dir name="js"><dir name="searchspring"><file name="jquery-1.11.1.min.js" hash="8101d596b2b8fa35fe3a634ea342d7c3"/><file name="setup.js" hash="7754359957784a96bd0f9c188979b136"/></dir></dir><dir name="skin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="searchspring"><dir name="css"><file name="styles.css" hash="95f1ec4a442f0e2239f9a2db9e6e517c"/></dir></dir></dir></dir></dir></dir></target></contents></package>
1
  <?xml version="1.0"?>
2
+ <package><name>SearchSpring_Manager</name><version>1.10.0</version><stability>stable</stability><license>SearchSpring Terms of Service</license><channel>community</channel><extends></extends><summary>Connects your Magento store to SearchSpring's subscription-based site search and category navigation services.</summary><description>SearchSpring improves the default Magento site search. Providing merchants with flexible, learning technology that enhances site search functionality, optimizes product results in real-time, allows for custom navigation, automates product SEO and provides fully configurable merchandising. Shoppers will find your products quickly and easily, generating repeat visits and increased sales!</description><notes>Added configuration for the product feed sales data timespan settings
3
+ Fixed the TBT Rewards Feed Operation
4
+ Changed the way product visibility filter works, allowing implicit Catalog/Search visibilities
5
+ Fixed issue where optional dropdown type attributes, that weren't set, were exporting as 'No'</notes><authors><author><name>SearchSpring Development Team</name><user>searchspring</user><email>info@searchspring.com</email></author></authors><date>2015-02-11</date><time>14:36:54</time><compatible></compatible><dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies><contents><target name="mage"><dir name="app"><dir name="code"><dir name="community"><dir name="SearchSpring"><file name="ErrorCodes.php" hash="fd8f65524b8f8708471f106aad294d0a"/><dir name="Manager"><file name="Collection.php" hash="0ebd621892bccd5d59ed3edcafada89b"/><file name="Iterator.php" hash="6f68effbe5452c1a6abd97cbf4b528ee"/><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Field"><file name="Timespan.php" hash="04e13b7375f1d57195aae385256c1274"/></dir><dir name="Fieldset"><file name="Hint.php" hash="82ff17ab23c59b1c5fd095dfdfe153bb"/><file name="Setup.php" hash="5f467825780852b12cba72abfbe9e596"/></dir></dir></dir></dir><dir name="Layer"><file name="View.php" hash="ae69c24e04b03048cc2cd9b7cc436603"/><dir name="Filter"><file name="SearchSpringCategory.php" hash="39fc479e15275db637c227e596d040f5"/><file name="SearchSpringList.php" hash="743bb9cb690c9df3d74e9de2c206d020"/></dir></dir></dir><dir name="Builder"><file name="OperationBuilder.php" hash="d85ad0a561091d34b3b98efd95646962"/></dir><dir name="controllers"><file name="GenerateController.php" hash="a8b0e0bd6d735ce33ca7ed09ecea3a24"/></dir><dir name="Entity"><file name="IndexingRequestBody.php" hash="6bdab2264cbb8dbafa666f493bf9bd60"/><file name="OperationsCollection.php" hash="be19c06bb1be447bd57601e67ac87557"/><file name="RecordsCollection.php" hash="c336526a10625a859c093d2b25dff911"/><file name="RequestBody.php" hash="4b6d7fd23f57527e9d53dd938d69a88d"/><file name="RequestParams.php" hash="f4778075264cd441c87e8de220fdd2a9"/><file name="SearchCollection.php" hash="e64543d4315c16d7a0717da8ec081e09"/><file name="SearchRequestBody.php" hash="bdfd9a2244ce1f9a7db8daca6e613176"/><file name="SearchResult.php" hash="863a720b8a837bd7e56e8a7fa781a1a1"/><dir name="SearchResult"><file name="Result.php" hash="ea4e36fe95e4c412af8d525a4628db5d"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="879a64f061de25cbd1292f4ead6c5b15"/><file name="api2.xml" hash="c958f2f25b6fcd0b467dc20fb945f1b4"/><file name="composer.json" hash="6a36df77eee995788585f7a8a535fa27"/><file name="config.xml" hash="81902aa1230e6ddba81739ee62d48787"/><file name="readme.md" hash="30d24e1aae89696090dcf22203802ad2"/><file name="system.xml" hash="5ac00df31f8874e68022b2bd21b2ab96"/></dir><dir name="Factory"><file name="ApiFactory.php" hash="2a0b31683e75cfa4c10bf6476a7346bf"/><file name="GeneratorFactory.php" hash="0609eec402a1a5df2f51079844231a4f"/><file name="IndexingRequestBodyFactory.php" hash="10e0717f6d938a06a9cfc68f6ac1ceaf"/><file name="PricingFactory.php" hash="bbba11efb7a2fd6ebf8c47d896c365a2"/><file name="SearchRequestBodyFactory.php" hash="4eb409f25d480ca11b08f206f7f4facc"/></dir><dir name="Generator"><file name="ProductGenerator.php" hash="69147879853105d0a388596b479a0b81"/></dir><dir name="Handler"><file name="ApiErrorHandler.php" hash="a287ed86d8d83a88b5a8f555015f2e80"/></dir><dir name="Helper"><file name="Data.php" hash="eb3620bd8eea016cc280c9d0a00c6644"/><file name="Http.php" hash="13d41de08d623892f6526817bf4ee971"/><file name="Oauth.php" hash="b6dd04c07e1322c38b76668b88d7d1e4"/><file name="Product.php" hash="e576ce5f09e32654cd0c1014b85d8d5a"/><file name="Webservice.php" hash="054d23d7db9da73b44bcbad083bd813e"/></dir><dir name="Model"><file name="Layer.php" hash="54afafde0cff2fcf2de2240bbb6cdb20"/><file name="Source.php" hash="906ec0129e2c51551d02a52dd1736892"/><dir name="Api2"><dir name="Auth"><file name="Adapter.php" hash="909c416381a44ef80b0665926a9e4ab2"/></dir><dir name="Indexing"><dir name="Rest"><dir name="Admin"><file name="V1.php" hash="3a306d75dccab962e7c81ecb82d35c60"/></dir></dir></dir></dir><dir name="Catalog"><dir name="Category"><dir name="Attribute"><dir name="EnableSearchSpring"><file name="Backend.php" hash="12d9799f273951ca22717df93088e6bb"/><file name="Source.php" hash="03fad199c925e07fffd5e42f63cbb1bb"/></dir></dir></dir></dir><dir name="Layer"><dir name="Filter"><file name="SearchSpring.php" hash="128a0a569e7d7a4e19b74bc947a4c01a"/><file name="SearchSpringCategory.php" hash="6654bdad88ca43917dbe072b6dfb21f8"/><file name="SearchSpringCategoryItem.php" hash="2dc143031706d2c6a7f4481ef7434bf4"/><file name="SearchSpringItem.php" hash="459fae0c48c411a58ae885d56124b1f3"/></dir></dir><dir name="Oauth"><file name="Server.php" hash="c5c2df03bc419caa49c8b1e3fe7d50ac"/></dir><dir name="Observer"><file name="CategorySaveObserver.php" hash="cfbbaabb8eb31d79d8106d490758f3d7"/><file name="ConfigObserver.php" hash="209a8f8b97e5b7a0c1c7539d493371e6"/><file name="LiveIndexer.php" hash="0fb8e5738d9431c9e00a928477343d2f"/><file name="ProductSaveObserver.php" hash="68bd69b0e7a810e9eb9c29c09cc61d39"/></dir><dir name="Source"><file name="Abstract.php" hash="965bfb89b539db821a75dd71ef7e7d5f"/></dir></dir><dir name="Operation"><file name="Product.php" hash="e190aa6864082e1b8dfe011f41f9f1df"/><file name="ProductOperation.php" hash="84df2df9055b52753680d4ccd94b6f68"/><dir name="Product"><file name="SetCategories.php" hash="0762e4f5975c98e87c6dcedbb9bb621c"/><file name="SetCoreFields.php" hash="b988b1a30f2d6a44b66a7ffbd33f1586"/><file name="SetFields.php" hash="8896858d190cadc5b19104120d7a1b58"/><file name="SetId.php" hash="792f08d85b399d57afca103e9d0eabd1"/><file name="SetImages.php" hash="964cd029a1a7bbffb21039bffb5ee68f"/><file name="SetOptions.php" hash="3db65aee252c0eb6a5c65eac1b641bfb"/><file name="SetPricing.php" hash="a2bb94df706c1c62c5b1cbe26d8afdf6"/><file name="SetRatings.php" hash="d04ad0e2f5e1820b4b8b94880a83aef7"/><file name="SetReport.php" hash="dec51d5202b0ceb826500275cf42941a"/></dir></dir><dir name="Provider"><file name="ProductCollectionProvider.php" hash="e639e1667ed0f2bc59f2272ad36d3107"/><dir name="ProductCollection"><file name="FeedProvider.php" hash="b82e2fae57e7c2d4e5b9d5a4b8440780"/><file name="ProductProvider.php" hash="dd8ce756d8f2a8117758e10ac220267e"/></dir></dir><dir name="Request"><file name="JSON.php" hash="541d9331b620bc92820abe5630824e41"/></dir><dir name="Service"><dir name="SearchSpring"><file name="ApiAdapter.php" hash="6878323855ef8a7bd3de8e707e104610"/><file name="IndexingApiAdapter.php" hash="92fa5e7682ec42e3c1f8b62c490488cc"/><file name="SearchApiAdapter.php" hash="bda32ec16f53054e75fb331ffcc0c155"/></dir></dir><dir name="sql"><dir name="searchspring_manager"><file name="mysql4-install-1.0.0.php" hash="c0de6de0b74290978f65d7896768e89f"/><file name="mysql4-upgrade-0.4.0-1.0.0.php" hash="1f59325ef181499292deb7775a5e4dc2"/></dir></dir><dir name="Strategy"><file name="PricingStrategy.php" hash="ee021066a76db7fc2710e329daed1a4b"/><dir name="Pricing"><file name="BundleStrategy.php" hash="df2aee59e4a6ff19acf13bbc5f9ad5b9"/><file name="ConfigurableStrategy.php" hash="403e8298c4799ba2b7701255db86a941"/><file name="GroupedStrategy.php" hash="383c482098f502d6cde5dd9ed5cf9e13"/><file name="SimpleStrategy.php" hash="a1b9e7bae38c2def28a7b0a9e6fd456e"/><file name="Strategy.php" hash="9d0fda2a4ff168ab319fd0c2240501fd"/></dir></dir><dir name="String"><file name="Sanitizer.php" hash="e89fa5f86714621ea554aea9aa3f796c"/></dir><dir name="ThirdParty"><dir name="Amasty"><file name="LabelsOperation.php" hash="a1536050cafdf2ede093cb11530d723c"/></dir><dir name="TBT"><file name="RewardsOperation.php" hash="cb86f610f60a5f6204da4a9080de2838"/></dir></dir><dir name="Transformer"><file name="ProductCollectionToRecordCollectionTransformer.php" hash="44bdf6ecf2c06c6a5bc0f96cff427b4e"/></dir><dir name="Validator"><file name="ProductValidator.php" hash="08ea9751207d9fc0fedb98716331f248"/></dir><dir name="VarienObject"><file name="Data.php" hash="44f184dabbf0db1958d1f922af92f6a8"/></dir><dir name="Writer"><file name="ProductWriter.php" hash="c7b218d215e68b5e3076ef654a41b141"/><dir name="Product"><file name="FileWriter.php" hash="b296be56f236635afc20e817e6277c80"/><file name="ResponseWriter.php" hash="c1af0cc22a9e823ec07175e2d8e34c9f"/><dir name="Params"><file name="FileWriterParams.php" hash="24080fdf866bdac26ed4571c4c7fc9f9"/><file name="ResponseWriterParams.php" hash="bf66753a5952a78c0049f69ccaa6e74d"/></dir></dir></dir></dir></dir></dir></dir><dir name="design"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="searchspring"><dir name="manager"><dir name="system"><dir name="config"><dir name="fieldset"><file name="hint.phtml" hash="a0e3da8cd870432cce2849a41aa1c5b9"/><file name="setup.phtml" hash="e019e039a41992ecf72a0ad956de7630"/></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="searchspring_manager.xml" hash="32227434f5770ddfd93de42d7feeff71"/></dir><dir name="template"><dir name="searchspring_manager"><dir name="layer"><file name="category_filter.phtml" hash="a9dd8c95a1d63b514cc8e9c5939168c5"/><file name="filter.phtml" hash="79888aac8f72d3597f2980d471237d64"/><file name="state.phtml" hash="168546af0f48a42c31c5a5d66b1de1c3"/><file name="view.phtml" hash="509776f71bc643839ade8d7e025764cb"/></dir><dir name="product"><file name="list.phtml" hash="9849b76e4fefac8ce181b428b5c6a148"/><dir name="list"><file name="toolbar.phtml" hash="aa2235708f7e861c63ba3e3e33ec041f"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="etc"><dir name="modules"><file name="SearchSpring_SearchSpringManager.xml" hash="613ec81afc8d858f60dee96d91719c09"/></dir></dir><dir name="locale"><dir name="en_US"><dir name="template"><dir name="email"><file name="searchspring_api_error.html" hash="20bc8d923f96ca22dd2fe8cd876c49fe"/></dir></dir></dir></dir></dir><dir name="js"><dir name="searchspring"><file name="jquery-1.11.1.min.js" hash="8101d596b2b8fa35fe3a634ea342d7c3"/><file name="setup.js" hash="7754359957784a96bd0f9c188979b136"/></dir></dir><dir name="skin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="searchspring"><dir name="css"><file name="styles.css" hash="95f1ec4a442f0e2239f9a2db9e6e517c"/></dir></dir></dir></dir></dir></dir></target></contents></package>