Channelpilotsolutions_Channelpilot - Version 2.1.3

Version Notes

- fixed bug in module activation

Download this release

Release Info

Developer Magento Core Team
Extension Channelpilotsolutions_Channelpilot
Version 2.1.3
Comparing to
See all releases


Code changes from version 2.1.2 to 2.1.3

app/code/community/Channelpilotsolutions/Channelpilot/Helper/Data.php CHANGED
@@ -1,240 +1,240 @@
1
- <?php
2
-
3
- /**
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the GNU General Public License (GPL 3)
8
- * that is bundled with this package in the file LICENSE.txt
9
- *
10
- * DISCLAIMER
11
- *
12
- * Do not edit or add to this file if you wish to upgrade Channelpilotsolutions_Channelpilot to newer
13
- * versions in the future. If you wish to customize Channelpilotsolutions_Channelpilot for your
14
- * needs please refer to http://www.channelpilot.com for more information.
15
- *
16
- * @category Channelpilotsolutions
17
- * @package Channelpilotsolutions_Channelpilot
18
- * @subpackage helper
19
- * @copyright Copyright (c) 2013 <info@channelpilot.com> - www.channelpilot.com
20
- * @author Peter Hoffmann <info@channelpilot.com>
21
- * @license <http://www.gnu.org/licenses/> GNU General Public License (GPL 3)
22
- * @link http://www.channelpilot.com
23
- */
24
- require_once 'CPErrors.php';
25
-
26
- // Handler
27
- require_once 'handler/CPAbstractHandler.php';
28
- require_once 'handler/CPErrorHandler.php';
29
- require_once 'handler/CPExportHandler.php';
30
- require_once 'handler/CPStatusHandler.php';
31
- require_once 'handler/CPRegisterHandler.php';
32
- require_once 'handler/CPNewPriceHandler.php';
33
- require_once 'handler/CPOrderHandler.php';
34
- require_once 'handler/CPDeliveryHandler.php';
35
- require_once 'handler/CPCancellationHandler.php';
36
- require_once 'handler/CPNewsHandler.php';
37
- require_once 'handler/CPDebugHandler.php';
38
-
39
- // RESPONSES
40
- require_once 'responses/CPHookResponse.php';
41
- require_once 'responses/CPGetStatusHookResponse.php';
42
- require_once 'responses/CPRegisterHookResponse.php';
43
-
44
- // API
45
- require_once 'api/1_0/thin/CPDelivery.php';
46
- require_once 'api/1_0/ChannelPilotSellerAPI_v1_0.php';
47
- require_once 'api/1_0/CPResultCodes.php';
48
-
49
- // special customer functions
50
- require_once 'special/CustomerFunctions.php';
51
-
52
- class Channelpilotsolutions_Channelpilot_Helper_Data extends Mage_Core_Helper_Abstract {
53
-
54
- const GET_REGISTER = "register";
55
- const GET_EXPORT = "export";
56
- const GET_STATUS = "status";
57
- const GET_IMPORT_ORDERS = "orders";
58
- const GET_DELIVERED = "deliveries";
59
- const GET_CANCELLATION = "cancellations";
60
- const GET_NEWS = "news";
61
- const GET_NEWPRICES = "prices";
62
- const GET_DEBUG = "debug";
63
-
64
- public function __construct($root = 'root') {
65
-
66
- }
67
-
68
- public function createXml() {
69
- if (strpos(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "true") !== false || strpos(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "1") !== false) {
70
- $password = Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_password');
71
- if ($password == '' || (isset($_GET['password']) AND $_GET['password'] == $password)) {
72
- header('Content-Type: text/xml; charset=utf-8');
73
- include 'ExportData.php';
74
- $exporter = new ExportData();
75
- echo('<?xml version="1.0"?>');
76
- echo("<root>");
77
- echo("<catalog>");
78
- $exporter->_runMain();
79
- echo("</catalog>");
80
- echo("</root>");
81
- exit();
82
- return;
83
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
85
- return;
86
- }
87
-
88
- // API CONNECTOR
89
- public function api() {
90
- $hook = null;
91
- if ($this->checkIp() === false) {
92
- return;
93
- }
94
-
95
- $newsActive = false;
96
- if (strcmp(Mage::getStoreConfig('channelpilot_general/channelpilot_general/channelpilot_useNews'), "true") === 0) {
97
- $newsActive = true;
98
- }
99
- $marketplaceActive = false;
100
- if (strcmp(Mage::getStoreConfig('channelpilot_marketplace/channelpilot_marketplace/channelpilot_useMarketplaces'), "true") === 0) {
101
- $marketplaceActive = true;
102
- }
103
- $pricecontrolActive = false;
104
- if (strcmp(Mage::getStoreConfig('channelpilot_pricecontrol/channelpilot_general/channelpilot_usePricecontrol'), "true") === 0) {
105
- $pricecontrolActive = true;
106
- }
107
- $exportActive = false;
108
- if (strcmp(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "true") !== false || strcmp(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "1") !== false) {
109
- $exportActive = true;
110
- }
111
-
112
-
113
- switch ($_GET['method']) {
114
- // Send method
115
- case self::GET_STATUS:
116
- $this->checkActivation(array($marketplaceActive, $pricecontrolActive), 'marketplace OR pricecontrol');
117
- $handler = new CPStatusHandler();
118
- $hook = $handler->handle();
119
- break;
120
-
121
- // Send method + merchantid + multishopid + token + ips
122
- case self::GET_REGISTER:
123
- $this->checkActivation(array($marketplaceActive, $pricecontrolActive), 'marketplace OR pricecontrol');
124
- $this->checkSignature();
125
- $handler = new CPRegisterHandler();
126
- $hook = $handler->handle();
127
- break;
128
-
129
- // Send Method + token
130
- case self::GET_IMPORT_ORDERS:
131
- $this->checkActivation(array($marketplaceActive), 'marketplace');
132
- $this->checkSignature();
133
- $handler = new CPOrderHandler();
134
- $hook = $handler->handle();
135
- break;
136
- // Send Method + token
137
- case self::GET_DELIVERED:
138
- $this->checkActivation(array($marketplaceActive), 'marketplace');
139
- $this->checkSignature();
140
- $handler = new CPDeliveryHandler();
141
- $hook = $handler->handle();
142
- break;
143
-
144
- // Send Method + token
145
- case self::GET_CANCELLATION:
146
- $this->checkActivation(array($marketplaceActive), 'marketplace');
147
- $this->checkSignature();
148
- $handler = new CPCancellationHandler();
149
- $hook = $handler->handle();
150
- break;
151
-
152
- // Send method
153
- case self::GET_NEWS:
154
- $this->checkActivation(array($newsActive), 'news');
155
- $this->checkSignature();
156
- $handler = new CPNewsHandler();
157
- $hook = $handler->handle();
158
- break;
159
-
160
- // Send method + token + priceId
161
- case self::GET_NEWPRICES:
162
- $this->checkActivation(array($pricecontrolActive), 'pricecontrol');
163
- // $this->checkSignature();
164
- $handler = new CPNewPriceHandler();
165
- $hook = $handler->handle();
166
- break;
167
-
168
- // Send method + limit + shopId ( + last)
169
- case self::GET_EXPORT:
170
- $this->checkActivation(array($exportActive), 'export');
171
- // $this->checkSignature();
172
- $handler = new CPExportHandler();
173
- $hook = $handler->handle();
174
- break;
175
-
176
- // Send method + limit + shopId ( + last)
177
- case self::GET_DEBUG:
178
- $this->checkSignature();
179
- $handler = new CPDebugHandler();
180
- $hook = $handler->handle();
181
- break;
182
-
183
- default:
184
- $hook = "not supported method: " . $_GET['method'];
185
- break;
186
- }
187
- header("Content-Type: application/json;");
188
- print_r(json_encode($hook));
189
- exit();
190
- }
191
-
192
- private function checkSignature() {
193
- IF (isset($_GET['php']) && isset($_GET['shop']) && isset($_GET['plugin'])) {
194
- if ($_GET['php'] == phpversion() && $_GET['shop'] == CPHookResponse::getSignatureShop() && $_GET['plugin'] == CPHookResponse::getModuleVersion()) {
195
- return true;
196
- }
197
- CPErrorHandler::handle(CPErrors::RESULT_SIGNATURE_MISMATCH, "Signature changed", "Signature changed \n" . $_GET['php'] . " -> " . phpversion() . "\n" . $_GET['shop'] . " -> " . CPHookResponse::getSignatureShop() . "\n" . $_GET['plugin'] . " -> " . CPHookResponse::getModuleVersion());
198
- } else {
199
- CPErrorHandler::handle(CPErrors::RESULT_MISSING_PARAMS, "Missing params for signature check", "Missing params for signature check");
200
- }
201
- }
202
-
203
- private function checkActivation($configs, $function) {
204
- foreach ($configs as $config) {
205
- if ($config === true) {
206
- return true;
207
- }
208
- }
209
- CPErrorHandler::handle(CPErrors::RESULT_API_DEACTIVATED, "'$function' not activated", "'$function' not activated");
210
- }
211
-
212
- private function checkIp() {
213
- if (strcmp(Mage::getStoreConfig('channelpilot_general/channelpilot_general/channelpilot_checkIp'), "true") === 0) {
214
- $allIps = array();
215
- $allIps[] = CPAbstractHandler::ChannelPilot_IP;
216
- $sQuery = "SELECT ips_authorized FROM " . CPAbstractHandler::DB_REGISTRATION;
217
- $dbConnection = Mage::getSingleton('core/resource')->getConnection('core_read');
218
- try {
219
- $sResult = $dbConnection->fetchAll($sQuery);
220
- foreach ($sResult as $resultType) {
221
- $ips = explode(";", $resultType['ips_authorized']);
222
- foreach ($ips as $ip) {
223
- $allIps[] = $ip;
224
- }
225
- }
226
- } catch (Exception $e) {
227
- $dbConnection->closeConnection();
228
- CPErrorHandler::handle(CPResultCodes::SYSTEM_ERROR, "Exception in getAllowedIpsViaSecurityToken(): " . $e->getMessage(), "Exception in getAllowedIpsViaSecurityToken(): '$sQuery'\n" . $e->getMessage());
229
- }
230
-
231
- if (!in_array($_SERVER['REMOTE_ADDR'], $allIps)) {
232
- return false;
233
- }
234
- }
235
- return true;
236
- }
237
-
238
- }
239
-
240
  ?>
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the GNU General Public License (GPL 3)
8
+ * that is bundled with this package in the file LICENSE.txt
9
+ *
10
+ * DISCLAIMER
11
+ *
12
+ * Do not edit or add to this file if you wish to upgrade Channelpilotsolutions_Channelpilot to newer
13
+ * versions in the future. If you wish to customize Channelpilotsolutions_Channelpilot for your
14
+ * needs please refer to http://www.channelpilot.com for more information.
15
+ *
16
+ * @category Channelpilotsolutions
17
+ * @package Channelpilotsolutions_Channelpilot
18
+ * @subpackage helper
19
+ * @copyright Copyright (c) 2013 <info@channelpilot.com> - www.channelpilot.com
20
+ * @author Peter Hoffmann <info@channelpilot.com>
21
+ * @license <http://www.gnu.org/licenses/> GNU General Public License (GPL 3)
22
+ * @link http://www.channelpilot.com
23
+ */
24
+ require_once 'CPErrors.php';
25
+
26
+ // Handler
27
+ require_once 'handler/CPAbstractHandler.php';
28
+ require_once 'handler/CPErrorHandler.php';
29
+ require_once 'handler/CPExportHandler.php';
30
+ require_once 'handler/CPStatusHandler.php';
31
+ require_once 'handler/CPRegisterHandler.php';
32
+ require_once 'handler/CPNewPriceHandler.php';
33
+ require_once 'handler/CPOrderHandler.php';
34
+ require_once 'handler/CPDeliveryHandler.php';
35
+ require_once 'handler/CPCancellationHandler.php';
36
+ require_once 'handler/CPNewsHandler.php';
37
+ require_once 'handler/CPDebugHandler.php';
38
+
39
+ // RESPONSES
40
+ require_once 'responses/CPHookResponse.php';
41
+ require_once 'responses/CPGetStatusHookResponse.php';
42
+ require_once 'responses/CPRegisterHookResponse.php';
43
+
44
+ // API
45
+ require_once 'api/1_0/thin/CPDelivery.php';
46
+ require_once 'api/1_0/ChannelPilotSellerAPI_v1_0.php';
47
+ require_once 'api/1_0/CPResultCodes.php';
48
+
49
+ // special customer functions
50
+ require_once 'special/CustomerFunctions.php';
51
+
52
+ class Channelpilotsolutions_Channelpilot_Helper_Data extends Mage_Core_Helper_Abstract {
53
+
54
+ const GET_REGISTER = "register";
55
+ const GET_EXPORT = "export";
56
+ const GET_STATUS = "status";
57
+ const GET_IMPORT_ORDERS = "orders";
58
+ const GET_DELIVERED = "deliveries";
59
+ const GET_CANCELLATION = "cancellations";
60
+ const GET_NEWS = "news";
61
+ const GET_NEWPRICES = "prices";
62
+ const GET_DEBUG = "debug";
63
+
64
+ public function __construct($root = 'root') {
65
+
66
+ }
67
+
68
+ public function createXml() {
69
+ if (strpos(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "true") !== false || strpos(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "1") !== false) {
70
+ $password = Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_password');
71
+ if ($password == '' || (isset($_GET['password']) AND $_GET['password'] == $password)) {
72
+ header('Content-Type: text/xml; charset=utf-8');
73
+ include 'ExportData.php';
74
+ $exporter = new ExportData();
75
+ echo('<?xml version="1.0"?>');
76
+ echo("<root>");
77
+ echo("<catalog>");
78
+ $exporter->_runMain();
79
+ echo("</catalog>");
80
+ echo("</root>");
81
+ exit();
82
+ return;
83
+ }
84
+ }
85
+ return;
86
+ }
87
+
88
+ // API CONNECTOR
89
+ public function api() {
90
+ $hook = null;
91
+ if ($this->checkIp() === false) {
92
+ return;
93
+ }
94
+
95
+ $newsActive = false;
96
+ if (strcmp(Mage::getStoreConfig('channelpilot_general/channelpilot_general/channelpilot_useNews'), "true") === 0 || strcmp(Mage::getStoreConfig('channelpilot_general/channelpilot_general/channelpilot_useNews'), "1") === 0) {
97
+ $newsActive = true;
98
+ }
99
+ $marketplaceActive = false;
100
+ if (strcmp(Mage::getStoreConfig('channelpilot_marketplace/channelpilot_marketplace/channelpilot_useMarketplaces'), "true") === 0 || strcmp(Mage::getStoreConfig('channelpilot_marketplace/channelpilot_marketplace/channelpilot_useMarketplaces'), "1") === 0) {
101
+ $marketplaceActive = true;
102
+ }
103
+ $pricecontrolActive = false;
104
+ if (strcmp(Mage::getStoreConfig('channelpilot_pricecontrol/channelpilot_general/channelpilot_usePricecontrol'), "true") === 0 || strcmp(Mage::getStoreConfig('channelpilot_pricecontrol/channelpilot_general/channelpilot_usePricecontrol'), "1") === 0) {
105
+ $pricecontrolActive = true;
106
  }
107
+ $exportActive = false;
108
+ if (strcmp(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "true") === 0 || strcmp(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_useExport'), "1") === 0) {
109
+ $exportActive = true;
110
+ }
111
+
112
+
113
+ switch ($_GET['method']) {
114
+ // Send method
115
+ case self::GET_STATUS:
116
+ $this->checkActivation(array($marketplaceActive, $pricecontrolActive), 'marketplace OR pricecontrol');
117
+ $handler = new CPStatusHandler();
118
+ $hook = $handler->handle();
119
+ break;
120
+
121
+ // Send method + merchantid + multishopid + token + ips
122
+ case self::GET_REGISTER:
123
+ $this->checkActivation(array($marketplaceActive, $pricecontrolActive), 'marketplace OR pricecontrol');
124
+ $this->checkSignature();
125
+ $handler = new CPRegisterHandler();
126
+ $hook = $handler->handle();
127
+ break;
128
+
129
+ // Send Method + token
130
+ case self::GET_IMPORT_ORDERS:
131
+ $this->checkActivation(array($marketplaceActive), 'marketplace');
132
+ $this->checkSignature();
133
+ $handler = new CPOrderHandler();
134
+ $hook = $handler->handle();
135
+ break;
136
+ // Send Method + token
137
+ case self::GET_DELIVERED:
138
+ $this->checkActivation(array($marketplaceActive), 'marketplace');
139
+ $this->checkSignature();
140
+ $handler = new CPDeliveryHandler();
141
+ $hook = $handler->handle();
142
+ break;
143
+
144
+ // Send Method + token
145
+ case self::GET_CANCELLATION:
146
+ $this->checkActivation(array($marketplaceActive), 'marketplace');
147
+ $this->checkSignature();
148
+ $handler = new CPCancellationHandler();
149
+ $hook = $handler->handle();
150
+ break;
151
+
152
+ // Send method
153
+ case self::GET_NEWS:
154
+ $this->checkActivation(array($newsActive), 'news');
155
+ $this->checkSignature();
156
+ $handler = new CPNewsHandler();
157
+ $hook = $handler->handle();
158
+ break;
159
+
160
+ // Send method + token + priceId
161
+ case self::GET_NEWPRICES:
162
+ $this->checkActivation(array($pricecontrolActive), 'pricecontrol');
163
+ // $this->checkSignature();
164
+ $handler = new CPNewPriceHandler();
165
+ $hook = $handler->handle();
166
+ break;
167
+
168
+ // Send method + limit + shopId ( + last)
169
+ case self::GET_EXPORT:
170
+ $this->checkActivation(array($exportActive), 'export');
171
+ // $this->checkSignature();
172
+ $handler = new CPExportHandler();
173
+ $hook = $handler->handle();
174
+ break;
175
+
176
+ // Send method + limit + shopId ( + last)
177
+ case self::GET_DEBUG:
178
+ $this->checkSignature();
179
+ $handler = new CPDebugHandler();
180
+ $hook = $handler->handle();
181
+ break;
182
+
183
+ default:
184
+ $hook = "not supported method: " . $_GET['method'];
185
+ break;
186
+ }
187
+ header("Content-Type: application/json;");
188
+ print_r(json_encode($hook));
189
+ exit();
190
+ }
191
+
192
+ private function checkSignature() {
193
+ IF (isset($_GET['php']) && isset($_GET['shop']) && isset($_GET['plugin'])) {
194
+ if ($_GET['php'] == phpversion() && $_GET['shop'] == CPHookResponse::getSignatureShop() && $_GET['plugin'] == CPHookResponse::getModuleVersion()) {
195
+ return true;
196
+ }
197
+ CPErrorHandler::handle(CPErrors::RESULT_SIGNATURE_MISMATCH, "Signature changed", "Signature changed \n" . $_GET['php'] . " -> " . phpversion() . "\n" . $_GET['shop'] . " -> " . CPHookResponse::getSignatureShop() . "\n" . $_GET['plugin'] . " -> " . CPHookResponse::getModuleVersion());
198
+ } else {
199
+ CPErrorHandler::handle(CPErrors::RESULT_MISSING_PARAMS, "Missing params for signature check", "Missing params for signature check");
200
+ }
201
+ }
202
+
203
+ private function checkActivation($configs, $function) {
204
+ foreach ($configs as $config) {
205
+ if ($config === true) {
206
+ return true;
207
+ }
208
+ }
209
+ CPErrorHandler::handle(CPErrors::RESULT_API_DEACTIVATED, "'$function' not activated", "'$function' not activated");
210
+ }
211
+
212
+ private function checkIp() {
213
+ if (strcmp(Mage::getStoreConfig('channelpilot_general/channelpilot_general/channelpilot_checkIp'), "true") === 0) {
214
+ $allIps = array();
215
+ $allIps[] = CPAbstractHandler::ChannelPilot_IP;
216
+ $sQuery = "SELECT ips_authorized FROM " . CPAbstractHandler::DB_REGISTRATION;
217
+ $dbConnection = Mage::getSingleton('core/resource')->getConnection('core_read');
218
+ try {
219
+ $sResult = $dbConnection->fetchAll($sQuery);
220
+ foreach ($sResult as $resultType) {
221
+ $ips = explode(";", $resultType['ips_authorized']);
222
+ foreach ($ips as $ip) {
223
+ $allIps[] = $ip;
224
+ }
225
+ }
226
+ } catch (Exception $e) {
227
+ $dbConnection->closeConnection();
228
+ CPErrorHandler::handle(CPResultCodes::SYSTEM_ERROR, "Exception in getAllowedIpsViaSecurityToken(): " . $e->getMessage(), "Exception in getAllowedIpsViaSecurityToken(): '$sQuery'\n" . $e->getMessage());
229
+ }
230
+
231
+ if (!in_array($_SERVER['REMOTE_ADDR'], $allIps)) {
232
+ return false;
233
+ }
234
+ }
235
+ return true;
236
+ }
237
+
238
+ }
239
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  ?>
app/code/community/Channelpilotsolutions/Channelpilot/Helper/ExportData.php CHANGED
@@ -1,646 +1,646 @@
1
- <?php
2
-
3
- /**
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the GNU General Public License (GPL 3)
8
- * that is bundled with this package in the file LICENSE.txt
9
- *
10
- * DISCLAIMER
11
- *
12
- * Do not edit or add to this file if you wish to upgrade Channelpilotsolutions_Channelpilot to newer
13
- * versions in the future. If you wish to customize Channelpilotsolutions_Channelpilot for your
14
- * needs please refer to http://www.channelpilot.com for more information.
15
- *
16
- * @category Channelpilotsolutions
17
- * @package Channelpilotsolutions_Channelpilot
18
- * @subpackage helper
19
- * @copyright Copyright (c) 2012 <info@channelpilot.com> - www.channelpilot.com
20
- * @author Peter Hoffmann <info@channelpilot.com>
21
- * @license <http://www.gnu.org/licenses/> GNU General Public License (GPL 3)
22
- * @link http://www.channelpilot.com
23
- */
24
- class ExportData {
25
-
26
- private $_tablePrefix;
27
- private $_storeId;
28
- private $_siteId;
29
- private $_mediaUrl;
30
- private $_webUrl;
31
- private $_dbConnection;
32
- private $_allCat;
33
- private $oldCatPath;
34
- private $xml;
35
-
36
- function __construct() {
37
-
38
-
39
- // Increase maximum execution time to 4 hours
40
- ini_set('max_execution_time', 7200);
41
-
42
- // Initialize the admin application
43
- Mage::app('admin');
44
-
45
- // Get the table prefix
46
- $tableName = Mage::getSingleton('core/resource')->getTableName('core_website');
47
- $this->_tablePrefix = substr($tableName, 0, strpos($tableName, 'core_website'));
48
-
49
- // Get database connection
50
- $this->_dbConnection = Mage::getSingleton('core/resource')->getConnection('core_read');
51
- }
52
-
53
- // Apply prefix to table names in the query
54
- private function _applyTablePrefix($query) {
55
- return str_replace('ChannelPilotSolutions_ChannelPilot_', $this->_tablePrefix, $query);
56
- }
57
-
58
- // Run the main application and call the appropriate function
59
- // depending on the command.
60
- public function _runMain() {
61
- if (isset($_GET['store']) AND $_GET['store'] != '') {
62
- $this->_storeId = $_GET['store'];
63
- } else {
64
- $this->_storeId = Mage::app()->getStore()->getId();
65
- }
66
-
67
- // Validate store and get information
68
- $this->_getStoreInformation();
69
-
70
- // Run extraction
71
- return $this->_extractFromMySQL();
72
- }
73
-
74
- private function getCategory($key) {
75
- $return = 0;
76
- if (strpos($key, '/') != false) {
77
- $tmpKey = substr($key, 0, strpos($key, strrchr($key, '/')));
78
- if (isset($this->_allCat[$tmpKey])) {
79
- $return = $this->_allCat[$tmpKey];
80
- } else {
81
- $return = $this->getCategory($tmpKey);
82
- }
83
- }
84
- return $return;
85
- }
86
-
87
- // Extract natively directly from the database
88
- private function _extractFromMySQL() {
89
- $selectLimit = 100;
90
-
91
- // Increase maximium length for group_concat (for additional image URLs field)
92
- $query = "SET SESSION group_concat_max_len = 1000000;";
93
- $this->_dbConnection->query($query);
94
-
95
- // Get category information
96
- $query = '';
97
- if (substr(Mage::getVersion(), 2, 3) >= 6) {
98
- $query = "
99
- SELECT DISTINCT fs.entity_id, fs.path, fs.name
100
- FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
101
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_flat_store_" . $this->_storeId . " AS fs
102
- ON pi.category_id = fs.entity_id
103
- ORDER BY fs.path ASC
104
- ";
105
- } else {
106
- $query = "
107
- SELECT DISTINCT ev.entity_id, ce.path, ev.value
108
- FROM ChannelPilotSolutions_ChannelPilot_catalog_category_entity_varchar AS ev
109
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_entity AS ce ON ev.entity_id = ce.entity_id
110
- WHERE ev.attribute_id = (
111
- SELECT attribute_id
112
- FROM ChannelPilotSolutions_ChannelPilot_eav_attribute as att
113
- WHERE att.entity_type_id = ev.entity_type_id AND att.attribute_code='name'
114
- )
115
- ORDER BY ce.path ASC
116
- ";
117
- }
118
- $query = $this->_applyTablePrefix($query);
119
- $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
120
-
121
- $categoriesTable = $this->_dbConnection->fetchAll($query);
122
-
123
- $this->_allCat = array();
124
- $oldCatPath = 'initialize';
125
- $oldCatTree = '';
126
-
127
- foreach ($categoriesTable as $categorie) {
128
- if (strpos($categorie[1], $oldCatPath) !== 0) {
129
- // Start tree
130
- $path = $this->getCategory($categorie[1]);
131
- if ($path !== 0) {
132
- $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $path . '>' . $categorie[2]);
133
- $oldCatTree = $path . '>' . $categorie[2];
134
- } else {
135
- $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $categorie[2]);
136
- $oldCatTree = $categorie[2];
137
- }
138
- } else {
139
- // continue tree
140
- $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $oldCatTree . '>' . $categorie[2]);
141
- $oldCatTree = $this->_allCat[$categorie[1]];
142
- }
143
- $oldCatPath = $categorie[1];
144
- }
145
-
146
- // print_r($this->_allCat);
147
- // exit();
148
- // By default, set media gallery attribute id to 703
149
- // Look it up later
150
- $MEDIA_GALLERY_ATTRIBUTE_ID = 703;
151
-
152
- // Get the entity type for products
153
- $query = "SELECT entity_type_id FROM ChannelPilotSolutions_ChannelPilot_eav_entity_type WHERE entity_type_code = 'catalog_product'";
154
- $query = $this->_applyTablePrefix($query);
155
- $PRODUCT_ENTITY_TYPE_ID = $this->_dbConnection->fetchOne($query);
156
-
157
- // Get attribute codes and types
158
- $query = "SELECT attribute_id, attribute_code, backend_type, frontend_input
159
- FROM ChannelPilotSolutions_ChannelPilot_eav_attribute
160
- WHERE entity_type_id = $PRODUCT_ENTITY_TYPE_ID
161
- ";
162
- $query = $this->_applyTablePrefix($query);
163
- $attributes = $this->_dbConnection->FetchAssoc($query);
164
- $attributeCodes = array();
165
- $blankProduct = array();
166
- $blankProduct['entity_id'] = '';
167
- $blankProduct['sku'] = '';
168
- $blankProduct['parent_id'] = '';
169
- $blankProduct['variationTheme'] = '';
170
- $blankProduct['name'] = '';
171
- $blankProduct['description'] = '';
172
- $blankProduct['price'] = '';
173
- $blankProduct['categories'] = '';
174
- $blankProduct['manufacturer'] = '';
175
- $blankProduct['cp_product_url'] = '';
176
- $blankProduct['cp_image_url'] = '';
177
- $blankProduct['color'] = '';
178
- $blankProduct['weight'] = '';
179
- for($i = 1; $i <= Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber'); $i++) {
180
- $blankProduct['cp_additional_image_'.$i] = '';
181
- }
182
-
183
- $special_export_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_specialexportfields'));
184
- if (!empty($special_export_fields)) {
185
- foreach ($special_export_fields as $element) {
186
- if (!empty($element['name'])) {
187
- $blankProduct[preg_replace('/\W/', '', $element['name'])] = $element['value'];
188
- }
189
- }
190
- }
191
-
192
- foreach ($attributes as $row) {
193
- // Save attribute ID for media gallery
194
- if ($row['attribute_code'] == 'media_gallery') {
195
- $MEDIA_GALLERY_ATTRIBUTE_ID = $row['attribute_id'];
196
- }
197
-
198
- switch ($row['backend_type']) {
199
- case 'datetime':
200
- case 'decimal':
201
- case 'int':
202
- case 'text':
203
- case 'varchar':
204
- $attributeCodes[$row['attribute_id']] = $row['attribute_code'];
205
- //$blankProduct[$row['attribute_code']] = '';
206
- break;
207
- case 'static':
208
- // ignore columns in entity table
209
- // print("Skipping static attribute: ".$row['attribute_code']."\n");
210
- break;
211
- default:
212
- // print("Unsupported backend_type: ".$row['backend_type']."\n");
213
- break;
214
- }
215
-
216
- // If the type is multiple choice, cache the option values
217
- // in a lookup array for performance (avoids several joins/aggregations)
218
- if ($row['frontend_input'] == 'select' || $row['frontend_input'] == 'multiselect') {
219
- // Get the option_id => value from the attribute options
220
- $query = "
221
- SELECT
222
- CASE WHEN SUM(aov.store_id) = 0 THEN MAX(aov.option_id) ELSE
223
- MAX(CASE WHEN aov.store_id = " . $this->_storeId . " THEN aov.option_id ELSE NULL END)
224
- END AS 'option_id'
225
- ,CASE WHEN SUM(aov.store_id) = 0 THEN MAX(aov.value) ELSE
226
- MAX(CASE WHEN aov.store_id = " . $this->_storeId . " THEN aov.value ELSE NULL END)
227
- END AS 'value'
228
- FROM ChannelPilotSolutions_ChannelPilot_eav_attribute_option AS ao
229
- INNER JOIN ChannelPilotSolutions_ChannelPilot_eav_attribute_option_value AS aov
230
- ON ao.option_id = aov.option_id
231
- WHERE aov.store_id IN (" . $this->_storeId . ", 0)
232
- AND ao.attribute_id = " . $row['attribute_id'] . "
233
- GROUP BY aov.option_id
234
- ";
235
- $query = $this->_applyTablePrefix($query);
236
- $result = $this->_dbConnection->fetchPairs($query);
237
-
238
- // If found, then save the lookup table in the attributeOptions array
239
- if (is_array($result)) {
240
- $attributeOptions[$row['attribute_id']] = $result;
241
- } else {
242
- // Otherwise, leave a blank array
243
- $attributeOptions[$row['attribute_id']] = array();
244
- }
245
- $result = null;
246
- }
247
- }
248
-
249
- $export_data_fields_codes = '';
250
- $export_data_fields_ids = '';
251
- foreach (array_keys($blankProduct) as $key) {
252
- $export_data_fields_codes = $export_data_fields_codes . "'" . $key . "',";
253
- $tmpid = array_search($key, $attributeCodes);
254
- if (!empty($tmpid)) {
255
- $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
256
- }
257
- }
258
-
259
- $export_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_exportfields'));
260
- if (!empty($export_fields)) {
261
- foreach ($export_fields as $element) {
262
- if (!empty($element['productattribute'])) {
263
- $blankProduct[preg_replace('/\W/', '', $element['productattribute'])] = '';
264
- $export_data_fields_codes = $export_data_fields_codes . "'" . $element['productattribute'] . "',";
265
- $tmpid = array_search($element['productattribute'], $attributeCodes);
266
- if (!empty($tmpid)) {
267
- $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
268
- }
269
- }
270
- }
271
- }
272
-
273
- $tmpid = array_search('status', $attributeCodes);
274
- if (!empty($tmpid)) {
275
- $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
276
- }
277
- $tmpid = array_search('url_path', $attributeCodes);
278
- if (!empty($tmpid)) {
279
- $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
280
- }
281
- $tmpid = array_search('image', $attributeCodes);
282
- if (!empty($tmpid)) {
283
- $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
284
- }
285
- $export_data_fields_ids = rtrim($export_data_fields_ids, ',');
286
-
287
-
288
-
289
- // Build queries for each attribute type
290
- $backendTypes = array(
291
- 'datetime',
292
- 'decimal',
293
- 'int',
294
- 'text',
295
- 'varchar',
296
- );
297
- $queries = array();
298
- foreach ($backendTypes as $backendType) {
299
- // Get store value if there is one, otherwise, global value
300
- $queries[] = "
301
- SELECT CASE WHEN SUM(ev.store_id) = 0 THEN MAX(ev.value) ELSE
302
- MAX(CASE WHEN ev.store_id = " . $this->_storeId . " THEN ev.value ELSE NULL END)
303
- END AS 'value', ev.attribute_id
304
- FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity
305
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_entity_$backendType AS ev
306
- ON ChannelPilotSolutions_ChannelPilot_catalog_product_entity.entity_id = ev.entity_id
307
- WHERE ev.store_id IN (" . $this->_storeId . ", 0)
308
- AND ev.entity_type_id = $PRODUCT_ENTITY_TYPE_ID
309
- AND ev.entity_id = @ENTITY_ID AND ev.attribute_id IN (" . $export_data_fields_ids . ")
310
- GROUP BY ev.attribute_id, ev.entity_id
311
- ";
312
- }
313
- $query = implode(" UNION ALL ", $queries);
314
- $MasterProductQuery = $query;
315
-
316
- $count = 0;
317
- $query = "
318
- SELECT count(*)
319
- FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity AS cpe
320
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_website as cpw
321
- ON cpw.product_id = cpe.entity_id
322
- WHERE cpw.website_id = " . $this->_siteId . "
323
- AND IFNULL(cpe.sku, '') != ''
324
- ";
325
- $query = $this->_applyTablePrefix($query);
326
- $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
327
- $count = $this->_dbConnection->fetchAll($query);
328
-
329
- $counter = 0;
330
-
331
- $border = (int) $count[0][0] - $selectLimit;
332
- if ($border < $count[0][0]) {
333
- $border = $count[0][0];
334
- }
335
-
336
- $parentProductArray = array();
337
- $replace_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_replacefields'));
338
-
339
- $variationThemes = array();
340
- while ($counter <= $border) {
341
- // Get all entity_ids for all products in the selected store
342
- $query = "
343
- SELECT cpe.entity_id, cpe.sku,
344
- (SELECT parent_id FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_link WHERE product_id=cpe.entity_id LIMIT 1) as parent,
345
- (SELECT count(*) FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_link WHERE parent_id=cpe.entity_id LIMIT 1) as is_parent,
346
- (SELECT qty FROM ChannelPilotSolutions_ChannelPilot_cataloginventory_stock_status WHERE product_id=cpe.entity_id AND website_id=" . $this->_siteId . " AND stock_id = 1 LIMIT 1) as qty,
347
- (SELECT stock_status FROM ChannelPilotSolutions_ChannelPilot_cataloginventory_stock_status WHERE product_id=cpe.entity_id AND website_id=" . $this->_siteId . " AND stock_id = 1 LIMIT 1) as stock_status,
348
- (SELECT crpp.rule_price FROM ChannelPilotSolutions_ChannelPilot_catalogrule_product_price AS crpp WHERE crpp.rule_date = CURDATE() AND crpp.product_id =cpe.entity_id AND crpp.customer_group_id = 1 AND crpp.website_id = " . $this->_siteId . ") as cat_price
349
- FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity AS cpe
350
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_website as cpw
351
- ON cpw.product_id = cpe.entity_id
352
- WHERE cpw.website_id = " . $this->_siteId . "
353
- AND IFNULL(cpe.sku, '') != ''
354
- ORDER BY is_parent DESC, entity_id DESC
355
- LIMIT " . $counter . ", " . $selectLimit . "
356
- ";
357
- $query = $this->_applyTablePrefix($query);
358
- // Set fetch mode to numeric to save memory
359
- $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
360
- $EntityIds = $this->_dbConnection->fetchAll($query);
361
- // Loop through each product and output the data
362
- foreach ($EntityIds as $entity) {
363
-
364
-
365
-
366
- // Fill the master query with the entity ID
367
- // $entity[0] = entity_id
368
- // $entity[1] = sku
369
- $query = str_replace('@ENTITY_ID', $entity[0], $MasterProductQuery);
370
- $query = $this->_applyTablePrefix($query);
371
- $result = $this->_dbConnection->query($query);
372
-
373
-
374
- // Create a new product record
375
- $product = $blankProduct;
376
-
377
- if (intval($entity[3]) > 0) {
378
- $varQuery = "SELECT ea.attribute_code FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_attribute cpsa
379
- LEFT JOIN ChannelPilotSolutions_ChannelPilot_eav_attribute ea ON ea.attribute_id = cpsa.attribute_id
380
- WHERE cpsa.product_id = '$entity[0]' ORDER BY ea.attribute_id; ";
381
- $varQuery = $this->_applyTablePrefix($varQuery);
382
- $varresults = $this->_dbConnection->fetchAll($varQuery);
383
- $variationTheme = "";
384
- foreach ($varresults as $varresult) {
385
- $variationTheme = $variationTheme . "|" . $varresult[0];
386
- }
387
- $product['variationTheme'] = ltrim($variationTheme, "|");
388
- $variationThemes[$entity[0]] = ltrim($variationTheme, "|");
389
- } else {
390
- if (empty($entity[2]) != true) {
391
- $product['variationTheme'] = $variationThemes[$entity[2]];
392
- }
393
- }
394
-
395
-
396
-
397
-
398
-
399
- // Initialize basic product data
400
- $product['entity_id'] = $entity[0];
401
- $product['sku'] = $entity[1];
402
-
403
- // Escape the SKU (it may contain double-quotes)
404
- $product['sku'] = str_replace('"', '""', $product['sku']);
405
-
406
- $product_status;
407
- $product_url;
408
- $product_image;
409
- // Loop through each field in the row and get the value
410
- while (true) {
411
- // Get next column
412
- // $column[0] = value
413
- // $column[1] = attribute_id
414
- $column = $result->fetch(Zend_Db::FETCH_NUM);
415
- // Break if no more rows
416
- if (empty($column)) {
417
- break;
418
- }
419
- // Skip attributes that don't exist in eav_attribute
420
- if (!isset($attributeCodes[$column[1]])) {
421
- continue;
422
- }
423
-
424
- // Translate the option option_id to a value.
425
- if (isset($attributeOptions[$column[1]]) == true) {
426
- // Convert all option values
427
- $optionValues = explode(',', $column[0]);
428
- $convertedOptionValues = array();
429
- foreach ($optionValues as $optionValue) {
430
- if (isset($attributeOptions[$column[1]][$optionValue]) == true) {
431
- // If a option_id is found, translate it
432
- $convertedOptionValues[] = $attributeOptions[$column[1]][$optionValue];
433
- }
434
- }
435
- // Erase values that are set to zero
436
- if ($column[0] == '0') {
437
- $column[0] = '';
438
- } elseif (empty($convertedOptionValues) == false) {
439
- // Use convert values if any conversions exist
440
- $column[0] = implode(',', $convertedOptionValues);
441
- }
442
- // Otherwise, leave value as-is
443
- }
444
- if (strpos($export_data_fields_codes, "'" . $attributeCodes[$column[1]] . "'") != false) {
445
- $product[$attributeCodes[$column[1]]] = str_replace('"', '""', $column[0]);
446
- }
447
- if ($attributeCodes[$column[1]] == 'status') {
448
- $product_status = $column[0];
449
- }
450
- if ($attributeCodes[$column[1]] == 'url_path') {
451
- $product_url = $column[0];
452
- }
453
- if ($attributeCodes[$column[1]] == 'image') {
454
- $product_image = $column[0];
455
- }
456
- }
457
- $result = null;
458
-
459
- // Skip product that are disabled or have no status
460
- if (empty($product_status) || $product_status == Mage_Catalog_Model_Product_Status::STATUS_DISABLED) {
461
- continue;
462
- }
463
- // Get category information
464
- $query = '';
465
- if (substr(Mage::getVersion(), 2, 3) >= 6) {
466
- $query = "
467
- SELECT DISTINCT fs.entity_id, fs.path, fs.name
468
- FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
469
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_flat_store_" . $this->_storeId . " AS fs
470
- ON pi.category_id = fs.entity_id
471
- WHERE pi.product_id = " . $entity[0] . " ORDER BY fs.path ASC
472
- ";
473
- } else {
474
- $query = "
475
- SELECT pi.category_id, ce.path
476
- FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
477
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_entity AS ce ON pi.category_id = ce.entity_id
478
- WHERE pi.product_id = " . $entity[0] . " AND pi.is_parent = 1 AND pi.store_id = " . $this->_storeId . " ORDER BY ce.path ASC
479
- ";
480
- }
481
- $query = $this->_applyTablePrefix($query);
482
- $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
483
-
484
- $categoriesTable = $this->_dbConnection->fetchAll($query);
485
- $product['categories'] = '';
486
- $categorieField = '';
487
- $this->oldCatPath = '';
488
- foreach ($categoriesTable as $categorie) {
489
- if (($this->oldCatPath == '') || (strpos($categorie[1], $this->oldCatPath) !== 0)) {
490
- // Start tree
491
- if ($this->oldCatPath !== '') {
492
- if ($categorieField !== '') {
493
- $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
494
- } else {
495
- $categorieField = $this->_allCat[$this->oldCatPath];
496
- }
497
- }
498
- $this->oldCatPath = $categorie[1];
499
- } else {
500
- // Add to tree
501
- $this->oldCatPath = $categorie[1];
502
- }
503
- }
504
- if ($categorieField !== '') {
505
- $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
506
- } else {
507
- if ($this->oldCatPath !== '') {
508
- $categorieField = $this->_allCat[$this->oldCatPath];
509
- }
510
- }
511
- $product['categories'] = $categorieField;
512
-
513
- // Get stock quantity
514
- // NOTE: stock_id = 1 is the 'Default' stock
515
- if (strpos($export_data_fields_codes, "'qty'") != false) {
516
- if (empty($entity[4]) == true) {
517
- $product['qty'] = '0';
518
- } else {
519
- $product['qty'] = $entity[4];
520
- }
521
- }
522
- if (strpos($export_data_fields_codes, "'stock_status'") != false) {
523
- if (empty($entity[5]) == true) {
524
- $product['stock_status'] = '';
525
- } else {
526
- $product['stock_status'] = $entity[5];
527
- }
528
- }
529
- $stockInfoResult = null;
530
-
531
- // Get additional image URLs
532
- $galleryImagePrefix = $this->_dbConnection->quote($this->_mediaUrl . 'catalog/product');
533
- $query = "
534
- SELECT
535
- GROUP_CONCAT(gallery.value_id SEPARATOR ',') AS value_id
536
- ,GROUP_CONCAT(CONCAT(" . $galleryImagePrefix . ", gallery.value) SEPARATOR ',') AS value
537
- FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity_media_gallery AS gallery
538
- INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_entity_media_gallery_value AS gallery_value
539
- ON gallery.value_id = gallery_value.value_id
540
- WHERE gallery_value.store_id IN (" . $this->_storeId . ", 0)
541
- AND gallery_value.disabled = 0
542
- AND gallery.entity_id=" . $entity[0] . "
543
- AND gallery.attribute_id = " . $MEDIA_GALLERY_ATTRIBUTE_ID . "
544
- ORDER BY gallery_value.position ASC";
545
- $query = $this->_applyTablePrefix($query);
546
- $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
547
- $galleryValues = $this->_dbConnection->fetchAll($query);
548
- if (empty($galleryValues) != true) {
549
- $additional_images = explode(',', $galleryValues[0][1]);
550
- for($i = 1; $i <= Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber'); $i++) {
551
- if (isset($additional_images[$i])) {
552
- $product['cp_additional_image_' . ($i + 1)] = $additional_images[$i];
553
- }
554
- }
555
- }
556
-
557
- // Get parent ID
558
- if (empty($entity[2]) != true && strpos($export_data_fields_codes, "'parent_id'") != false) {
559
- $product['parent_id'] = $entity[2];
560
- }
561
-
562
- // Override price with catalog price rule, if found
563
- if (empty($entity[6]) != true) {
564
- // Override price with catalog rule price
565
- $product['price'] = $entity[6];
566
- }
567
-
568
- // Calculate image and product URLs
569
- if (empty($product_url) == false) {
570
- $product['cp_product_url'] = $this->_urlPathJoin($this->_webUrl, $product_url);
571
- }
572
-
573
- if (empty($product_image) == false) {
574
- $product['cp_image_url'] = $this->_urlPathJoin($this->_mediaUrl, 'catalog/product');
575
- $product['cp_image_url'] = $this->_urlPathJoin($product['cp_image_url'], $product_image);
576
- }
577
-
578
- if (!empty($replace_fields)) {
579
- // PARENT
580
- if ($entity[3] > 0) {
581
- foreach ($replace_fields as $element) {
582
- if (!empty($element['productattribute']) && array_key_exists($element['productattribute'], $product)) {
583
- $parentProductArray[$product['entity_id']][$element['productattribute']] = $product[$element['productattribute']];
584
- }
585
- }
586
- } else {
587
- // CHILD
588
- if ($entity[2] != null) {
589
- foreach ($replace_fields as $element) {
590
- if (!empty($element['productattribute']) && array_key_exists($element['productattribute'], $product)) {
591
- $product[$element['productattribute']] = $parentProductArray[$entity[2]][$element['productattribute']];
592
- }
593
- }
594
- }
595
- }
596
- }
597
- $this->xml = new SimpleXMLElement("<product></product>");
598
- echo str_replace('<?xml version="1.0"?>', '', $this->toXML($product));
599
- $this->xml = null;
600
- }
601
- $counter = $counter + $selectLimit;
602
- }
603
- return;
604
- }
605
-
606
- // Join two URL paths and handle forward slashes
607
- private function _urlPathJoin($part1, $part2) {
608
- return rtrim($part1, '/') . '/' . ltrim($part2, '/');
609
- }
610
-
611
- // Die if the storeId is invalid
612
- private function _getStoreInformation() {
613
- try {
614
- // Get the store object
615
- $store = Mage::app()->getStore($this->_storeId);
616
-
617
- // Load the store information
618
- $this->_siteId = $store->getWebsiteId();
619
- $this->_webUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
620
- $this->_mediaUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
621
- } catch (Exception $e) {
622
- die('Store=' . $this->_storeId . " probably does not exist.");
623
- }
624
- }
625
-
626
- private function toXML($array) {
627
- $this->iterate($array, $this->xml);
628
- return $this->xml->asXML();
629
- }
630
-
631
- private function iterate($element, $xmlNode) {
632
- if (is_array($element)) {
633
- foreach ($element as $name => $value) {
634
- if (is_string($value) || is_numeric($value) || is_bool($value)) {
635
- $xmlNode->$name = $value;
636
- } else {
637
- $xmlNode->$name = null;
638
- $this->iterate($value, $xmlNode->$name);
639
- }
640
- }
641
- }
642
- }
643
-
644
- }
645
-
646
- ?>
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the GNU General Public License (GPL 3)
8
+ * that is bundled with this package in the file LICENSE.txt
9
+ *
10
+ * DISCLAIMER
11
+ *
12
+ * Do not edit or add to this file if you wish to upgrade Channelpilotsolutions_Channelpilot to newer
13
+ * versions in the future. If you wish to customize Channelpilotsolutions_Channelpilot for your
14
+ * needs please refer to http://www.channelpilot.com for more information.
15
+ *
16
+ * @category Channelpilotsolutions
17
+ * @package Channelpilotsolutions_Channelpilot
18
+ * @subpackage helper
19
+ * @copyright Copyright (c) 2012 <info@channelpilot.com> - www.channelpilot.com
20
+ * @author Peter Hoffmann <info@channelpilot.com>
21
+ * @license <http://www.gnu.org/licenses/> GNU General Public License (GPL 3)
22
+ * @link http://www.channelpilot.com
23
+ */
24
+ class ExportData {
25
+
26
+ private $_tablePrefix;
27
+ private $_storeId;
28
+ private $_siteId;
29
+ private $_mediaUrl;
30
+ private $_webUrl;
31
+ private $_dbConnection;
32
+ private $_allCat;
33
+ private $oldCatPath;
34
+ private $xml;
35
+
36
+ function __construct() {
37
+
38
+
39
+ // Increase maximum execution time to 4 hours
40
+ ini_set('max_execution_time', 7200);
41
+
42
+ // Initialize the admin application
43
+ Mage::app('admin');
44
+
45
+ // Get the table prefix
46
+ $tableName = Mage::getSingleton('core/resource')->getTableName('core_website');
47
+ $this->_tablePrefix = substr($tableName, 0, strpos($tableName, 'core_website'));
48
+
49
+ // Get database connection
50
+ $this->_dbConnection = Mage::getSingleton('core/resource')->getConnection('core_read');
51
+ }
52
+
53
+ // Apply prefix to table names in the query
54
+ private function _applyTablePrefix($query) {
55
+ return str_replace('ChannelPilotSolutions_ChannelPilot_', $this->_tablePrefix, $query);
56
+ }
57
+
58
+ // Run the main application and call the appropriate function
59
+ // depending on the command.
60
+ public function _runMain() {
61
+ if (isset($_GET['store']) AND $_GET['store'] != '') {
62
+ $this->_storeId = $_GET['store'];
63
+ } else {
64
+ $this->_storeId = Mage::app()->getStore()->getId();
65
+ }
66
+
67
+ // Validate store and get information
68
+ $this->_getStoreInformation();
69
+
70
+ // Run extraction
71
+ return $this->_extractFromMySQL();
72
+ }
73
+
74
+ private function getCategory($key) {
75
+ $return = 0;
76
+ if (strpos($key, '/') != false) {
77
+ $tmpKey = substr($key, 0, strpos($key, strrchr($key, '/')));
78
+ if (isset($this->_allCat[$tmpKey])) {
79
+ $return = $this->_allCat[$tmpKey];
80
+ } else {
81
+ $return = $this->getCategory($tmpKey);
82
+ }
83
+ }
84
+ return $return;
85
+ }
86
+
87
+ // Extract natively directly from the database
88
+ private function _extractFromMySQL() {
89
+ $selectLimit = 100;
90
+
91
+ // Increase maximium length for group_concat (for additional image URLs field)
92
+ $query = "SET SESSION group_concat_max_len = 1000000;";
93
+ $this->_dbConnection->query($query);
94
+
95
+ // Get category information
96
+ $query = '';
97
+ if (substr(Mage::getVersion(), 2, 3) >= 6) {
98
+ $query = "
99
+ SELECT DISTINCT fs.entity_id, fs.path, fs.name
100
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
101
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_flat_store_" . $this->_storeId . " AS fs
102
+ ON pi.category_id = fs.entity_id
103
+ ORDER BY fs.path ASC
104
+ ";
105
+ } else {
106
+ $query = "
107
+ SELECT DISTINCT ev.entity_id, ce.path, ev.value
108
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_category_entity_varchar AS ev
109
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_entity AS ce ON ev.entity_id = ce.entity_id
110
+ WHERE ev.attribute_id = (
111
+ SELECT attribute_id
112
+ FROM ChannelPilotSolutions_ChannelPilot_eav_attribute as att
113
+ WHERE att.entity_type_id = ev.entity_type_id AND att.attribute_code='name'
114
+ )
115
+ ORDER BY ce.path ASC
116
+ ";
117
+ }
118
+ $query = $this->_applyTablePrefix($query);
119
+ $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
120
+
121
+ $categoriesTable = $this->_dbConnection->fetchAll($query);
122
+
123
+ $this->_allCat = array();
124
+ $oldCatPath = 'initialize';
125
+ $oldCatTree = '';
126
+
127
+ foreach ($categoriesTable as $categorie) {
128
+ if (strpos($categorie[1], $oldCatPath) !== 0) {
129
+ // Start tree
130
+ $path = $this->getCategory($categorie[1]);
131
+ if ($path !== 0) {
132
+ $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $path . '>' . $categorie[2]);
133
+ $oldCatTree = $path . '>' . $categorie[2];
134
+ } else {
135
+ $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $categorie[2]);
136
+ $oldCatTree = $categorie[2];
137
+ }
138
+ } else {
139
+ // continue tree
140
+ $this->_allCat[$categorie[1]] = str_replace('Root Catalog', 'Home', $oldCatTree . '>' . $categorie[2]);
141
+ $oldCatTree = $this->_allCat[$categorie[1]];
142
+ }
143
+ $oldCatPath = $categorie[1];
144
+ }
145
+
146
+ // print_r($this->_allCat);
147
+ // exit();
148
+ // By default, set media gallery attribute id to 703
149
+ // Look it up later
150
+ $MEDIA_GALLERY_ATTRIBUTE_ID = 703;
151
+
152
+ // Get the entity type for products
153
+ $query = "SELECT entity_type_id FROM ChannelPilotSolutions_ChannelPilot_eav_entity_type WHERE entity_type_code = 'catalog_product'";
154
+ $query = $this->_applyTablePrefix($query);
155
+ $PRODUCT_ENTITY_TYPE_ID = $this->_dbConnection->fetchOne($query);
156
+
157
+ // Get attribute codes and types
158
+ $query = "SELECT attribute_id, attribute_code, backend_type, frontend_input
159
+ FROM ChannelPilotSolutions_ChannelPilot_eav_attribute
160
+ WHERE entity_type_id = $PRODUCT_ENTITY_TYPE_ID
161
+ ";
162
+ $query = $this->_applyTablePrefix($query);
163
+ $attributes = $this->_dbConnection->FetchAssoc($query);
164
+ $attributeCodes = array();
165
+ $blankProduct = array();
166
+ $blankProduct['entity_id'] = '';
167
+ $blankProduct['sku'] = '';
168
+ $blankProduct['parent_id'] = '';
169
+ $blankProduct['variationTheme'] = '';
170
+ $blankProduct['name'] = '';
171
+ $blankProduct['description'] = '';
172
+ $blankProduct['price'] = '';
173
+ $blankProduct['categories'] = '';
174
+ $blankProduct['manufacturer'] = '';
175
+ $blankProduct['cp_product_url'] = '';
176
+ $blankProduct['cp_image_url'] = '';
177
+ $blankProduct['color'] = '';
178
+ $blankProduct['weight'] = '';
179
+ for($i = 1; $i <= Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber'); $i++) {
180
+ $blankProduct['cp_additional_image_'.$i] = '';
181
+ }
182
+
183
+ $special_export_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_specialexportfields'));
184
+ if (!empty($special_export_fields)) {
185
+ foreach ($special_export_fields as $element) {
186
+ if (!empty($element['name'])) {
187
+ $blankProduct[preg_replace('/\W/', '', $element['name'])] = $element['value'];
188
+ }
189
+ }
190
+ }
191
+
192
+ foreach ($attributes as $row) {
193
+ // Save attribute ID for media gallery
194
+ if ($row['attribute_code'] == 'media_gallery') {
195
+ $MEDIA_GALLERY_ATTRIBUTE_ID = $row['attribute_id'];
196
+ }
197
+
198
+ switch ($row['backend_type']) {
199
+ case 'datetime':
200
+ case 'decimal':
201
+ case 'int':
202
+ case 'text':
203
+ case 'varchar':
204
+ $attributeCodes[$row['attribute_id']] = $row['attribute_code'];
205
+ //$blankProduct[$row['attribute_code']] = '';
206
+ break;
207
+ case 'static':
208
+ // ignore columns in entity table
209
+ // print("Skipping static attribute: ".$row['attribute_code']."\n");
210
+ break;
211
+ default:
212
+ // print("Unsupported backend_type: ".$row['backend_type']."\n");
213
+ break;
214
+ }
215
+
216
+ // If the type is multiple choice, cache the option values
217
+ // in a lookup array for performance (avoids several joins/aggregations)
218
+ if ($row['frontend_input'] == 'select' || $row['frontend_input'] == 'multiselect') {
219
+ // Get the option_id => value from the attribute options
220
+ $query = "
221
+ SELECT
222
+ CASE WHEN SUM(aov.store_id) = 0 THEN MAX(aov.option_id) ELSE
223
+ MAX(CASE WHEN aov.store_id = " . $this->_storeId . " THEN aov.option_id ELSE NULL END)
224
+ END AS 'option_id'
225
+ ,CASE WHEN SUM(aov.store_id) = 0 THEN MAX(aov.value) ELSE
226
+ MAX(CASE WHEN aov.store_id = " . $this->_storeId . " THEN aov.value ELSE NULL END)
227
+ END AS 'value'
228
+ FROM ChannelPilotSolutions_ChannelPilot_eav_attribute_option AS ao
229
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_eav_attribute_option_value AS aov
230
+ ON ao.option_id = aov.option_id
231
+ WHERE aov.store_id IN (" . $this->_storeId . ", 0)
232
+ AND ao.attribute_id = " . $row['attribute_id'] . "
233
+ GROUP BY aov.option_id
234
+ ";
235
+ $query = $this->_applyTablePrefix($query);
236
+ $result = $this->_dbConnection->fetchPairs($query);
237
+
238
+ // If found, then save the lookup table in the attributeOptions array
239
+ if (is_array($result)) {
240
+ $attributeOptions[$row['attribute_id']] = $result;
241
+ } else {
242
+ // Otherwise, leave a blank array
243
+ $attributeOptions[$row['attribute_id']] = array();
244
+ }
245
+ $result = null;
246
+ }
247
+ }
248
+
249
+ $export_data_fields_codes = '';
250
+ $export_data_fields_ids = '';
251
+ foreach (array_keys($blankProduct) as $key) {
252
+ $export_data_fields_codes = $export_data_fields_codes . "'" . $key . "',";
253
+ $tmpid = array_search($key, $attributeCodes);
254
+ if (!empty($tmpid)) {
255
+ $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
256
+ }
257
+ }
258
+
259
+ $export_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_exportfields'));
260
+ if (!empty($export_fields)) {
261
+ foreach ($export_fields as $element) {
262
+ if (!empty($element['productattribute'])) {
263
+ $blankProduct[preg_replace('/\W/', '', $element['productattribute'])] = '';
264
+ $export_data_fields_codes = $export_data_fields_codes . "'" . $element['productattribute'] . "',";
265
+ $tmpid = array_search($element['productattribute'], $attributeCodes);
266
+ if (!empty($tmpid)) {
267
+ $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
268
+ }
269
+ }
270
+ }
271
+ }
272
+
273
+ $tmpid = array_search('status', $attributeCodes);
274
+ if (!empty($tmpid)) {
275
+ $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
276
+ }
277
+ $tmpid = array_search('url_path', $attributeCodes);
278
+ if (!empty($tmpid)) {
279
+ $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
280
+ }
281
+ $tmpid = array_search('image', $attributeCodes);
282
+ if (!empty($tmpid)) {
283
+ $export_data_fields_ids = $export_data_fields_ids . "'" . $tmpid . "',";
284
+ }
285
+ $export_data_fields_ids = rtrim($export_data_fields_ids, ',');
286
+
287
+
288
+
289
+ // Build queries for each attribute type
290
+ $backendTypes = array(
291
+ 'datetime',
292
+ 'decimal',
293
+ 'int',
294
+ 'text',
295
+ 'varchar',
296
+ );
297
+ $queries = array();
298
+ foreach ($backendTypes as $backendType) {
299
+ // Get store value if there is one, otherwise, global value
300
+ $queries[] = "
301
+ SELECT CASE WHEN SUM(ev.store_id) = 0 THEN MAX(ev.value) ELSE
302
+ MAX(CASE WHEN ev.store_id = " . $this->_storeId . " THEN ev.value ELSE NULL END)
303
+ END AS 'value', ev.attribute_id
304
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity
305
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_entity_$backendType AS ev
306
+ ON ChannelPilotSolutions_ChannelPilot_catalog_product_entity.entity_id = ev.entity_id
307
+ WHERE ev.store_id IN (" . $this->_storeId . ", 0)
308
+ AND ev.entity_type_id = $PRODUCT_ENTITY_TYPE_ID
309
+ AND ev.entity_id = @ENTITY_ID AND ev.attribute_id IN (" . $export_data_fields_ids . ")
310
+ GROUP BY ev.attribute_id, ev.entity_id
311
+ ";
312
+ }
313
+ $query = implode(" UNION ALL ", $queries);
314
+ $MasterProductQuery = $query;
315
+
316
+ $count = 0;
317
+ $query = "
318
+ SELECT count(*)
319
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity AS cpe
320
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_website as cpw
321
+ ON cpw.product_id = cpe.entity_id
322
+ WHERE cpw.website_id = " . $this->_siteId . "
323
+ AND IFNULL(cpe.sku, '') != ''
324
+ ";
325
+ $query = $this->_applyTablePrefix($query);
326
+ $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
327
+ $count = $this->_dbConnection->fetchAll($query);
328
+
329
+ $counter = 0;
330
+
331
+ $border = (int) $count[0][0] - $selectLimit;
332
+ if ($border < $count[0][0]) {
333
+ $border = $count[0][0];
334
+ }
335
+
336
+ $parentProductArray = array();
337
+ $replace_fields = unserialize(Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_replacefields'));
338
+
339
+ $variationThemes = array();
340
+ while ($counter <= $border) {
341
+ // Get all entity_ids for all products in the selected store
342
+ $query = "
343
+ SELECT cpe.entity_id, cpe.sku,
344
+ (SELECT parent_id FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_link WHERE product_id=cpe.entity_id LIMIT 1) as parent,
345
+ (SELECT count(*) FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_link WHERE parent_id=cpe.entity_id LIMIT 1) as is_parent,
346
+ (SELECT qty FROM ChannelPilotSolutions_ChannelPilot_cataloginventory_stock_status WHERE product_id=cpe.entity_id AND website_id=" . $this->_siteId . " AND stock_id = 1 LIMIT 1) as qty,
347
+ (SELECT stock_status FROM ChannelPilotSolutions_ChannelPilot_cataloginventory_stock_status WHERE product_id=cpe.entity_id AND website_id=" . $this->_siteId . " AND stock_id = 1 LIMIT 1) as stock_status,
348
+ (SELECT crpp.rule_price FROM ChannelPilotSolutions_ChannelPilot_catalogrule_product_price AS crpp WHERE crpp.rule_date = CURDATE() AND crpp.product_id =cpe.entity_id AND crpp.customer_group_id = 1 AND crpp.website_id = " . $this->_siteId . ") as cat_price
349
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity AS cpe
350
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_website as cpw
351
+ ON cpw.product_id = cpe.entity_id
352
+ WHERE cpw.website_id = " . $this->_siteId . "
353
+ AND IFNULL(cpe.sku, '') != ''
354
+ ORDER BY is_parent DESC, entity_id DESC
355
+ LIMIT " . $counter . ", " . $selectLimit . "
356
+ ";
357
+ $query = $this->_applyTablePrefix($query);
358
+ // Set fetch mode to numeric to save memory
359
+ $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
360
+ $EntityIds = $this->_dbConnection->fetchAll($query);
361
+ // Loop through each product and output the data
362
+ foreach ($EntityIds as $entity) {
363
+
364
+
365
+
366
+ // Fill the master query with the entity ID
367
+ // $entity[0] = entity_id
368
+ // $entity[1] = sku
369
+ $query = str_replace('@ENTITY_ID', $entity[0], $MasterProductQuery);
370
+ $query = $this->_applyTablePrefix($query);
371
+ $result = $this->_dbConnection->query($query);
372
+
373
+
374
+ // Create a new product record
375
+ $product = $blankProduct;
376
+
377
+ if (intval($entity[3]) > 0) {
378
+ $varQuery = "SELECT ea.attribute_code FROM ChannelPilotSolutions_ChannelPilot_catalog_product_super_attribute cpsa
379
+ LEFT JOIN ChannelPilotSolutions_ChannelPilot_eav_attribute ea ON ea.attribute_id = cpsa.attribute_id
380
+ WHERE cpsa.product_id = '$entity[0]' ORDER BY ea.attribute_id; ";
381
+ $varQuery = $this->_applyTablePrefix($varQuery);
382
+ $varresults = $this->_dbConnection->fetchAll($varQuery);
383
+ $variationTheme = "";
384
+ foreach ($varresults as $varresult) {
385
+ $variationTheme = $variationTheme . "|" . $varresult[0];
386
+ }
387
+ $product['variationTheme'] = ltrim($variationTheme, "|");
388
+ $variationThemes[$entity[0]] = ltrim($variationTheme, "|");
389
+ } else {
390
+ if (empty($entity[2]) != true) {
391
+ $product['variationTheme'] = $variationThemes[$entity[2]];
392
+ }
393
+ }
394
+
395
+
396
+
397
+
398
+
399
+ // Initialize basic product data
400
+ $product['entity_id'] = $entity[0];
401
+ $product['sku'] = $entity[1];
402
+
403
+ // Escape the SKU (it may contain double-quotes)
404
+ $product['sku'] = str_replace('"', '""', $product['sku']);
405
+
406
+ $product_status;
407
+ $product_url;
408
+ $product_image;
409
+ // Loop through each field in the row and get the value
410
+ while (true) {
411
+ // Get next column
412
+ // $column[0] = value
413
+ // $column[1] = attribute_id
414
+ $column = $result->fetch(Zend_Db::FETCH_NUM);
415
+ // Break if no more rows
416
+ if (empty($column)) {
417
+ break;
418
+ }
419
+ // Skip attributes that don't exist in eav_attribute
420
+ if (!isset($attributeCodes[$column[1]])) {
421
+ continue;
422
+ }
423
+
424
+ // Translate the option option_id to a value.
425
+ if (isset($attributeOptions[$column[1]]) == true) {
426
+ // Convert all option values
427
+ $optionValues = explode(',', $column[0]);
428
+ $convertedOptionValues = array();
429
+ foreach ($optionValues as $optionValue) {
430
+ if (isset($attributeOptions[$column[1]][$optionValue]) == true) {
431
+ // If a option_id is found, translate it
432
+ $convertedOptionValues[] = $attributeOptions[$column[1]][$optionValue];
433
+ }
434
+ }
435
+ // Erase values that are set to zero
436
+ if ($column[0] == '0') {
437
+ $column[0] = '';
438
+ } elseif (empty($convertedOptionValues) == false) {
439
+ // Use convert values if any conversions exist
440
+ $column[0] = implode(',', $convertedOptionValues);
441
+ }
442
+ // Otherwise, leave value as-is
443
+ }
444
+ if (strpos($export_data_fields_codes, "'" . $attributeCodes[$column[1]] . "'") != false) {
445
+ $product[$attributeCodes[$column[1]]] = str_replace('"', '""', $column[0]);
446
+ }
447
+ if ($attributeCodes[$column[1]] == 'status') {
448
+ $product_status = $column[0];
449
+ }
450
+ if ($attributeCodes[$column[1]] == 'url_path') {
451
+ $product_url = $column[0];
452
+ }
453
+ if ($attributeCodes[$column[1]] == 'image') {
454
+ $product_image = $column[0];
455
+ }
456
+ }
457
+ $result = null;
458
+
459
+ // Skip product that are disabled or have no status
460
+ if (empty($product_status) || $product_status == Mage_Catalog_Model_Product_Status::STATUS_DISABLED) {
461
+ continue;
462
+ }
463
+ // Get category information
464
+ $query = '';
465
+ if (substr(Mage::getVersion(), 2, 3) >= 6) {
466
+ $query = "
467
+ SELECT DISTINCT fs.entity_id, fs.path, fs.name
468
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
469
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_flat_store_" . $this->_storeId . " AS fs
470
+ ON pi.category_id = fs.entity_id
471
+ WHERE pi.product_id = " . $entity[0] . " ORDER BY fs.path ASC
472
+ ";
473
+ } else {
474
+ $query = "
475
+ SELECT pi.category_id, ce.path
476
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_category_product_index AS pi
477
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_category_entity AS ce ON pi.category_id = ce.entity_id
478
+ WHERE pi.product_id = " . $entity[0] . " AND pi.is_parent = 1 AND pi.store_id = " . $this->_storeId . " ORDER BY ce.path ASC
479
+ ";
480
+ }
481
+ $query = $this->_applyTablePrefix($query);
482
+ $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
483
+
484
+ $categoriesTable = $this->_dbConnection->fetchAll($query);
485
+ $product['categories'] = '';
486
+ $categorieField = '';
487
+ $this->oldCatPath = '';
488
+ foreach ($categoriesTable as $categorie) {
489
+ if (($this->oldCatPath == '') || (strpos($categorie[1], $this->oldCatPath) !== 0)) {
490
+ // Start tree
491
+ if ($this->oldCatPath !== '') {
492
+ if ($categorieField !== '') {
493
+ $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
494
+ } else {
495
+ $categorieField = $this->_allCat[$this->oldCatPath];
496
+ }
497
+ }
498
+ $this->oldCatPath = $categorie[1];
499
+ } else {
500
+ // Add to tree
501
+ $this->oldCatPath = $categorie[1];
502
+ }
503
+ }
504
+ if ($categorieField !== '') {
505
+ $categorieField = $categorieField . ', ' . $this->_allCat[$this->oldCatPath];
506
+ } else {
507
+ if ($this->oldCatPath !== '') {
508
+ $categorieField = $this->_allCat[$this->oldCatPath];
509
+ }
510
+ }
511
+ $product['categories'] = $categorieField;
512
+
513
+ // Get stock quantity
514
+ // NOTE: stock_id = 1 is the 'Default' stock
515
+ if (strpos($export_data_fields_codes, "'qty'") != false) {
516
+ if (empty($entity[4]) == true) {
517
+ $product['qty'] = '0';
518
+ } else {
519
+ $product['qty'] = $entity[4];
520
+ }
521
+ }
522
+ if (strpos($export_data_fields_codes, "'stock_status'") != false) {
523
+ if (empty($entity[5]) == true) {
524
+ $product['stock_status'] = '';
525
+ } else {
526
+ $product['stock_status'] = $entity[5];
527
+ }
528
+ }
529
+ $stockInfoResult = null;
530
+
531
+ // Get additional image URLs
532
+ $galleryImagePrefix = $this->_dbConnection->quote($this->_mediaUrl . 'catalog/product');
533
+ $query = "
534
+ SELECT
535
+ GROUP_CONCAT(gallery.value_id SEPARATOR ',') AS value_id
536
+ ,GROUP_CONCAT(CONCAT(" . $galleryImagePrefix . ", gallery.value) SEPARATOR ',') AS value
537
+ FROM ChannelPilotSolutions_ChannelPilot_catalog_product_entity_media_gallery AS gallery
538
+ INNER JOIN ChannelPilotSolutions_ChannelPilot_catalog_product_entity_media_gallery_value AS gallery_value
539
+ ON gallery.value_id = gallery_value.value_id
540
+ WHERE gallery_value.store_id IN (" . $this->_storeId . ", 0)
541
+ AND gallery_value.disabled = 0
542
+ AND gallery.entity_id=" . $entity[0] . "
543
+ AND gallery.attribute_id = " . $MEDIA_GALLERY_ATTRIBUTE_ID . "
544
+ ORDER BY gallery_value.position ASC";
545
+ $query = $this->_applyTablePrefix($query);
546
+ $this->_dbConnection->setFetchMode(ZEND_DB::FETCH_NUM);
547
+ $galleryValues = $this->_dbConnection->fetchAll($query);
548
+ if (empty($galleryValues) != true) {
549
+ $additional_images = explode(',', $galleryValues[0][1]);
550
+ for($i = 1; $i <= Mage::getStoreConfig('channelpilot_export/channelpilot_productfeed/channelpilot_imagenumber'); $i++) {
551
+ if (isset($additional_images[$i])) {
552
+ $product['cp_additional_image_' . ($i + 1)] = $additional_images[$i];
553
+ }
554
+ }
555
+ }
556
+
557
+ // Get parent ID
558
+ if (empty($entity[2]) != true && strpos($export_data_fields_codes, "'parent_id'") != false) {
559
+ $product['parent_id'] = $entity[2];
560
+ }
561
+
562
+ // Override price with catalog price rule, if found
563
+ if (empty($entity[6]) != true) {
564
+ // Override price with catalog rule price
565
+ $product['price'] = $entity[6];
566
+ }
567
+
568
+ // Calculate image and product URLs
569
+ if (empty($product_url) == false) {
570
+ $product['cp_product_url'] = $this->_urlPathJoin($this->_webUrl, $product_url);
571
+ }
572
+
573
+ if (empty($product_image) == false) {
574
+ $product['cp_image_url'] = $this->_urlPathJoin($this->_mediaUrl, 'catalog/product');
575
+ $product['cp_image_url'] = $this->_urlPathJoin($product['cp_image_url'], $product_image);
576
+ }
577
+
578
+ if (!empty($replace_fields)) {
579
+ // PARENT
580
+ if ($entity[3] > 0) {
581
+ foreach ($replace_fields as $element) {
582
+ if (!empty($element['productattribute']) && array_key_exists($element['productattribute'], $product)) {
583
+ $parentProductArray[$product['entity_id']][$element['productattribute']] = $product[$element['productattribute']];
584
+ }
585
+ }
586
+ } else {
587
+ // CHILD
588
+ if ($entity[2] != null) {
589
+ foreach ($replace_fields as $element) {
590
+ if (!empty($element['productattribute']) && array_key_exists($element['productattribute'], $product)) {
591
+ $product[$element['productattribute']] = $parentProductArray[$entity[2]][$element['productattribute']];
592
+ }
593
+ }
594
+ }
595
+ }
596
+ }
597
+ $this->xml = new SimpleXMLElement("<product></product>");
598
+ echo str_replace('<?xml version="1.0"?>', '', $this->toXML($product));
599
+ $this->xml = null;
600
+ }
601
+ $counter = $counter + $selectLimit;
602
+ }
603
+ return;
604
+ }
605
+
606
+ // Join two URL paths and handle forward slashes
607
+ private function _urlPathJoin($part1, $part2) {
608
+ return rtrim($part1, '/') . '/' . ltrim($part2, '/');
609
+ }
610
+
611
+ // Die if the storeId is invalid
612
+ private function _getStoreInformation() {
613
+ try {
614
+ // Get the store object
615
+ $store = Mage::app()->getStore($this->_storeId);
616
+
617
+ // Load the store information
618
+ $this->_siteId = $store->getWebsiteId();
619
+ $this->_webUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
620
+ $this->_mediaUrl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
621
+ } catch (Exception $e) {
622
+ die('Store=' . $this->_storeId . " probably does not exist.");
623
+ }
624
+ }
625
+
626
+ private function toXML($array) {
627
+ $this->iterate($array, $this->xml);
628
+ return $this->xml->asXML();
629
+ }
630
+
631
+ private function iterate($element, $xmlNode) {
632
+ if (is_array($element)) {
633
+ foreach ($element as $name => $value) {
634
+ if (is_string($value) || is_numeric($value) || is_bool($value)) {
635
+ $xmlNode->$name = $value;
636
+ } else {
637
+ $xmlNode->$name = null;
638
+ $this->iterate($value, $xmlNode->$name);
639
+ }
640
+ }
641
+ }
642
+ }
643
+
644
+ }
645
+
646
+ ?>
app/code/community/Channelpilotsolutions/Channelpilot/Helper/api/1_0/ChannelPilotSellerAPI_v1_0.php CHANGED
@@ -1,184 +1,184 @@
1
- <?php
2
-
3
- // include the stub-classes
4
- require_once 'thin/CPAuth.php';
5
- require_once 'thin/CPResponseHeader.php';
6
- require_once 'thin/CPArticleUpdate.php';
7
- require_once 'thin/CPAddress.php';
8
- require_once 'thin/CPArticle.php';
9
- require_once 'thin/CPCancellation.php';
10
- require_once 'thin/CPDiscount.php';
11
- require_once 'thin/CPManagedArticlePrice.php';
12
- require_once 'thin/CPMoney.php';
13
- require_once 'thin/CPPayment.php';
14
- require_once 'thin/CPCustomer.php';
15
- require_once 'thin/CPOrderItem.php';
16
- require_once 'thin/CPShipping.php';
17
- require_once 'thin/CPOrderStatus.php';
18
- require_once 'thin/CPOrderHeader.php';
19
- require_once 'thin/CPOrder.php';
20
- require_once 'thin/CPOrderSummary.php';
21
-
22
- // request-classes
23
- // response-classes
24
- require_once 'responses/Response.php';
25
- require_once 'responses/GetServerTimeResponse.php';
26
- require_once 'responses/UpdateArticlesResponse.php';
27
- require_once 'responses/UpdateArticleResult.php';
28
- require_once 'responses/UpdateOrdersResponse.php';
29
- require_once 'responses/UpdateOrderResult.php';
30
- require_once 'responses/GetNewMarketplaceOrdersResponse.php';
31
- require_once 'responses/GetManagedArticlePricesResponse.php';
32
-
33
- /**
34
- * Main API-Class
35
- * @author Channel Pilot Solutions GmbH <api@channelpilot.com>
36
- * @version 1.0
37
- */
38
- class ChannelPilotSellerAPI_v1_0 extends SoapClient {
39
-
40
- private $auth;
41
- private $wsdlUrl = 'https://seller.api.channelpilot.com/1_0?wsdl';
42
- private $soapOptions = array(
43
- 'connection_timeout' => 20,
44
- 'features' => SOAP_SINGLE_ELEMENT_ARRAYS
45
- );
46
- private $classmap = array(
47
- 'CPAuth' => 'CPAuth',
48
- 'CPResponseHeader' => 'CPResponseHeader',
49
- 'AbstractResponse' => 'AbstractResponse',
50
- 'GetServerTimeResponse' => 'GetServerTimeResponse',
51
- 'CPArticleUpdate' => 'CPArticleUpdate',
52
- 'UpdateArticlesResponse' => 'UpdateArticlesResponse',
53
- 'UpdateArticleResult' => 'UpdateArticleResult',
54
- 'UpdateOrdersResponse' => 'UpdateOrdersResponse',
55
- 'UpdateOrderResult' => 'UpdateOrderResult',
56
- 'CPAddress' => 'CPAddress',
57
- 'CPArticle' => 'CPArticle',
58
- 'CPDiscount' => 'CPDiscount',
59
- 'CPManagedArticlePrice' => 'CPManagedArticlePrice',
60
- 'CPMoney' => 'CPMoney',
61
- 'CPPayment' => 'CPPayment',
62
- 'CPCustomer' => 'CPCustomer',
63
- 'CPOrderItem' => 'CPOrderItem',
64
- 'CPShipping' => 'CPShipping',
65
- 'CPOrderStatus' => 'CPOrderStatus',
66
- 'CPOrderHeader' => 'CPOrderHeader',
67
- 'CPOrder' => 'CPOrder',
68
- 'CPOrderSummary' => 'CPOrderSummary',
69
- 'GetNewMarketplaceOrdersResponse' => 'GetNewMarketplaceOrdersResponse'
70
- );
71
-
72
- public function ChannelPilotSellerAPI_v1_0($merchantId, $shopToken) {
73
- $this->auth = new CPAuth($merchantId, $shopToken);
74
-
75
- foreach ($this->classmap as $key => $value) {
76
- if (!isset($this->soapOptions['classmap'][$key])) {
77
- $this->soapOptions['classmap'][$key] = $value;
78
- }
79
- }
80
- parent::__construct($this->wsdlUrl, $this->soapOptions);
81
- }
82
-
83
- /**
84
- * Receives the acutal server time. Can be used to test the connection.
85
- * @return GetServerTimeResponse
86
- */
87
- public function getServerTime() {
88
- return $this->__call(
89
- 'getServerTime',
90
- array(
91
- new SoapParam($this->auth, 'auth')
92
- )
93
- );
94
- }
95
-
96
- /**
97
- * updates an array of articles in batch
98
- * @return UpdateArticlesResponse
99
- */
100
- public function updateArticles(array $articles) {
101
- return $this->__call(
102
- 'updateArticles',
103
- array(
104
- new SoapParam($this->auth, 'auth'),
105
- new SoapParam($articles, 'articles')
106
- )
107
- );
108
- }
109
-
110
- /**
111
- * retrieves new marketplace orders
112
- * @return GetNewMarketplaceOrdersResponse
113
- */
114
- public function getNewMarketplaceOrders() {
115
- return $this->__call(
116
- 'getNewMarketplaceOrders',
117
- array(
118
- new SoapParam($this->auth, 'auth')
119
- )
120
- );
121
- }
122
-
123
- /**
124
- * update orders in ChannelPilot to "imported", generates the matching between externalOrderId and the shop-internal orderId
125
- * q
126
- * @return GetNewMarketplaceOrdersResponse
127
- */
128
-
129
-
130
- /**
131
- * update orders in ChannelPilot to "imported", generates the matching between externalOrderId and the shop-internal orderId
132
- * @param array $orders array of CPOrders
133
- * @param type $mapOrderItemIds boolean, if channelPilot should map your internal orderItemIds
134
- * @return type
135
- */
136
- public function setImportedOrders(array $orders, $mapOrderItemIds) {
137
- return $this->__call(
138
- 'setImportedOrders',
139
- array(
140
- new SoapParam($this->auth, 'auth'),
141
- new SoapParam($orders, 'importedOrders'),
142
- new SoapParam($mapOrderItemIds, 'mapOrderItemIds'),
143
- )
144
- );
145
- }
146
-
147
-
148
- public function registerDeliveries(array $deliveries) {
149
- return $this->__call(
150
- 'registerDeliveries',
151
- array(
152
- new SoapParam($this->auth, 'auth'),
153
- new SoapParam($deliveries, 'deliveries')
154
- )
155
- );
156
- }
157
-
158
- public function registerCancellations(array $cancellations) {
159
- return $this->__call(
160
- 'registerCancellations',
161
- array(
162
- new SoapParam($this->auth, 'auth'),
163
- new SoapParam($cancellations, 'cancellations')
164
- )
165
- );
166
- }
167
-
168
- public function getDynamicArticlePrices($priceId, $method, $filterArticles, $filterFrom) {
169
- return $this->__call(
170
- 'getDynamicArticlePrices',
171
- array(
172
- new SoapParam($this->auth, 'auth'),
173
- new SoapParam($priceId, 'priceId'),
174
- new SoapParam(null, 'pagination'),
175
- new SoapParam($method, 'method'),
176
- new SoapParam($filterArticles, 'filterArticles'),
177
- new SoapParam($filterFrom, 'filterFrom')
178
- )
179
- );
180
- }
181
-
182
- }
183
-
184
- ?>
1
+ <?php
2
+
3
+ // include the stub-classes
4
+ require_once 'thin/CPAuth.php';
5
+ require_once 'thin/CPResponseHeader.php';
6
+ require_once 'thin/CPArticleUpdate.php';
7
+ require_once 'thin/CPAddress.php';
8
+ require_once 'thin/CPArticle.php';
9
+ require_once 'thin/CPCancellation.php';
10
+ require_once 'thin/CPDiscount.php';
11
+ require_once 'thin/CPManagedArticlePrice.php';
12
+ require_once 'thin/CPMoney.php';
13
+ require_once 'thin/CPPayment.php';
14
+ require_once 'thin/CPCustomer.php';
15
+ require_once 'thin/CPOrderItem.php';
16
+ require_once 'thin/CPShipping.php';
17
+ require_once 'thin/CPOrderStatus.php';
18
+ require_once 'thin/CPOrderHeader.php';
19
+ require_once 'thin/CPOrder.php';
20
+ require_once 'thin/CPOrderSummary.php';
21
+
22
+ // request-classes
23
+ // response-classes
24
+ require_once 'responses/Response.php';
25
+ require_once 'responses/GetServerTimeResponse.php';
26
+ require_once 'responses/UpdateArticlesResponse.php';
27
+ require_once 'responses/UpdateArticleResult.php';
28
+ require_once 'responses/UpdateOrdersResponse.php';
29
+ require_once 'responses/UpdateOrderResult.php';
30
+ require_once 'responses/GetNewMarketplaceOrdersResponse.php';
31
+ require_once 'responses/GetManagedArticlePricesResponse.php';
32
+
33
+ /**
34
+ * Main API-Class
35
+ * @author Channel Pilot Solutions GmbH <api@channelpilot.com>
36
+ * @version 1.0
37
+ */
38
+ class ChannelPilotSellerAPI_v1_0 extends SoapClient {
39
+
40
+ private $auth;
41
+ private $wsdlUrl = 'https://seller.api.channelpilot.com/1_0?wsdl';
42
+ private $soapOptions = array(
43
+ 'connection_timeout' => 20,
44
+ 'features' => SOAP_SINGLE_ELEMENT_ARRAYS
45
+ );
46
+ private $classmap = array(
47
+ 'CPAuth' => 'CPAuth',
48
+ 'CPResponseHeader' => 'CPResponseHeader',
49
+ 'AbstractResponse' => 'AbstractResponse',
50
+ 'GetServerTimeResponse' => 'GetServerTimeResponse',
51
+ 'CPArticleUpdate' => 'CPArticleUpdate',
52
+ 'UpdateArticlesResponse' => 'UpdateArticlesResponse',
53
+ 'UpdateArticleResult' => 'UpdateArticleResult',
54
+ 'UpdateOrdersResponse' => 'UpdateOrdersResponse',
55
+ 'UpdateOrderResult' => 'UpdateOrderResult',
56
+ 'CPAddress' => 'CPAddress',
57
+ 'CPArticle' => 'CPArticle',
58
+ 'CPDiscount' => 'CPDiscount',
59
+ 'CPManagedArticlePrice' => 'CPManagedArticlePrice',
60
+ 'CPMoney' => 'CPMoney',
61
+ 'CPPayment' => 'CPPayment',
62
+ 'CPCustomer' => 'CPCustomer',
63
+ 'CPOrderItem' => 'CPOrderItem',
64
+ 'CPShipping' => 'CPShipping',
65
+ 'CPOrderStatus' => 'CPOrderStatus',
66
+ 'CPOrderHeader' => 'CPOrderHeader',
67
+ 'CPOrder' => 'CPOrder',
68
+ 'CPOrderSummary' => 'CPOrderSummary',
69
+ 'GetNewMarketplaceOrdersResponse' => 'GetNewMarketplaceOrdersResponse'
70
+ );
71
+
72
+ public function ChannelPilotSellerAPI_v1_0($merchantId, $shopToken) {
73
+ $this->auth = new CPAuth($merchantId, $shopToken);
74
+
75
+ foreach ($this->classmap as $key => $value) {
76
+ if (!isset($this->soapOptions['classmap'][$key])) {
77
+ $this->soapOptions['classmap'][$key] = $value;
78
+ }
79
+ }
80
+ parent::__construct($this->wsdlUrl, $this->soapOptions);
81
+ }
82
+
83
+ /**
84
+ * Receives the acutal server time. Can be used to test the connection.
85
+ * @return GetServerTimeResponse
86
+ */
87
+ public function getServerTime() {
88
+ return $this->__call(
89
+ 'getServerTime',
90
+ array(
91
+ new SoapParam($this->auth, 'auth')
92
+ )
93
+ );
94
+ }
95
+
96
+ /**
97
+ * updates an array of articles in batch
98
+ * @return UpdateArticlesResponse
99
+ */
100
+ public function updateArticles(array $articles) {
101
+ return $this->__call(
102
+ 'updateArticles',
103
+ array(
104
+ new SoapParam($this->auth, 'auth'),
105
+ new SoapParam($articles, 'articles')
106
+ )
107
+ );
108
+ }
109
+
110
+ /**
111
+ * retrieves new marketplace orders
112
+ * @return GetNewMarketplaceOrdersResponse
113
+ */
114
+ public function getNewMarketplaceOrders() {
115
+ return $this->__call(
116
+ 'getNewMarketplaceOrders',
117
+ array(
118
+ new SoapParam($this->auth, 'auth')
119
+ )
120
+ );
121
+ }
122
+
123
+ /**
124
+ * update orders in ChannelPilot to "imported", generates the matching between externalOrderId and the shop-internal orderId
125
+ * q
126
+ * @return GetNewMarketplaceOrdersResponse
127
+ */
128
+
129
+
130
+ /**
131
+ * update orders in ChannelPilot to "imported", generates the matching between externalOrderId and the shop-internal orderId
132
+ * @param array $orders array of CPOrders
133
+ * @param type $mapOrderItemIds boolean, if channelPilot should map your internal orderItemIds
134
+ * @return type
135
+ */
136
+ public function setImportedOrders(array $orders, $mapOrderItemIds) {
137
+ return $this->__call(
138
+ 'setImportedOrders',
139
+ array(
140
+ new SoapParam($this->auth, 'auth'),
141
+ new SoapParam($orders, 'importedOrders'),
142
+ new SoapParam($mapOrderItemIds, 'mapOrderItemIds'),
143
+ )
144
+ );
145
+ }
146
+
147
+
148
+ public function registerDeliveries(array $deliveries) {
149
+ return $this->__call(
150
+ 'registerDeliveries',
151
+ array(
152
+ new SoapParam($this->auth, 'auth'),
153
+ new SoapParam($deliveries, 'deliveries')
154
+ )
155
+ );
156
+ }
157
+
158
+ public function registerCancellations(array $cancellations) {
159
+ return $this->__call(
160
+ 'registerCancellations',
161
+ array(
162
+ new SoapParam($this->auth, 'auth'),
163
+ new SoapParam($cancellations, 'cancellations')
164
+ )
165
+ );
166
+ }
167
+
168
+ public function getDynamicArticlePrices($priceId, $method, $filterArticles, $filterFrom) {
169
+ return $this->__call(
170
+ 'getDynamicArticlePrices',
171
+ array(
172
+ new SoapParam($this->auth, 'auth'),
173
+ new SoapParam($priceId, 'priceId'),
174
+ new SoapParam(null, 'pagination'),
175
+ new SoapParam($method, 'method'),
176
+ new SoapParam($filterArticles, 'filterArticles'),
177
+ new SoapParam($filterFrom, 'filterFrom')
178
+ )
179
+ );
180
+ }
181
+
182
+ }
183
+
184
+ ?>
app/code/community/Channelpilotsolutions/Channelpilot/Helper/handler/CPExportHandler.php CHANGED
@@ -24,7 +24,7 @@ class CPExportHandler extends CPAbstractHandler {
24
  *
25
  */
26
  public function handle() {
27
- if (isset($_GET['shopId'])) {
28
  $this->limit = $_GET['limit'];
29
  $this->last = $_GET['last'];
30
  $this->_storeId = $_GET['shopId'];
24
  *
25
  */
26
  public function handle() {
27
+ if (isset($_GET['limit']) && isset($_GET['shopId'])) {
28
  $this->limit = $_GET['limit'];
29
  $this->last = $_GET['last'];
30
  $this->_storeId = $_GET['shopId'];
app/code/community/Channelpilotsolutions/Channelpilot/Model/PaymentTypes.php CHANGED
@@ -1,11 +1,5 @@
1
  <?php
2
 
3
- /*
4
- * To change this license header, choose License Headers in Project Properties.
5
- * To change this template file, choose Tools | Templates
6
- * and open the template in the editor.
7
- */
8
-
9
  class Channelpilotsolutions_Channelpilot_Model_Paymenttypes {
10
 
11
  public function toOptionArray() {
1
  <?php
2
 
 
 
 
 
 
 
3
  class Channelpilotsolutions_Channelpilot_Model_Paymenttypes {
4
 
5
  public function toOptionArray() {
app/code/community/Channelpilotsolutions/Channelpilot/etc/config.xml CHANGED
@@ -24,7 +24,7 @@
24
  <config>
25
  <modules>
26
  <Channelpilotsolutions_Channelpilot>
27
- <version>2.1.2</version>
28
  </Channelpilotsolutions_Channelpilot>
29
  </modules>
30
  <global>
24
  <config>
25
  <modules>
26
  <Channelpilotsolutions_Channelpilot>
27
+ <version>2.1.3</version>
28
  </Channelpilotsolutions_Channelpilot>
29
  </modules>
30
  <global>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Channelpilotsolutions_Channelpilot</name>
4
- <version>2.1.2</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
@@ -26,11 +26,11 @@
26
  &lt;li&gt;&lt;b&gt;ChannelPilot Multi-Platform:&lt;/b&gt; Access ChannelPilot on any device (e.g. computer, tablet or smartphone) and keep a firm hold on your online marketing- wherever you are!&lt;/li&gt;&#xD;
27
  &lt;/ul&gt;&#xD;
28
  Just get more information about ChannelPilot: &lt;a href="http://www.channelpilot.com"&gt;www.channelpilot.com&lt;/a&gt;</description>
29
- <notes>- fix bug in product detail page</notes>
30
  <authors><author><name>ChannelPilot Solutions GmbH</name><user>auto-converted</user><email>info@channelpilot.com</email></author></authors>
31
- <date>2015-04-15</date>
32
- <time>16:04:49</time>
33
- <contents><target name="magecommunity"><dir name="Channelpilotsolutions"><dir name="Channelpilot"><dir name="Adminhtml"><dir name="Model"><dir name="Articlenumber"><file name="Values.php" hash="f2744ef8301e25e096318f34eb97c2bf"/></dir><dir name="Cookiemode"><file name="Values.php" hash="1ec39f85bb7562c1b6a4614f759d9124"/></dir><dir name="Grossnet"><file name="Values.php" hash="11eaf553b0ec34299524ec6d5a9f1e13"/></dir><dir name="Imagenumber"><file name="Values.php" hash="010dbb2ec946627f338bc500d3d8d747"/></dir><dir name="Pricefield"><file name="Values.php" hash="6b02dfa3fa93daafa8325d66a986b4ac"/></dir><dir name="Truefalse"><file name="Values.php" hash="e07f105d7d8dc9881690f162cd23472d"/></dir><dir name="Truefalsesecurity"><file name="Values.php" hash="509b5e1cc7cabbe179373bc0ed490499"/></dir></dir></dir><dir name="Block"><dir name="Adminhtml"><dir name="Field"><file name="Exportfields.php" hash="ca3e562dff7272ed6e72592d65d2466f"/><file name="Replacefields.php" hash="998c731b9e0419271f5ef13237405ad0"/><file name="Specialfields.php" hash="617a423f8632d0bee669bab5a463ce74"/><file name="Trackingkeys.php" hash="383c5112824ccb2998c74dbc3fe10da1"/></dir><file name="Hintlogo.php" hash="be78974a79e7cc59601254a8df0dc48b"/></dir></dir><dir name="Helper"><dir name="api"><dir name="1_0"><dir name="responses"><file name="GetManagedArticlePricesResponse.php" hash="9ad5adee1952b9408b442449791a1f34"/><file name="GetNewMarketplaceOrdersResponse.php" hash="cd5db953a84759b93a35a360956c4624"/><file name="GetServerTimeResponse.php" hash="07d157639b5bf715aa3f93b0d9e4b736"/><file name="Response.php" hash="c76ce62707a862e1c59346c668055b5d"/><file name="UpdateArticleResult.php" hash="a014c60be447fbb9cf48c947c8e9822f"/><file name="UpdateArticlesResponse.php" hash="338619d50391d91defb5c9d41370022f"/><file name="UpdateOrderResult.php" hash="0fbd88371624270a8cb2c4209a89cfac"/><file name="UpdateOrdersResponse.php" hash="b0ad5828da633b05e654da393b15526a"/></dir><dir name="thin"><file name="CPAddress.php" hash="885fb4517335421fbd8cbc882ae336b1"/><file name="CPArticle.php" hash="1adce1ce33acdd0185dee06010040b18"/><file name="CPArticleUpdate.php" hash="45f514823895c754010f8f11a1ff683a"/><file name="CPAuth.php" hash="cf5fe570dbd98e3e6339b20cec826b7b"/><file name="CPCancellation.php" hash="9bf808e265e09d166466313405a167fc"/><file name="CPCustomer.php" hash="62babdf11e9b4d80ae0afbbf96ba329d"/><file name="CPDelivery.php" hash="c8c54883370efd519249a9a9551668d0"/><file name="CPDiscount.php" hash="5d6f2766869134a86761c12230dc32d1"/><file name="CPManagedArticlePrice.php" hash="65c4c0df04b7c8d20294874de11640d6"/><file name="CPMoney.php" hash="952131eccc8470e107c78e15c94b6495"/><file name="CPOrder.php" hash="32623885f664e9b5871fc48b6ba0c801"/><file name="CPOrderHeader.php" hash="828377182e8197c304f230a783606993"/><file name="CPOrderItem.php" hash="dfe2440a08e3d0f13e638fc4090e6c52"/><file name="CPOrderStatus.php" hash="e0e767388dd9a1ab8be5a990f1ab1259"/><file name="CPOrderSummary.php" hash="fceaa6a79b5fc892062681f518fd0243"/><file name="CPPayment.php" hash="446ffde1318d001c213de2b80855af07"/><file name="CPResponseHeader.php" hash="53930210d68046183e3be306996ea9b9"/><file name="CPShipping.php" hash="eaddceace28cdc6ba72434a6321d8c47"/></dir><file name="CPResultCodes.php" hash="955180ee33f14b4afa93f6eb1b5df53f"/><file name="ChannelPilotSellerAPI_v1_0.php" hash="45ccca9cbc4d583167c1c8135fb8c2f1"/></dir></dir><dir name="handler"><file name="CPAbstractHandler.php" hash="3ff636f82a10e452f8b76e0747d64644"/><file name="CPCancellationHandler.php" hash="9b77706089a26ae42ad2e00c303b66ae"/><file name="CPDebugHandler.php" hash="43f2e8da6e44adfb20d7ec813ca54cad"/><file name="CPDeliveryHandler.php" hash="a392ca48d781dd0db4e6fb9bdd863b7e"/><file name="CPErrorHandler.php" hash="5d728c064c068fdf8354fa87882e4dba"/><file name="CPExportHandler.php" hash="8a46a4a30ff01209641aa8d0852ab073"/><file name="CPNewPriceHandler.php" hash="749093369d0c3fefe1782c5c77774f9f"/><file name="CPNewsHandler.php" hash="4975a6271baf09af3b2f007f13bb587c"/><file name="CPOrderHandler.php" hash="b605bf698acd1803bb6d3be8a65dd27c"/><file name="CPRegisterHandler.php" hash="43a7baff372b472049dc0e52deb2549f"/><file name="CPStatusHandler.php" hash="713feca664739aeacda6260318f5c26a"/><file name="todoCPPaymentHandler.php" hash="34ea64beda7c8bc5309ebea280146c32"/></dir><dir name="responses"><file name="CPGetStatusHookResponse.php" hash="672609ebcaa23aa0de85aed04c7662d8"/><file name="CPHookResponse.php" hash="9acdda5838cae8b6022af2f4e0a9314b"/><file name="CPRegisterHookResponse.php" hash="206de6433d0795ebdabff98129cc2fb7"/></dir><dir name="special"><file name="CustomerFunctions.php" hash="0d343d3c9c3cb87232c833e0772f730e"/></dir><file name="CPErrors.php" hash="3659c38a1ed3be4aa4ec03d93e68a84e"/><file name="Data.php" hash="08dc97ef0dd64cfe4e0b77ea3735b0bf"/><file name="ExportData.php" hash="8eb3d8aafa53ddc6b4c49f80f35348b6"/></dir><dir name="Model"><file name="Abstract.php" hash="0e9349f1023527a77e59742dfdb21308"/><file name="Payment.php" hash="5160ffe0422a9a46dc2bd7a79e512b8b"/><file name="PaymentTypes.php" hash="adc3931280cfe313adcbdd4702191a01"/><file name="Paymenttypes.php" hash="b217cdabf427beadb8d74acff069af4d"/></dir><dir name="controllers"><file name="IndexController.php" hash="36e391b61d1914f8669cd48207dd06da"/></dir><dir name="etc"><file name="adminhtml.xml" hash="62fad9ef0e77e858b74d2a7bdd6a6879"/><file name="config.xml" hash="154fd239a817bf3f9d50be4c305f4db4"/><file name="system.xml" hash="33d311ca704780d078533f62381895b1"/></dir><dir name="sql"><dir name="channelpilot_setup"><file name="mysql4-install-2.0.0.php" hash="8910b9b0507d1b38c8b8465845fb3849"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Channelpilotsolutions_Channelpilot.xml" hash="4cc80daa0c7f8dda239e41a6b17321bf"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="Channelpilotsolutions"><file name="channelpilot.xml" hash="732f1d98851f3c1bf0cb9e655a4a0359"/></dir></dir><dir name="template"><dir name="Channelpilotsolutions"><file name="channelpilot.phtml" hash="ac42e9777d28910dddc50d7d82ded4c2"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="template"><dir name="channelpilotsolutions"><file name="array_dropdown.phtml" hash="cb1230cd8a92ce0a0961f71b396736ec"/><file name="config_hint.phtml" hash="bab45579386a99fe4ccbfb1972ed08fc"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="de_DE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="57d54b69d4c7cb28373764403069eb6d"/></dir><dir name="de_CH"><file name="Channelpilotsolutions_Channelpilot.csv" hash="c5c7fd72d8a8778b5f1228c356111695"/></dir><dir name="de_AT"><file name="Channelpilotsolutions_Channelpilot.csv" hash="c5c7fd72d8a8778b5f1228c356111695"/></dir><dir name="fr_FR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="9a49d3ba87895fb14b234cfa838b9fab"/></dir><dir name="fr_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="9a49d3ba87895fb14b234cfa838b9fab"/></dir><dir name="en_AU"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_GB"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_IE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_NZ"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_US"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="es_AR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CL"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CO"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_ES"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_MX"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_PA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_PE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_VE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir></target></contents>
34
  <compatible/>
35
  <dependencies/>
36
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Channelpilotsolutions_Channelpilot</name>
4
+ <version>2.1.3</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
  <channel>community</channel>
26
  &lt;li&gt;&lt;b&gt;ChannelPilot Multi-Platform:&lt;/b&gt; Access ChannelPilot on any device (e.g. computer, tablet or smartphone) and keep a firm hold on your online marketing- wherever you are!&lt;/li&gt;&#xD;
27
  &lt;/ul&gt;&#xD;
28
  Just get more information about ChannelPilot: &lt;a href="http://www.channelpilot.com"&gt;www.channelpilot.com&lt;/a&gt;</description>
29
+ <notes>- fixed bug in module activation</notes>
30
  <authors><author><name>ChannelPilot Solutions GmbH</name><user>auto-converted</user><email>info@channelpilot.com</email></author></authors>
31
+ <date>2015-05-12</date>
32
+ <time>12:28:52</time>
33
+ <contents><target name="magecommunity"><dir name="Channelpilotsolutions"><dir name="Channelpilot"><dir name="Adminhtml"><dir name="Model"><dir name="Articlenumber"><file name="Values.php" hash="f2744ef8301e25e096318f34eb97c2bf"/></dir><dir name="Cookiemode"><file name="Values.php" hash="1ec39f85bb7562c1b6a4614f759d9124"/></dir><dir name="Grossnet"><file name="Values.php" hash="11eaf553b0ec34299524ec6d5a9f1e13"/></dir><dir name="Imagenumber"><file name="Values.php" hash="010dbb2ec946627f338bc500d3d8d747"/></dir><dir name="Pricefield"><file name="Values.php" hash="6b02dfa3fa93daafa8325d66a986b4ac"/></dir><dir name="Truefalse"><file name="Values.php" hash="e07f105d7d8dc9881690f162cd23472d"/></dir><dir name="Truefalsesecurity"><file name="Values.php" hash="509b5e1cc7cabbe179373bc0ed490499"/></dir></dir></dir><dir name="Block"><dir name="Adminhtml"><dir name="Field"><file name="Exportfields.php" hash="ca3e562dff7272ed6e72592d65d2466f"/><file name="Replacefields.php" hash="998c731b9e0419271f5ef13237405ad0"/><file name="Specialfields.php" hash="617a423f8632d0bee669bab5a463ce74"/><file name="Trackingkeys.php" hash="383c5112824ccb2998c74dbc3fe10da1"/></dir><file name="Hintlogo.php" hash="be78974a79e7cc59601254a8df0dc48b"/></dir></dir><dir name="Helper"><dir name="api"><dir name="1_0"><dir name="responses"><file name="GetManagedArticlePricesResponse.php" hash="9ad5adee1952b9408b442449791a1f34"/><file name="GetNewMarketplaceOrdersResponse.php" hash="cd5db953a84759b93a35a360956c4624"/><file name="GetServerTimeResponse.php" hash="07d157639b5bf715aa3f93b0d9e4b736"/><file name="Response.php" hash="c76ce62707a862e1c59346c668055b5d"/><file name="UpdateArticleResult.php" hash="a014c60be447fbb9cf48c947c8e9822f"/><file name="UpdateArticlesResponse.php" hash="338619d50391d91defb5c9d41370022f"/><file name="UpdateOrderResult.php" hash="0fbd88371624270a8cb2c4209a89cfac"/><file name="UpdateOrdersResponse.php" hash="b0ad5828da633b05e654da393b15526a"/></dir><dir name="thin"><file name="CPAddress.php" hash="885fb4517335421fbd8cbc882ae336b1"/><file name="CPArticle.php" hash="1adce1ce33acdd0185dee06010040b18"/><file name="CPArticleUpdate.php" hash="45f514823895c754010f8f11a1ff683a"/><file name="CPAuth.php" hash="cf5fe570dbd98e3e6339b20cec826b7b"/><file name="CPCancellation.php" hash="9bf808e265e09d166466313405a167fc"/><file name="CPCustomer.php" hash="62babdf11e9b4d80ae0afbbf96ba329d"/><file name="CPDelivery.php" hash="c8c54883370efd519249a9a9551668d0"/><file name="CPDiscount.php" hash="5d6f2766869134a86761c12230dc32d1"/><file name="CPManagedArticlePrice.php" hash="65c4c0df04b7c8d20294874de11640d6"/><file name="CPMoney.php" hash="952131eccc8470e107c78e15c94b6495"/><file name="CPOrder.php" hash="32623885f664e9b5871fc48b6ba0c801"/><file name="CPOrderHeader.php" hash="828377182e8197c304f230a783606993"/><file name="CPOrderItem.php" hash="dfe2440a08e3d0f13e638fc4090e6c52"/><file name="CPOrderStatus.php" hash="e0e767388dd9a1ab8be5a990f1ab1259"/><file name="CPOrderSummary.php" hash="fceaa6a79b5fc892062681f518fd0243"/><file name="CPPayment.php" hash="446ffde1318d001c213de2b80855af07"/><file name="CPResponseHeader.php" hash="53930210d68046183e3be306996ea9b9"/><file name="CPShipping.php" hash="eaddceace28cdc6ba72434a6321d8c47"/></dir><file name="CPResultCodes.php" hash="955180ee33f14b4afa93f6eb1b5df53f"/><file name="ChannelPilotSellerAPI_v1_0.php" hash="2eab31345c3628f38c71364e81aad905"/></dir></dir><dir name="handler"><file name="CPAbstractHandler.php" hash="3ff636f82a10e452f8b76e0747d64644"/><file name="CPCancellationHandler.php" hash="9b77706089a26ae42ad2e00c303b66ae"/><file name="CPDebugHandler.php" hash="43f2e8da6e44adfb20d7ec813ca54cad"/><file name="CPDeliveryHandler.php" hash="a392ca48d781dd0db4e6fb9bdd863b7e"/><file name="CPErrorHandler.php" hash="5d728c064c068fdf8354fa87882e4dba"/><file name="CPExportHandler.php" hash="d36ae63a30e587245e8be62e01cebdcb"/><file name="CPNewPriceHandler.php" hash="749093369d0c3fefe1782c5c77774f9f"/><file name="CPNewsHandler.php" hash="4975a6271baf09af3b2f007f13bb587c"/><file name="CPOrderHandler.php" hash="b605bf698acd1803bb6d3be8a65dd27c"/><file name="CPRegisterHandler.php" hash="43a7baff372b472049dc0e52deb2549f"/><file name="CPStatusHandler.php" hash="713feca664739aeacda6260318f5c26a"/><file name="todoCPPaymentHandler.php" hash="34ea64beda7c8bc5309ebea280146c32"/></dir><dir name="responses"><file name="CPGetStatusHookResponse.php" hash="672609ebcaa23aa0de85aed04c7662d8"/><file name="CPHookResponse.php" hash="9acdda5838cae8b6022af2f4e0a9314b"/><file name="CPRegisterHookResponse.php" hash="206de6433d0795ebdabff98129cc2fb7"/></dir><dir name="special"><file name="CustomerFunctions.php" hash="0d343d3c9c3cb87232c833e0772f730e"/></dir><file name="CPErrors.php" hash="3659c38a1ed3be4aa4ec03d93e68a84e"/><file name="Data.php" hash="7caa8da971acdff24ed04f928fef0cef"/><file name="ExportData.php" hash="4b7c911c4889cfde9d1e2976db856336"/></dir><dir name="Model"><file name="Abstract.php" hash="0e9349f1023527a77e59742dfdb21308"/><file name="Payment.php" hash="5160ffe0422a9a46dc2bd7a79e512b8b"/><file name="PaymentTypes.php" hash="b217cdabf427beadb8d74acff069af4d"/><file name="Paymenttypes.php" hash="b217cdabf427beadb8d74acff069af4d"/></dir><dir name="controllers"><file name="IndexController.php" hash="36e391b61d1914f8669cd48207dd06da"/></dir><dir name="etc"><file name="adminhtml.xml" hash="62fad9ef0e77e858b74d2a7bdd6a6879"/><file name="config.xml" hash="3ad65547173f2c1d9144ceb9267be37e"/><file name="system.xml" hash="33d311ca704780d078533f62381895b1"/></dir><dir name="sql"><dir name="channelpilot_setup"><file name="mysql4-install-2.0.0.php" hash="8910b9b0507d1b38c8b8465845fb3849"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Channelpilotsolutions_Channelpilot.xml" hash="4cc80daa0c7f8dda239e41a6b17321bf"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="Channelpilotsolutions"><file name="channelpilot.xml" hash="732f1d98851f3c1bf0cb9e655a4a0359"/></dir></dir><dir name="template"><dir name="Channelpilotsolutions"><file name="channelpilot.phtml" hash="ac42e9777d28910dddc50d7d82ded4c2"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="template"><dir name="channelpilotsolutions"><file name="array_dropdown.phtml" hash="cb1230cd8a92ce0a0961f71b396736ec"/><file name="config_hint.phtml" hash="bab45579386a99fe4ccbfb1972ed08fc"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="de_DE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="57d54b69d4c7cb28373764403069eb6d"/></dir><dir name="de_CH"><file name="Channelpilotsolutions_Channelpilot.csv" hash="c5c7fd72d8a8778b5f1228c356111695"/></dir><dir name="de_AT"><file name="Channelpilotsolutions_Channelpilot.csv" hash="c5c7fd72d8a8778b5f1228c356111695"/></dir><dir name="fr_FR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="9a49d3ba87895fb14b234cfa838b9fab"/></dir><dir name="fr_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="9a49d3ba87895fb14b234cfa838b9fab"/></dir><dir name="en_AU"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_CA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_GB"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_IE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_NZ"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="en_US"><file name="Channelpilotsolutions_Channelpilot.csv" hash="023babc42d9f9fd4488c6badcee01032"/></dir><dir name="es_AR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CL"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CO"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_CR"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_ES"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_MX"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_PA"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_PE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir><dir name="es_VE"><file name="Channelpilotsolutions_Channelpilot.csv" hash="eb81767885d7b76c7e89f9f3c0900fc3"/></dir></target></contents>
34
  <compatible/>
35
  <dependencies/>
36
  </package>