View source
<?php
function webform2pdf_enabled_pdf_access() {
$param = func_get_args();
$node = array_shift($param);
$call = array_shift($param);
$row = db_select('webform2pdf', 'w2p')
->fields('w2p', array(
'enabled',
))
->condition('nid', $node->nid, '=')
->condition('enabled', 1, '=')
->execute()
->fetchAssoc();
return $row['enabled'] && call_user_func_array($call, $param);
}
function webform2pdf_menu() {
$items = array();
$items['node/%webform_menu/webform/webform2pdf'] = array(
'title' => 'Generate PDF',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_edit_form',
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform2pdf.settings.inc',
'weight' => 4,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/downloadpdf'] = array(
'title' => 'Download PDF',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_download_pdf_form',
1,
),
'access callback' => 'webform2pdf_enabled_pdf_access',
'access arguments' => array(
1,
'webform_results_access',
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,
),
'page callback' => 'webform2pdf_submission_download_pdf',
'page arguments' => array(
1,
3,
),
'access callback' => 'webform2pdf_enabled_pdf_access',
'access arguments' => array(
1,
'webform_submission_access',
1,
3,
'view',
),
'file' => 'includes/webform2pdf.download.inc',
'weight' => 6,
'type' => MENU_LOCAL_TASK,
);
$items['admin/config/content/webform2pdf'] = array(
'title' => 'Webform to PDF',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform2pdf_admin_settings',
),
'access callback' => 'user_access',
'access arguments' => array(
'administer site configuration',
),
'description' => 'Global configuration of webform2pdf functionality.',
'file' => 'includes/webform2pdf.settings.inc',
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function webform2pdf_theme() {
return array(
'webform2pdf_token_help' => array(
'variables' => array(
'groups' => array(),
'tokens' => array(),
),
'file' => 'includes/webform2pdf.settings.inc',
),
'webform2pdf_pdf_init' => array(
'variables' => array(
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_header' => array(
'variables' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_page' => array(
'variables' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_content' => array(
'variables' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_pdf_footer' => array(
'variables' => array(
'pdf' => NULL,
'node' => NULL,
'template' => NULL,
),
),
'webform2pdf_mail2pdf' => array(
'variables' => array(
'nid' => NULL,
'sid' => NULL,
),
),
'webform2pdf_filename' => array(
'variables' => array(
'node' => NULL,
'submission' => NULL,
),
),
'webform2pdf_content' => array(
'variables' => array(
'node' => NULL,
'submission' => NULL,
'template' => 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'])));
}
$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, '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_template($nid) {
$row = db_select('webform2pdf', 'w2p')
->fields('w2p')
->condition('nid', $nid, '=')
->condition('enabled', 1, '=')
->execute()
->fetchAssoc();
$row['p_body'] = check_markup($row['p_body'], $row['format'], FALSE);
return $row;
}
function _webform2pdf_get_submissions($nid, $header = NULL, $sids = array()) {
$query = db_select('webform_submissions', 's')
->condition('s.nid', $nid, '=');
if (count($sids)) {
$query
->condition('s.sid', $sids, 'IN');
}
$query
->leftJoin('webform_submitted_data', 'sd', 'sd.sid = s.sid');
$query
->leftJoin('users', 'u', 'u.uid = s.uid');
$query
->fields('s')
->fields('sd', array(
'cid',
'no',
'data',
))
->fields('u', array(
'name',
));
if ($header) {
$query = $query
->extend('TableSort');
$query
->orderByHeader($header);
}
$result = $query
->execute();
$previous = 0;
foreach ($result as $row) {
if ($row->sid != $previous) {
$submissions[$row->sid] = new stdClass();
$submissions[$row->sid]->sid = $row->sid;
$submissions[$row->sid]->nid = $row->nid;
$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]->is_draft = $row->is_draft;
}
$submissions[$row->sid]->data[$row->cid]['value'][$row->no] = $row->data;
$previous = $row->sid;
}
return $submissions;
}
function theme_webform2pdf_filename($vars) {
$sid = is_object($vars['submission']) ? $vars['submission']->sid : $vars['submission'];
$pdf_file_name = "webform_submission-" . $vars['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;
$tcpdf_dir = libraries_get_path('tcpdf');
if (defined('K_TCPDF_EXTERNAL_CONFIG')) {
define('K_TCPDF_EXTERNAL_CONFIG', TRUE);
define('K_PATH_MAIN', dirname($_SERVER['SCRIPT_FILENAME']));
define('K_PATH_URL', $base_url);
define('K_PATH_FONTS', $tcpdf_dir . '/fonts/');
define('K_PATH_CACHE', $tcpdf_dir . '/cache/');
define('K_PATH_IMAGES', '');
define('K_BLANK_IMAGE', $tcpdf_dir . '/images/_blank.png');
define('K_CELL_HEIGHT_RATIO', 1.25);
define('K_SMALL_RATIO', 2 / 3);
}
if (is_file($tcpdf_dir . '/tcpdf.php')) {
include_once drupal_get_path('module', 'webform2pdf') . '/webform2pdf.class.inc';
$font = array(
variable_get('p_font_family', 'dejavuserif'),
'',
variable_get('p_font_size', 12),
);
$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($vars) {
return _webform2pdf_init_tcpdf($vars['node'], $vars['template']);
}
function _webform2pdf_pdf_header($pdf, $node, $template) {
if (!empty($template['h_left_logo'])) {
$f = file_load($template['h_left_logo']);
$s = image_get_info($f->uri);
$logo['left'] = drupal_realpath($f->uri);
$size['left']['w'] = $s['width'] / 75 * 25;
$size['left']['h'] = $s['height'] / 75 * 25;
}
else {
$logo['left'] = '';
$size['left']['w'] = 0;
$size['left']['h'] = 0;
}
if (!empty($template['h_right_logo'])) {
$f = file_load($template['h_right_logo']);
$s = image_get_info($f->uri);
$logo['right'] = drupal_realpath($f->uri);
$size['right']['w'] = $s['width'] / 75 * 25;
$size['right']['h'] = $s['height'] / 75 * 25;
}
else {
$logo['right'] = '';
$size['right']['w'] = 0;
$size['right']['h'] = 0;
}
if (!empty($template['p_background'])) {
$f = file_load($template['p_background']);
$background = drupal_realpath($f->uri);
}
else {
$background = NULL;
}
$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'], array(), array(), $background);
return $pdf;
}
function theme_webform2pdf_pdf_header($vars) {
return _webform2pdf_pdf_header($vars['pdf'], $vars['node'], $vars['template']);
}
function _webform2pdf_pdf_footer($pdf, $node, $template) {
if (!empty($template['f_left_logo'])) {
$f = file_load($template['f_left_logo']);
$s = image_get_info($f->uri);
$logo['left'] = drupal_realpath($f->uri);
$size['left']['w'] = $s['width'] / 75 * 25;
$size['left']['h'] = $s['height'] / 75 * 25;
}
else {
$logo['left'] = '';
$size['left']['w'] = 0;
$size['left']['h'] = 0;
}
if (!empty($template['f_right_logo'])) {
$f = file_load($template['f_right_logo']);
$s = image_get_info($f->uri);
$logo['right'] = drupal_realpath($f->uri);
$size['right']['w'] = $s['width'] / 75 * 25;
$size['right']['h'] = $s['height'] / 75 * 25;
}
else {
$logo['right'] = '';
$size['right']['w'] = 0;
$size['right']['h'] = 0;
}
$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($vars) {
return _webform2pdf_pdf_footer($vars['pdf'], $vars['node'], $vars['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($vars) {
return _webform2pdf_pdf_page($vars['pdf']);
}
function _webform2pdf_pdf_content($pdf, $node, $template) {
$pdf
->SetFont($template['p_font_family'], '', $template['p_font_size']);
foreach ($template['pages'] as $page) {
$pdf
->AddPage();
$pdf
->writeHTML($page, TRUE, FALSE, FALSE, FALSE, $template['p_txt_align']);
}
return $pdf;
}
function theme_webform2pdf_pdf_content($vars) {
return _webform2pdf_pdf_content($vars['pdf'], $vars['node'], $vars['template']);
}
function theme_webform2pdf_content($vars) {
$email = array(
'html' => 'text',
'excluded_components' => array(),
);
$p_body = _webform_filter_values($vars['template']['p_body'], $vars['node'], $vars['submission'], $email, FALSE, TRUE);
return _webform2pdf_filter_values($p_body, $vars['node'], $vars['submission']);
}
function _webform2pdf_filter_values($string, $node, $submission) {
$tokens = array();
foreach ($node->webform['components'] as $component) {
if (isset($component['type']) && $component['type'] == 'select') {
$values = isset($submission->data[$component['cid']]['value']) ? $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;
}
$nl = $all = $nl_all = array();
foreach ($options as $key => $option) {
if (in_array($option, $values) || in_array($key, $values)) {
if (!empty($option)) {
$nl[] = ' - ' . $option . "<br />\n";
$all[] = '<u><b><span class="selected">' . $option . '</span></b></u>';
$nl_all[] = ' [X] ' . $option . "<br />\n";
}
}
else {
if (!empty($option)) {
$all[] = $option;
$nl_all[] = ' [ ] ' . $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)) {
$nl[] = ' - ' . check_plain($value) . "<br />\n";
$all[] = '<u><b><span class="selected">' . check_plain($value) . '</span></b></u>';
$nl_all[] = ' [X] ' . check_plain($value) . "<br />\n";
}
}
}
}
$tokens['%label_nl[' . $component['form_key'] . ']'] = $component['name'] . ": <br />\n" . implode('', $nl);
$tokens['%label_all[' . $component['form_key'] . ']'] = $component['name'] . ': ' . implode(', ', $all);
$tokens['%label_all_nl[' . $component['form_key'] . ']'] = $component['name'] . ": <br />\n" . implode('', $nl_all);
$tokens['%nl[' . $component['form_key'] . ']'] = implode('', $nl);
$tokens['%all[' . $component['form_key'] . ']'] = implode(', ', $all);
$tokens['%all_nl[' . $component['form_key'] . ']'] = implode('', $nl_all);
}
else {
$tokens['%label_nl[' . $component['form_key'] . ']'] = $tokens['%label_all[' . $component['form_key'] . ']'] = $tokens['%label_all_nl[' . $component['form_key'] . ']'] = $tokens['%nl[' . $component['form_key'] . ']'] = $tokens['%all[' . $component['form_key'] . ']'] = $tokens['%all_nl[' . $component['form_key'] . ']'] = '';
}
}
}
drupal_alter('webform2pdf_tokens', $tokens, $node, $submission);
return strtr($string, $tokens);
}
function webform2pdf_mail_alter(&$message) {
if ($message['id'] == 'webform_submission' && isset($message['params']['node']) && isset($message['params']['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) {
$node = node_load($webform2pdf_send2pdf['nid']);
$filename = theme('webform2pdf_filename', array(
'node' => $node,
'submission' => $webform2pdf_send2pdf['sid'],
));
unset($node);
if (webform_email_html_capable()) {
if (module_exists('mimemail')) {
$attachment = new stdClass();
$attachment->filecontent = theme('webform2pdf_mail2pdf', array(
'nid' => $webform2pdf_send2pdf['nid'],
'sid' => $webform2pdf_send2pdf['sid'],
));
$attachment->filename = $filename;
$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\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'][0] = $body;
unset($body);
$message['body'][0] .= "\n\n--" . $trenner . "\n";
$message['body'][0] .= "Content-Type: application/pdf; name=\"" . $filename . "\"\n";
$message['body'][0] .= "Content-Transfer-Encoding: base64\n";
$message['body'][0] .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n";
$message['body'][0] .= chunk_split(base64_encode(theme('webform2pdf_mail2pdf', array(
'nid' => $webform2pdf_send2pdf['nid'],
'sid' => $webform2pdf_send2pdf['sid'],
))));
$message['body'][0] .= "\n\n";
$message['body'][0] .= "--" . $trenner . "--";
}
}
}
}
}
function theme_webform2pdf_mail2pdf($vars) {
$node = node_load($vars['nid']);
$get_submissions = _webform2pdf_get_submissions($vars['nid'], NULL, array(
$vars['sid'],
));
$submission = array_shift($get_submissions);
$template = _webform2pdf_get_template($node->nid);
$pdf = theme('webform2pdf_pdf_init', array(
'node' => $node,
'template' => $template,
));
if (!empty($pdf)) {
$pdf = theme('webform2pdf_pdf_header', array(
'pdf' => $pdf,
'node' => $node,
'template' => $template,
));
$pdf = theme('webform2pdf_pdf_footer', array(
'pdf' => $pdf,
'node' => $node,
'template' => $template,
));
$pdf = theme('webform2pdf_pdf_page', array(
'pdf' => $pdf,
));
if (method_exists($pdf, 'AliasNbPages')) {
$pdf
->AliasNbPages();
}
$page = theme('webform2pdf_content', array(
'node' => $node,
'submission' => $submission,
'template' => $template,
));
$template['pages'] = explode('%pagebreak', $page);
$pdf = theme('webform2pdf_pdf_content', array(
'pdf' => $pdf,
'node' => $node,
'template' => $template,
));
$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;
}