diff --git a/print.module b/print.module index 620c7f65fce7a51a8a285ead47e9cdf917f68a86..70018ddabc83c0f5f872bca8cf06f80f88acc7c6 100644 --- a/print.module +++ b/print.module @@ -106,6 +106,42 @@ function print_menu() { return $items; } +/** + * Implementation of hook_block(). + */ +function print_block($op = 'list', $delta = 0, $edit = array()) { + switch ($op) { + case 'list': + $block[$delta]['info'] = t('Printer, e-mail and PDF versions'); + return $block; + break; + case 'configure': + return ''; + case 'save': + return; + case 'view': + $nid = preg_replace('!^node/!', '', $_GET['q']); + if (is_numeric($nid)) { + $node = node_load(array('nid' => $nid)); + } + else { + $node = NULL; + } + $funcs = get_defined_functions(); + $block['content'] = ''; + foreach ($funcs['user'] as $func) { + if (preg_match('!^print.*?_insert_link$!', $func)) { + $link = $func(NULL, $node); + if (!empty($link)) { + $block['content'] .= $link .'<br />'; + } + } + } + return $block; + break; + } +} + /** * Implementation of hook_link(). */ @@ -176,43 +212,36 @@ function print_help($path, $arg) { } $print_html_link_pos = variable_get('print_html_link_pos', array(PRINT_HTML_LINK_POS_DEFAULT => PRINT_HTML_LINK_POS_DEFAULT)); - if (print_link_allowed(array('path' => $path)) && (preg_match('!^node/!i', $path) == 0) && + if ((preg_match('!^node/!i', $path) == 0) && !(empty($print_html_link_pos['link']) && empty($print_html_link_pos['corner']))) { static $output = FALSE; if ($output === FALSE) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $output = TRUE; - return '<span class="print-syslink">'. print_insert_link() .'</span>'; + $link = print_insert_link(); + if ($link) { + return "<span class='print-syslink'>$link</span>"; + } } } } /** - * Implementation of hook_nodeapi(). + * Implementation of hook_nodeapi_view(). */ -function print_nodeapi(&$node, $op = 'view', $teaser, $page) { - switch ($op) { - case 'view': +function print_nodeapi_view(&$node, $teaser, $page) { $print_html_link_pos = variable_get('print_html_link_pos', array(PRINT_HTML_LINK_POS_DEFAULT => PRINT_HTML_LINK_POS_DEFAULT)); - $allowed_type = print_link_allowed(array('node' => $node, 'teaser' => $teaser)); - if (($allowed_type != FALSE) && !empty($print_html_link_pos['corner']) && + if (($teaser === FALSE) && !empty($print_html_link_pos['corner']) && (preg_match('!^print!i', $_GET['q']) == 0)) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); - if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { - $path = PRINT_PATH .'/book/export/html/'. $node->nid; + $link = print_insert_link(NULL, $node); + if ($link) { + $node->content['print_link'] = array( + '#markup' => "<span class='print-link'>$link</span>", + '#weight' => -1, + ); } - else { - $path = NULL; - } - $link = print_insert_link($path); - $node->content['print_link'] = array( - '#value' => "<span class='print-link'>$link</span>", - '#weight' => -1, - ); } - } } /** @@ -299,10 +328,10 @@ function _print_format_link_aux($type = 0, $text = '', $img = '') { $html = TRUE; switch ($type) { case 2: - $text = theme('image', $img, $text, '', array('class' => 'print-icon')); + $text = theme('image', $img, $text, $text, array('class' => 'print-icon')); break; case 3: - $text = theme('image', $img, $text, '', array('class' => 'print-icon print-icon-margin')) . $text; + $text = theme('image', $img, $text, $text, array('class' => 'print-icon print-icon-margin')) . $text; break; } } @@ -366,19 +395,41 @@ function theme_print_text() { * @param $path * path of the original page (optional). If not specified, the current URL * is used + * @param $node + * an optional node object, to be used in defining the path, if used, the + * path argument is irrelevant * @return * string with the HTML link to the printer-friendly page */ -function print_insert_link($path = NULL) { - if (user_access('access print')) { +function print_insert_link($path = NULL, $node = NULL) { + if ($node !== NULL) { + $nid = $node->nid; + $path = 'node/'. $nid; + $allowed_type = print_link_allowed(array('node' => $node)); + } + else { if ($path === NULL) { - $print_html_link_use_alias = variable_get('print_html_link_use_alias', PRINT_HTML_LINK_USE_ALIAS_DEFAULT); + $nid = preg_replace('!^node/!', '', $_GET['q']); + $path = $_GET['q']; + } + else { + $nid = NULL; + } + $allowed_type = print_link_allowed(array('path' => $path)); + } - if ($print_html_link_use_alias) { - $path = drupal_get_path_alias($_GET['q']); + if ($allowed_type) { + if ($nid !== NULL) { + if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { + $path = 'book/export/html/'. $nid; } else { - $path = preg_replace('!^node/!', '', $_GET['q']); + if (variable_get('print_html_link_use_alias', PRINT_HTML_LINK_USE_ALIAS_DEFAULT)) { + $path = drupal_get_path_alias($path); + } + else { + $path = $nid; + } } $path = PRINT_PATH .'/'. $path; $query = print_query_string_encode($_GET, array('q')); @@ -389,9 +440,13 @@ function print_insert_link($path = NULL) { else { $query = NULL; } + drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $format = theme('print_format_link'); return '<span class="print">'. l($format['text'], $path, array('attributes' => $format['attributes'], 'query' => $query, 'absolute' => TRUE, 'html' => $format['html'])) .'</span>'; } + else { + return FALSE; + } } /** @@ -437,6 +492,12 @@ function print_link_allowed($args) { // If showing only the teaser or the user is not allowed or link is disabled return FALSE; } + if (!empty($args['path'])) { + $nid = preg_replace('!^node/!', '', drupal_get_normal_path($args['path'])); + if (is_numeric($nid)) { + $args['node'] = node_load(array('nid' => $nid)); + } + } if (!empty($args['node'])) { static $node_type = FALSE; diff --git a/print_mail/print_mail.module b/print_mail/print_mail.module index ab6be3ad63eaa3a42ff4b4c218b0fd80d6ea0c54..eae220f88485e70711883cbf40883aa56f536eb4 100644 --- a/print_mail/print_mail.module +++ b/print_mail/print_mail.module @@ -3,7 +3,7 @@ /** * @file - * Display printer-friendly versions of Drupal pages + * Displays Printer-friendly versions of Drupal pages. */ define('PRINTMAIL_PATH', 'printmail'); @@ -107,7 +107,9 @@ function print_mail_link($type, $node = NULL, $teaser = FALSE) { return $links; } } - return; + else { + return; + } } /** @@ -115,43 +117,36 @@ function print_mail_link($type, $node = NULL, $teaser = FALSE) { */ function print_mail_help($path, $arg) { $print_mail_link_pos = variable_get('print_mail_link_pos', array(PRINT_MAIL_LINK_POS_DEFAULT => PRINT_MAIL_LINK_POS_DEFAULT)); - if (print_mail_link_allowed(array('path' => $path)) && (preg_match('!^node/!i', $path) == 0) && + if ((preg_match('!^node/!i', $path) == 0) && !(empty($print_mail_link_pos['link']) && empty($print_mail_link_pos['corner']))) { static $output = FALSE; if ($output === FALSE) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $output = TRUE; - - return '<span class="print-syslink">'. print_mail_insert_link() .'</span>'; + + $link = print_mail_insert_link(); + if ($link) { + return "<span class='print-syslink'>$link</span>"; + } } } } /** - * Implementation of hook_nodeapi(). + * Implementation of hook_nodeapi_view(). */ -function print_mail_nodeapi(&$node, $op = 'view', $teaser, $page) { - switch ($op) { - case 'view': +function print_mail_nodeapi_view(&$node, $teaser, $page) { $print_mail_link_pos = variable_get('print_mail_link_pos', array(PRINT_MAIL_LINK_POS_DEFAULT => PRINT_MAIL_LINK_POS_DEFAULT)); - $allowed_type = print_mail_link_allowed(array('node' => $node, 'teaser' => $teaser)); - if (($allowed_type != FALSE) && !empty($print_mail_link_pos['corner']) && + if (($teaser === FALSE) && !empty($print_mail_link_pos['corner']) && (preg_match('!^print!i', $_GET['q']) == 0)) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); - if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { - $path = PRINTMAIL_PATH .'/book/export/html/'. $node->nid; + $link = print_mail_insert_link(NULL, $node); + if ($link) { + $node->content['print_mail_link'] = array( + '#markup' => "<span class='print-link'>$link</span>", + '#weight' => -2, + ); } - else { - $path = NULL; - } - $link = print_mail_insert_link($path); - $node->content['print_mail_link'] = array( - '#value' => "<span class='print-link'>$link</span>", - '#weight' => -2, - ); } - } } /** @@ -202,18 +197,47 @@ function theme_print_mail_format_link() { /** * Auxiliary function to display a formatted send by e-mail link * - * @return string + * Function made available so that developers may call this function from + * their defined pages/blocks. + * + * @param $path + * path of the original page (optional). If not specified, the current URL + * is used + * @param $node + * an optional node object, to be used in defining the path, if used, the + * path argument is irrelevant + * @return + * string with the HTML link to the printer-friendly page */ -function print_mail_insert_link($path = NULL) { - if (user_access('access print')) { +function print_mail_insert_link($path = NULL, $node = NULL) { + if ($node !== NULL) { + $nid = $node->nid; + $path = 'node/'. $nid; + $allowed_type = print_mail_link_allowed(array('node' => $node)); + } + else { if ($path === NULL) { - $print_mail_link_use_alias = variable_get('print_mail_link_use_alias', PRINT_MAIL_LINK_USE_ALIAS_DEFAULT); + $nid = preg_replace('!^node/!', '', $_GET['q']); + $path = $_GET['q']; + } + else { + $nid = NULL; + } + $allowed_type = print_mail_link_allowed(array('path' => $path)); + } - if ($print_mail_link_use_alias) { - $path = drupal_get_path_alias($_GET['q']); + if ($allowed_type) { + if ($nid !== NULL) { + if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { + $path = 'book/export/html/'. $nid; } else { - $path = preg_replace('!^node/!', '', $_GET['q']); + if (variable_get('print_mail_link_use_alias', PRINT_MAIL_LINK_USE_ALIAS_DEFAULT)) { + $path = drupal_get_path_alias($path); + } + else { + $path = $nid; + } } $path = PRINTMAIL_PATH .'/'. $path; $query = print_query_string_encode($_GET, array('q')); @@ -224,9 +248,13 @@ function print_mail_insert_link($path = NULL) { else { $query = NULL; } + drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $format = theme('print_mail_format_link'); return '<span class="print_mail">'. l($format['text'], $path, array('attributes' => $format['attributes'], 'query' => $query, 'absolute' => TRUE, 'html' => $format['html'])) .'</span>'; } + else { + return FALSE; + } } /** @@ -245,6 +273,12 @@ function print_mail_link_allowed($args) { // If showing only the teaser or the user is not allowed or link is disabled return FALSE; } + if (!empty($args['path'])) { + $nid = preg_replace('!^node/!', '', drupal_get_normal_path($args['path'])); + if (is_numeric($nid)) { + $args['node'] = node_load(array('nid' => $nid)); + } + } if (!empty($args['node'])) { static $node_type = FALSE; @@ -261,7 +295,7 @@ function print_mail_link_allowed($args) { $print_mail_node_link_visibility = variable_get('print_mail_node_link_visibility', PRINT_MAIL_NODE_LINK_VISIBILITY_DEFAULT); $print_mail_node_link_pages = variable_get('print_mail_node_link_pages', PRINT_MAIL_NODE_LINK_PAGES_DEFAULT); - if (!empty($node->printing) || + if (!empty($node->printing) || !_print_page_match($print_mail_node_link_visibility, $print_mail_node_link_pages)) { // Page not in visibility list or we are working! return FALSE; @@ -272,7 +306,7 @@ function print_mail_link_allowed($args) { } else { // Node link - if (isset($node_type) && + if (isset($node_type) && !variable_get('print_mail_display_'. $node_type, PRINT_TYPE_SHOW_LINK_DEFAULT)) { // Link for this node type is disabled return FALSE; diff --git a/print_pdf/print_pdf.module b/print_pdf/print_pdf.module index a56ffe5d2ceb0522f57160d8b95f178ae9bd101d..4c24771557215956837a75555663113db3156a6b 100644 --- a/print_pdf/print_pdf.module +++ b/print_pdf/print_pdf.module @@ -3,7 +3,7 @@ /** * @file - * Display printer-friendly versions of Drupal pages + * Displays Printer-friendly versions of Drupal pages. */ define('PRINTPDF_PATH', 'printpdf'); @@ -146,7 +146,9 @@ function print_pdf_link($type, $node = NULL, $teaser = FALSE) { return $links; } } - return; + else { + return; + } } /** @@ -154,43 +156,36 @@ function print_pdf_link($type, $node = NULL, $teaser = FALSE) { */ function print_pdf_help($path, $arg) { $print_pdf_link_pos = variable_get('print_pdf_link_pos', array(PRINT_PDF_LINK_POS_DEFAULT => PRINT_PDF_LINK_POS_DEFAULT)); - if (print_pdf_link_allowed(array('path' => $path)) && (preg_match('!^node/!i', $path) == 0) && + if ((preg_match('!^node/!i', $path) == 0) && !(empty($print_pdf_link_pos['link']) && empty($print_pdf_link_pos['corner']))) { static $output = FALSE; if ($output === FALSE) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $output = TRUE; - - return '<span class="print-syslink">'. print_pdf_insert_link() .'</span>'; + + $link = print_pdf_insert_link(); + if ($link) { + return "<span class='print-syslink'>$link</span>"; + } } } } /** - * Implementation of hook_nodeapi(). + * Implementation of hook_nodeapi_view(). */ -function print_pdf_nodeapi(&$node, $op = 'view', $teaser, $page) { - switch ($op) { - case 'view': +function print_pdf_nodeapi_view(&$node, $teaser, $page) { $print_pdf_link_pos = variable_get('print_pdf_link_pos', array(PRINT_PDF_LINK_POS_DEFAULT => PRINT_PDF_LINK_POS_DEFAULT)); - $allowed_type = print_pdf_link_allowed(array('node' => $node, 'teaser' => $teaser)); - if (($allowed_type != FALSE) && !empty($print_pdf_link_pos['corner']) && + if (($teaser === FALSE) && !empty($print_pdf_link_pos['corner']) && (preg_match('!^print!i', $_GET['q']) == 0)) { - drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); - if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { - $path = PRINTPDF_PATH .'/book/export/html/'. $node->nid; + $link = print_pdf_insert_link(NULL, $node); + if ($link) { + $node->content['print_pdf_link'] = array( + '#markup' => "<span class='print-link'>$link</span>", + '#weight' => -3, + ); } - else { - $path = NULL; - } - $link = print_pdf_insert_link($path); - $node->content['print_pdf_link'] = array( - '#value' => "<span class='print-link'>$link</span>", - '#weight' => -3, - ); } - } } /** @@ -240,20 +235,49 @@ function theme_print_pdf_format_link() { } /** - * Auxiliary function to display a formatted Printer-friendly link + * Auxiliary function to display a formatted PDF version link + * + * Function made available so that developers may call this function from + * their defined pages/blocks. * - * @return string + * @param $path + * path of the original page (optional). If not specified, the current URL + * is used + * @param $node + * an optional node object, to be used in defining the path, if used, the + * path argument is irrelevant + * @return + * string with the HTML link to the printer-friendly page */ -function print_pdf_insert_link($path = NULL) { - if (user_access('access print')) { +function print_pdf_insert_link($path = NULL, $node = NULL) { + if ($node !== NULL) { + $nid = $node->nid; + $path = 'node/'. $nid; + $allowed_type = print_pdf_link_allowed(array('node' => $node)); + } + else { if ($path === NULL) { - $print_pdf_link_use_alias = variable_get('print_pdf_link_use_alias', PRINT_PDF_LINK_USE_ALIAS_DEFAULT); + $nid = preg_replace('!^node/!', '', $_GET['q']); + $path = $_GET['q']; + } + else { + $nid = NULL; + } + $allowed_type = print_pdf_link_allowed(array('path' => $path)); + } - if ($print_pdf_link_use_alias) { - $path = drupal_get_path_alias($_GET['q']); + if ($allowed_type) { + if ($nid !== NULL) { + if ($allowed_type === PRINT_ALLOW_BOOK_LINK) { + $path = 'book/export/html/'. $nid; } else { - $path = preg_replace('!^node/!', '', $_GET['q']); + if (variable_get('print_pdf_link_use_alias', PRINT_PDF_LINK_USE_ALIAS_DEFAULT)) { + $path = drupal_get_path_alias($path); + } + else { + $path = $nid; + } } $path = PRINTPDF_PATH .'/'. $path; $query = print_query_string_encode($_GET, array('q')); @@ -264,9 +288,13 @@ function print_pdf_insert_link($path = NULL) { else { $query = NULL; } + drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css'); $format = theme('print_pdf_format_link'); return '<span class="print_pdf">'. l($format['text'], $path, array('attributes' => $format['attributes'], 'query' => $query, 'absolute' => TRUE, 'html' => $format['html'])) .'</span>'; } + else { + return FALSE; + } } /** @@ -286,6 +314,12 @@ function print_pdf_link_allowed($args) { // If showing only the teaser or the user is not allowed or link is disabled return FALSE; } + if (!empty($args['path'])) { + $nid = preg_replace('!^node/!', '', drupal_get_normal_path($args['path'])); + if (is_numeric($nid)) { + $args['node'] = node_load(array('nid' => $nid)); + } + } if (!empty($args['node'])) { static $node_type = FALSE; @@ -302,7 +336,7 @@ function print_pdf_link_allowed($args) { $print_pdf_node_link_visibility = variable_get('print_pdf_node_link_visibility', PRINT_PDF_NODE_LINK_VISIBILITY_DEFAULT); $print_pdf_node_link_pages = variable_get('print_pdf_node_link_pages', PRINT_PDF_NODE_LINK_PAGES_DEFAULT); - if (!empty($node->printing) || + if (!empty($node->printing) || !_print_page_match($print_pdf_node_link_visibility, $print_pdf_node_link_pages)) { // Page not in visibility list or we are working! return FALSE; @@ -313,7 +347,7 @@ function print_pdf_link_allowed($args) { } else { // Node link - if (isset($node_type) && + if (isset($node_type) && !variable_get('print_pdf_display_'. $node_type, PRINT_TYPE_SHOW_LINK_DEFAULT)) { // Link for this node type is disabled return FALSE; diff --git a/print_pdf/print_pdf.pages.inc b/print_pdf/print_pdf.pages.inc index 4a2466405ea49a8ac49ad814788a70c5dcbbe05d..02900238a43a497cc5c19cfd00a00583ea6c4b45 100644 --- a/print_pdf/print_pdf.pages.inc +++ b/print_pdf/print_pdf.pages.inc @@ -20,6 +20,8 @@ require_once(drupal_get_path('module', 'print') .'/print.pages.inc'); * @see _print_pdf_tcpdf() */ function print_pdf_controller() { + global $base_url; + $args = func_get_args(); // Remove the printpdf/ prefix $path = implode('/', $args); @@ -37,6 +39,15 @@ function print_pdf_controller() { $print['content'] = preg_replace_callback($pattern, '_print_rewrite_urls', $print['content']); $print['logo'] = preg_replace_callback($pattern, '_print_rewrite_urls', $print['logo']); $print['footer_message'] = preg_replace_callback($pattern, '_print_rewrite_urls', $print['footer_message']); + // And converted from private to public paths + $file_downloads = variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC); + if ($file_downloads == FILE_DOWNLOADS_PRIVATE) { + $pattern = "!(<img\s[^>]*?src\s*?=\s*?['\"]?${base_url}/)system/files(/[^>]*?>)!is"; + $replacement = '$1'. file_directory_path() .'$2'; + $print['content'] = preg_replace($pattern, $replacement, $print['content']); + $print['logo'] = preg_replace($pattern, $replacement, $print['logo']); + $print['footer_message'] = preg_replace($pattern, $replacement, $print['footer_message']); + } $node = $print['node']; ob_start(); diff --git a/tests/print_basic.test b/tests/print_basic.test index 011f09d21a37d793b32bdf6204debed65e444e32..6ad38c2cad5646795a606312364f27adf5d331d2 100644 --- a/tests/print_basic.test +++ b/tests/print_basic.test @@ -15,7 +15,7 @@ class PrintBasicTest extends DrupalWebTestCase { /** * Implementation of getInfo(). */ - public function getInfo() { + function getInfo() { return array( 'name' => t('Printer, e-mail and PDF versions tests'), 'description' => t('Unit tests for the print, print_mail and print_pdf modules.'), @@ -26,7 +26,7 @@ class PrintBasicTest extends DrupalWebTestCase { /** * Implementation of setUp(). */ - public function setUp() { + function setUp() { parent::setUp(); // User to set up print. @@ -42,13 +42,13 @@ class PrintBasicTest extends DrupalWebTestCase { /** * Implementation of tearDown(). */ - public function tearDown() { + function tearDown() { $_GET['q'] = $this->getq; parent::tearDown(); } - public function testPrintRewriteUrls() { + function testPrintRewriteUrls() { global $base_url, $base_root; //Must require it, since this function gets called via Drupal's dynamic loading