function guilro_petitions_sendmail() { // set WPML language global $sitepress; $lang = isset($_POST['lang']) ? $_POST['lang'] : ''; if (isset($sitepress)) { $sitepress->switch_lang($lang, true); } include_once 'class.signature.php'; include_once 'class.petition.php'; include_once 'class.mail.php'; include_once 'class.wpml.php'; $the_signature = new guilro_petitions_Signature(); $the_petition = new guilro_petitions_Petition(); $the_settings = new guilro_petitions_Settings(); $the_settings->retrieve(); $wpml = new guilro_petitions_WPML(); $options = get_object_vars($the_settings); // clean posted signature fields $the_signature->poppulate_from_post(); // get petition data $the_petition->retrieve($the_signature->petitions_id); $wpml->translate_petition($the_petition); $options = $wpml->translate_options($options); // check if submitted email address is already in use for this petition if ($the_signature->has_unique_email($the_signature->email, $the_signature->petitions_id)) { // handle custom petition messages $original_message = str_replace("\r", '', $the_petition->petition_message); if ($the_petition->is_editable && $the_signature->submitted_message != $original_message) { $the_signature->custom_message = trim($the_signature->submitted_message); } // does petition require email confirmation? if ($the_petition->requires_confirmation) { $the_signature->is_confirmed = 0; $the_signature->create_confirmation_code(); guilro_petitions_Mail::send_confirmation($the_petition, $the_signature, $options); } else { if ($the_petition->sends_email) { guilro_petitions_Mail::send_petition($the_petition, $the_signature); } } // add signature to database $the_signature->create($the_signature->petitions_id); // display success message $success_message = $options['success_message']; $success_message = str_replace('%first_name%', $the_signature->first_name, $success_message); $success_message = str_replace('%last_name%', $the_signature->last_name, $success_message); $json_response = array('status' => 'success', 'message' => $success_message); $json_response = json_encode($json_response); echo $json_response; } else { $json_response = array('status' => 'error', 'message' => $options['already_signed_message']); $json_response = json_encode($json_response); echo $json_response; } // end AJAX processing die; }
function guilro_petitions_signatures_page() { // check security: ensure user has authority if (!current_user_can('publish_posts')) { wp_die(__('Insufficient privileges: You need to be an editor to do that.', 'guilro_petitions')); } include_once 'class.speakout.php'; include_once 'class.signature.php'; include_once 'class.petition.php'; $the_signatures = new guilro_petitions_Signature(); $the_petitions = new guilro_petitions_Petition(); global $guilro_petitions_settings; $options = $guilro_petitions_settings->getAll(); $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; $pid = isset($_REQUEST['pid']) ? $_REQUEST['pid'] : ''; // petition id $sid = isset($_REQUEST['sid']) ? $_REQUEST['sid'] : ''; // signature id // set variables for paged record display and for limit values in db query $paged = isset($_REQUEST['paged']) ? $_REQUEST['paged'] : '1'; $total_pages = isset($_REQUEST['total_pages']) ? $_REQUEST['total_pages'] : '1'; $current_page = guilro_petitions_SpeakOut::current_paged($paged, $total_pages); $query_limit = $options['signatures_rows']; $query_start = $current_page * $query_limit - $query_limit; switch ($action) { case 'delete': // security: ensure user has intention check_admin_referer('guilro_petitions-delete_signature' . $sid); // delete signature from the database $the_signatures->delete($sid); // count number of signatures in database $count = $the_signatures->count($pid); // get all signatures for display $signatures = $the_signatures->all($pid, $query_start, $query_limit); // set up display strings // set up values for the table label ie: All Signatures (36) if ($count == 0) { $petition = ''; } elseif ($pid != '') { $petition = $signatures[0]->title; } else { $petition = __('All Signatures', 'guilro_petitions'); } $table_label = esc_html($petition) . ' <span class="count">(' . $count . ')</span>'; $base_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures&action=petition&pid=' . $pid); $message_update = __('Signature deleted.', 'guilro_petitions'); break; case 'petition': // count number of signatures in database $count = $the_signatures->count($pid); // get all signatures for display $signatures = $the_signatures->all($pid, $query_start, $query_limit); // TODO: Make this always show petition title (maybe use join in query) // set up display strings // if signatures exist, show petition title, else show petition id number if (count($signatures) > 0) { $table_label = esc_html($signatures[0]->title) . ' <span class="count">(' . $count . ')</span>'; } else { $table_label = __('Petition', 'guilro_petitions') . ' ' . $pid . ' <span class="count">(0)</span>'; } $base_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures&action=petition&pid=' . $pid); $message_update = ''; break; case 'reconfirm': check_admin_referer('guilro_petitions-resend_confirmations' . $pid); include_once 'class.mail.php'; $petition_to_confirm = new guilro_petitions_Petition(); // get unconfirmed signatures $unconfirmed = $the_signatures->unconfirmed($pid); foreach ($unconfirmed as $signature) { $unconfirmed_signature = new guilro_petitions_signature(); $unconfirmed_signature->first_name = $signature->first_name; $unconfirmed_signature->last_name = $signature->last_name; $unconfirmed_signature->email = $signature->email; $unconfirmed_signature->confirmation_code = $signature->confirmation_code; guilro_petitions_Mail::send_confirmation($petition_to_confirm, $unconfirmed_signature, $options); // destroy temporary object so we can re-use the variable unset($unconfirmed_signature); } // count number of signatures in database $count = $the_signatures->count($pid); // get all signatures for display $signatures = $the_signatures->all($pid, $query_start, $query_limit); // set up display strings if (count($signatures) > 0) { $table_label = esc_html($signatures[0]->title) . ' <span class="count">(' . $count . ')</span>'; } else { $table_label = __('Petition', 'guilro_petitions') . ' ' . $pid . ' <span class="count">(0)</span>'; } $base_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures&action=petition&pid=' . $pid); $message_update = __('Confirmation emails sent.', 'guilro_petitions'); break; default: // count number of signatures in database $count = $the_signatures->count($pid); // get all signatures for display $signatures = $the_signatures->all($pid, $query_start, $query_limit); // set up display strings $table_label = __('All Signatures', 'guilro_petitions') . ' <span class="count">(' . $count . ')</span>'; $base_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures'); $message_update = ''; } // get list of petitions to populate select box navigation $petitions_list = $the_petitions->quicklist(); // Set up URLs for 'Download as CSV' and 'Resend confirmations' buttons // Show buttons only when we are viewing signatures from a single petition if (count($petitions_list) == 1 || $pid != '') { // if $pid (petition id) wasn't sent through the URL, then create it from the query if ($pid == '') { $pid = $petitions_list[0]->id; } $csv_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures&action=petition&pid=' . $pid); $reconfirm_url = site_url('wp-admin/admin.php?page=guilro_petitions_signatures&action=reconfirm&pid=' . $pid); } // display the Signatures table include_once __DIR__ . '/signatures.view.php'; }
function guilro_petitions_signatures_csv() { // check security: ensure user has authority and intention if (!current_user_can('publish_posts')) { wp_die(__('Insufficient privileges: You need to be an editor to do that.', 'guilro_petitions')); } check_admin_referer('guilro_petitions-download_signatures'); include_once 'class.signature.php'; $signatures = new guilro_petitions_Signature(); $petition_id = isset($_REQUEST['pid']) ? $_REQUEST['pid'] : ''; // petition id // retrieve signatures from the database $csv_data = $signatures->all($petition_id, 0, 0, 'csv'); // display error message if query returns no results if (count($csv_data) < 1) { echo '<h1>' . __('No signatures found.', 'guilro_petitions') . '</h1>'; die; } // construct CSV filename $counter = 0; foreach ($csv_data as $file) { if ($counter < 1) { $filename_title = stripslashes(str_replace(' ', '-', $file->title)); $filename_date = date('Y-m-d', strtotime(current_time('mysql', 0))); $filename = $filename_title . '_' . $filename_date . '.csv'; } ++$counter; } // set up CSV file headers header('Content-Type: text/octet-stream; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Pragma: public'); // supposed to make stuff work over https // get the column headers translated $firstname = __('First Name', 'guilro_petitions'); $lastname = __('Last Name', 'guilro_petitions'); $email = __('Email Address', 'guilro_petitions'); $street = __('Street Address', 'guilro_petitions'); $city = __('City', 'guilro_petitions'); $state = __('State', 'guilro_petitions'); $postcode = __('Post Code', 'guilro_petitions'); $country = __('Country', 'guilro_petitions'); $date = __('Date Signed', 'guilro_petitions'); $confirmed = __('Confirmed', 'guilro_petitions'); $petition_title = __('Petition Title', 'guilro_petitions'); $petitions_id = __('Petition ID', 'guilro_petitions'); $email_optin = __('Email Opt-in', 'guilro_petitions'); $custom_message = __('Custom Message', 'guilro_petitions'); $language = __('Language', 'guilro_petitions'); // If set, use the custom field label as column header instead of "Custom Field" $counter = 0; foreach ($csv_data as $label) { if ($counter < 1) { if ($label->custom_field_label != '') { $custom_field_label = stripslashes($label->custom_field_label); } else { $custom_field_label = __('Custom Field', 'guilro_petitions'); } } ++$counter; } // construct CSV file header row // must use double quotes and separate with tabs $csv = "{$firstname}\t{$lastname}\t{$email}\t{$street}\t{$city}\t{$state}\t{$postcode}\t{$country}\t{$custom_field_label}\t{$date}\t{$confirmed}\t{$petition_title}\t{$petitions_id}\t{$email_optin}\t{$custom_message}\t{$language}"; $csv .= "\n"; // construct CSV file data rows foreach ($csv_data as $signature) { // convert the 1, 0, or '' values of confirmed to readable format $confirm = $signature->is_confirmed; if ($confirm == 1) { $confirm = __('confirmed', 'guilro_petitions'); } elseif ($confirm == 0) { $confirm = __('unconfirmed', 'guilro_petitions'); } else { $confirm = '...'; } // convert the 1, 0, or '' values of optin to readable format $optin = $signature->optin; if ($optin == 1) { $optin = __('yes', 'guilro_petitions'); } elseif ($optin == 0) { $optin = __('no', 'guilro_petitions'); } else { $optin = '...'; } $csv .= stripslashes('"' . $signature->first_name . '" "' . $signature->last_name . '" "' . $signature->email . '" "' . $signature->street_address . '" "' . $signature->city . '" "' . $signature->state . '" "' . $signature->postcode . '" "' . $signature->country . '" "' . $signature->custom_field . '" "' . $signature->date . '" "' . $confirm . '" "' . $signature->title . '" "' . $signature->petitions_id . '" "' . $optin . '" "' . $signature->custom_message . '" "' . $signature->language . '"'); $csv .= "\n"; } // output CSV file in a UTF-8 format that Excel can understand echo chr(255) . chr(254) . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8'); exit; }
/** * Displays the confirmation page. */ function guilro_petitions_confirm_email() { // set WPML language global $sitepress; $lang = isset($_REQUEST['lang']) ? $_REQUEST['lang'] : ''; if (isset($sitepress)) { $sitepress->switch_lang($lang, true); } include_once 'class.signature.php'; include_once 'class.petition.php'; include_once 'class.mail.php'; include_once 'class.wpml.php'; $the_signature = new guilro_petitions_Signature(); $the_petition = new guilro_petitions_Petition(); $wpml = new guilro_petitions_WPML(); // get the confirmation code from url $confirmation_code = $_REQUEST['dkspeakoutconfirm']; // try to confirm the signature $try_confirm = $the_signature->confirm($confirmation_code); // if our attempt to confirm the signature was successful if ($try_confirm) { // retrieve the signature data $the_signature->retrieve_confirmed($confirmation_code); // retrieve the petition data $the_petition->retrieve($the_signature->petitions_id); $wpml->translate_petition($the_petition); // send the petition email if ($the_petition->sends_email) { guilro_petitions_Mail::send_petition($the_petition, $the_signature); } // redirect to page wp_redirect($the_petition->return_url); exit; } else { // has the signature already been confirmed? if ($the_signature->check_confirmation($confirmation_code)) { $message = __('Your signature has already been confirmed.', 'guilro_petitions'); } else { // the confirmation code is fubar or an admin has already deleted the signature $message = __('The confirmation code you provided is invalid.', 'guilro_petitions'); } } // display the confirmation page $confirmation_page = ' <!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=' . get_bloginfo('charset') . '" /> <meta http-equiv="refresh" content="10;' . $the_petition->return_url . '"> <title>' . get_bloginfo('name') . '</title> <style type="text/css"> body { background: #666; font-family: arial, sans-serif; font-size: 14px; } #confirmation { background: #fff url(' . plugins_url('guilro-petitions/images/mail-stripes.png') . ') repeat top left; border: 1px solid #fff; width: 515px; margin: 200px auto 0 auto; box-shadow: 0px 3px 5px #333; } #confirmation-content { background: #fff url(' . plugins_url('guilro-petitions/images/postmark.png') . ') no-repeat top right; margin: 10px; padding: 40px 0 20px 100px; } </style> </head> <body> <div id="confirmation"> <div id="confirmation-content"> <h2>' . __('Email Confirmation', 'guilro_petitions') . '</h2> <p>' . $message . '</p> <p>' . __('You will be redirected momentarily.', 'guilro_petitions') . '</p> <p><a href="' . home_url() . '">' . get_bloginfo('name') . ' »</a></p> </div> </div> </body> </html> '; echo $confirmation_page; // stop page rendering here // without this, the home page will display below the confirmation message die; }
/** * generates HTML table of signatures for a single petition. * * @param int $id the ID petition for which we are displaying signatures * @param int $start the first signature to be retrieved * @param int $limit number of signatures to be retrieved * @param string $context either 'shortcode' or 'ajax' to distinguish between calls from the initia page load (shortcode) and calls from pagination buttons (ajax) * @param string $dateformat PHP date format provided by shortcode attribute - also relayed in ajax requests * @param string $nextbuttontext provided by shortcode attribute * @param string $prevtbuttontext provided by shortcode attribute * * @return string HTML table containing signatures (or just the table rows if context is ajax) */ public static function table($id, $start, $limit, $context = 'shortcode', $dateformat = 'M d, Y', $nextbuttontext = '>', $prevbuttontext = '<') { include_once 'class.signature.php'; $the_signatures = new guilro_petitions_Signature(); global $guilro_petitions_settings; $options = $guilro_petitions_settings->getAll(); // get list of columns to display - as defined in settings $columns = unserialize($options['signaturelist_columns']); // get the signatures $signatures = $the_signatures->all($id, $start, $limit, 'signaturelist'); $total = $the_signatures->count($id, 'signaturelist'); $current_signature_number = $total - $start; $signatures_list = ''; // only show signature lists if there are signatures if ($total > 0) { // determine which columns to display $display_city = in_array('sig_city', $columns) ? 1 : 0; $display_state = in_array('sig_state', $columns) ? 1 : 0; $display_postcode = in_array('sig_postcode', $columns) ? 1 : 0; $display_country = in_array('sig_country', $columns) ? 1 : 0; $display_custom = in_array('sig_custom', $columns) ? 1 : 0; $display_date = in_array('sig_date', $columns) ? 1 : 0; if ($context !== 'ajax') { // only include on initial page load (not when paging) $signatures_list = ' <!-- signaturelist --> <table class="guilro-petitions-signaturelist guilro-petitions-signaturelist-' . $id . '"> <caption>' . $options['signaturelist_header'] . '</caption>'; } $row_count = 0; foreach ($signatures as $signature) { if ($row_count % 2) { $signatures_list .= '<tr class="guilro-petitions-even">'; } else { $signatures_list .= '<tr class="guilro-petitions-odd">'; } $signatures_list .= '<td class="guilro-petitions-signaturelist-count">' . number_format($current_signature_number, 0, '.', ',') . '</td>'; $display_lastname = $signature->last_name; // if we have enabled privacy, only show forst letter of surname if ($options['signaturelist_privacy'] == 'enabled') { $display_lastname = substr($signature->last_name, 0, 1) . '.'; } $signatures_list .= '<td class="guilro-petitions-signaturelist-name">' . stripslashes($signature->first_name . ' ' . $display_lastname) . '</td>'; // if we display both city and state, combine them into one column $city = $display_city ? $signature->city : ''; $state = $display_state ? $signature->state : ''; if ($display_city && $display_state) { // should we separate with a comma? $delimiter = $city != '' && $state != '' ? ', ' : ''; $signatures_list .= '<td class="guilro-petitions-signaturelist-city">' . stripslashes($city . $delimiter . $state) . '</td>'; } else { if ($display_city) { $signatures_list .= '<td class="guilro-petitions-signaturelist-city">' . stripslashes($city) . '</td>'; } if ($display_state) { $signatures_list .= '<td class="guilro-petitions-signaturelist-state">' . stripslashes($state) . '</td>'; } } if ($display_postcode) { $signatures_list .= '<td class="guilro-petitions-signaturelist-postcode">' . stripslashes($signature->postcode) . '</td>'; } if ($display_country) { $signatures_list .= '<td class="guilro-petitions-signaturelist-country">' . stripslashes($signature->country) . '</td>'; } if ($display_custom) { $signatures_list .= '<td class="guilro-petitions-signaturelist-custom">' . stripslashes($signature->custom_field) . '</td>'; } if ($display_date) { $signatures_list .= '<td class="guilro-petitions-signaturelist-date">' . date_i18n($dateformat, strtotime($signature->date)) . '</td>'; } $signatures_list .= '</tr>'; --$current_signature_number; ++$row_count; } if ($context !== 'ajax') { // only include on initial page load if ($limit != 0 && $start + $limit < $total) { $colspan = count($columns) + 2; $signatures_list .= ' <tr class="guilro-petitions-signaturelist-pagelinks"> <td colspan="' . $colspan . '"> <a class="guilro-petitions-signaturelist-prev guilro-petitions-signaturelist-disabled" rel="' . $id . ',' . $total . ',' . $limit . ',' . $total . ',0">' . $prevbuttontext . '</a> <a class="guilro-petitions-signaturelist-next" rel="' . $id . ',' . ($start + $limit) . ',' . $limit . ',' . $total . ',1">' . $nextbuttontext . '</a> </td> </tr> '; } $signatures_list .= '</table>'; } } return $signatures_list; }