Giftd_Cards - Version 1.0.0

Version Notes

First public release.

Download this release

Release Info

Developer Alexander Nevidimov
Extension Giftd_Cards
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/community/Giftd/Cards/Helper/Data.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Giftd_Cards_Helper_Data extends Mage_Core_Helper_Abstract
4
+ {
5
+
6
+ }
app/code/community/Giftd/Cards/Model/GiftdClient.php ADDED
@@ -0,0 +1,275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class GiftdClient
4
+ {
5
+ private $userId;
6
+ private $apiKey;
7
+ private $baseUrl;
8
+
9
+ const RESPONSE_TYPE_DATA = 'data';
10
+ const RESPONSE_TYPE_ERROR = 'error';
11
+
12
+ const ERROR_NETWORK_ERROR = "networkError";
13
+ const ERROR_TOKEN_NOT_FOUND = "tokenNotFound";
14
+ const ERROR_EXTERNAL_ID_NOT_FOUND = "externalIdNotFound";
15
+ const ERROR_DUPLICATE_EXTERNAL_ID = "duplicateExternalId";
16
+ const ERROR_TOKEN_ALREADY_USED = "tokenAlreadyUsed";
17
+ const ERROR_YOUR_ACCOUNT_IS_BANNED = "yourAccountIsBanned";
18
+
19
+ public function __construct($userId, $apiKey)
20
+ {
21
+ $this->userId = $userId;
22
+ $this->apiKey = $apiKey;
23
+ $this->baseUrl = (defined('DEBUG') && DEBUG) ? "https://api.giftd.local/v1/" : "https://api.giftd.ru/v1/";
24
+ }
25
+
26
+ private function httpPost($url, array $params)
27
+ {
28
+ $ch = curl_init($url);
29
+ curl_setopt_array($ch, array(
30
+ CURLOPT_POST => 1,
31
+ CURLOPT_POSTFIELDS => $params,
32
+ CURLOPT_RETURNTRANSFER => 1,
33
+ ));
34
+ if (defined('DEBUG') && DEBUG) {
35
+ curl_setopt_array($ch, array(
36
+ CURLOPT_SSL_VERIFYHOST => 0,
37
+ CURLOPT_SSL_VERIFYPEER => 0,
38
+ ));
39
+ }
40
+ $result = curl_exec($ch);
41
+ if (curl_errno($ch)) {
42
+ throw new Giftd_NetworkException(curl_error($ch));
43
+ }
44
+ if (!($result = json_decode($result, true))) {
45
+ throw new Giftd_Exception("Giftd API returned malformed JSON, unable to decode it");
46
+ }
47
+ return $result;
48
+ }
49
+
50
+ public function query($method, $params = array(), $suppressExceptions = false)
51
+ {
52
+ if (isset($_SERVER['REMOTE_ADDR'])) {
53
+ $params['client_ip'] = $_SERVER['REMOTE_ADDR'];
54
+ }
55
+
56
+ $params['signature'] = $this->calculateSignature($method, $params);
57
+ $params['user_id'] = $this->userId;
58
+
59
+ $result = $this->httpPost($this->baseUrl . $method, $params);
60
+ if (empty($result['type'])) {
61
+ throw new Giftd_Exception("Giftd API returned response without type field, unable to decode it");
62
+ }
63
+ if (!$suppressExceptions && $result['type'] == static::RESPONSE_TYPE_ERROR) {
64
+ $this->throwException($result);
65
+ }
66
+ return $result;
67
+ }
68
+
69
+ private function throwException(array $rawResponse)
70
+ {
71
+ throw new Giftd_Exception($rawResponse['data'], $rawResponse['code']);
72
+ }
73
+
74
+ private function constructGiftCard(array $rawData)
75
+ {
76
+ $card = new Giftd_Card();
77
+ foreach ($rawData as $key => $value) {
78
+ $card->$key = $value;
79
+ }
80
+ if ($card->charge_details) {
81
+ $chargeDetails = new Giftd_ChargeDetails();
82
+ foreach ($card->charge_details as $key => $value) {
83
+ $chargeDetails->$key = $value;
84
+ }
85
+ $card->charge_details = $chargeDetails;
86
+ }
87
+ return $card;
88
+ }
89
+
90
+ /**
91
+ * @param null $token
92
+ * @param null $external_id
93
+ * @return Giftd_Card|null
94
+ * @throws Giftd_Exception
95
+ */
96
+ public function check($token = null, $external_id = null)
97
+ {
98
+ $response = $this->query('gift/check', array(
99
+ 'token' => $token,
100
+ 'external_id' => $external_id
101
+ ), true);
102
+ switch ($response['type']) {
103
+ case static::RESPONSE_TYPE_ERROR:
104
+ switch ($response['code']) {
105
+ case static::ERROR_TOKEN_NOT_FOUND:
106
+ case static::ERROR_EXTERNAL_ID_NOT_FOUND:
107
+ return null;
108
+ default:
109
+ $this->throwException($response);
110
+ }
111
+ break;
112
+ case static::RESPONSE_TYPE_DATA:
113
+ return $this->constructGiftCard($response['data']);
114
+ default:
115
+ throw new Giftd_Exception("Unknown response type {$response['type']}");
116
+ }
117
+ }
118
+
119
+ /**
120
+ * @param $externalId
121
+ * @return Giftd_Card|null
122
+ * @throws Giftd_Exception
123
+ */
124
+ public function checkByExternalId($externalId)
125
+ {
126
+ return $this->check(null, $externalId);
127
+ }
128
+
129
+ /**
130
+ * @param $token
131
+ * @return Giftd_Card|null
132
+ * @throws Giftd_Exception
133
+ */
134
+ public function checkByToken($token)
135
+ {
136
+ return $this->check($token, null);
137
+ }
138
+
139
+ /**
140
+ * @param $token
141
+ * @param $amount
142
+ * @param null $amountTotal
143
+ * @param null $externalId
144
+ * @param null $comment
145
+ * @return Giftd_Card
146
+ * @throws Giftd_Exception
147
+ */
148
+ public function charge($token, $amount, $amountTotal = null, $externalId = null, $comment = null)
149
+ {
150
+ $result = $this->query('gift/charge', array(
151
+ 'token' => $token,
152
+ 'amount' => $amount,
153
+ 'amount_total' => $amountTotal,
154
+ 'external_id' => $externalId,
155
+ 'comment' => $comment
156
+ ));
157
+
158
+ return $this->constructGiftCard($result['data']);
159
+ }
160
+
161
+ private function calculateSignature($method, array $params)
162
+ {
163
+ $signatureBase = $method . "," . $this->userId. ",";
164
+ unset($params['user_id'], $params['signature'], $params['api_key']);
165
+ ksort($params);
166
+ foreach ($params as $key => $value) {
167
+ $signatureBase .= $key . "=" . $value . ",";
168
+ }
169
+ $signatureBase .= $this->apiKey;
170
+ return sha1($signatureBase);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * @property integer $id
176
+ * @property string $status
177
+ * @property string $status_str
178
+ * @property float $amount_available
179
+ * @property integer $card_id,
180
+ * @property string $card_title
181
+ * @property string $owner_owner_name
182
+ * @property string $owner_gender
183
+ * @property bool $amount_total_required
184
+ * @property float|null $min_amount_total
185
+ * @property string $charge_type
186
+ * @property integer $created
187
+ * @property integer $expires
188
+ * @property string $token_status
189
+ * @property Giftd_ChargeDetails|null $charge_details
190
+ */
191
+ class Giftd_Card
192
+ {
193
+ const CHARGE_TYPE_ONETIME = 'onetime';
194
+ const CHARGE_TYPE_MULTIPLE = 'multiple';
195
+
196
+ const TOKEN_STATUS_OK = 'ok';
197
+ const TOKEN_STATUS_USED = 'used';
198
+
199
+ public $id;
200
+ public $status;
201
+ public $status_str;
202
+ public $amount_available;
203
+ public $card_id;
204
+ public $card_title;
205
+ public $owner_name;
206
+ public $owner_gender;
207
+ public $amount_total_required;
208
+ public $min_amount_total;
209
+ public $charge_type;
210
+ public $created;
211
+ public $expires;
212
+ public $token_status;
213
+ public $charge_details;
214
+ }
215
+
216
+ /**
217
+ * @property string $token
218
+ * @property string $external_id
219
+ * @property integer $time
220
+ * @property float $amount
221
+ * @property float $amount_total
222
+ * @property float $amount_left
223
+ * @property string $type
224
+ * @property string $comment
225
+ */
226
+ class Giftd_ChargeDetails
227
+ {
228
+ const TYPE_MANUAL = 'manual';
229
+ const TYPE_API = 'api';
230
+
231
+ public $token;
232
+ public $external_id;
233
+ public $time;
234
+ public $amount;
235
+ public $amount_total;
236
+ public $amount_left;
237
+ public $type;
238
+ public $comment;
239
+ }
240
+
241
+ class Giftd_Exception extends Exception
242
+ {
243
+ public $code;
244
+ public $data;
245
+
246
+ protected function _stringifyData($data)
247
+ {
248
+ if (!is_array($data)) {
249
+ return $data;
250
+ }
251
+ $result = array();
252
+ foreach ($data as $key => $value)
253
+ {
254
+ if (is_array($value)) {
255
+ $result[] = implode(", ", $value);
256
+ } else {
257
+ $result[] = $value;
258
+ }
259
+ }
260
+ return implode(", ", $result);
261
+ }
262
+
263
+ public function __construct($data, $code = null)
264
+ {
265
+ parent::__construct($this->_stringifyData($data));
266
+ $this->code = $code;
267
+ $this->data = $data;
268
+ }
269
+ }
270
+
271
+ class Giftd_NetworkException extends Giftd_Exception
272
+ {
273
+
274
+ }
275
+ ?>
app/code/community/Giftd/Cards/Model/Observer.php ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once('GiftdClient.php');
4
+
5
+ class Giftd_Cards_Model_Observer
6
+ {
7
+ /**
8
+ * @var GiftdClient $client
9
+ */
10
+ protected $client = false;
11
+
12
+ public function init($force=false)
13
+ {
14
+ if($this->client && !$force)
15
+ return true;
16
+
17
+ $api_key = Mage::getStoreConfig('giftd_cards/api_settings/api_key',Mage::app()->getStore());
18
+ $user_id = Mage::getStoreConfig('giftd_cards/api_settings/user_id',Mage::app()->getStore());
19
+
20
+ if(strlen($api_key) > 0 && strlen($user_id) > 0)
21
+ {
22
+ $this->client = new GiftdClient($user_id, $api_key);
23
+ return true;
24
+ }
25
+
26
+ return false;
27
+ }
28
+
29
+ public function getStoreInfo()
30
+ {
31
+ $schema = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https' : 'http';
32
+
33
+ $host = (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']);
34
+ if (count($hostParts = explode(":", $host)) > 1) {
35
+ $port = $hostParts[1];
36
+ if ($port == 80 || $port == 443) {
37
+ $host = $hostParts[0];
38
+ }
39
+ }
40
+ $url = "$schema://$host";
41
+
42
+ $userId = Mage::getSingleton('admin/session')->getUser()->getId();
43
+ $user = Mage::getModel('admin/user')->load($userId);
44
+
45
+ $name = trim($user->getData('firstname').' '.$user->getData('lastname'));
46
+
47
+ $result = array(
48
+ 'email' => $user->getData('email'),
49
+ 'url' => $url,
50
+ 'magento_version' => Mage::getVersion()
51
+ );
52
+ if ($name) {
53
+ $result['name'] = $name;
54
+ }
55
+ return $result;
56
+ }
57
+
58
+ public function updateApiKey(Varien_Event_Observer $observer)
59
+ {
60
+ //kk: do check if api_key or user_id values has changed
61
+ if(self::init())
62
+ {
63
+ $config = new Mage_Core_Model_Config();
64
+
65
+ $this->client->query('magento/install', $this->getStoreInfo());
66
+ Mage::log('Sent store data to Giftd');
67
+
68
+ $response = $this->client->query('partner/get');
69
+ if($response['type'] == 'data') {
70
+ $config->saveConfig('giftd_cards/api_settings/partner_token', $response['data']['code'], 'default', 0);
71
+ $config->saveConfig('giftd_cards/api_settings/partner_token_prefix', $response['data']['token_prefix'], 'default', 0);
72
+ }
73
+ }
74
+ }
75
+
76
+ public function showMinimumSubtotalError($limit)
77
+ {
78
+
79
+ switch (Mage::app()->getLocale()->getLocaleCode()) {
80
+ case 'ru_RU':
81
+ $message = "Для использования этой подарочной карты общая сумма должна быть не менее %s";
82
+ break;
83
+ case 'de_DE':
84
+ $message = "Um diese Geschenkkarte nutzen die Zwischensumme sollte mindestens %s";
85
+ break;
86
+ default:
87
+ $message = "To use this gift card the subtotal should be at least %s";
88
+ break;
89
+ }
90
+ $formattedLimit = Mage::helper('core')->currency($limit, true, false);
91
+
92
+ Mage::getSingleton('checkout/session')->addError(sprintf($message, $formattedLimit));
93
+ }
94
+
95
+ public function checkoutCoupon(Varien_Event_Observer $observer)
96
+ {
97
+ if(self::init())
98
+ {
99
+ $quote = Mage::helper('checkout/cart')->getQuote();
100
+ if ($coupon_code = $quote->getCouponCode())
101
+ {
102
+ if($card = self::getGiftdCard($coupon_code))
103
+ {
104
+ $subtotal = $quote->getSubtotal();
105
+ $order_id = $observer->getEvent()->getOrder()->getId();
106
+ $visitor = Mage::getSingleton('core/session')->getVisitorData();
107
+
108
+ try
109
+ {
110
+ $this->client->charge($coupon_code, $card->amount_available, $subtotal, $visitor['visitor_id'].'_'.$visitor['quote_id'].'_'.$order_id);
111
+ Mage::log('coupon charged - code:'.$coupon_code.' amount:'.$card->amount_available.' subtotal:'.$subtotal.' id:'.$visitor['visitor_id'].'_'.$visitor['quote_id'].'_'.$order_id);
112
+
113
+ }
114
+ catch(Exception $e)
115
+ {
116
+ //KK: how should we handle such situations?
117
+ Mage::logException($e);
118
+ }
119
+
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+
126
+ public function processCoupon(Varien_Event_Observer $observer)
127
+ {
128
+ if($_REQUEST['remove'] == 1)
129
+ return;
130
+
131
+ $coupon_code = trim($_REQUEST['coupon_code']);
132
+ $subTotal = Mage::helper('checkout/cart')->getQuote()->getSubtotal();
133
+
134
+ $existedCoupon = Mage::getModel('salesrule/coupon')->load($coupon_code, 'code');
135
+ $rule = $existedCoupon->getRuleId() ? Mage::getModel('salesrule/rule')->load($existedCoupon->getRuleId()) : false;
136
+ if($rule)
137
+ {
138
+ if(strpos($rule->getData('name'), 'Giftd') === 0 && self::init())
139
+ {
140
+ if($card = self::getGiftdCard($coupon_code))
141
+ {
142
+ if($card->min_amount_total > $subTotal)
143
+ $this->showMinimumSubtotalError($card->min_amount_total);
144
+ }
145
+ }
146
+ return;
147
+ }
148
+
149
+ if(self::init())
150
+ {
151
+ if($card = self::getGiftdCard($coupon_code))
152
+ {
153
+ $coupon_value = $card->amount_available;
154
+ if ($card->min_amount_total > $subTotal)
155
+ {
156
+ $this->showMinimumSubtotalError($card->min_amount_total);
157
+ }
158
+ self::generateRule("Giftd card", $coupon_code, $coupon_value, $card->min_amount_total);
159
+ }
160
+ }
161
+ }
162
+
163
+ public function getGiftdCard($the_coupon_code)
164
+ {
165
+ $the_coupon_code = trim($the_coupon_code);
166
+ $prefix = trim(Mage::getStoreConfig('giftd_cards/api_settings/partner_token_prefix',Mage::app()->getStore()));
167
+ if($this->client && strlen($the_coupon_code) > 0 && (!$prefix || strpos($the_coupon_code, $prefix) === 0))
168
+ {
169
+ $card = $this->client->checkByToken($the_coupon_code);
170
+ if($card && $card->token_status == Giftd_Card::TOKEN_STATUS_OK)
171
+ {
172
+ return $card;
173
+ }
174
+ }
175
+
176
+ return false;
177
+ }
178
+
179
+ public function generateRule($name, $coupon_code, $discount, $min_amount)
180
+ {
181
+ if ($name != null && $coupon_code != null)
182
+ {
183
+ $data = array(
184
+ 'product_ids' => null,
185
+ 'name' => $name,
186
+ 'description' => null,
187
+ 'is_active' => 1,
188
+ 'website_ids' => array(1),
189
+ 'customer_group_ids' => array(0,1,2,4,5),
190
+ 'coupon_type' => 2,
191
+ 'coupon_code' => $coupon_code,
192
+ 'uses_per_coupon' => 1,
193
+ 'uses_per_customer' => 1,
194
+ 'from_date' => null,
195
+ 'to_date' => null,
196
+ 'sort_order' => null,
197
+ 'is_rss' => 0,
198
+ 'conditions' => array(
199
+ "1" => array(
200
+ "type" => "salesrule/rule_condition_combine",
201
+ "aggregator" => "all",
202
+ "value" => "1",
203
+ "new_child" => null
204
+ ),
205
+ "1--1" => array(
206
+ "type" => "salesrule/rule_condition_address",
207
+ "attribute" => "base_subtotal",
208
+ "operator" => ">=",
209
+ "value" => $min_amount
210
+ )
211
+ ),
212
+ 'simple_action' => 'cart_fixed',
213
+ 'discount_amount' => $discount,
214
+ 'discount_qty' => 0,
215
+ 'discount_step' => null,
216
+ 'apply_to_shipping' => 0,
217
+ 'simple_free_shipping' => 0,
218
+ 'stop_rules_processing' => 0,
219
+ 'store_labels' => array($name)
220
+ );
221
+
222
+ $model = Mage::getModel('salesrule/rule');
223
+ $validateResult = $model->validateData(new Varien_Object($data));
224
+
225
+ if ($validateResult == true)
226
+ {
227
+ try {
228
+ $model->loadPost($data);
229
+ $model->save();
230
+ } catch (Exception $e) {
231
+ Mage::log($e->getMessage());
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
app/code/community/Giftd/Cards/Model/System/Config/Source/Tabposition.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Giftd_Cards_Model_System_Config_Source_Tabposition
4
+ {
5
+ /**
6
+ * Options getter
7
+ *
8
+ * @return array
9
+ */
10
+ public function toOptionArray()
11
+ {
12
+ return array(
13
+ array('value' => 'top', 'label'=>Mage::helper('adminhtml')->__('Top ')),
14
+ array('value' => 'left', 'label'=>Mage::helper('adminhtml')->__('Left')),
15
+ array('value' => 'bottom', 'label'=>Mage::helper('adminhtml')->__('Bottom ')),
16
+ );
17
+ }
18
+
19
+ /**
20
+ * Get options in "key-value" format
21
+ *
22
+ * @return array
23
+ */
24
+ public function toArray()
25
+ {
26
+ return array(
27
+ 'top' => Mage::helper('adminhtml')->__('Top'),
28
+ 'left' => Mage::helper('adminhtml')->__('Left'),
29
+ 'bottom' => Mage::helper('adminhtml')->__('Bottom'),
30
+ );
31
+ }
32
+ }
app/code/community/Giftd/Cards/etc/config.xml ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Giftd_Cards>
5
+ <version>1.0.0</version>
6
+ </Giftd_Cards>
7
+ </modules>
8
+
9
+ <global>
10
+ <helpers>
11
+ <giftd_cards>
12
+ <!-- This is where we define our helper directory -->
13
+ <class>Giftd_Cards_Helper</class>
14
+ </giftd_cards>
15
+ </helpers>
16
+
17
+ <models>
18
+ <giftd_cards>
19
+ <!-- This is where we define our model directory -->
20
+ <class>Giftd_Cards_Model</class>
21
+ </giftd_cards>
22
+ </models>
23
+
24
+ <blocks>
25
+ <giftd_cards><class>Giftd_Cards_Block</class></giftd_cards>
26
+ </blocks>
27
+
28
+ <!-- And finally we define our resource setup script -->
29
+ <resources>
30
+ <giftd_cards_setup>
31
+ <setup>
32
+ <module>Giftd_Cards</module>
33
+ </setup>
34
+ </giftd_cards_setup>
35
+ </resources>
36
+
37
+ <events>
38
+ <admin_system_config_changed_section_giftd_cards>
39
+ <observers>
40
+ <giftd_cards>
41
+ <class>giftd_cards/observer</class>
42
+ <method>updateApiKey</method>
43
+ <type>singleton</type>
44
+ </giftd_cards>
45
+ </observers>
46
+ </admin_system_config_changed_section_giftd_cards>
47
+ <controller_action_predispatch_checkout_cart_couponPost>
48
+ <observers>
49
+ <giftd_cards>
50
+ <class>giftd_cards/observer</class>
51
+ <method>processCoupon</method>
52
+ <type>singleton</type>
53
+ </giftd_cards>
54
+ </observers>
55
+ </controller_action_predispatch_checkout_cart_couponPost>
56
+ <sales_order_place_after>
57
+ <observers>
58
+ <giftd_cards>
59
+ <class>giftd_cards/observer</class>
60
+ <method>checkoutCoupon</method>
61
+ <type>singleton</type>
62
+ </giftd_cards>
63
+ </observers>
64
+ </sales_order_place_after>
65
+ </events>
66
+ </global>
67
+
68
+ <frontend>
69
+ <layout>
70
+ <updates>
71
+ <giftd_cards module="giftd_cards">
72
+ <file>giftd_panel.xml</file>
73
+ </giftd_cards>
74
+ </updates>
75
+ </layout>
76
+ </frontend>
77
+
78
+ <adminhtml>
79
+ <layout>
80
+ <updates>
81
+ <giftd_cards>
82
+ <file>giftd_cards.xml</file>
83
+ </giftd_cards>
84
+ </updates>
85
+ </layout>
86
+ <acl>
87
+ <resources>
88
+ <admin>
89
+ <children>
90
+ <system>
91
+ <children>
92
+ <config>
93
+ <children>
94
+ <giftd_cards translate="title" module="giftd_cards">
95
+ <title>Giftd Cards Settings</title>
96
+ </giftd_cards>
97
+ </children>
98
+ </config>
99
+ </children>
100
+ </system>
101
+ </children>
102
+ </admin>
103
+ </resources>
104
+ </acl>
105
+ </adminhtml>
106
+
107
+ <admin>
108
+ <routers>
109
+ <adminhtml>
110
+ <args>
111
+ <!-- This is how we load our Adminhtml controllers -->
112
+ <modules>
113
+ <Giftd_Cards before="Mage_Adminhtml">Giftd_Cards_Adminhtml</Giftd_Cards>
114
+ </modules>
115
+ </args>
116
+ </adminhtml>
117
+ </routers>
118
+ </admin>
119
+
120
+ </config>
app/code/community/Giftd/Cards/etc/system.xml ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <sections>
4
+ <giftd_cards translate="label" module="giftd_cards">
5
+ <label>Giftd Cards</label>
6
+ <tab>sales</tab>
7
+ <frontend_type>text</frontend_type>
8
+ <sort_order>991</sort_order>
9
+ <show_in_default>1</show_in_default>
10
+ <show_in_website>1</show_in_website>
11
+ <show_in_store>1</show_in_store>
12
+ <groups>
13
+ <api_settings translate="label">
14
+ <label>Giftd API Settings</label>
15
+ <frontend_type>text</frontend_type>
16
+ <sort_order>1</sort_order>
17
+ <show_in_default>1</show_in_default>
18
+ <show_in_website>1</show_in_website>
19
+ <show_in_store>1</show_in_store>
20
+ <comment>
21
+ <![CDATA[
22
+ Access for API (<a id="SIGN_IN" href="https://partner.giftd.ru/site/login?popup=1" onclick="SignIn(this);return false;">Get API access settings</a>)
23
+ <script type="text/javascript">
24
+ var popup = null;
25
+ function openWindow(options) {
26
+ var
27
+ screenX = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
28
+ screenY = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
29
+ outerWidth = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.body.clientWidth,
30
+ outerHeight = typeof window.outerHeight != 'undefined' ? window.outerHeight : (document.body.clientHeight - 22),
31
+ width = options.width,
32
+ height = options.height,
33
+ left = parseInt(screenX + ((outerWidth - width) / 2), 10),
34
+ top = parseInt(screenY + ((outerHeight - height) / 2.5), 10),
35
+ features = (
36
+ 'width=' + width +
37
+ ',height=' + height +
38
+ ',left=' + left +
39
+ ',top=' + top
40
+ );
41
+ popup = window.open(options.url, 'giftd_auth_' + new Date().getTime(), features);
42
+ }
43
+
44
+ function update_api_key(user_id, api_key)
45
+ {
46
+ giftd_cards_api_settings_api_key.value = api_key;
47
+ giftd_cards_api_settings_user_id.value = user_id;
48
+ configForm.submit();
49
+ }
50
+
51
+ function SignIn(a){
52
+ openWindow({
53
+ width: 520,
54
+ height: 453,
55
+ url: a.href
56
+ });
57
+
58
+ AwaitResponse();
59
+ }
60
+
61
+ function AwaitResponse() {
62
+ if (window.addEventListener) { // all browsers except IE before version 9
63
+ window.addEventListener ("message", OnMessage, false);
64
+ }
65
+ else {
66
+ if (window.attachEvent) { // IE before version 9
67
+ window.attachEvent("onmessage", OnMessage);
68
+ }
69
+ }
70
+ }
71
+
72
+ function OnMessage (message) {
73
+ var rawMessage = message.data || message.originalEvent.data;
74
+ console.log(rawMessage);
75
+ if (typeof(rawMessage) == 'string' && rawMessage.indexOf("giftd/auth") === 0) {
76
+ var message = JSON.parse(rawMessage.split("~", 2)[1]);
77
+ console.log(message);
78
+ switch (message.type) {
79
+ case 'error':
80
+ alert(message.data);
81
+ break;
82
+ case 'data':
83
+ update_api_key(message.data.user_id, message.data.api_key);
84
+ break;
85
+ default:
86
+ break;
87
+ }
88
+ popup.close();
89
+ }
90
+ }
91
+ </script>
92
+ ]]>
93
+ </comment>
94
+ <fields>
95
+ <api_key translate="label comment">
96
+ <label>API Key</label>
97
+ <comment></comment>
98
+ <frontend_type>text</frontend_type>
99
+ <sort_order>1</sort_order>
100
+ <show_in_default>1</show_in_default>
101
+ <show_in_website>1</show_in_website>
102
+ <show_in_store>1</show_in_store>
103
+ </api_key>
104
+ <user_id translate="label comment">
105
+ <label>User ID</label>
106
+ <comment></comment>
107
+ <frontend_type>text</frontend_type>
108
+ <sort_order>2</sort_order>
109
+ <show_in_default>1</show_in_default>
110
+ <show_in_website>1</show_in_website>
111
+ <show_in_store>1</show_in_store>
112
+ </user_id>
113
+ <partner_token translate="label comment">
114
+ <label>Partner Token</label>
115
+ <comment></comment>
116
+ <frontend_type>text</frontend_type>
117
+ <sort_order>3</sort_order>
118
+ <show_in_default>1</show_in_default>
119
+ <show_in_website>1</show_in_website>
120
+ <show_in_store>1</show_in_store>
121
+ </partner_token>
122
+ <partner_token_prefix translate="label comment">
123
+ <label>Partner Token Prefix</label>
124
+ <comment></comment>
125
+ <frontend_type>text</frontend_type>
126
+ <sort_order>4</sort_order>
127
+ <show_in_default>1</show_in_default>
128
+ <show_in_website>1</show_in_website>
129
+ <show_in_store>1</show_in_store>
130
+ </partner_token_prefix>
131
+ <sent_on_install translate="label comment">
132
+ <label>Has installed</label>
133
+ <comment><![CDATA[
134
+ <script>
135
+ row_giftd_cards_api_settings_sent_on_install.style.display = "none";
136
+ </script>
137
+ ]]></comment>
138
+ <frontend_type>text</frontend_type>
139
+ <sort_order>5</sort_order>
140
+ <show_in_default>1</show_in_default>
141
+ <show_in_website>1</show_in_website>
142
+ <show_in_store>1</show_in_store>
143
+ </sent_on_install>
144
+ </fields>
145
+ </api_settings>
146
+ <panel_settings translate="label">
147
+ <label>Giftd Panel Settings</label>
148
+ <frontend_type>text</frontend_type>
149
+ <sort_order>2</sort_order>
150
+ <show_in_default>1</show_in_default>
151
+ <show_in_website>1</show_in_website>
152
+ <show_in_store>1</show_in_store>
153
+ <comment></comment>
154
+ <fields>
155
+ <panel_is_active translate="label comment">
156
+ <label>Отображать на сайте графический блок Giftd</label>
157
+ <comment><![CDATA[
158
+ <script type="text/javascript">
159
+ function updatePanelSettings()
160
+ {
161
+ var is_active = giftd_cards_panel_settings_panel_is_active.value == 1;
162
+ var display = is_active ? "table-row" : "none";
163
+
164
+ giftd_cards_panel_settings.getElementsBySelector('tr').each(function(row){
165
+ if(row != row_giftd_cards_panel_settings_panel_is_active)
166
+ row.style.display = display;
167
+
168
+ console.log(row);
169
+ });
170
+ }
171
+
172
+ window.addEventListener('load',
173
+ function() {
174
+ giftd_cards_panel_settings_panel_is_active.onchange = updatePanelSettings;
175
+ updatePanelSettings();
176
+ }, false );
177
+
178
+ </script>
179
+ ]]></comment>
180
+ <frontend_type>select</frontend_type>
181
+ <source_model>adminhtml/system_config_source_yesno</source_model>
182
+ <sort_order>1</sort_order>
183
+ <show_in_default>1</show_in_default>
184
+ <show_in_website>1</show_in_website>
185
+ <show_in_store>1</show_in_store>
186
+ </panel_is_active>
187
+ <panel_position translate="label comment">
188
+ <label>Местоположение вкладки Giftd</label>
189
+ <comment><![CDATA[<img src="https://partner.giftd.ru/img/embedded_tab_screenshot.png" style="width: 267px;margin-top: 5px;">]]></comment>
190
+ <frontend_type>select</frontend_type>
191
+ <source_model>giftd_cards/system_config_source_tabposition</source_model>
192
+ <sort_order>2</sort_order>
193
+ <show_in_default>1</show_in_default>
194
+ <show_in_website>1</show_in_website>
195
+ <show_in_store>1</show_in_store>
196
+ </panel_position>
197
+ </fields>
198
+ </panel_settings>
199
+
200
+ <tab_settings translate="label">
201
+ <label>Giftd Tab Settings</label>
202
+ <frontend_type>text</frontend_type>
203
+ <sort_order>3</sort_order>
204
+ <show_in_default>1</show_in_default>
205
+ <show_in_website>1</show_in_website>
206
+ <show_in_store>1</show_in_store>
207
+ <comment><![CDATA[]]></comment>
208
+ <fields>
209
+ <custom_code_is_active translate="label comment">
210
+ <label>Настроить внешний вид графическиго блока Giftd</label>
211
+ <comment><![CDATA[
212
+ <script type="text/javascript">
213
+ function updateTabSettings()
214
+ {
215
+ var is_active = giftd_cards_tab_settings_custom_code_is_active.value == 1;
216
+ var display = is_active ? "table-row" : "none";
217
+
218
+ giftd_cards_tab_settings.getElementsBySelector('tr').each(function(row){
219
+ if(row != row_giftd_cards_tab_settings_custom_code_is_active)
220
+ row.style.display = display;
221
+ });
222
+ }
223
+
224
+ window.addEventListener('load',
225
+ function() {
226
+ giftd_cards_tab_settings_custom_code_is_active.onchange = updateTabSettings;
227
+ updateTabSettings();
228
+ }, false );
229
+
230
+ </script>
231
+ ]]></comment>
232
+ <frontend_type>select</frontend_type>
233
+ <source_model>adminhtml/system_config_source_yesno</source_model>
234
+ <sort_order>1</sort_order>
235
+ <show_in_default>1</show_in_default>
236
+ <show_in_website>1</show_in_website>
237
+ <show_in_store>1</show_in_store>
238
+ </custom_code_is_active>
239
+ <custom_code_info translate="label comment">
240
+ <label></label>
241
+ <comment><![CDATA[
242
+ <p>
243
+ Ниже вы можете отредактировать JS-код, который встраивается на ваш сайт.
244
+ В этом коде есть ряд переменных, которые вы можете изменить — <b>цвета надписей, фоновые цвета и изображения</b>.
245
+ </p>
246
+ <p>
247
+ Это образец кода, в котором всем возможным переменным заданы значения — эти значения приводят цвета и изобажения вкладки Giftd в состояние "по умолчанию":
248
+ </p>
249
+ <style>
250
+ pre.giftd-code {
251
+ background-color: ghostwhite;
252
+ border: 1px solid silver;
253
+ padding: 10px 20px;
254
+ margin: 20px;
255
+ max-width: 600px;
256
+ overflow: scroll;;
257
+
258
+ }
259
+ .giftd-code .json-key {
260
+ color: brown;
261
+ }
262
+ .giftd-code .json-value {
263
+ color: navy;
264
+ }
265
+ .giftd-code .json-string {
266
+ color: olive;
267
+ }
268
+ .giftd-code textarea {
269
+ width: 600px;
270
+ height: 365px;
271
+ font-family: courier, monospace;
272
+ font-size: 12px;
273
+ line-height: 15px;
274
+ white-space: nowrap;
275
+ overflow: auto;
276
+ }
277
+
278
+ ul.bullets {
279
+ list-style-type: disc;
280
+ margin-left: 20px;
281
+ }
282
+ </style>
283
+
284
+ <pre class="giftd-code"><code><span class="json-key">window.giftdOptions</span> = {
285
+ <span class="json-key">pid</span>: <span class="json-string">"<?php echo GiftdHelper::GetOption('PARTNER_CODE') ?>"</span>,
286
+ <span class="json-key">tab</span>: {
287
+ <span class="json-key">enabled</span>: <span class="json-value">true</span>,
288
+ <span class="json-key">position</span>: <span class="json-string">"left"</span>,
289
+ <span class="json-key">panelBg</span>: {
290
+ <span class="json-key">color</span>: <span class="json-string">"#008ede"</span>,
291
+ <span class="json-key">image</span>: <span class="json-string">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAwCAYAAADQMxCBAAAAVklEQVQIHW2OUQ6AMAhDCSfz2DvbhOJgDDSRr5aWF+gaMKY1rAClUiOGLXu7ylTfdopkMPWcocr7wgGhAOdRob69qEhRwu5dPdS7fjIrB9qVUPrD8+ABBOQ3zPy6HCkAAAAASUVORK5CYII="</span>
292
+ },
293
+ <span class="json-key">panelDecor</span>: {
294
+ <span class="json-key">top</span>: <span class="json-string">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAAxCAMAAABTYCHnAAAAwFBMVEUAAAAAAQEAAQEAAQEAAQEAAQEAAQEAAQEAAQEAAQEAAQEAAQHO3usAAQEAAQEAAQHkge3A1eaouca80N/D1+enusnZ5e+0w87V4+79/f3kge3O3uv5+vze6fLTfuj6+/y7ytbIcdC2z+LTd9vL3OrpmfHvt/T79Pz8+PzG2OjhgOzFddm9a8X67PvKfeTxvvW+0uP00Pfnje/lhe7spfLB1ubN3eu/1OWzxdSrwNHy9vn33fnzyvbZe+LtrfPWed+d0tzIAAAAGXRSTlMANSM5KRIDGgwHPDFmHxYvRGaqF0m22bXy9/6YcAAAAZxJREFUSMfl1l1XgjAcBnBQQEzASnsZYqkgmIn4Vim+9P2/Vftv1RyE4+yCm54bOJzzO3C2sT2KohjNpqk7Ddu2a3fbEU4vRT/x+k8uDsomve8oQA1Ka5p2uwMaICSwkMdfS2ib0FFayqZdbDE1HUzbLZVaj7dH3/fjQ5gsIx7fUKs7tqa1VHW3gPD2dTabHV3IOpzkLXyy1lbV+u4DkrXDqfudcfSXreHX1q+2b5CsJZRmc8G+QDL20z3LUmCfeUu/NhzTa7ENILydA0nw7YlgNlwWbwfM5uc3JjYutO+QAjsRvLcHKbAHuFkhGRut4CaUsiFZWpGMjdd0emXsBi4nJGP3ZKAiKUtW1R7J2ISOsZSFjCcXrU/inmU6x7Yg15wdkvwfKz9W4jmqeG2wNVn5v4A2bGuX/vcr3nPYXlflHiu/t4vPFGYlzzJmxWeo2ObPbrEVdwaL7yqcFXUVi+9InBV1JIvrZszmu1mS62YW3wkHAdhyndDrZrroAmy/lO1jynXgh0UA2BNYeN6hlmDdcRol4ui6aTYNA+AX7gz9bC873/cAAAAASUVORK5CYII="</span>,
295
+ <span class="json-key">bottom</span>: <span class="json-string">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAAwCAMAAACyoMGoAAAAe1BMVEUAAAA5s/sfou4sq/QQmOYZnusIk+MIk+MTmug4svo+tv0HkuIlpvAWnOk1sPgLlOQZnusJk+McoOwwrfUyrvcdoOwTmug3sfkBjt8doe0ZnusUm+gEkOERmOcLleQ1sPg6tPtAuP4Hk+IOl+Uyrvctq/QlpvA+tvwbn+w2IVSMAAAAGHRSTlMAH8bFWWRKxjYlVufFj1bnjy6PzO7yx1h3FiyaAAABl0lEQVRYw+2R21KDQBBENwYjq0bFaJVKvCfR//9CQ+h5sKlJF1CWS8KBl+6ZhVMQPPJYw/07iJMa7lU+B2qPCR5RiMIzJiv6BUyUe5VNVO0xPUVjuqJvwES5V9lE1R7TWvQVmCj3Kl8BtcccrujdqoZFV0BlE1V7DMaaxbRisfBeMAVB0FaMsoZF1qCtKJ9bE948AdHN7gJIPUQvgeUN8OYMn+PM8PzwRE+A5UfgzRk+x5nheQqim+adpmi3L3oKgsM9HcyB9+Bb4AmovrPoN2BRnrMo95a9nhm2aLZH9AmwqDe/AdxbFj3N+YsORjTbK1puL1eU53Ow7X71yGWjR8FX619fAhblOYtyb9nrGe/Xz5MTzUDoSQlUVudHUeMZqOyeF4yiyYp+ApXd84LjE30BKrvnBcHjDFieFBVxogSzWQ0/h/evQSCEoBaNRZHnW1MlOvtv0cqzMk1fNN/REP0ASpT3L0DjeURX0XwoooP5ogMQLSBKLIES5X1PdEmEv4HF9YtRS0bR5EUfAGfD2ZeMoqNo6qI/fvJUFNWbkq8AAAAASUVORK5CYII="</span>
296
+ },
297
+ <span class="json-key">panelTextColor</span>: <span class="json-string">"#fff"</span>,
298
+ <span class="json-key">panelDescriptionColor</span>: <span class="json-string">"#B0FFA5"</span>,
299
+ <span class="json-key">panelDescriptionIcon</span>: <span class="json-string">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAMAAACuuX39AAAAwFBMVEUAAACw/6Ww/6UAAQGn8pwAAQGT1ooFCAUAAQEAAQGv/aQAAQGw/6UAAQE0TTGq9qCw/6Ww/6UOFQ6Q0Ieu/KOw/6VfiVlwo2k2TzMAAQGV2Iyw/6Ww/6WR0oiw/6Wq96Ct+6Kd45Oi65ig6Jap9Z+Gwn6w/6UAAQGw/6Ww/6Wi6pew/6WIxYCFwHxKbEav/aSw/6Wm8Juw/6Wq9p9jj12w/6VMb0iq96Cw/6Ww/6Wm8Zyj7JmW2o2w/6Wu/KOw/6XJxdjGAAAAP3RSTlMAEFEKBi2vHyUQQzzWBUzo+wo5k6dcamsaAlZ9squq+n2apNLelzsbMZ23FomVX41zvmXXROJdw/Ul0ca3//4rIEY4AAAAmUlEQVQY003O5Q7DMAwE4BSTFLXimJmZ3fd/rNXT1vj+3SfrZEZS01ONdu0CcH8Q6EOZhMAQ4an6fIwQ/+tqAfGkV3R4ud1KUnMPy4Bz1xWMmR5enjLL/906gIlktdX8gqnG6yHCTr3YCOzRZnuAYyW+sLhh5aHnTLttvWIZrQGjhM1shBtTGSC8CJyLEnICxtV+Z5JREUKyD26+FQN53O4ZAAAAAElFTkSuQmCC"</span>,
300
+ <span class="json-key">contentBgImage</span>: <span class="json-string">"https://static.giftd.ru/embedded/content_bg.png?1100409742"</span>,
301
+ <span class="json-key">contentColor</span>: <span class="json-string">"#5d869e"</span>,
302
+ <span class="json-key">contentTitleColor</span>: <span class="json-string">"#3496CE"</span>
303
+ }
304
+ }</code></pre>
305
+ <p>
306
+ На картинке показано соответствие между переменными и элементами встраиваемого решения:
307
+ </p>
308
+ <img style="width: 600px;" src="https://partner-static.giftd.ru/img/embedded_customization.png">
309
+ <p>Нюансы кастомизации встраиваемого решения:</p>
310
+ <ul class="bullets">
311
+ <li>В образце кода все переменные заполнены значениями, равными значениям по умолчанию;</li>
312
+ <li>Свойство <code>position</code> может принимать одно из трех значений: <code>left</code>, <code>right</code> или <code>bottom</code>.</li>
313
+ <li>Не меняйте свойство <code>pid</code>;</li>
314
+ <li>Мы советуем удалить из кода переменные, которые вы не будете кастомизировать — будут использованы значения по умолчанию;</li>
315
+ <li>Не забудьте раскомментировать строчку с переменной, если меняете ее;</li>
316
+ <li>Картинки можно вставлять как в виде Data URI, так и в виде обычного URL — в образце выше есть и тот, и другой вариант.</li>
317
+ <li>Для задания фона панели вы можете использовать как свойство <code>panelBg.color</code>, так и <code>panelBg.image</code>. <br><small><i>Рекомендуем использовать обе переменных одновременно — на тот случай, если фоновая картинка не загрузится.</i></small></li>
318
+
319
+ </ul>
320
+ ]]></comment>
321
+ <frontend_type>label</frontend_type>
322
+ <sort_order>2</sort_order>
323
+ <show_in_default>1</show_in_default>
324
+ <show_in_website>1</show_in_website>
325
+ <show_in_store>1</show_in_store>
326
+ </custom_code_info>
327
+ <tab_js_code translate="label comment">
328
+ <label>JS-код с настройкаи графического блока Giftd</label>
329
+ <comment></comment>
330
+ <frontend_type>textarea</frontend_type>
331
+ <sort_order>12</sort_order>
332
+ <show_in_default>1</show_in_default>
333
+ <show_in_website>1</show_in_website>
334
+ <show_in_store>1</show_in_store>
335
+ </tab_js_code>
336
+ </fields>
337
+ </tab_settings>
338
+ </groups>
339
+ </giftd_cards>
340
+ </sections>
341
+ </config>
app/design/frontend/base/default/layout/giftd_panel.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.0">
3
+ <default>
4
+ <reference name="before_body_end">
5
+ <block type="core/template" name="giftdPanel" template="giftd/panel.phtml"/>
6
+ </reference>
7
+ </default>
8
+ </layout>
app/design/frontend/base/default/template/giftd/panel.phtml ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $show_panel = Mage::getStoreConfig('giftd_cards/panel_settings/panel_is_active',Mage::app()->getStore());
3
+ $use_custom_js = Mage::getStoreConfig('giftd_cards/tab_settings/custom_code_is_active',Mage::app()->getStore());
4
+ $custom_js = Mage::getStoreConfig('giftd_cards/tab_settings/tab_js_code',Mage::app()->getStore());
5
+
6
+ $panel_options =
7
+ 'window.giftdOptions = {'.
8
+ 'pid: "'.Mage::getStoreConfig('giftd_cards/api_settings/partner_token',Mage::app()->getStore()).'",'.
9
+ 'tab: {'.
10
+ 'enabled: '.(Mage::getStoreConfig('giftd_cards/panel_settings/panel_is_active',Mage::app()->getStore()) ? 'true' : 'false').','.
11
+ 'position: "'.(Mage::getStoreConfig('giftd_cards/panel_settings/panel_position',Mage::app()->getStore()) ?: 'left').'"'.
12
+ '}'.
13
+ '};';
14
+
15
+ if ($show_panel && $use_custom_js && $custom_js)
16
+ $panel_options = $custom_js . ';';
17
+
18
+ ?>
19
+
20
+ <script>
21
+ <?=$panel_options?>
22
+ (function(){
23
+ var s = (window.giftdOptions.tab && window.giftdOptions.tab.enabled) ? "giftd.js" : "giftd_no_tab.js";
24
+ var el = document.createElement("script");
25
+ el.id = "giftd-script";
26
+ el.async = true;
27
+ el.src = "https://static.giftd.ru/embedded/" + s;
28
+ document.getElementsByTagName("head")[0].appendChild(el);
29
+ })();
30
+ </script>';
package.xml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Giftd_Cards</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://opensource.org/licenses/gpl-license.php">GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Provides integration of Magento and Giftd &#x2014; digital gift cards platform.</summary>
10
+ <description>The extension integrates Magento and Giftd. &#xD;
11
+ &#xD;
12
+ Giftd is a platform-as-a-service. It allows businesses to issue, sell and accept digital gift cards. &#xD;
13
+ &#xD;
14
+ The extension has three primary features: &#xD;
15
+ &#xD;
16
+ &#x2014; Install Giftd embedded solution on your website;&#xD;
17
+ &#xD;
18
+ &#x2014; Add Giftd tab to your website, allowing users to send gift cards;&#xD;
19
+ &#xD;
20
+ &#x2014; Accept gift cards using an existing discount code field.</description>
21
+ <notes>First public release.</notes>
22
+ <authors><author><name>Alexander Nevidimov</name><user>nevidimov</user><email>nevidimov@giftd.ru</email></author></authors>
23
+ <date>2014-10-10</date>
24
+ <time>19:23:02</time>
25
+ <contents><target name="magecommunity"><dir><dir name="Giftd"><dir name="Cards"><dir name="Helper"><file name="Data.php" hash="a07c9c0bb8c274a37f245be65941df59"/></dir><dir name="Model"><file name="GiftdClient.php" hash="f32c25a85dd0efd8b60b5771f8320e99"/><file name="Observer.php" hash="c2c1de2ff722335c32e05ce2f7832365"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Tabposition.php" hash="cc645c33159bf2449acf58bba336075d"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="0d6bbce8bbf0f0c1e14920a00e953dde"/><file name="system.xml" hash="70e7e19dc34ff6e38a3ff8f79300c781"/></dir></dir></dir></dir></target><target name="magedesign"><dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="giftd_panel.xml" hash="3d9ad4a36cdeab1cfb4bd7cc5dea5080"/></dir><dir name="template"><dir name="giftd"><file name="panel.phtml" hash="a725ec457409fc71b19243f930c1eede"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir><dir name="etc"><dir name="modules"><file name="Giftd_Cards.xml" hash=""/></dir></dir></dir></target></contents>
26
+ <compatible/>
27
+ <dependencies><required><php><min>5.0.0</min><max>5.9.9</max></php></required></dependencies>
28
+ </package>