Juicy_GeoIP - Version 1.0.0

Version Notes

Stable Release

Download this release

Release Info

Developer Juicy Media
Extension Juicy_GeoIP
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/local/Juicy/Geoip/Block/Countrydefine.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Juicy_Geoip_Block_Countrydefine extends Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstract
4
+ {
5
+ protected $magentoOptions;
6
+
7
+ public function __construct()
8
+ {
9
+ // create columns
10
+ $this->addColumn('countryCode', array(
11
+ 'label' => Mage::helper('adminhtml')->__('Country Code'),
12
+ 'size' => 28,
13
+ ));
14
+ $this->addColumn('currencyCode', array(
15
+ 'label' => Mage::helper('adminhtml')->__('Currency Code'),
16
+ 'size' => 28
17
+ ));
18
+
19
+ $this->addColumn('store', array(
20
+ 'label' => Mage::helper('adminhtml')->__('Store'),
21
+ 'size' => 28
22
+ ));
23
+
24
+ $this->_addAfter = false;
25
+ $this->_addButtonLabel = Mage::helper('adminhtml')->__('Add Line');
26
+
27
+ parent::__construct();
28
+ $this->setTemplate('juicy/geoip/system/config/form/field/array.phtml');
29
+
30
+ }
31
+
32
+ protected function _renderCellTemplate($columnName)
33
+ {
34
+ if (empty($this->_columns[$columnName])) {
35
+ throw new Exception('Wrong column name specified.');
36
+ }
37
+ $column = $this->_columns[$columnName];
38
+ $inputName = $this->getElement()->getName() . '[#{_id}][' . $columnName . ']';
39
+
40
+ if($columnName === "currencyCode"){
41
+ $currencyStr = "";
42
+ $currencyArr = Mage::getModel('directory/currency')->getConfigAllowCurrencies();
43
+ foreach($currencyArr as $code => $currency){
44
+ $currencyStr .= '<option value="'.$currency.'">'.$currency.'</option>';
45
+ }
46
+ return '<select name="' . $inputName . '">'.$currencyStr.'</select>';
47
+ } else if($columnName === "countryCode"){
48
+ $countryStr = "";
49
+ $countryArr = Mage::helper('geoip')->getCountryList();
50
+ foreach($countryArr as $code => $country){
51
+ $countryStr .= '<option value="'.$code.'">'.$country.'</option>';
52
+ }
53
+ return '<select name="' . $inputName . '">'.$countryStr.'</select>';
54
+ } else if($columnName === "store"){
55
+ $storeStr = "";
56
+ foreach (Mage::app()->getWebsites() as $website) {
57
+ foreach ($website->getGroups() as $group) {
58
+ $stores = $group->getStores();
59
+ $storeStr .= '<optgroup label="'.$group->getName().'">';
60
+ foreach ($stores as $store) {
61
+ $storeStr .= '<option value="'.$store->getId().'">'.$store->getName().'</option>';
62
+ }
63
+ $storeStr .= '</optgroup>';
64
+ }
65
+ }
66
+ return '<select name="' . $inputName . '">'.$storeStr.'</select>';
67
+ }else{
68
+ return '<input type="text" name="' . $inputName . '" value="#{' . $columnName . '}" ' . ($column['size'] ? 'size="' . $column['size'] . '"' : '') . '/>';
69
+ }
70
+
71
+
72
+ }
73
+ }
app/code/local/Juicy/Geoip/Helper/Data.php ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Juicy_Geoip_Helper_Data extends Mage_Core_Helper_Abstract {
4
+ public function isPrivateIp()
5
+ {
6
+ return !filter_var(Mage::helper('core/http')->getRemoteAddr(), FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
7
+ }
8
+ public function getConfig($key)
9
+ {
10
+ return Mage::getStoreConfig('geoip/'.$key);
11
+ }
12
+ public function isEnabled()
13
+ {
14
+ return Mage::getStoreConfig('geoip/general/status');
15
+ }
16
+ public function isTestMode()
17
+ {
18
+ return Mage::getStoreConfig('geoip/general/testing');
19
+ }
20
+ public function testOverrideCountry()
21
+ {
22
+ return Mage::getStoreConfig('geoip/general/country_override');
23
+ }
24
+ public function canSwitch($key)
25
+ {
26
+ return Mage::getStoreConfig('geoip/general/switch_'.$key);
27
+ }
28
+
29
+ public function getCountryList(){
30
+ return array (
31
+ 'AF' => 'Afghanistan',
32
+ 'AL' => 'Albania',
33
+ 'DZ' => 'Algeria',
34
+ 'AS' => 'American Samoa',
35
+ 'AD' => 'Andorra',
36
+ 'AO' => 'Angola',
37
+ 'AI' => 'Anguilla',
38
+ 'AQ' => 'Antarctica',
39
+ 'AG' => 'Antigua and Barbuda',
40
+ 'AR' => 'Argentina',
41
+ 'AM' => 'Armenia',
42
+ 'AW' => 'Aruba',
43
+ 'AU' => 'Australia',
44
+ 'AT' => 'Austria',
45
+ 'AZ' => 'Azerbaijan',
46
+ 'BS' => 'Bahamas',
47
+ 'BH' => 'Bahrain',
48
+ 'BD' => 'Bangladesh',
49
+ 'BB' => 'Barbados',
50
+ 'BY' => 'Belarus',
51
+ 'BE' => 'Belgium',
52
+ 'BZ' => 'Belize',
53
+ 'BJ' => 'Benin',
54
+ 'BM' => 'Bermuda',
55
+ 'BT' => 'Bhutan',
56
+ 'BO' => 'Bolivia',
57
+ 'BA' => 'Bosnia and Herzegovina',
58
+ 'BW' => 'Botswana',
59
+ 'BV' => 'Bouvet Island',
60
+ 'BR' => 'Brazil',
61
+ 'BQ' => 'British Antarctic Territory',
62
+ 'IO' => 'British Indian Ocean Territory',
63
+ 'VG' => 'British Virgin Islands',
64
+ 'BN' => 'Brunei',
65
+ 'BG' => 'Bulgaria',
66
+ 'BF' => 'Burkina Faso',
67
+ 'BI' => 'Burundi',
68
+ 'KH' => 'Cambodia',
69
+ 'CM' => 'Cameroon',
70
+ 'CA' => 'Canada',
71
+ 'CT' => 'Canton and Enderbury Islands',
72
+ 'CV' => 'Cape Verde',
73
+ 'KY' => 'Cayman Islands',
74
+ 'CF' => 'Central African Republic',
75
+ 'TD' => 'Chad',
76
+ 'CL' => 'Chile',
77
+ 'CN' => 'China',
78
+ 'CX' => 'Christmas Island',
79
+ 'CC' => 'Cocos [Keeling] Islands',
80
+ 'CO' => 'Colombia',
81
+ 'KM' => 'Comoros',
82
+ 'CG' => 'Congo - Brazzaville',
83
+ 'CD' => 'Congo - Kinshasa',
84
+ 'CK' => 'Cook Islands',
85
+ 'CR' => 'Costa Rica',
86
+ 'HR' => 'Croatia',
87
+ 'CU' => 'Cuba',
88
+ 'CY' => 'Cyprus',
89
+ 'CZ' => 'Czech Republic',
90
+ 'CI' => 'Côte d’Ivoire',
91
+ 'DK' => 'Denmark',
92
+ 'DJ' => 'Djibouti',
93
+ 'DM' => 'Dominica',
94
+ 'DO' => 'Dominican Republic',
95
+ 'NQ' => 'Dronning Maud Land',
96
+ 'DD' => 'East Germany',
97
+ 'EC' => 'Ecuador',
98
+ 'EG' => 'Egypt',
99
+ 'SV' => 'El Salvador',
100
+ 'GQ' => 'Equatorial Guinea',
101
+ 'ER' => 'Eritrea',
102
+ 'EE' => 'Estonia',
103
+ 'ET' => 'Ethiopia',
104
+ 'FK' => 'Falkland Islands',
105
+ 'FO' => 'Faroe Islands',
106
+ 'FJ' => 'Fiji',
107
+ 'FI' => 'Finland',
108
+ 'FR' => 'France',
109
+ 'GF' => 'French Guiana',
110
+ 'PF' => 'French Polynesia',
111
+ 'TF' => 'French Southern Territories',
112
+ 'FQ' => 'French Southern and Antarctic Territories',
113
+ 'GA' => 'Gabon',
114
+ 'GM' => 'Gambia',
115
+ 'GE' => 'Georgia',
116
+ 'DE' => 'Germany',
117
+ 'GH' => 'Ghana',
118
+ 'GI' => 'Gibraltar',
119
+ 'GR' => 'Greece',
120
+ 'GL' => 'Greenland',
121
+ 'GD' => 'Grenada',
122
+ 'GP' => 'Guadeloupe',
123
+ 'GU' => 'Guam',
124
+ 'GT' => 'Guatemala',
125
+ 'GG' => 'Guernsey',
126
+ 'GN' => 'Guinea',
127
+ 'GW' => 'Guinea-Bissau',
128
+ 'GY' => 'Guyana',
129
+ 'HT' => 'Haiti',
130
+ 'HM' => 'Heard Island and McDonald Islands',
131
+ 'HN' => 'Honduras',
132
+ 'HK' => 'Hong Kong SAR China',
133
+ 'HU' => 'Hungary',
134
+ 'IS' => 'Iceland',
135
+ 'IN' => 'India',
136
+ 'ID' => 'Indonesia',
137
+ 'IR' => 'Iran',
138
+ 'IQ' => 'Iraq',
139
+ 'IE' => 'Ireland',
140
+ 'IM' => 'Isle of Man',
141
+ 'IL' => 'Israel',
142
+ 'IT' => 'Italy',
143
+ 'JM' => 'Jamaica',
144
+ 'JP' => 'Japan',
145
+ 'JE' => 'Jersey',
146
+ 'JT' => 'Johnston Island',
147
+ 'JO' => 'Jordan',
148
+ 'KZ' => 'Kazakhstan',
149
+ 'KE' => 'Kenya',
150
+ 'KI' => 'Kiribati',
151
+ 'KW' => 'Kuwait',
152
+ 'KG' => 'Kyrgyzstan',
153
+ 'LA' => 'Laos',
154
+ 'LV' => 'Latvia',
155
+ 'LB' => 'Lebanon',
156
+ 'LS' => 'Lesotho',
157
+ 'LR' => 'Liberia',
158
+ 'LY' => 'Libya',
159
+ 'LI' => 'Liechtenstein',
160
+ 'LT' => 'Lithuania',
161
+ 'LU' => 'Luxembourg',
162
+ 'MO' => 'Macau SAR China',
163
+ 'MK' => 'Macedonia',
164
+ 'MG' => 'Madagascar',
165
+ 'MW' => 'Malawi',
166
+ 'MY' => 'Malaysia',
167
+ 'MV' => 'Maldives',
168
+ 'ML' => 'Mali',
169
+ 'MT' => 'Malta',
170
+ 'MH' => 'Marshall Islands',
171
+ 'MQ' => 'Martinique',
172
+ 'MR' => 'Mauritania',
173
+ 'MU' => 'Mauritius',
174
+ 'YT' => 'Mayotte',
175
+ 'FX' => 'Metropolitan France',
176
+ 'MX' => 'Mexico',
177
+ 'FM' => 'Micronesia',
178
+ 'MI' => 'Midway Islands',
179
+ 'MD' => 'Moldova',
180
+ 'MC' => 'Monaco',
181
+ 'MN' => 'Mongolia',
182
+ 'ME' => 'Montenegro',
183
+ 'MS' => 'Montserrat',
184
+ 'MA' => 'Morocco',
185
+ 'MZ' => 'Mozambique',
186
+ 'MM' => 'Myanmar [Burma]',
187
+ 'NA' => 'Namibia',
188
+ 'NR' => 'Nauru',
189
+ 'NP' => 'Nepal',
190
+ 'NL' => 'Netherlands',
191
+ 'AN' => 'Netherlands Antilles',
192
+ 'NT' => 'Neutral Zone',
193
+ 'NC' => 'New Caledonia',
194
+ 'NZ' => 'New Zealand',
195
+ 'NI' => 'Nicaragua',
196
+ 'NE' => 'Niger',
197
+ 'NG' => 'Nigeria',
198
+ 'NU' => 'Niue',
199
+ 'NF' => 'Norfolk Island',
200
+ 'KP' => 'North Korea',
201
+ 'VD' => 'North Vietnam',
202
+ 'MP' => 'Northern Mariana Islands',
203
+ 'NO' => 'Norway',
204
+ 'OM' => 'Oman',
205
+ 'PC' => 'Pacific Islands Trust Territory',
206
+ 'PK' => 'Pakistan',
207
+ 'PW' => 'Palau',
208
+ 'PS' => 'Palestinian Territories',
209
+ 'PA' => 'Panama',
210
+ 'PZ' => 'Panama Canal Zone',
211
+ 'PG' => 'Papua New Guinea',
212
+ 'PY' => 'Paraguay',
213
+ 'YD' => 'Peoples Democratic Republic of Yemen',
214
+ 'PE' => 'Peru',
215
+ 'PH' => 'Philippines',
216
+ 'PN' => 'Pitcairn Islands',
217
+ 'PL' => 'Poland',
218
+ 'PT' => 'Portugal',
219
+ 'PR' => 'Puerto Rico',
220
+ 'QA' => 'Qatar',
221
+ 'RO' => 'Romania',
222
+ 'RU' => 'Russia',
223
+ 'RW' => 'Rwanda',
224
+ 'RE' => 'Réunion',
225
+ 'BL' => 'Saint Barthélemy',
226
+ 'SH' => 'Saint Helena',
227
+ 'KN' => 'Saint Kitts and Nevis',
228
+ 'LC' => 'Saint Lucia',
229
+ 'MF' => 'Saint Martin',
230
+ 'PM' => 'Saint Pierre and Miquelon',
231
+ 'VC' => 'Saint Vincent and the Grenadines',
232
+ 'WS' => 'Samoa',
233
+ 'SM' => 'San Marino',
234
+ 'SA' => 'Saudi Arabia',
235
+ 'SN' => 'Senegal',
236
+ 'RS' => 'Serbia',
237
+ 'CS' => 'Serbia and Montenegro',
238
+ 'SC' => 'Seychelles',
239
+ 'SL' => 'Sierra Leone',
240
+ 'SG' => 'Singapore',
241
+ 'SK' => 'Slovakia',
242
+ 'SI' => 'Slovenia',
243
+ 'SB' => 'Solomon Islands',
244
+ 'SO' => 'Somalia',
245
+ 'ZA' => 'South Africa',
246
+ 'GS' => 'South Georgia and the South Sandwich Islands',
247
+ 'KR' => 'South Korea',
248
+ 'ES' => 'Spain',
249
+ 'LK' => 'Sri Lanka',
250
+ 'SD' => 'Sudan',
251
+ 'SR' => 'Suriname',
252
+ 'SJ' => 'Svalbard and Jan Mayen',
253
+ 'SZ' => 'Swaziland',
254
+ 'SE' => 'Sweden',
255
+ 'CH' => 'Switzerland',
256
+ 'SY' => 'Syria',
257
+ 'ST' => 'São Tomé and Príncipe',
258
+ 'TW' => 'Taiwan',
259
+ 'TJ' => 'Tajikistan',
260
+ 'TZ' => 'Tanzania',
261
+ 'TH' => 'Thailand',
262
+ 'TL' => 'Timor-Leste',
263
+ 'TG' => 'Togo',
264
+ 'TK' => 'Tokelau',
265
+ 'TO' => 'Tonga',
266
+ 'TT' => 'Trinidad and Tobago',
267
+ 'TN' => 'Tunisia',
268
+ 'TR' => 'Turkey',
269
+ 'TM' => 'Turkmenistan',
270
+ 'TC' => 'Turks and Caicos Islands',
271
+ 'TV' => 'Tuvalu',
272
+ 'UM' => 'U.S. Minor Outlying Islands',
273
+ 'PU' => 'U.S. Miscellaneous Pacific Islands',
274
+ 'VI' => 'U.S. Virgin Islands',
275
+ 'UG' => 'Uganda',
276
+ 'UA' => 'Ukraine',
277
+ 'SU' => 'Union of Soviet Socialist Republics',
278
+ 'AE' => 'United Arab Emirates',
279
+ 'GB' => 'United Kingdom',
280
+ 'US' => 'United States',
281
+ 'ZZ' => 'Unknown or Invalid Region',
282
+ 'UY' => 'Uruguay',
283
+ 'UZ' => 'Uzbekistan',
284
+ 'VU' => 'Vanuatu',
285
+ 'VA' => 'Vatican City',
286
+ 'VE' => 'Venezuela',
287
+ 'VN' => 'Vietnam',
288
+ 'WK' => 'Wake Island',
289
+ 'WF' => 'Wallis and Futuna',
290
+ 'EH' => 'Western Sahara',
291
+ 'YE' => 'Yemen',
292
+ 'ZM' => 'Zambia',
293
+ 'ZW' => 'Zimbabwe',
294
+ 'AX' => 'Åland Islands',
295
+ );
296
+ }
297
+ }
app/code/local/Juicy/Geoip/Model/Geoip.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ define("GEOIP_STANDARD", 0);
4
+
5
+ class Juicy_Geoip_Model_Geoip
6
+ {
7
+
8
+ public function runGeoip(){
9
+ $countryCode = $this->_getCountryCode();
10
+ $pairArr = $this->_getPairArray();
11
+ foreach($pairArr as $searchArr){
12
+ if(in_array($countryCode, $searchArr)){
13
+ $this->_setCurrency($searchArr);
14
+ //This method returns the redirect for store if it needs one
15
+ //@TODO Make this a bit nicer
16
+ return $this->_setStore($searchArr);
17
+ }
18
+ }
19
+ }
20
+ protected function _setCurrency($searchArr)
21
+ {
22
+ if(Mage::helper('geoip')->canSwitch("currency")){
23
+ Mage::app()->getStore()->setCurrentCurrencyCode(next($searchArr));
24
+ }
25
+ }
26
+ protected function _setStore($searchArr)
27
+ {
28
+ if(Mage::helper('geoip')->canSwitch("store")){
29
+ $storeName = Mage::app()->getStore($searchArr['store'])->getName();
30
+ if ($storeName) {
31
+ $store = Mage::getModel('core/store')->load($storeName, 'name');
32
+ if ($store->getName() != Mage::app()->getStore()->getName()) {
33
+ //Needs to return store URL for observer to redirect using event
34
+ return $store->getCurrentUrl(false);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ protected function _getCountryCode()
40
+ {
41
+ return Mage::helper('geoip')->isTestMode()
42
+ ? Mage::helper('geoip')->testOverrideCountry()
43
+ : $this->_getCountryCodeFromIp($this->_getIp());
44
+ }
45
+ protected function _getPairArray()
46
+ {
47
+ return unserialize(Mage::getStoreConfig('geoip/geoipset/ippair', Mage::app()->getStore()));
48
+ }
49
+
50
+ protected function _getIp(){
51
+ //Using Mage HTTP helper because Varnish can confuse PHP method
52
+ return Mage::helper('core/http')->getRemoteAddr();
53
+ }
54
+ protected function _getCountryCodeFromIp($ip){
55
+ //If its 0, that means we're using Apache else we're using a file
56
+ if(Mage::helper('geoip')->getConfig('general/apache_or_file') == 0){
57
+ return geoip_country_code_by_name($ip);
58
+ }else{
59
+ /*
60
+ try{
61
+ $fileName = Mage::helper('geoip')->getConfig('general/file_location');
62
+ *
63
+ *
64
+ return $country;
65
+ }catch(Exception $e){
66
+ Mage::throwException($e->getMessage());
67
+ }
68
+ */
69
+ return geoip_country_code_by_name($ip);
70
+ }
71
+ }
72
+ }
73
+
app/code/local/Juicy/Geoip/Model/Observer.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Juicy_Geoip_Model_Observer
4
+ {
5
+ public function controllerActionPredispatch($e)
6
+ {
7
+ if(Mage::helper("geoip")->isModuleEnabled() == 1 && !Mage::helper("geoip")->isPrivateIp()){
8
+ if(Mage::helper("geoip")->isTestMode() == 1){
9
+ Mage::getModel('core/session')->unsGeoipChecked();
10
+ }
11
+ $session = Mage::getModel('core/session')->getGeoipChecked();
12
+ if(!isset($session) || $session == false){
13
+
14
+ $redirStore = Mage::getModel('geoip/geoip')->runGeoip();
15
+ if($redirStore){
16
+ $e->getControllerAction()->getResponse()->setRedirect($redirStore);
17
+ }
18
+ Mage::getSingleton("core/session")->setGeoipChecked(true);
19
+ }
20
+ }
21
+ }
22
+ }
app/code/local/Juicy/Geoip/etc/adminhtml.xml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ To change this license header, choose License Headers in Project Properties.
4
+ To change this template file, choose Tools | Templates
5
+ and open the template in the editor.
6
+ -->
7
+
8
+ <config>
9
+ <acl>
10
+ <resources>
11
+ <all>
12
+ <title>Allow Everything</title>
13
+ </all>
14
+ <admin>
15
+ <children>
16
+ <system>
17
+ <children>
18
+ <config>
19
+ <children>
20
+ <geoip module="geoip">
21
+ <title>GeoIP Config</title>
22
+ <sort_order>99</sort_order>
23
+ </geoip>
24
+ </children>
25
+ </config>
26
+ </children>
27
+ </system>
28
+ </children>
29
+ </admin>
30
+ </resources>
31
+ </acl>
32
+ </config>
app/code/local/Juicy/Geoip/etc/config.xml ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+
4
+ <config>
5
+ <modules>
6
+ <Juicy_Geoip>
7
+ <version>0.2.0</version>
8
+ </Juicy_Geoip>
9
+ </modules>
10
+ <global>
11
+ <helpers>
12
+ <geoip>
13
+ <class>Juicy_Geoip_Helper</class>
14
+ </geoip>
15
+ </helpers>
16
+ <blocks>
17
+ <geoip>
18
+ <class>Juicy_Geoip_Block</class>
19
+ </geoip>
20
+ </blocks>
21
+ <models>
22
+ <geoip>
23
+ <class>Juicy_Geoip_Model</class>
24
+ </geoip>
25
+ </models>
26
+ </global>
27
+ <frontend>
28
+ <events>
29
+ <controller_action_predispatch>
30
+ <observers>
31
+ <geoip>
32
+ <class>geoip/observer</class>
33
+ <method>controllerActionPredispatch</method>
34
+ </geoip>
35
+ </observers>
36
+ </controller_action_predispatch>
37
+ </events>
38
+ </frontend>
39
+ <default>
40
+ <geoip>
41
+ <general>
42
+ <status>0</status>
43
+ <testing>0</testing>
44
+ <country_override></country_override>
45
+ <switch_currency>0</switch_currency>
46
+ <switch_store>0</switch_store>
47
+ <apache_or_file>0</apache_or_file>
48
+ <file_location>EXAMPLE: geoip.dat</file_location>
49
+ </general>
50
+ <geoipset>
51
+
52
+ </geoipset>
53
+ </geoip>
54
+ </default>
55
+ </config>
app/code/local/Juicy/Geoip/etc/system.xml ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ To change this license header, choose License Headers in Project Properties.
4
+ To change this template file, choose Tools | Templates
5
+ and open the template in the editor.
6
+ -->
7
+
8
+
9
+ <config>
10
+ <tabs>
11
+ <juicy translate="label" module="geoip">
12
+ <label>Juicy Media</label>
13
+ <sort_order>10</sort_order>
14
+ </juicy>
15
+ </tabs>
16
+ <sections>
17
+ <geoip translate="label" module="geoip">
18
+ <label>GeoIP</label>
19
+ <tab>juicy</tab>
20
+ <sort_order>0</sort_order>
21
+ <show_in_default>1</show_in_default>
22
+ <show_in_website>1</show_in_website>
23
+ <show_in_store>1</show_in_store>
24
+ <groups>
25
+ <general translate="label" module="geoip">
26
+ <label>General</label>
27
+ <frontend_type>text</frontend_type>
28
+ <sort_order>1000</sort_order>
29
+ <show_in_default>1</show_in_default>
30
+ <show_in_website>1</show_in_website>
31
+ <show_in_store>1</show_in_store>
32
+ <fields>
33
+ <status translate="label">
34
+ <label>GeoIP Ext</label>
35
+ <frontend_type>select</frontend_type>
36
+ <comment>Enable/Disable GeoIP Extension</comment>
37
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
38
+ <sort_order>20</sort_order>
39
+ <show_in_default>1</show_in_default>
40
+ <show_in_website>1</show_in_website>
41
+ <show_in_store>0</show_in_store>
42
+ </status>
43
+ <testing translate="label">
44
+ <label>GeoIP Testing Mode</label>
45
+ <frontend_type>select</frontend_type>
46
+ <comment>Enable/Disable testing mode</comment>
47
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
48
+ <sort_order>25</sort_order>
49
+ <show_in_default>1</show_in_default>
50
+ <show_in_website>1</show_in_website>
51
+ <show_in_store>0</show_in_store>
52
+ <depends><status>1</status></depends>
53
+ </testing>
54
+ <country_override translate="label">
55
+ <label>Country Override</label>
56
+ <frontend_type>text</frontend_type>
57
+ <comment>ISO 3166 country code to mimic. Must be filled in for testing mode to work.</comment>
58
+ <sort_order>30</sort_order>
59
+ <show_in_default>1</show_in_default>
60
+ <show_in_website>1</show_in_website>
61
+ <show_in_store>0</show_in_store>
62
+ <depends><testing>1</testing></depends>
63
+ </country_override>
64
+ <switch_currency translate="label">
65
+ <label>Allow Currency Switching</label>
66
+ <frontend_type>select</frontend_type>
67
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
68
+ <sort_order>40</sort_order>
69
+ <show_in_default>1</show_in_default>
70
+ <show_in_website>1</show_in_website>
71
+ <show_in_store>0</show_in_store>
72
+ <depends><status>1</status></depends>
73
+ </switch_currency>
74
+ <!--
75
+ <switch_locale translate="label">
76
+ <label>Allow Locale(Translation) Switching</label>
77
+ <frontend_type>select</frontend_type>
78
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
79
+ <sort_order>50</sort_order>
80
+ <show_in_default>1</show_in_default>
81
+ <show_in_website>1</show_in_website>
82
+ <show_in_store>0</show_in_store>
83
+ </switch_locale>
84
+ -->
85
+ <switch_store translate="label">
86
+ <label>Allow Store Switching</label>
87
+ <frontend_type>select</frontend_type>
88
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
89
+ <sort_order>60</sort_order>
90
+ <show_in_default>1</show_in_default>
91
+ <show_in_website>1</show_in_website>
92
+ <show_in_store>0</show_in_store>
93
+ <depends><status>1</status></depends>
94
+ </switch_store>
95
+ <!--
96
+ <apache_or_file translate="label">
97
+ <label>Use my own GeoIP file</label>
98
+ <frontend_type>select</frontend_type>
99
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
100
+ <sort_order>70</sort_order>
101
+ <comment> <![CDATA[ <span>Enable if you do not need/want to use the Apache GeoIP module <b style="color:red;">EXPERIMENTAL ONLY</b></span> ]]></comment>
102
+ <show_in_default>1</show_in_default>
103
+ <show_in_website>1</show_in_website>
104
+ <show_in_store>0</show_in_store>
105
+ <depends><status>1</status></depends>
106
+ </apache_or_file>
107
+ <file_location translate="label">
108
+ <label>GeoIP data Override file name</label>
109
+ <frontend_type>text</frontend_type>
110
+ <sort_order>80</sort_order>
111
+ <comment>Place .dat file in [Mage Dir]/var/juicy/geoip</comment>
112
+ <show_in_default>1</show_in_default>
113
+ <show_in_website>1</show_in_website>
114
+ <show_in_store>0</show_in_store>
115
+ <depends><apache_or_file>1</apache_or_file></depends>
116
+ </file_location>
117
+ -->
118
+ </fields>
119
+ </general>
120
+ <geoipset translate="label" module="geoip">
121
+ <label>GeoIP Pairing</label>
122
+ <frontend_type>text</frontend_type>
123
+ <sort_order>2000</sort_order>
124
+ <show_in_default>1</show_in_default>
125
+ <show_in_website>1</show_in_website>
126
+ <show_in_store>1</show_in_store>
127
+ <fields>
128
+ <ippair translate="label">
129
+ <label>GeoIP Pairing</label>
130
+ <frontend_model>juicy_geoip_block_countrydefine</frontend_model>
131
+ <backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
132
+ <sort_order>0</sort_order>
133
+ <show_in_default>1</show_in_default>
134
+ <show_in_website>1</show_in_website>
135
+ <show_in_store>1</show_in_store>
136
+ <comment><!--<![CDATA[ ]]>--></comment>
137
+ </ippair>
138
+ </fields>
139
+ </geoipset>
140
+ </groups>
141
+ </geoip>
142
+ </sections>
143
+ </config>
app/design/adminhtml/default/default/template/juicy/geoip/system/config/form/field/array.phtml ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category design
22
+ * @package default_default
23
+ * @copyright Copyright (c) 2014 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+
28
+ <?php
29
+ $_htmlId = $this->getHtmlId() ? $this->getHtmlId() : '_' . uniqid();
30
+
31
+ $_colspan = 2;
32
+ if (!$this->_addAfter) {
33
+ $_colspan -= 1;
34
+ }
35
+ $_colspan = $_colspan > 1 ? 'colspan="' . $_colspan . '"' : '';
36
+ ?>
37
+
38
+ <div class="grid" id="grid<?php echo $_htmlId ?>">
39
+ <table cellpadding="0" cellspacing="0" class="border">
40
+ <tbody>
41
+
42
+ <tr class="headings" id="headings<?php echo $_htmlId ?>">
43
+ <?php foreach ($this->_columns as $columnName => $column):?>
44
+ <th><?php echo $column['label'] ?></th>
45
+ <?php endforeach;?>
46
+ <th <?php echo $_colspan?>></th>
47
+ </tr>
48
+
49
+ <tr id="addRow<?php echo $_htmlId ?>">
50
+ <td colspan="<?php echo count($this->_columns) ?>"></td>
51
+ <td <?php echo $_colspan?>>
52
+ <button style="" onclick="" class="scalable add" type="button" id="addToEndBtn<?php echo $_htmlId ?>">
53
+ <span><span><span><?php echo $this->_addButtonLabel ?></span></span></span>
54
+ </button>
55
+ </td>
56
+ </tr>
57
+
58
+ </tbody>
59
+ </table>
60
+ <input type="hidden" name="<?php echo $this->getElement()->getName() ?>[__empty]" value="" />
61
+ </div>
62
+ <div id="empty<?php echo $_htmlId ?>">
63
+ <button style="" onclick="" class="scalable add" type="button" id="emptyAddBtn<?php echo $_htmlId ?>">
64
+ <span><span><span><?php echo $this->_addButtonLabel ?></span></span></span>
65
+ </button>
66
+ </div>
67
+
68
+ <script type="text/javascript">
69
+ //<![CDATA[
70
+ // create row creator
71
+ var arrayRow<?php echo $_htmlId ?> = {
72
+ // define row prototypeJS template
73
+ template : new Template(
74
+ '<tr id="#{_id}">'
75
+ <?php foreach ($this->_columns as $columnName => $column):?>
76
+ +'<td class="#{_id}-<?php echo $columnName ?>">'
77
+ +'<?php echo $this->_renderCellTemplate($columnName)?>'
78
+ +'<\/td>'
79
+ <?php endforeach;?>
80
+ <?php if ($this->_addAfter):?>
81
+ +'<td><button onclick="" class="scalable add" type="button" id="addAfterBtn#{_id}"><span><span><span><?php echo Mage::helper('adminhtml')->__('Add after') ?><\/span><\/span><\/span><\/button><\/td>'
82
+ <?php endif;?>
83
+ +'<td><button onclick="arrayRow<?php echo $_htmlId ?>.del(\'#{_id}\')" class="scalable delete" type="button"><span><span><span><?php echo Mage::helper('adminhtml')->__('Delete') ?><\/span><\/span><\/span><\/button><\/td>'
84
+ +'<\/tr>'
85
+ ),
86
+
87
+ rowsCount : 0,
88
+
89
+ add : function(templateData, insertAfterId)
90
+ {
91
+ // generate default template data
92
+ if ('' == templateData) {
93
+ var d = new Date();
94
+ var templateData = {
95
+ <?php foreach ($this->_columns as $columnName => $column):?>
96
+ <?php echo $columnName ?> : '',
97
+ <?php endforeach;?>
98
+ _id : '_' + d.getTime() + '_' + d.getMilliseconds()
99
+ };
100
+ }
101
+
102
+ // insert before last row
103
+ if ('' == insertAfterId) {
104
+ Element.insert($('addRow<?php echo $_htmlId ?>'), {before: this.template.evaluate(templateData)});
105
+ }
106
+ // insert after specified row
107
+ else {
108
+ Element.insert($(insertAfterId), {after: this.template.evaluate(templateData)});
109
+ }
110
+
111
+ // set the selected drop-down list item
112
+ <?php foreach ($this->_columns as $columnName => $column):?>
113
+ var options = $$('td.' + templateData._id + '-' + '<?php echo $columnName?>' + ' option');
114
+ for (var index = 0; index < options.length; ++index) {
115
+ var option = options[index]
116
+ if (option.getAttribute('value') == templateData.<?php echo $columnName?>) {
117
+ option.selected = true
118
+ }
119
+ }
120
+ <?php endforeach;?>
121
+
122
+ <?php if ($this->_addAfter):?>
123
+ Event.observe('addAfterBtn' + templateData._id, 'click', this.add.bind(this, '', templateData._id));
124
+ <?php endif;?>
125
+
126
+ this.rowsCount += 1;
127
+ },
128
+
129
+ del : function(rowId)
130
+ {
131
+ $(rowId).remove();
132
+ this.rowsCount -= 1;
133
+ if (0 == this.rowsCount) {
134
+ this.showButtonOnly();
135
+ }
136
+ },
137
+
138
+ showButtonOnly : function()
139
+ {
140
+ $('grid<?php echo $_htmlId ?>').hide();
141
+ $('empty<?php echo $_htmlId ?>').show();
142
+ }
143
+ }
144
+
145
+ // bind add action to "Add" button in last row
146
+ Event.observe('addToEndBtn<?php echo $_htmlId ?>', 'click', arrayRow<?php echo $_htmlId ?>.add.bind(arrayRow<?php echo $_htmlId ?>, '', ''));
147
+
148
+ // add existing rows
149
+ <?php
150
+ $_addAfterId = "headings{$_htmlId}";
151
+ foreach ($this->getArrayRows() as $_rowId => $_row) {
152
+ echo "arrayRow{$_htmlId}.add(" . $_row->toJson() . ", '{$_addAfterId}');\n";
153
+ $_addAfterId = $_rowId;
154
+ }
155
+ ?>
156
+
157
+ // initialize standalone button
158
+ $('empty<?php echo $_htmlId ?>').hide();
159
+ Event.observe('emptyAddBtn<?php echo $_htmlId ?>', 'click', function () {
160
+ $('grid<?php echo $_htmlId ?>').show();
161
+ $('empty<?php echo $_htmlId ?>').hide();
162
+ arrayRow<?php echo $_htmlId ?>.add('', '');
163
+ });
164
+
165
+ // if no rows, hide grid and show button only
166
+ <?php if (!$this->getArrayRows()):?>
167
+ arrayRow<?php echo $_htmlId ?>.showButtonOnly();
168
+ <?php endif;?>
169
+
170
+ // toggle the grid, if element is disabled (depending on scope)
171
+ <?php if ($this->getElement()->getDisabled()):?>
172
+ toggleValueElements({checked:true}, $('grid<?php echo $_htmlId ?>').parentNode);
173
+ <?php endif;?>
174
+ //]]>
175
+ </script>
app/etc/modules/Juicy_Geoip.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Juicy_Geoip>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ </Juicy_Geoip>
8
+ </modules>
9
+ </config>
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Juicy_GeoIP</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license>GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Change currency using the visitors IP address and the PHP GeoIP module</summary>
10
+ <description>Gets the customers current country using PHP's GeoIP module, filters through a list of countries and grabs the associated currency code for Magento</description>
11
+ <notes>Stable Release</notes>
12
+ <authors><author><name>Jonathan Webb</name><user>JuicyMedia</user><email>jonathan.webb@juicymedia.co.uk</email></author></authors>
13
+ <date>2015-01-19</date>
14
+ <time>11:03:07</time>
15
+ <contents><target name="magelocal"><dir name="Juicy"><dir name="Geoip"><dir name="Block"><file name="Countrydefine.php" hash="0032d7797b0dc464fe0edc99d6a7fe7e"/></dir><dir name="Helper"><file name="Data.php" hash="d724ae9ca937562e91e8b45a052beff2"/></dir><dir name="Model"><file name="Geoip.php" hash="537242b732c5bcd2e087137c864359e9"/><file name="Observer.php" hash="176a89109b18c4322ec109c465067e8a"/></dir><dir name="etc"><file name="adminhtml.xml" hash="5ac9ab6f0f5b9bb998fa7666dbe54803"/><file name="config.xml" hash="8926d6a0f8d457c837b5972fbd42c90c"/><file name="system.xml" hash="91e1e5163d0b725fd810e41a1339a875"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Juicy_Geoip.xml" hash="c4ebc7b11208b6c6b6020cb581ba9b12"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="juicy"><dir name="geoip"><dir name="system"><dir name="config"><dir name="form"><dir name="field"><file name="array.phtml" hash="83994a57e699b206fe5fa898d1f99690"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php><extension><name>geoip</name><min/><max>100</max></extension></required></dependencies>
18
+ </package>