PluginProbe
Mailchimp List Subscribe Form / 1.4.1
Mailchimp List Subscribe Form v1.4.1
1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 All 55 releases
mailchimp / mailchimp.php

mailchimp.php in Mailchimp List Subscribe Form 1.4.1, at mailchimp.php

1,524 lines 48.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: MailChimp
4 Plugin URI: http://www.mailchimp.com/plugins/mailchimp-wordpress-plugin/
5 Description: The MailChimp plugin allows you to quickly and easily add a signup form for your MailChimp list.
6 Version: 1.4.1
7 Author: MailChimp and Crowd Favorite
8 Author URI: http://mailchimp.com/api/
9 */
10 /* Copyright 2008-2012 MailChimp.com (email : api@mailchimp.com)
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 */
26
27 // Version constant for easy CSS refreshes
28 define('MCSF_VER', '1.4.1');
29
30 // What's our permission (capability) threshold
31 define('MCSF_CAP_THRESHOLD', 'manage_options');
32
33 // If Developer mode not defined, make it false
34 if (! defined('MAILCHIMP_DEV_MODE') ) {
35 define('MAILCHIMP_DEV_MODE', false);
36 }
37
38 // Define our location constants, both MCSF_DIR and MCSF_URL
39 mailchimpSF_where_am_i();
40
41 // Get our MailChimp API class in scope
42 if (!class_exists('Sopresto_MailChimp')) {
43 require_once(MCSF_DIR.'lib/sopresto/sopresto.php');
44 }
45
46 // includes the widget code so it can be easily called either normally or via ajax
47 include_once('mailchimp_widget.php');
48
49 // includes the backwards compatibility functions
50 include_once('mailchimp_compat.php');
51
52 /**
53 * Do the following plugin setup steps here
54 *
55 * Internationalization
56 * Resource (JS & CSS) enqueuing
57 *
58 * @return void
59 */
60 function mailchimpSF_plugin_init() {
61 // Internationalize the plugin
62 $textdomain = 'mailchimp_i18n';
63 $locale = apply_filters( 'plugin_locale', get_locale(), $textdomain);
64 load_textdomain('mailchimp_i18n', MCSF_LANG_DIR.$textdomain.'-'.$locale.'.mo');
65
66 // Bring in our appropriate JS and CSS resources
67 mailchimpSF_load_resources();
68 }
69 add_action( 'init', 'mailchimpSF_plugin_init' );
70
71
72 /**
73 * Add the settings link to the MailChimp plugin row
74 *
75 * @param array $links - Links for the plugin
76 * @return array - Links
77 */
78 function mailchimpSD_plugin_action_links($links) {
79 $settings_page = add_query_arg(array('page' => 'mailchimpSF_options'), admin_url('options-general.php'));
80 $settings_link = '<a href="'.esc_url($settings_page).'">'.__('Settings', 'mailchimp_i18n' ).'</a>';
81 array_unshift($links, $settings_link);
82 return $links;
83 }
84 add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'mailchimpSD_plugin_action_links', 10, 1);
85
86 /**
87 * Loads the appropriate JS and CSS resources depending on
88 * settings and context (admin or not)
89 *
90 * @return void
91 */
92 function mailchimpSF_load_resources() {
93 // JS
94 if (get_option('mc_use_javascript') == 'on') {
95 if (!is_admin()) {
96 wp_enqueue_script('jquery_scrollto', MCSF_URL.'js/scrollTo.js', array('jquery'), MCSF_VER);
97 wp_enqueue_script('mailchimpSF_main_js', MCSF_URL.'js/mailchimp.js', array('jquery', 'jquery-form'), MCSF_VER);
98 // some javascript to get ajax version submitting to the proper location
99 global $wp_scripts;
100 $wp_scripts->localize('mailchimpSF_main_js', 'mailchimpSF', array(
101 'ajax_url' => trailingslashit(home_url()),
102 ));
103 }
104 }
105
106 if (get_option('mc_use_datepicker') == 'on' && !is_admin()) {
107 // Datepicker theme
108 wp_enqueue_style('flick', MCSF_URL.'/css/flick/flick.css');
109 // Datepicker JS
110 wp_enqueue_script('datepicker', MCSF_URL.'/js/datepicker.js', array('jquery','jquery-ui-core'));
111 }
112
113 wp_enqueue_style('mailchimpSF_main_css', home_url('?mcsf_action=main_css&ver='.MCSF_VER));
114 wp_enqueue_style('mailchimpSF_ie_css', MCSF_URL.'css/ie.css');
115 global $wp_styles;
116 $wp_styles->add_data( 'mailchimpSF_ie_css', 'conditional', 'IE' );
117 }
118
119
120 /**
121 * Loads resources for the MailChimp admin page
122 *
123 * @return void
124 */
125 function mc_admin_page_load_resources() {
126 wp_enqueue_style('mailchimpSF_admin_css', MCSF_URL.'css/admin.css');
127 wp_enqueue_script('mailchimpSF_admin_js', MCSF_URL.'js/admin.js');
128 }
129 add_action('load-settings_page_mailchimpSF_options', 'mc_admin_page_load_resources');
130
131
132 /**
133 * Loads jQuery Datepicker for the date-pick class
134 **/
135 function mc_datepicker_load() {
136 ?>
137 <script type="text/javascript">
138 jQuery(function($) {
139 $('.date-pick').each(function() {
140 var format = $(this).data('format') || 'mm/dd/yyyy';
141 format = format.replace(/yyyy/i, 'yy');
142 $(this).datepicker({
143 autoFocusNextInput: true,
144 constrainInput: false,
145 changeMonth: true,
146 changeYear: true,
147 beforeShow: function(input, inst) { $('#ui-datepicker-div').addClass('show'); },
148 dateFormat: format.toLowerCase(),
149 });
150 });
151 d = new Date();
152 $('.birthdate-pick').each(function() {
153 var format = $(this).data('format') || 'mm/dd';
154 format = format.replace(/yyyy/i, 'yy');
155 $(this).datepicker({
156 autoFocusNextInput: true,
157 constrainInput: false,
158 changeMonth: true,
159 changeYear: false,
160 minDate: new Date(d.getFullYear(), 1-1, 1),
161 maxDate: new Date(d.getFullYear(), 12-1, 31),
162 beforeShow: function(input, inst) { $('#ui-datepicker-div').removeClass('show'); },
163 dateFormat: format.toLowerCase(),
164 });
165
166 });
167
168 });
169 </script>
170 <?php
171 }
172 if (get_option('mc_use_datepicker') == 'on' && !is_admin()) {
173 add_action('wp_head', 'mc_datepicker_load');
174 }
175
176 /**
177 * Handles requests that as light-weight a load as possible.
178 * typically, JS or CSS
179 **/
180 function mailchimpSF_early_request_handler() {
181 if (isset($_GET['mcsf_action'])) {
182 switch ($_GET['mcsf_action']) {
183 case 'main_css':
184 header("Content-type: text/css");
185 mailchimpSF_main_css();
186 exit;
187 case 'authorize':
188 mailchimpSF_authorize();
189 break;
190 case 'authorized':
191 mailchimpSF_authorized();
192 break;
193 }
194 }
195 }
196 add_action('init', 'mailchimpSF_early_request_handler', 0);
197
198 /**
199 * Outputs the front-end CSS. This checks several options, so it
200 * was best to put it in a Request-handled script, as opposed to
201 * a static file.
202 */
203 function mailchimpSF_main_css() {
204 ?>
205 .mc_error_msg {
206 color: red;
207 margin-bottom: 1.0em;
208 }
209 .mc_success_msg {
210 color: green;
211 margin-bottom: 1.0em;
212 }
213 .mc_merge_var{
214 padding:0;
215 margin:0;
216 }
217 <?php
218 // If we're utilizing custom styles
219 if (get_option('mc_custom_style')=='on'){
220 ?>
221 #mc_signup_form {
222 padding:5px;
223 border-width: <?php echo get_option('mc_form_border_width'); ?>px;
224 border-style: <?php echo (get_option('mc_form_border_width')==0) ? 'none' : 'solid'; ?>;
225 border-color: #<?php echo get_option('mc_form_border_color'); ?>;
226 color: #<?php echo get_option('mc_form_text_color'); ?>;
227 background-color: #<?php echo get_option('mc_form_background'); ?>;
228 }
229
230
231 .mc_custom_border_hdr {
232 border-width: <?php echo get_option('mc_header_border_width'); ?>px;
233 border-style: <?php echo (get_option('mc_header_border_width')==0) ? 'none' : 'solid'; ?>;
234 border-color: #<?php echo get_option('mc_header_border_color'); ?>;
235 color: #<?php echo get_option('mc_header_text_color'); ?>;
236 background-color: #<?php echo get_option('mc_header_background'); ?>;
237 <!-- font-size: 1.2em;-->
238 padding:5px 10px;
239 width: 100%;
240 }
241 <?php
242 }
243 ?>
244 #mc_signup_container {}
245 #mc_signup_form {}
246 #mc_signup_form .mc_var_label {}
247 #mc_signup_form .mc_input {}
248 #mc-indicates-required {
249 width:100%;
250 }
251 #mc_display_rewards {}
252 .mc_interests_header {
253 font-weight:bold;
254 }
255 div.mc_interest{
256 width:100%;
257 }
258 #mc_signup_form input.mc_interest {}
259 #mc_signup_form select {}
260 #mc_signup_form label.mc_interest_label {
261 display:inline;
262 }
263 .mc_signup_submit {
264 text-align:center;
265 }
266 ul.mc_list {
267 list-style-type: none;
268 }
269 ul.mc_list li {
270 font-size: 12px;
271 }
272 .ui-datepicker-year {
273 display: none;
274 }
275 #ui-datepicker-div.show .ui-datepicker-year {
276 display: inline;
277 padding-left: 3px
278 }
279 <?php
280 }
281
282
283 /**
284 * Add our settings page to the admin menu
285 *
286 * @return void
287 */
288 function mailchimpSF_add_pages(){
289 // Add settings page for users who can edit plugins
290 add_options_page( __( 'MailChimp Setup', 'mailchimp_i18n' ), __( 'MailChimp Setup', 'mailchimp_i18n' ), MCSF_CAP_THRESHOLD, 'mailchimpSF_options', 'mailchimpSF_setup_page');
291 }
292 add_action('admin_menu', 'mailchimpSF_add_pages');
293
294 function mailchimpSF_request_handler() {
295 if (isset($_POST['mcsf_action'])) {
296 switch ($_POST['mcsf_action']) {
297 case 'logout':
298 // Check capability & Verify nonce
299 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'mc_logout')) {
300 wp_die('Cheatin&rsquo; huh?');
301 }
302
303 // erase auth information
304 delete_option('mc_sopresto_user');
305 delete_option('mc_sopresto_public_key');
306 delete_option('mc_sopresto_secret_key');
307 break;
308 case 'reset_list':
309 // Check capability & Verify nonce
310 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'reset_mailchimp_list')) {
311 wp_die('Cheatin&rsquo; huh?');
312 }
313
314 mailchimpSF_reset_list_settings();
315 break;
316 case 'change_form_settings':
317 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_general_form_settings')) {
318 wp_die('Cheatin&rsquo; huh?');
319 }
320
321 // Update the form settings
322 mailchimpSF_save_general_form_settings();
323 break;
324 case 'mc_submit_signup_form':
325 // Validate nonce
326 if (!wp_verify_nonce($_POST['_mc_submit_signup_form_nonce'], 'mc_submit_signup_form')) {
327 wp_die('Cheatin&rsquo; huh?');
328 }
329
330 // Attempt the signup
331 mailchimpSF_signup_submit();
332
333 // Do a different action for html vs. js
334 switch ($_POST['mc_submit_type']) {
335 case 'html':
336 /* Allow to fall through. The widget will pick up the
337 * global message left over from the signup_submit function */
338 break;
339 case 'js':
340 if (!headers_sent()){ //just in case...
341 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT', true, 200);
342 }
343 echo mailchimpSF_global_msg(); // Don't esc_html this, b/c we've already escaped it
344 exit;
345 }
346 }
347 }
348 }
349 add_action('init', 'mailchimpSF_request_handler');
350
351 function mailchimpSF_auth_nonce_key($salt = null) {
352 if (is_null($salt)) {
353 $salt = mailchimpSF_auth_nonce_salt();
354 }
355 return md5('social_authentication'.AUTH_KEY.$salt);
356 }
357
358 function mailchimpSF_auth_nonce_salt() {
359 return md5(microtime().$_SERVER['SERVER_ADDR']);
360 }
361
362 function mailchimpSF_authorize() {
363 $api = mailchimpSF_get_api(true);
364 $proxy = apply_filters('mailchimp_authorize_url', $api->getApiUrl('authorize'));
365 if (strpos($proxy, 'socialize-this') !== false) {
366 $salt = mailchimpSF_auth_nonce_salt();
367 $id = wp_create_nonce(mailchimpSF_auth_nonce_key($salt));
368 $url = home_url('index.php');
369 $args = array(
370 'mcsf_action' => 'authorized',
371 'salt' => $salt,
372 'user_id' => get_current_user_id(),
373 );
374
375 $proxy = add_query_arg(array(
376 'id' => $id,
377 'response_url' => urlencode(add_query_arg($args, $url))
378 ), $proxy);
379
380 $proxy = apply_filters('mailchimp_proxy_url', $proxy);
381 }
382
383 wp_redirect($proxy);
384 exit;
385 }
386
387 function mailchimpSF_authorized() {
388 // User ID on the request? Must be set before nonce comparison
389 $user_id = stripslashes($_GET['user_id']);
390 if ($user_id !== null) {
391 wp_set_current_user($user_id);
392 }
393
394 $nonce = stripslashes($_POST['id']);
395 $salt = stripslashes($_GET['salt']);
396 if (wp_verify_nonce($nonce, mailchimpSF_auth_nonce_key($salt)) === false) {
397 wp_die('Cheatin&rsquo; huh?');
398 }
399
400 $response = stripslashes_deep($_POST['response']);
401
402 if (!isset($response['keys']) || !isset($response['user'])) {
403 wp_die('Something went wrong, please try again');
404 }
405
406 update_option('mc_sopresto_user', $response['user']);
407 update_option('mc_sopresto_dc', $response['dc']);
408 update_option('mc_sopresto_public_key', $response['keys']['public']);
409 update_option('mc_sopresto_secret_key', $response['keys']['secret']);
410 exit;
411 }
412
413 /**
414 * Upgrades data if it needs to. Checks on admin_init
415 *
416 * @return void
417 */
418 function mailchimpSF_upgrade() {
419 // See if we need an upgrade
420 if (mailchimpSF_needs_upgrade()) {
421 // remove password option if it's set (0.5)
422 // Update interest group data
423 mailchimpSF_do_upgrade();
424 }
425 }
426 add_action('admin_init', 'mailchimpSF_upgrade');
427
428 /**
429 * Creates new Sopresto API object
430 *
431 * @return Sopresto_MailChimp|false
432 */
433 function mailchimpSF_get_api($force = false) {
434 $public_key = get_option('mc_sopresto_public_key');
435 $secret_key = get_option('mc_sopresto_secret_key');
436
437 if ($public_key && $secret_key || $force) {
438 return new Sopresto_MailChimp($public_key, $secret_key, '1.3');
439 }
440
441 return false;
442 }
443
444 /**
445 * Checks to see if we're storing a password, if so, we need
446 * to upgrade to the API key
447 *
448 * @return bool
449 **/
450 function mailchimpSF_needs_upgrade() {
451 $igs = get_option('mc_interest_groups');
452
453 if ($igs !== false // we have an option
454 && (
455 empty($igs) || // it can be an empty array (no interest groups)
456 (is_array($igs) && isset($igs[0]['id'])) // OR it should be a populated array that's well-formed
457 )) {
458 return false; // no need to upgrade
459 }
460 else {
461 return true; // yeah, let's do it
462 }
463 }
464
465 /**
466 * 1.2.4 -> 1.2.5 - Update to support multiple interest groups
467 * MCAPIv1.2 -> MCAPIv1.3 - update interest groups
468 * 2011-02-09 - old password upgrade code deleted as 0.5 is way old
469 */
470 function mailchimpSF_do_upgrade() {
471 # TODO: reload this
472 }
473
474 /**
475 * Deletes all mailchimp options
476 **/
477 function mailchimpSF_delete_setup() {
478 delete_option('mc_user_id');
479 delete_option('mc_sopresto_user');
480 delete_option('mc_sopresto_public_key');
481 delete_option('mc_sopresto_secret_key');
482 delete_option('mc_rewards');
483 delete_option('mc_use_javascript');
484 delete_option('mc_use_datepicker');
485 delete_option('mc_use_unsub_link');
486 delete_option('mc_list_id');
487 delete_option('mc_list_name');
488 $igs = get_option('mc_interest_groups');
489 if (is_array($igs)) {
490 foreach ($igs as $ig) {
491 $opt = 'mc_show_interest_groups_'.$ig['id'];
492 delete_option($opt);
493 }
494 }
495 delete_option('mc_interest_groups');
496 $mv = get_option('mc_merge_vars');
497 if (is_array($mv)){
498 foreach($mv as $var){
499 $opt = 'mc_mv_'.$var['tag'];
500 delete_option($opt);
501 }
502 }
503 delete_option('mc_merge_vars');
504 }
505
506 /**
507 * Resets the list settings, there's only one list
508 * that can have settings at a time, so no list_id
509 * parameter is necessary.
510 **/
511 function mailchimpSF_reset_list_settings() {
512
513 delete_option('mc_list_id');
514 delete_option('mc_list_name');
515 delete_option('mc_merge_vars');
516 delete_option('mc_interest_groups');
517
518 delete_option('mc_use_javascript');
519 delete_option('mc_use_unsub_link');
520 delete_option('mc_use_datepicker');
521
522 delete_option('mc_header_content');
523 delete_option('mc_subheader_content');
524 delete_option('mc_submit_text');
525
526 delete_option('mc_custom_style');
527
528 delete_option('mc_header_border_width');
529 delete_option('mc_header_border_color');
530 delete_option('mc_header_background');
531 delete_option('mc_header_text_color');
532
533 delete_option('mc_form_border_width');
534 delete_option('mc_form_border_color');
535 delete_option('mc_form_background');
536 delete_option('mc_form_text_color');
537
538 $msg = '<p class="success_msg">'.esc_html(__('Successfully Reset your List selection... Now you get to pick again!', 'mailchimp_i18n')).'</p>';
539 mailchimpSF_global_msg($msg);
540 }
541
542 /**
543 * Gets or sets a global message based on parameter passed to it
544 *
545 * @return string/bool depending on get/set
546 **/
547 function mailchimpSF_global_msg($msg = null) {
548 global $mcsf_msgs;
549
550 // Make sure we're formed properly
551 if (!is_array($mcsf_msgs)) {
552 $mcsf_msgs = array();
553 }
554
555 // See if we're getting
556 if (is_null($msg)) {
557 return implode('', $mcsf_msgs);
558 }
559
560 // Must be setting
561 $mcsf_msgs[] = $msg;
562 return true;
563 }
564
565 /**
566 * Sets the default options for the option form
567 **/
568 function mailchimpSF_set_form_defaults($list_name = '') {
569 update_option('mc_header_content',__( 'Sign up for', 'mailchimp_i18n' ).' '.$list_name);
570 update_option('mc_submit_text',__( 'Subscribe', 'mailchimp_i18n' ));
571
572 update_option('mc_use_datepicker', 'on');
573 update_option('mc_custom_style','off');
574 update_option('mc_use_javascript','on');
575 update_option('mc_use_unsub_link','off');
576 update_option('mc_header_border_width','1');
577 update_option('mc_header_border_color','E3E3E3');
578 update_option('mc_header_background','FFFFFF');
579 update_option('mc_header_text_color','CC6600');
580
581 update_option('mc_form_border_width','1');
582 update_option('mc_form_border_color','E0E0E0');
583 update_option('mc_form_background','FFFFFF');
584 update_option('mc_form_text_color','3F3F3f');
585 }
586
587 /**
588 * Saves the General Form settings on the options page
589 *
590 * @return void
591 **/
592 function mailchimpSF_save_general_form_settings() {
593
594 if (MAILCHIMP_DEV_MODE == false) {
595 if (isset($_POST['mc_rewards'])){
596 update_option('mc_rewards', 'on');
597 $msg = '<p class="success_msg">'.__('Monkey Rewards turned On!', 'mailchimp_i18n').'</p>';
598 mailchimpSF_global_msg($msg);
599 } else if (get_option('mc_rewards')!='off') {
600 update_option('mc_rewards', 'off');
601 $msg = '<p class="success_msg">'.__('Monkey Rewards turned Off!', 'mailchimp_i18n').'</p>';
602 mailchimpSF_global_msg($msg);
603 }
604 if (isset($_POST['mc_use_javascript'])){
605 update_option('mc_use_javascript', 'on');
606 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned On!', 'mailchimp_i18n').'</p>';
607 mailchimpSF_global_msg($msg);
608 } else if (get_option('mc_use_javascript')!='off') {
609 update_option('mc_use_javascript', 'off');
610 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned Off!', 'mailchimp_i18n').'</p>';
611 mailchimpSF_global_msg($msg);
612 }
613
614 if (isset($_POST['mc_use_datepicker'])){
615 update_option('mc_use_datepicker', 'on');
616 $msg = '<p class="success_msg">'.__('Datepicker turned On!', 'mailchimp_i18n').'</p>';
617 mailchimpSF_global_msg($msg);
618 } else if (get_option('mc_use_datepicker')!='off') {
619 update_option('mc_use_datepicker', 'off');
620 $msg = '<p class="success_msg">'.__('Datepicker turned Off!', 'mailchimp_i18n').'</p>';
621 mailchimpSF_global_msg($msg);
622 }
623
624 if (isset($_POST['mc_use_unsub_link'])){
625 update_option('mc_use_unsub_link', 'on');
626 $msg = '<p class="success_msg">'.__('Unsubscribe link turned On!', 'mailchimp_i18n').'</p>';
627 mailchimpSF_global_msg($msg);
628 } else if (get_option('mc_use_unsub_link')!='off') {
629 update_option('mc_use_unsub_link', 'off');
630 $msg = '<p class="success_msg">'.__('Unsubscribe link turned Off!', 'mailchimp_i18n').'</p>';
631 mailchimpSF_global_msg($msg);
632 }
633
634 $content = stripslashes($_POST['mc_header_content']);
635 $content = str_replace("\r\n","<br/>", $content);
636 update_option('mc_header_content', $content );
637
638 $content = stripslashes($_POST['mc_subheader_content']);
639 $content = str_replace("\r\n","<br/>", $content);
640 update_option('mc_subheader_content', $content );
641
642
643 $submit_text = stripslashes($_POST['mc_submit_text']);
644 $submit_text = str_replace("\r\n","", $submit_text);
645 update_option('mc_submit_text', $submit_text);
646 }
647
648 // Set Custom Style option
649 update_option('mc_custom_style', isset($_POST['mc_custom_style']) ? 'on' : 'off');
650
651 if (MAILCHIMP_DEV_MODE == false) {
652 //we told them not to put these things we are replacing in, but let's just make sure they are listening...
653 update_option('mc_header_border_width',str_replace('px','',$_POST['mc_header_border_width']) );
654 update_option('mc_header_border_color', str_replace('#','',$_POST['mc_header_border_color']));
655 update_option('mc_header_background',str_replace('#','',$_POST['mc_header_background']));
656 update_option('mc_header_text_color', str_replace('#','',$_POST['mc_header_text_color']));
657 }
658
659 update_option('mc_form_border_width',str_replace('px','',$_POST['mc_form_border_width']) );
660 update_option('mc_form_border_color', str_replace('#','',$_POST['mc_form_border_color']));
661 update_option('mc_form_background',str_replace('#','',$_POST['mc_form_background']));
662 update_option('mc_form_text_color', str_replace('#','',$_POST['mc_form_text_color']));
663
664 if (MAILCHIMP_DEV_MODE == false) {
665 $igs = get_option('mc_interest_groups');
666 if (is_array($igs)) {
667 foreach($igs as $var){
668 $opt = 'mc_show_interest_groups_'.$var['id'];
669 if (isset($_POST[$opt])){
670 update_option($opt,'on');
671 } else {
672 update_option($opt,'off');
673 }
674 }
675 }
676
677 $mv = get_option('mc_merge_vars');
678 if (is_array($mv)) {
679 foreach($mv as $var){
680 $opt = 'mc_mv_'.$var['tag'];
681 if (isset($_POST[$opt]) || $var['req']=='Y'){
682 update_option($opt,'on');
683 } else {
684 update_option($opt,'off');
685 }
686 }
687 }
688 }
689 $msg = '<p class="success_msg">'.esc_html(__('Successfully Updated your List Subscribe Form Settings!', 'mailchimp_i18n')).'</p>';
690 mailchimpSF_global_msg($msg);
691 }
692
693 /**
694 * Sees if the user changed the list, and updates options accordingly
695 **/
696 function mailchimpSF_change_list_if_necessary() {
697 // Simple permission check before going through all this
698 if (!current_user_can(MCSF_CAP_THRESHOLD)) { return; }
699
700 $api = mailchimpSF_get_api();
701 if (!$api) { return; }
702
703 //we *could* support paging, but few users have that many lists (and shouldn't)
704 $lists = $api->lists(array(),0,100);
705 $lists = $lists['data'];
706
707 if (is_array($lists) && !empty($lists) && isset($_POST['mc_list_id'])) {
708
709 /* If our incoming list ID (the one chosen in the select dropdown)
710 is in our array of lists, the set it to be the active list */
711 foreach($lists as $key => $list) {
712 if ($list['id'] == $_POST['mc_list_id']) {
713 $list_id = $_POST['mc_list_id'];
714 $list_name = $list['name'];
715 $list_key = $key;
716 }
717 }
718
719 $orig_list = get_option('mc_list_id');
720 if ($list_id != '') {
721 update_option('mc_list_id', $list_id);
722 update_option('mc_list_name', $list_name);
723 update_option('mc_email_type_option', $lists[$list_key]['email_type_option']);
724
725
726 // See if the user changed the list
727 if ($orig_list != $list_id){
728 // The user changed the list, Reset the Form Defaults
729 mailchimpSF_set_form_defaults($list_name);
730 }
731 // email_type_option
732
733 // Grab the merge vars and interest groups
734 $mv = $api->listMergeVars($list_id);
735 $igs = $api->listInterestGroupings($list_id);
736
737 update_option('mc_merge_vars', $mv);
738 foreach($mv as $var){
739 $opt = 'mc_mv_'.$var['tag'];
740 //turn them all on by default
741 if ($orig_list != $list_id) {
742 update_option($opt, 'on' );
743 }
744 }
745 update_option('mc_interest_groups', $igs);
746 if (is_array($igs)) {
747 foreach ($igs as $var){
748 $opt = 'mc_show_interest_groups_'.$var['id'];
749 //turn them all on by default
750 if ($orig_list != $list_id) {
751 update_option($opt, 'on' );
752 }
753 }
754 }
755 $igs_text = ' ';
756 if (is_array($igs)) {
757 $igs_text .= sprintf(__('and %s Sets of Interest Groups', 'mailchimp_i18n'), count($igs));
758 }
759
760 $msg = '<p class="success_msg">'.
761 sprintf(
762 __('<b>Success!</b> Loaded and saved the info for %d Merge Variables', 'mailchimp_i18n').$igs_text,
763 count($mv)
764 ).' '.
765 __('from your list').' "'.$list_name.'"<br/><br/>'.
766 __('Now you should either Turn On the MailChimp Widget or change your options below, then turn it on.', 'mailchimp_i18n').'</p>';
767 mailchimpSF_global_msg($msg);
768 }
769 }
770 }
771
772
773 /**
774 * Outputs the Settings/Options page
775 */
776 function mailchimpSF_setup_page() {
777 ?>
778 <div class="wrap">
779
780 <div class="mailchimp-header">
781 <h2><?php esc_html_e('MailChimp List Setup', 'mailchimp_i18n');?> </h2>
782 </div>
783 <?php
784
785 // Display Developer mode active.
786 if (MAILCHIMP_DEV_MODE == true) { ?>
787 <p class="error_msg">Developer mode active.</p>
788 <?php }
789
790 $user = get_option('mc_sopresto_user');
791
792 // If we have an API Key, see if we need to change the lists and its options
793 mailchimpSF_change_list_if_necessary();
794
795 // Display our success/error message(s) if have them
796 if (mailchimpSF_global_msg() != ''){
797 // Message has already been html escaped, so we don't want to 2x escape it here
798 ?>
799 <div id="mc_message" class=""><?php echo mailchimpSF_global_msg(); ?></div>
800 <?php
801 }
802
803 // If we don't have an API Key, do a login form
804 if (!$user && MAILCHIMP_DEV_MODE == false) {
805 ?>
806 <div>
807 <h3 class="mc-h2"><?php esc_html_e('Log In', 'mailchimp_i18n');?></h3>
808 <p class="mc-p" style="width: 40%;line-height: 21px;"><?php esc_html_e('To start using the MailChimp plugin, we first need to connect your MailChimp account. Click login below to connect.', 'mailchimp_i18n'); ?></p>
809 <p class="mc-a">
810 <?php
811 echo sprintf(
812 '%1$s <a href="http://www.mailchimp.com/signup/" target="_blank">%2$s</a>',
813 esc_html(__("Don't have a MailChimp account?", 'mailchimp_i18n')),
814 esc_html(__('Try one for Free!', 'mailchimp_i18n'))
815 );
816 ?>
817 </p>
818
819 <div style="width: 900px;">
820 <table class="widefat mc-widefat mc-api">
821 <tr valign="top">
822 <th scope="row" class="mailchimp-connect"><?php esc_html_e('Connect to MailChimp', 'mailchimp_i18n'); ?></th>
823 <td>
824 <a href="<?php echo add_query_arg(array("mcsf_action" => "authorize"), home_url('index.php')) ?>" class="mailchimp-login">Connect</a>
825 </td>
826 </tr>
827 </table>
828 </div>
829 </div>
830
831 <br/>
832 <?php
833 if ($user && $user['username'] != '') {
834 ?>
835 <!--<div class="notes_msg">
836 <strong><?php esc_html_e('Notes', 'mailchimp_i18n'); ?>:</strong>
837 <ul>
838 <li><?php esc_html_e('Changing your settings at MailChimp.com may cause this to stop working.', 'mailchimp_i18n'); ?></li>
839 <li><?php esc_html_e('If you change your login to a different account, the info you have setup below will be erased.', 'mailchimp_i18n'); ?></li>
840 <li><?php esc_html_e('If any of that happens, no biggie - just reconfigure your login and the items below...', 'mailchimp_i18n'); ?></li>
841 </ul>
842 </div>-->
843 <?php
844 }
845 } // End of login form
846
847 // Start logout form
848 elseif (MAILCHIMP_DEV_MODE == false) {
849 ?>
850 <table style="min-width:400px;" class="mc-user" cellspacing="0">
851 <tr>
852 <td><h3><?php esc_html_e('Logged in as', 'mailchimp_i18n');?>: <?php echo esc_html($user['username']); ?></h3>
853 </td>
854 <td>
855 <form method="post" action="options-general.php?page=mailchimpSF_options">
856 <input type="hidden" name="mcsf_action" value="logout"/>
857 <input type="submit" name="Submit" value="<?php esc_attr_e('Logout', 'mailchimp_i18n');?>" class="button" />
858 <?php wp_nonce_field('mc_logout', '_mcsf_nonce_action'); ?>
859 </form>
860 </td>
861 </tr>
862 </table>
863 <?php
864 } // End Logout form
865
866 //Just get out if nothing else matters...
867 $api = mailchimpSF_get_api();
868 if (!$api && MAILCHIMP_DEV_MODE == false) { return; }
869
870 if ($api){
871 ?>
872 <h3 class="mc-h2"><?php esc_html_e('Your Lists', 'mailchimp_i18n'); ?></h3>
873
874 <div>
875
876 <p class="mc-p"><?php esc_html_e('Please select the List you wish to create a Signup Form for.', 'mailchimp_i18n'); ?></p>
877 <p class="mc-list-note"><strong><?php esc_html_e('Note:', 'mailchimp_i18n'); ?></strong> <?php esc_html_e('Updating your list will not cause settings below to be lost. Changing to a new list will.', 'mailchimp_i18n'); ?></p>
878
879 <form method="post" action="options-general.php?page=mailchimpSF_options">
880 <?php
881 //we *could* support paging, but few users have that many lists (and shouldn't)
882 $lists = $api->lists(array(),0,100);
883 $lists = $lists['data'];
884
885 if (count($lists) == 0) {
886 ?>
887 <span class='error_msg'>
888 <?php
889 echo sprintf(
890 esc_html(__("Uh-oh, you don't have any lists defined! Please visit %s, login, and setup a list before using this tool!", 'mailchimp_i18n')),
891 "<a href='http://www.mailchimp.com/'>MailChimp</a>"
892 );
893 ?>
894 </span>
895 <?php
896 }
897 else {
898 ?>
899 <table style="min-width:400px" class="mc-list-select" cellspacing="0">
900 <tr class="mc-list-row">
901 <td>
902 <select name="mc_list_id" style="min-width:200px;">
903 <option value=""> &mdash; <?php esc_html_e('Select A List','mailchimp_i18n'); ?> &mdash; </option>
904 <?php
905 foreach ($lists as $list) {
906 $option = get_option('mc_list_id');
907 ?>
908 <option value="<?php echo esc_attr($list['id']); ?>"<?php selected($list['id'], $option); ?>><?php echo esc_html($list['name']); ?></option>
909 <?php
910 }
911 ?>
912 </select>
913 </td>
914 <td>
915 <input type="hidden" name="mcsf_action" value="update_mc_list_id" />
916 <input type="submit" name="Submit" value="<?php esc_attr_e('Update List', 'mailchimp_i18n'); ?>" class="button" />
917 </td>
918 </tr>
919 </table>
920 <?php
921 } //end select list
922 ?>
923 </form>
924 </div>
925
926 <br/>
927
928 <?php
929 }
930 elseif (MAILCHIMP_DEV_MODE == false) {
931 //display the selected list...
932 ?>
933
934 <p class="submit">
935 <form method="post" action="options-general.php?page=mailchimpSF_options">
936 <input type="hidden" name="mcsf_action" value="reset_list" />
937 <input type="submit" name="reset_list" value="<?php esc_attr_e('Reset List Options and Select again', 'mailchimp_i18n'); ?>" class="button" />
938 <?php wp_nonce_field('reset_mailchimp_list', '_mcsf_nonce_action'); ?>
939 </form>
940 </p>
941 <h3><?php esc_html_e('Subscribe Form Widget Settings for this List', 'mailchimp_i18n'); ?>:</h3>
942 <h4><?php esc_html_e('Selected MailChimp List', 'mailchimp_i18n'); ?>: <?php echo esc_html(get_option('mc_list_name')); ?></h4>
943 <?php
944 }
945
946 //Just get out if nothing else matters...
947 if (get_option('mc_list_id') == '' && MAILCHIMP_DEV_MODE == false) return;
948
949
950 // The main Settings form
951 ?>
952
953 <div>
954 <form method="post" action="options-general.php?page=mailchimpSF_options">
955 <div style="width:900px;">
956 <input type="hidden" name="mcsf_action" value="change_form_settings">
957 <?php wp_nonce_field('update_general_form_settings', '_mcsf_nonce_action'); ?>
958
959 <?php if (MAILCHIMP_DEV_MODE == false) { ?>
960 <!--<input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button" />-->
961 <table class="widefat mc-widefat mc-label-options">
962 <tr><th colspan="2">Content Options</th></tr>
963 <tr valign="top">
964 <th scope="row"><?php esc_html_e('Header', 'mailchimp_i18n'); ?></th>
965 <td>
966 <textarea name="mc_header_content" rows="2" cols="70"><?php echo esc_html(get_option('mc_header_content')); ?></textarea><br/>
967 <?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?>
968 </td>
969 </tr>
970
971 <tr valign="top">
972 <th scope="row"><?php esc_html_e('Sub-header', 'mailchimp_i18n'); ?></th>
973 <td>
974 <textarea name="mc_subheader_content" rows="2" cols="70"><?php echo esc_html(get_option('mc_subheader_content')); ?></textarea><br/>
975 <?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?>.<br/>
976 <?php esc_html_e('This will be displayed under the heading and above the form.', 'mailchimp_i18n'); ?>
977 </td>
978 </tr>
979
980 <tr valign="top" class="last-row">
981 <th scope="row"><?php esc_html_e('Submit Button', 'mailchimp_i18n'); ?></th>
982 <td>
983 <input type="text" name="mc_submit_text" size="70" value="<?php echo esc_attr(get_option('mc_submit_text')); ?>"/>
984 </td>
985 </tr>
986 </table>
987
988 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
989 <?php } ?>
990
991 <table class="widefat mc-widefat mc-custom-styling">
992 <tr><th colspan="2">Custom Styling</th></tr>
993 <tr class="mc-turned-on"><th><label for="mc_custom_style"><?php esc_html_e('Enabled?', 'mailchimp_i18n'); ?></label></th><td><span class="mc-pre-input"></span><input type="checkbox" name="mc_custom_style" id="mc_custom_style"<?php checked(get_option('mc_custom_style'), 'on'); ?> /></td></tr>
994
995 <tr class="mc-internal-heading"><th colspan="2"><?php esc_html_e('Form Settings', 'mailchimp_i18n'); ?></th></tr>
996 <tr><th><?php esc_html_e('Border Width', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input"></span><input type="text" name="mc_form_border_width" size="3" maxlength="3" value="<?php echo esc_attr(get_option('mc_form_border_width')); ?>"/>
997 <em>px <?php esc_html_e('Set to 0 for no border, do not enter', 'mailchimp_i18n'); ?> <strong>px</strong>!</em>
998 </td></tr>
999 <tr><th><?php esc_html_e('Border Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_border_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_border_color')); ?>"/>
1000 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1001 </td></tr>
1002 <tr><th><?php esc_html_e('Text Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_text_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_text_color')); ?>"/>
1003 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1004 </td></tr>
1005 <tr class="last-row"><th><?php esc_html_e('Background Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_background" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_background')); ?>"/>
1006 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1007 </td></tr>
1008 </table>
1009
1010 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1011
1012 <?php if (MAILCHIMP_DEV_MODE == false) { ?>
1013 <table class="widefat mc-widefat">
1014 <tr><th colspan="2">List Options</th></tr>
1015 <tr valign="top">
1016 <th scope="row"><?php esc_html_e('Monkey Rewards', 'mailchimp_i18n'); ?>?</th>
1017 <td><input name="mc_rewards" type="checkbox"<?php if (get_option('mc_rewards')=='on' || get_option('mc_rewards')=='' ) { echo ' checked="checked"'; } ?> id="mc_rewards" class="code" />
1018 <em><label for="mc_rewards"><?php esc_html_e('Turning this on will place a "powered by MailChimp" link in your form that will earn you credits with us. It is optional and can be turned on or off at any time.', 'mailchimp_i18n'); ?></label></em>
1019 </td>
1020 </tr>
1021
1022 <tr valign="top">
1023 <th scope="row"><?php esc_html_e('Use Javascript Support?', 'mailchimp_i18n'); ?></th>
1024 <td><input name="mc_use_javascript" type="checkbox" <?php checked(get_option('mc_use_javascript'), 'on'); ?> id="mc_use_javascript" class="code" />
1025 <em><label for="mc_use_javascript"><?php esc_html_e('Turning this on will use fancy javascript submission and should degrade gracefully for users not using javascript. It is optional and can be turned on or off at any time.', 'mailchimp_i18n'); ?></label></em>
1026 </td>
1027 </tr>
1028
1029 <tr valign="top">
1030 <th scope="row"><?php esc_html_e('Use Javascript Datepicker?', 'mailchimp_i18n'); ?></th>
1031 <td><input name="mc_use_datepicker" type="checkbox" <?php checked(get_option('mc_use_datepicker'), 'on'); ?> id="mc_use_datepicker" class="code" />
1032 <em><label for="mc_use_datepicker"><?php esc_html_e('Turning this on will use the jQuery UI Datepicker for dates.', 'mailchimp_i18n'); ?></label></em>
1033 </td>
1034 </tr>
1035 <tr valign="top" class="last-row">
1036 <th scope="row"><?php esc_html_e('Include Unsubscribe link?', 'mailchimp_i18n'); ?></th>
1037 <td><input name="mc_use_unsub_link" type="checkbox"<?php checked(get_option('mc_use_unsub_link'), 'on'); ?> id="mc_use_unsub_link" class="code" />
1038 <em><label for="mc_use_unsub_link"><?php esc_html_e('Turning this on will add a link to your host unsubscribe form', 'mailchimp_i18n'); ?></label></em>
1039 </td>
1040 </tr>
1041 </table>
1042
1043 <?php } ?>
1044
1045 </div>
1046
1047 <?php
1048 // Merge Variables Table
1049 if (MAILCHIMP_DEV_MODE == false) { ?>
1050 <div style="width:900px;">
1051
1052 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1053
1054 <table class='widefat mc-widefat'>
1055 <tr>
1056 <th colspan="4">
1057 <?php esc_html_e('Merge Variables Included', 'mailchimp_i18n'); ?>
1058
1059 <?php
1060 $mv = get_option('mc_merge_vars');
1061
1062 if (count($mv) == 0 || !is_array($mv)){
1063 ?>
1064 <em><?php esc_html_e('No Merge Variables found.', 'mailchimp_i18n'); ?></em>
1065 <?php
1066 } else {
1067 ?>
1068 </th>
1069 </tr>
1070 <tr valign="top">
1071 <th><?php esc_html_e('Name', 'mailchimp_i18n');?></th>
1072 <th><?php esc_html_e('Tag', 'mailchimp_i18n');?></th>
1073 <th><?php esc_html_e('Required?', 'mailchimp_i18n');?></th>
1074 <th><?php esc_html_e('Include?', 'mailchimp_i18n');?></th>
1075 </tr>
1076 <?php
1077 foreach($mv as $var){
1078 ?>
1079 <tr valign="top">
1080 <td><?php echo esc_html($var['name']); ?></td>
1081 <td><?php echo esc_html($var['tag']); ?></td>
1082 <td><?php echo esc_html(($var['req'] == 1) ? 'Y' : 'N'); ?></td>
1083 <td>
1084 <?php
1085 if (!$var['req']){
1086 $opt = 'mc_mv_'.$var['tag'];
1087 ?>
1088 <input name="<?php echo esc_attr($opt); ?>" type="checkbox" id="<?php echo esc_attr($opt); ?>" class="code"<?php checked(get_option($opt), 'on'); ?> />
1089 <?php
1090 } else {
1091 ?>
1092 &nbsp;&mdash;&nbsp;
1093 <?php
1094 }
1095 ?>
1096 </td>
1097 </tr>
1098 <?php
1099 }
1100 ?>
1101 </table>
1102 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1103 </div>
1104 <?php
1105 }
1106 ?>
1107
1108
1109
1110 <?php
1111 // Interest Groups Table
1112 $igs = get_option('mc_interest_groups');
1113 if (is_array($igs) && !isset($igs['id'])) { ?>
1114 <h3 class="mc-h3"><?php esc_html_e('Group Settings', 'mailchimp_i18n'); ?></h3> <?php
1115 // Determines whether or not to continue processing. Only false if there was an error.
1116 $continue = true;
1117 foreach ($igs as $ig) {
1118 if ($continue) {
1119 if (!is_array($ig) || empty($ig) || $ig == 'N' ) {
1120 ?>
1121 <em><?php esc_html_e('No Interest Groups Setup for this List', 'mailchimp_i18n'); ?></em>
1122 <?php
1123 $continue = false;
1124 }
1125 else {
1126 ?>
1127 <table class='mc-widefat mc-blue' width="450px" cellspacing="0">
1128 <tr valign="top">
1129 <th colspan="2"><?php echo esc_html($ig['name']); ?></th>
1130 </tr>
1131 <tr valign="top">
1132 <th>
1133 <label for="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>"><?php esc_html_e('Show?', 'mailchimp_i18n'); ?></label>
1134 </th>
1135 <th>
1136 <input name="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>" id="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>" type="checkbox" class="code"<?php checked('on', get_option('mc_show_interest_groups_'.$ig['id'])); ?> />
1137 </th>
1138 </tr>
1139 <tr valign="top">
1140 <th><?php esc_html_e('Input Type', 'mailchimp_i18n'); ?></th>
1141 <td><?php echo esc_html($ig['form_field']); ?></td>
1142 </tr>
1143 <tr valign="top" class="last-row">
1144 <th><?php esc_html_e('Options', 'mailchimp_i18n'); ?></th>
1145 <td>
1146 <ul>
1147 <?php
1148 foreach($ig['groups'] as $interest){
1149 ?>
1150 <li><?php echo esc_html($interest['name']); ?></li>
1151 <?php
1152 }
1153 ?>
1154 </ul>
1155 </td>
1156 </tr>
1157 </table>
1158 <?php
1159 }
1160 }
1161 }
1162 }
1163 } // end dev mode check
1164 ?>
1165 <div style="width: 900px; margin-top: 35px;">
1166 <table class="widefat mc-widefat mc-yellow">
1167 <tr><th colspan="2">CSS Cheat Sheet</th></tr>
1168 <tr valign="top">
1169 <th scope="row">.widget_mailchimpsf_widget </th>
1170 <td>This targets the entire widget container.</td>
1171 </tr>
1172 <tr valign="top">
1173 <th scope="row">.widget-title</th>
1174 <td>This styles the title of your MailChimp widget. <i>Modifying this class will affect your other widget titles.</i></td>
1175 </tr>
1176 <tr valign="top">
1177 <th scope="row">#mc_signup</th>
1178 <td>This targets the entirity of the widget beneath the widget title.</td>
1179 </tr>
1180 <tr valign="top">
1181 <th scope="row">#mc_subheader</th>
1182 <td>This styles the subheader text.</td>
1183 </tr>
1184 <tr valign="top">
1185 <th scope="row">.mc_form_inside</th>
1186 <td>The guts and main container for the all of the form elements (the entirety of the widget minus the header and the sub header).</td>
1187 </tr>
1188 <tr valign="top">
1189 <th scope="row">.mc_header</th>
1190 <td>This targets the label above the input fields.</td>
1191 </tr>
1192 <tr valign="top">
1193 <th scope="row">.mc_input</th>
1194 <td>This attaches to the input fields.</td>
1195 </tr>
1196 <tr valign="top">
1197 <th scope="row">.mc_header_address</th>
1198 <td>This is the label above an address group.</td>
1199 </tr>
1200 <tr valign="top">
1201 <th scope="row">.mc_radio_label</th>
1202 <td>These are the labels associated with radio buttons.</td>
1203 </tr>
1204 <tr valign="top">
1205 <th scope="row">#mc-indicates-required</th>
1206 <td>This targets the “Indicates Required Field” text.</td>
1207 </tr>
1208 <tr valign="top">
1209 <th scope="row">#mc_signup_submit</th>
1210 <td>Use this to style the submit button.</td>
1211 </tr>
1212 </table>
1213 </div>
1214
1215 </form>
1216 <?php
1217 }//mailchimpSF_setup_page()
1218
1219
1220 function mailchimpSF_register_widgets() {
1221 if (mailchimpSF_get_api() || MAILCHIMP_DEV_MODE == true) {
1222 register_widget('mailchimpSF_Widget');
1223 }
1224 }
1225 add_action('widgets_init', 'mailchimpSF_register_widgets');
1226
1227 function mailchimpSF_shortcode($atts){
1228 ob_start();
1229 mailchimpSF_signup_form();
1230 return ob_get_clean();
1231 }
1232 add_shortcode('mailchimpsf_form', 'mailchimpSF_shortcode');
1233
1234 /**
1235 * Attempts to signup a user, per the $_POST args.
1236 *
1237 * This sets a global message, that is then used in the widget
1238 * output to retrieve and display that message.
1239 *
1240 * @return bool
1241 */
1242 function mailchimpSF_signup_submit() {
1243 $mv = get_option('mc_merge_vars', array());
1244 $mv_tag_keys = array();
1245
1246 $igs = get_option('mc_interest_groups', array());
1247
1248 $success = true;
1249 $listId = get_option('mc_list_id');
1250 $email = isset($_POST['mc_mv_EMAIL']) ? strip_tags(stripslashes($_POST['mc_mv_EMAIL'])) : '';
1251 $merge = $errs = $html_errs = array(); // Set up some vars
1252
1253 // Loop through our Merge Vars, and if they're empty, but required, then print an error, and mark as failed
1254 foreach($mv as $var) {
1255 $opt = 'mc_mv_'.$var['tag'];
1256
1257 $opt_val = isset($_POST[$opt]) ? $_POST[$opt] : '';
1258
1259 if (is_array($opt_val) && isset($opt_val['area'])) {
1260 // This filters out all 'falsey' elements
1261 $opt_val = array_filter($opt_val);
1262
1263 // If they weren't all empty
1264 if ($opt_val) {
1265 $opt_val = implode('-', $opt_val);
1266 if (strlen($opt_val) < 12) {
1267 $opt_val = '';
1268 }
1269 }
1270 else {
1271 $opt_val = '';
1272 }
1273 }
1274 else if (is_array($opt_val) && $var['field_type'] == 'address') {
1275 if ($var['req'] == 'Y') {
1276 if (empty($opt_val['addr1']) || empty($opt_val['city'])) {
1277 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name']));
1278 $success = false;
1279 }
1280 }
1281 $merge[$var['tag']] = $opt_val;
1282 continue;
1283 }
1284 else if (is_array($opt_val)) {
1285 $opt_val = implode($opt_val);
1286 }
1287
1288 if ($var['req'] == 'Y' && trim($opt_val) == '') {
1289 $success = false;
1290 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name']));
1291 }
1292 else {
1293 if ($var['tag'] != 'EMAIL') {
1294 $merge[$var['tag']] = $opt_val;
1295 }
1296 }
1297
1298 // We also want to create an array where the keys are the tags for easier validation later
1299 $mv_tag_keys[$var['tag']] = $var;
1300
1301 }
1302
1303 // Head back to the beginning of the merge vars array
1304 reset($mv);
1305
1306 // Ensure we have an array
1307 $igs = !is_array($igs) ? array() : $igs;
1308 foreach ($igs as $ig) {
1309 $groups = '';
1310 if (get_option('mc_show_interest_groups_'.$ig['id']) == 'on') {
1311 $groupings = array();
1312 switch ($ig['form_field']) {
1313 case 'select':
1314 case 'dropdown':
1315 case 'radio':
1316 if (isset($_POST['group'][$ig['id']])) {
1317 $groupings = array(
1318 'id' => $ig['id'],
1319 'groups' => str_replace(',', '\,', stripslashes($_POST['group'][$ig['id']])),
1320 );
1321 }
1322 break;
1323 case 'checkboxes':
1324 case 'checkbox':
1325 if (isset($_POST['group'][$ig['id']])) {
1326 foreach ($_POST['group'][$ig['id']] as $i => $value) {
1327 // Escape
1328 $groups .= str_replace(',', '\,', stripslashes($value)).',';
1329 }
1330 $groupings = array(
1331 'id' => $ig['id'],
1332 'groups' => $groups,
1333 );
1334 }
1335 break;
1336 default:
1337 // Nothing
1338 break;
1339 }
1340 if (!isset($merge['GROUPINGS']) || !is_array($merge['GROUPINGS'])) {
1341 $merge['GROUPINGS'] = array();
1342 }
1343 if (!empty($groupings)) {
1344 $merge['GROUPINGS'][] = $groupings;
1345 }
1346 }
1347 }
1348
1349 // If we're good
1350 if ($success) {
1351 // Clear out empty merge vars
1352 foreach ($merge as $k => $v) {
1353 if (is_array($v) && empty($v)) {
1354 unset($merge[$k]);
1355 }
1356 else if (!is_array($v) && trim($v) === '') {
1357 unset($merge[$k]);
1358 }
1359 }
1360
1361 // If we have an empty $merge, then assign empty string.
1362 if (count($merge) == 0 || $merge == '') {
1363 $merge = '';
1364 }
1365
1366 if (isset($_POST['email_type']) && in_array($_POST['email_type'], array('text', 'html', 'mobile'))) {
1367 $email_type = $_POST['email_type'];
1368 }
1369 else {
1370 $email_type = 'html';
1371 }
1372
1373 // Custom validation based on type
1374 if (is_array($merge) && !empty($merge)) {
1375 foreach ($merge as $merge_key => $merge_value) {
1376 if ($merge_key !== 'GROUPINGS') {
1377 switch ($mv_tag_keys[$merge_key]['field_type']) {
1378 case 'phone':
1379 if ($mv_tag_keys[$merge_key]['phoneformat'] == 'US') {
1380 $phone = $merge_value;
1381 if (!empty($phone)) {
1382 if (!preg_match('/[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,4}/', $phone)) {
1383 $errs[] = sprintf(__("%s must consist of only numbers", 'mailchimp_i18n'), esc_html($mv_tag_keys[$merge_key]['name']));
1384 $success = false;
1385 }
1386 }
1387 }
1388 break;
1389
1390 default:
1391 break;
1392 }
1393 }
1394 }
1395 }
1396 if ($success) {
1397 $api = mailchimpSF_get_api();
1398 if (!$api) { return; }
1399
1400 $retval = $api->listSubscribe( $listId, $email, $merge, $email_type);
1401 if (!$retval) {
1402 switch($api->errorCode) {
1403 case '105' :
1404 $errs[] = __("Please try again later", 'mailchimp_i18n').'.';
1405 break;
1406 case '214' :
1407 $msg = __("That email address is already subscribed to the list", 'mailchimp_i18n') . '.';
1408
1409 $account = $api->getAccountDetails(array("modules", "orders", "rewards-credits", "rewards-inspections", "rewards-referrals", "rewards-applied"));
1410 if (!$api->errorCode) {
1411 $dc = get_option('mc_sopresto_dc');
1412 $uid = $account['user_id'];
1413 $username = preg_replace('/\s+/', '-', $account['username']);
1414 $eid = base64_encode($email);
1415 $msg .= ' ' . sprintf(__('<a href="%s">Click here to update your profile.</a>', 'mailchimp_i18n'), "http://$username.$dc.list-manage.com/subscribe/send-email?u=$uid&id=$listId&e=$eid");
1416 }
1417
1418 $errs[] = $msg;
1419 $html_errs[] = count($errs)-1;
1420 break;
1421 case '250' :
1422 list($field, $rest) = explode(' ', $api->errorMessage, 2);
1423 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($mv_tag_keys[$field]['name']));
1424 break;
1425 case '254' :
1426 list($i1, $i2, $i3, $field, $rest) = explode(' ',$api->errorMessage,5);
1427 $errs[] = sprintf(__("%s has invalid content.", 'mailchimp_i18n'), esc_html($mv_tag_keys[$field]['name']));
1428 break;
1429 case '270' :
1430 $errs[] = __("An invalid Interest Group was selected", 'mailchimp_i18n').'.';
1431 break;
1432 case '502' :
1433 $errs[] = __("That email address is invalid", 'mailchimp_i18n').'.';
1434 break;
1435 default:
1436 $errs[] = $api->errorCode.":".$api->errorMessage;
1437 break;
1438 }
1439 $success = false;
1440 }
1441 }
1442 }
1443
1444 // If we have errors, then show them
1445 if (count($errs) > 0) {
1446 $msg = '<span class="mc_error_msg">';
1447 foreach($errs as $error_index => $error){
1448 if (!in_array($error_index, $html_errs)) {
1449 $error = esc_html($error);
1450 }
1451 $msg .= '&raquo; '.$error.'<br />';
1452 }
1453 $msg .= '</span>';
1454 }
1455 else {
1456 $msg = "<strong class='mc_success_msg'>".esc_html(__("Success, you've been signed up! Please look for our confirmation email!", 'mailchimp_i18n'))."</strong>";
1457 }
1458
1459 // Set our global message
1460 mailchimpSF_global_msg($msg);
1461
1462 return $success;
1463 }
1464
1465
1466
1467 /**********************
1468 * Utility Functions *
1469 **********************/
1470 /**
1471 * Utility function to allow placement of plugin in plugins, mu-plugins, child or parent theme's plugins folders
1472 *
1473 * This function must be ran _very early_ in the load process, as it sets up important constants for the rest of the plugin
1474 */
1475 function mailchimpSF_where_am_i() {
1476 $locations = array(
1477 'plugins' => array(
1478 'dir' => WP_PLUGIN_DIR,
1479 'url' => plugins_url()
1480 ),
1481 'mu_plugins' => array(
1482 'dir' => WPMU_PLUGIN_DIR,
1483 'url' => plugins_url(),
1484 ),
1485 'template' => array(
1486 'dir' => trailingslashit(get_template_directory()).'plugins/',
1487 'url' => trailingslashit(get_template_directory_uri()).'plugins/',
1488 ),
1489 'stylesheet' => array(
1490 'dir' => trailingslashit(get_stylesheet_directory()).'plugins/',
1491 'url' => trailingslashit(get_stylesheet_directory_uri()).'plugins/',
1492 ),
1493 );
1494
1495 // Set defaults
1496 $mscf_dirbase = trailingslashit(basename(dirname(__FILE__))); // Typically wp-mailchimp/ or mailchimp/
1497 $mscf_dir = trailingslashit(WP_PLUGIN_DIR).$mscf_dirbase;
1498 $mscf_url = trailingslashit(WP_PLUGIN_URL).$mscf_dirbase;
1499
1500 // Try our hands at finding the real location
1501 foreach ($locations as $key => $loc) {
1502 $dir = trailingslashit($loc['dir']).$mscf_dirbase;
1503 $url = trailingslashit($loc['url']).$mscf_dirbase;
1504 if (is_file($dir.basename(__FILE__))) {
1505 $mscf_dir = $dir;
1506 $mscf_url = $url;
1507 break;
1508 }
1509 }
1510
1511 // Define our complete filesystem path
1512 define('MCSF_DIR', $mscf_dir);
1513
1514 /* Lang location needs to be relative *from* ABSPATH,
1515 so strip it out of our language dir location */
1516 define('MCSF_LANG_DIR', trailingslashit(MCSF_DIR).'po/');
1517
1518 // Define our complete URL to the plugin folder
1519 define('MCSF_URL', $mscf_url);
1520 }
1521
1522
1523 ?>
1524