예제 #1
0
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;
}
예제 #2
0
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';
}
예제 #3
0
 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;
 }
예제 #4
0
/**
 * 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') . '  &raquo;</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 = '&gt;', $prevbuttontext = '&lt;')
    {
        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;
    }