View source
<?php
function webform2pdf_enabled_pdf_access() {
$param = func_get_args();
$node = array_shift($param);
$call = array_shift($param);
$result = db_query("SELECT enabled FROM {webform2pdf} WHERE nid = %d AND enabled = 1", $node->nid);
$row = db_fetch_array($result);
return $row['enabled'] && call_user_func_array($call, $param);
}
function webform2pdf_menu() {
$items = array();
$items['node/%webform_menu/webform/webform2pdf'] = array(
'title' => 'Generate PDF',
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_edit_form',
1,
),
'file' => 'includes/webform2pdf.settings.inc',
'weight' => 4,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/downloadpdf'] = array(
'title' => 'Download PDF',
'load arguments' => array(
1,
),
'access callback' => 'webform2pdf_enabled_pdf_access',
'access arguments' => array(
1,
'webform_results_access',
1,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_download_pdf_form',
1,
),
'file' => 'includes/webform2pdf.download.inc',
'weight' => 9,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/submission/%webform_menu_submission/downloadpdf'] = array(
'title' => 'Download PDF',
'load arguments' => array(
1,
),
'access callback' => 'webform2pdf_enabled_pdf_access',
'access arguments' => array(
1,
'webform_submission_access',
1,
3,
'view',
),
'page callback' => 'webform2pdf_submission_download_pdf',
'page arguments' => array(
1,
3,
),
'file' => 'includes/webform2pdf.download.inc',
'weight' => 6,
'type' => MENU_LOCAL_TASK,
);
$items['admin/settings/webform2pdf'] = array(
'title' => 'Webform to PDF',
'access arguments' => array(
'administer site configuration',
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_admin_settings',
),
'file' => 'includes/webform2pdf.settings.inc',
'description' => 'Global configuration of webform2pdf functionality.',
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function webform2pdf_theme() {
return array(
'webform2pdf_download_pdf_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform2pdf.download.inc',
),
'webform2pdf_pdf_init' => array(
'arguments' => array(
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_header' => array(
'arguments' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_page' => array(
'arguments' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_content' => array(
'arguments' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
'tokens' => NULL,
),
),
'webform2pdf_pdf_footer' => array(
'arguments' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_mail2pdf' => array(
'arguments' => array(
'nid' => NULL,
'sid' => NULL,
),
),
'webform2pdf_filename' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
),
),
);
}
function webform2pdf_help($path, $arg) {
global $base_url;
switch ($path) {
case 'node/%/webform-results/downloadpdf':
return $output = '<p>' . t('A PDF document will be generated from the marked results.') . '</p>';
break;
}
}
function webform2pdf_send2pdf($node, $submission) {
$webform2pdf = _webform2pdf_get_template($node->nid);
$nopdf = array();
if (isset($webform2pdf['enabled']) && $webform2pdf['enabled'] && $webform2pdf['pdf_send_email']) {
$no_mail = unserialize($webform2pdf['no_send_email_addr']);
if (is_array($no_mail)) {
$no_mail = array_diff($no_mail, array(
0,
));
if (!empty($no_mail)) {
foreach ($no_mail as $eid) {
$email_addresses = $node->webform['emails'][$eid]['email'];
if (isset($node->webform['components'][$email_addresses])) {
$email_addresses = $submission->data[$eid]['value'];
}
else {
$email_addresses = array_filter(explode(',', check_plain($node->webform['emails'][$eid]['email'])));
}
if (is_array($email_addresses)) {
$nopdf = array_merge($nopdf, $email_addresses);
}
$nopdf = array_map("trim", $nopdf);
}
}
}
return array(
'nid' => $node->nid,
'sid' => $submission->sid,
'nopdf' => $nopdf,
);
}
}
function webform2pdf_preprocess_webform_results_submissions(&$vars) {
$rows =& $vars['table']['#rows'];
$i = 0;
$table_row_keys = array_keys($vars['table']['#rows']);
foreach ($vars['submissions'] as $sid => $submission) {
if (webform2pdf_enabled_pdf_access($vars['node'], 'webform_submission_access', $vars['node'], $submission->nid, 'view')) {
$rows[$table_row_keys[$i]][] = l(t('Download PDF'), 'node/' . $submission->nid . '/submission/' . $submission->sid . '/downloadpdf');
}
else {
$rows[$table_row_keys[$i]][] = '';
}
$i++;
}
$header_keys = array_keys($vars['table']['#header']);
$last_header_key = array_pop($header_keys);
$vars['table']['#operation_total'] += 1;
$vars['table']['#header'][$last_header_key]['colspan'] += 1;
}
function _webform2pdf_get_file($fid) {
if (is_numeric($fid)) {
$result = db_query("SELECT * FROM {files} WHERE fid = %d", $fid);
return db_fetch_object($result);
}
return 0;
}
function _webform2pdf_use_file($fid) {
$webform2pdf_default = variable_get('webform2pdf_default', '');
if (is_numeric($fid)) {
$SQL = "SELECT count(*) AS num FROM {webform2pdf}";
$SQL .= " WHERE (h_left_logo = %d) OR (h_right_logo = %d) OR (f_left_logo = %d) OR (f_right_logo = %d)";
$result = db_query($SQL, $fid, $fid, $fid, $fid);
$count = db_fetch_array($result);
if ($webform2pdf_default['h_left_logo'] == $fid) {
$count['num']++;
}
if ($webform2pdf_default['h_right_logo'] == $fid) {
$count['num']++;
}
if ($webform2pdf_default['f_left_logo'] == $fid) {
$count['num']++;
}
if ($webform2pdf_default['f_right_logo'] == $fid) {
$count['num']++;
}
return $count['num'];
}
return 0;
}
function _webform2pdf_list_template_vars($node) {
$tokens = array();
foreach ($node->webform['components'] as $component) {
switch ($component['type']) {
case 'select':
$tokens[] = '%' . $component['form_key'];
$tokens[] = '%' . $component['form_key'] . '-all';
$tokens[] = '%' . $component['form_key'] . '-nl';
$tokens[] = '%' . $component['form_key'] . '-all-nl';
break;
case 'number':
case 'email':
case 'date':
case 'time':
case 'hidden':
case 'textarea':
case 'textfield':
case 'grid':
$tokens[] = '%' . $component['form_key'];
break;
default:
foreach (module_list() as $module) {
$function = '_' . $module . '_webform2pdf_list_template_vars';
if (function_exists($function)) {
$function($component, $tokens);
}
}
break;
}
}
$tokens[] = '%nid';
$tokens[] = '%sid';
return $tokens;
}
function _webform2pdf_get_template_vars($node, $submission) {
$tokens = array_flip(_webform2pdf_list_template_vars($node));
foreach ($tokens as $key => $token) {
$tokens[$key] = '';
}
foreach ($node->webform['components'] as $component) {
if (!empty($submission->data[$component['cid']]['value']) && isset($component['type'])) {
switch ($component['type']) {
case 'date':
if (!empty($submission->data[$component['cid']]['value'][0])) {
$timestamp = strtotime($submission->data[$component['cid']]['value'][0] . ' GMT');
$format = webform_date_format('medium');
$date = format_date($timestamp, 'custom', $format, 0);
$tokens['%' . $component['form_key']] = $date;
}
else {
$tokens['%' . $component['form_key']] = '';
}
break;
case 'time':
if (!empty($submission->data[$component['cid']]['value'][0])) {
list($hour, $min, $sec) = explode(':', $submission->data[$component['cid']]['value'][0]);
$ampm = '';
if ($component['extra']['hourformat'] === '12-hour') {
if ($hour > 12) {
$hour -= 12;
$ampm = t('pm');
}
else {
$ampm = t('am');
}
}
$tokens['%' . $component['form_key']] = trim($hour . ':' . $min . ' ' . $ampm);
}
else {
$tokens['%' . $component['form_key']] = '';
}
break;
case 'grid':
$answers = $questions = array();
$a = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['options']));
$q = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['questions']));
foreach ($a as $key => $value) {
if (strpos($value, '|') === FALSE) {
$key = $option = $value;
}
else {
$key = drupal_substr($value, 0, strpos($value, '|'));
$option = drupal_substr($value, strpos($value, '|') + 1);
}
$answers[$key] = $option;
}
foreach ($q as $key => $value) {
if (strpos($value, '|') === FALSE) {
$key = $option = $value;
}
else {
$key = drupal_substr($value, 0, strpos($value, '|'));
$option = drupal_substr($value, strpos($value, '|') + 1);
}
$questions[$key] = $option;
}
$grid = array();
foreach ($submission->data[$component['cid']]['value'] as $question => $answer) {
if (isset($questions[$question]) && isset($answers[$answer])) {
$grid[] = $questions[$question] . ': ' . $answers[$answer];
}
}
$tokens['%' . $component['form_key']] = implode("<br />\n", $grid);
break;
case 'select':
$values = $submission->data[$component['cid']]['value'];
if (is_array($values)) {
$items = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['items']));
$options = array();
foreach ($items as $item) {
if (strpos($item, '|') === FALSE) {
$key = $option = $item;
}
else {
$key = drupal_substr($item, 0, strpos($item, '|'));
$option = drupal_substr($item, strpos($item, '|') + 1);
}
$options[$key] = $option;
}
$select = $selectNL = $selectAll = $selectAllNL = array();
foreach ($options as $key => $option) {
if (in_array($option, $values) || in_array($key, $values)) {
if (!empty($option)) {
$select[] = $option;
$selectNL[] = ' - ' . $option . "<br />\n";
$selectAll[] = '<u><b><span class="selected">' . $option . '</span></b></u>';
$selectAllNL[] = ' [X] ' . $option . "<br />\n";
}
}
else {
if (!empty($option)) {
$selectAll[] = $option;
$selectAllNL[] = ' [ ] ' . $option . "<br />\n";
}
}
}
if (module_exists('select_or_other')) {
$potential_values = array_merge(array_keys($options), array_values($options));
$diff = array_diff($values, $potential_values);
if (count($diff)) {
foreach ($diff as $value) {
if (!empty($value)) {
$select[] = check_plain($value);
$selectNL[] = ' - ' . check_plain($value) . "<br />\n";
$selectAll[] = '<u><b><span class="selected">' . check_plain($value) . '</span></b></u>';
$selectAllNL[] = ' [X] ' . check_plain($value) . "<br />\n";
}
}
}
}
$tokens['%' . $component['form_key']] = implode(', ', $select);
$tokens['%' . $component['form_key'] . '-all'] = implode(', ', $selectAll);
$tokens['%' . $component['form_key'] . '-nl'] = implode('', $selectNL);
$tokens['%' . $component['form_key'] . '-all-nl'] = implode('', $selectAllNL);
}
else {
$tokens['%' . $component['form_key']] = $tokens['%' . $component['form_key'] . '-all'] = $tokens['%' . $component['form_key'] . '-nl'] = $tokens['%' . $component['form_key'] . '-all-nl'] = '';
}
break;
case 'number':
if (!empty($submission->data[$component['cid']]['value'][0])) {
$decimals = 0;
if ($component['extra']['integer']) {
$decimals = is_numeric($component['extra']['decimals']) ? (int) $component['extra']['decimals'] : 0;
}
$tokens['%' . $component['form_key']] = number_format($submission->data[$component['cid']]['value'][0], $decimals, $component['extra']['point'], $component['extra']['separator']);
}
else {
$tokens['%' . $component['form_key']] = '';
}
break;
case 'email':
case 'hidden':
case 'textarea':
case 'textfield':
if (!empty($submission->data[$component['cid']]['value'][0])) {
$tokens['%' . $component['form_key']] = str_replace('<br>', '<br />', nl2br(check_plain($submission->data[$component['cid']]['value'][0])));
}
else {
$tokens['%' . $component['form_key']] = '';
}
break;
default:
foreach (module_list() as $module) {
$function = '_' . $module . '_webform2pdf_get_template_vars';
if (function_exists($function)) {
$function($component, $submission, $tokens);
}
}
break;
}
}
}
$tokens['%nid'] = $node->nid;
$tokens['%sid'] = $submission->sid;
drupal_alter('webform2pdf_tokens', $tokens, $node, $submission);
return $tokens;
}
function _webform2pdf_get_template($nid) {
$result = db_query("SELECT * FROM {webform2pdf} WHERE nid = %d AND enabled = 1", $nid);
$row = db_fetch_array($result);
$row['p_body'] = check_markup($row['p_body'], $row['format'], FALSE);
return $row;
}
function _webform2pdf_get_submissions($nid, $header = NULL, $sids = array()) {
$SQL = 'SELECT s.*, sd.cid, sd.no, sd.data, u.name, u.mail, u.status';
$SQL .= ' FROM {webform_submissions} s';
$SQL .= ' LEFT JOIN {webform_submitted_data} sd ON sd.sid = s.sid';
$SQL .= ' LEFT JOIN {users} u ON u.uid = s.uid';
$SQL .= ' WHERE sd.nid = %d';
if (count($sids)) {
$SQL .= ' AND s.sid IN (%s)';
}
if (is_array($header)) {
$SQL .= tablesort_sql($header);
if (!isset($header[0]['sort'])) {
$SQL .= ', sid ASC';
}
$SQL .= ', cid ASC, no ASC';
}
else {
$SQL .= ' ORDER BY sid ASC, cid ASC, no ASC';
}
$result = db_query($SQL, $nid, implode(',', $sids));
$submissions = array();
$previous = array();
while ($row = db_fetch_object($result)) {
if ($row->sid != $previous) {
$submissions[$row->sid] = new stdClass();
$submissions[$row->sid]->sid = $row->sid;
$submissions[$row->sid]->submitted = $row->submitted;
$submissions[$row->sid]->remote_addr = $row->remote_addr;
$submissions[$row->sid]->uid = $row->uid;
$submissions[$row->sid]->name = $row->name;
$submissions[$row->sid]->status = $row->status;
}
$submissions[$row->sid]->data[$row->cid]['value'][$row->no] = $row->data;
$previous = $row->sid;
}
return $submissions;
}
function theme_webform2pdf_filename($node, $submission) {
$sid = is_object($submission) ? $submission->sid : $submission;
$pdf_file_name = "webform_submission-" . $node->nid;
$pdf_file_name .= !empty($sid) ? '-' . $sid : '';
$pdf_file_name .= ".pdf";
return $pdf_file_name;
}
function _webform2pdf_init_tcpdf($node, $template) {
global $base_url;
$default = variable_get('webform2pdf_default', '');
define('K_TCPDF_EXTERNAL_CONFIG', TRUE);
define('K_PATH_MAIN', dirname($_SERVER['SCRIPT_FILENAME']));
define('K_PATH_URL', $base_url);
define('K_PATH_FONTS', $default['pdf_lib'] . '/fonts/');
define('K_PATH_CACHE', $default['pdf_lib'] . '/cache/');
define('K_PATH_IMAGES', '');
define('K_BLANK_IMAGE', $default['pdf_lib'] . '/images/_blank.png');
define('K_CELL_HEIGHT_RATIO', 1.25);
define('K_SMALL_RATIO', 2 / 3);
if (is_file($default['pdf_lib'] . '/tcpdf.php')) {
include_once drupal_get_path('module', 'webform2pdf') . '/webform2pdf.class.inc';
$font = array(
variable_get('print_pdf_font_family', PRINT_PDF_FONT_FAMILY_DEFAULT),
'',
variable_get('print_pdf_font_size', PRINT_PDF_FONT_SIZE_DEFAULT),
);
$pdf = new W2PDF($template['page_orientation'], 'mm', $template['page_format'], TRUE);
$pdf
->SetCreator(variable_get('site_name', 'Drupal'));
$pdf
->SetAuthor($node->name);
$pdf
->SetTitle($node->title);
$pdf
->setPDFVersion('1.6');
return $pdf;
}
else {
return;
}
}
function theme_webform2pdf_pdf_init($node, $template) {
return _webform2pdf_init_tcpdf($node, $template);
}
function _webform2pdf_pdf_header($pdf, $node, $template) {
if (!empty($template['h_left_logo'])) {
$f = _webform2pdf_get_file($template['h_left_logo']);
$s = getimagesize($f->filepath);
$logo['left'] = $f->filepath;
$size['left']['w'] = $s[0] / 75 * 25;
$size['left']['h'] = $s[1] / 75 * 25;
}
if (!empty($template['h_right_logo'])) {
$f = _webform2pdf_get_file($template['h_right_logo']);
$s = getimagesize($f->filepath);
$logo['right'] = $f->filepath;
$size['right']['w'] = $s[0] / 75 * 25;
$size['right']['h'] = $s[1] / 75 * 25;
}
$pdf
->setHeaderFont(array(
$template['h_font_family'],
'',
$template['h_font_size'],
));
$pdf
->setHeaderMargin(5);
$header_msg = nl2br(_webform_filter_values($template['h_txt'], $node, NULL, NULL, FALSE));
$pdf
->setHeaderData($logo, $size, $header_msg, $template['h_txt_align']);
return $pdf;
}
function theme_webform2pdf_pdf_header($pdf, $node, $template) {
return _webform2pdf_pdf_header($pdf, $node, $template);
}
function _webform2pdf_pdf_footer($pdf, $node, $template) {
if (!empty($template['f_left_logo'])) {
$f = _webform2pdf_get_file($template['f_left_logo']);
$s = getimagesize($f->filepath);
$logo['left'] = $f->filepath;
$size['left']['w'] = $s[0] / 75 * 25;
$size['left']['h'] = $s[1] / 75 * 25;
}
if (!empty($template['f_right_logo'])) {
$f = _webform2pdf_get_file($template['f_right_logo']);
$s = getimagesize($f->filepath);
$logo['right'] = $f->filepath;
$size['right']['w'] = $s[0] / 75 * 25;
$size['right']['h'] = $s[1] / 75 * 25;
}
$pdf
->setFooterFont(array(
$template['f_font_family'],
'',
$template['f_font_size'],
));
$pdf
->setFooterMargin(5);
$footer_msg = nl2br(_webform_filter_values($template['f_txt'], $node, NULL, NULL, FALSE));
$pdf
->SetFooterData($logo, $size, $footer_msg, $template['f_txt_align']);
return $pdf;
}
function theme_webform2pdf_pdf_footer($pdf, $node, $template) {
return _webform2pdf_pdf_footer($pdf, $node, $template);
}
function _webform2pdf_pdf_page($pdf) {
$pdf
->SetMargins(15, 20, 15);
$pdf
->SetAutoPageBreak(TRUE, 25);
$pdf
->setImageScale(4);
$pdf
->setJPEGQuality(100);
return $pdf;
}
function theme_webform2pdf_pdf_page($pdf) {
return _webform2pdf_pdf_page($pdf);
}
function _webform2pdf_pdf_content($pdf, $node, $template, $tokens) {
$pdf
->SetFont($template['p_font_family'], '', $template['p_font_size']);
foreach ($template['pages'] as $page) {
$pdf
->AddPage();
$page = _webform_filter_values($page, $node, NULL, NULL, FALSE);
$pdf
->writeHTML($page, TRUE, FALSE, FALSE, FALSE, $template['p_txt_align']);
}
return $pdf;
}
function theme_webform2pdf_pdf_content($pdf, $node, $template, $tokens) {
return _webform2pdf_pdf_content($pdf, $node, $template, $tokens);
}
function webform2pdf_mail_alter(&$message) {
if ($message['id'] == 'webform_submission') {
$webform2pdf_send2pdf = webform2pdf_send2pdf($message['params']['node'], $message['params']['submission']);
if (isset($webform2pdf_send2pdf['nid'])) {
$attach_pdf = 1;
if (!empty($webform2pdf_send2pdf['nopdf'])) {
if (in_array($message['to'], $webform2pdf_send2pdf['nopdf'])) {
$attach_pdf = 0;
}
}
if ($attach_pdf) {
if (module_exists('mimemail')) {
$node = node_load($webform2pdf_send2pdf['nid']);
$attachment = new stdClass();
$attachment->filecontent = theme('webform2pdf_mail2pdf', $webform2pdf_send2pdf['nid'], $webform2pdf_send2pdf['sid']);
$attachment->filename = theme('webform2pdf_filename', $node, $webform2pdf_send2pdf['sid']);
$attachment->filemime = 'application/pdf';
$message['params']['attachments'][] = $attachment;
}
else {
$trenner = '------------' . md5(uniqid(time()));
$content_type = $message['headers']['Content-Type'];
$message['headers']['Content-Type'] = 'multipart/mixed; boundary="' . $trenner . '"';
unset($message['headers']['Content-Transfer-Encoding']);
$body = "\n--" . $trenner . "\n" . "Content-Type: " . $content_type . "\n" . "Content-Transfer-Encoding: 8bit\n\n";
$body .= is_array($message['body']) ? drupal_wrap_mail(implode("\n\n", $message['body'])) : drupal_wrap_mail($message['body']);
unset($message['body']);
$message['body'] = $body;
unset($body);
$node = node_load($webform2pdf_send2pdf['nid']);
$filename = theme('webform2pdf_filename', $node, $webform2pdf_send2pdf['sid']);
unset($node);
$message['body'] .= "\n\n--" . $trenner . "\n";
$message['body'] .= "Content-Type: application/pdf; name=\"" . $filename . "\"\n";
$message['body'] .= "Content-Transfer-Encoding: base64\n";
$message['body'] .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n";
$message['body'] .= chunk_split(base64_encode(theme('webform2pdf_mail2pdf', $webform2pdf_send2pdf['nid'], $webform2pdf_send2pdf['sid'])));
$message['body'] .= "\n\n";
$message['body'] .= "--" . $trenner . "--";
}
}
}
}
}
function theme_webform2pdf_mail2pdf($nid, $sid) {
$node = node_load(array(
'nid' => $nid,
));
$submissions = _webform2pdf_get_submissions($nid, NULL, array(
$sid,
));
$token = _webform2pdf_get_template_vars($node, $submissions[$sid]);
$template = _webform2pdf_get_template($node->nid);
$pdf = theme('webform2pdf_pdf_init', $node, $template);
if (!empty($pdf)) {
$pdf = theme('webform2pdf_pdf_header', $pdf, $node, $template);
$pdf = theme('webform2pdf_pdf_footer', $pdf, $node, $template);
$pdf = theme('webform2pdf_pdf_page', $pdf);
if (method_exists($pdf, 'AliasNbPages')) {
$pdf
->AliasNbPages();
}
$template['pages'] = explode('%pagebreak', $template['p_body']);
foreach ($template['pages'] as $key => $page) {
$template['pages'][$key] = strtr($page, $token);
}
$pdf = theme('webform2pdf_pdf_content', $pdf, $node, $template, $token);
$pdf
->lastPage();
return $pdf
->Output($filename, 'S');
}
}
function webform2pdf_url_encode($nid, $sid, $encode = TRUE) {
$url = 'node/' . $nid . '/submission/' . $sid . '/downloadpdf';
if ($encode && function_exists('mcrypt_encrypt')) {
$key = variable_get('webform2pdf_key', '');
return 'webform2pdf/' . urlencode(trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $url, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))));
}
return $url;
}