diff --git a/css/islandora.print.css b/css/islandora.print.css new file mode 100644 index 00000000..d54bb366 --- /dev/null +++ b/css/islandora.print.css @@ -0,0 +1,72 @@ +/** + * @file + * Print styling + * + * We provide some sane print styling for Drupal using Zen's layout method. + */ +a:link, +a:visited { /* underline all links */ + text-decoration: underline !important; +} + +#site-name a:link, +#site-name a:visited { /* Don't underline header */ + text-decoration: none !important; +} + +#content a[href^="javascript:"]:after, +#content a[href^="#"]:after { /* Only display useful links. */ +/* content: ""; */ +} + +#content abbr[title]:after { /* Add visible title after abbreviations. */ +/* content: " (" attr(title) ")"; */ +} + +#content { + left: 0 !important; + width: 100% !important; +} +uncomment when ready to test printing +#header { + display: none !important; +} + +#content { /* Un-float the content */ + float: none !important; + width: 100% !important; + margin: 0 !important; + padding: 0 !important; +} + +body, +#page, +#main, +#content { /* Turn off any background colors or images */ + color: #000; + background-color: transparent !important; + background-image: none !important; +} + +body.sidebar-first { + left: 0 !important; + width: 100% !important; +} +#skip-link, +#toolbar, +#navigation, +/* .region-sidebar-first, */ +/* .region-sidebar-second, */ +#header, +#footer, +.breadcrumb, +.tabs, +.action-links, +.links, +.book-navigation, +.forum-topic-navigation, +.pager, +.feed-icons { /* Hide sidebars and nav elements */ + visibility: hidden !important; + display: none !important; +} \ No newline at end of file diff --git a/images/print-icon.png b/images/print-icon.png new file mode 100644 index 00000000..5f5a3b3c Binary files /dev/null and b/images/print-icon.png differ diff --git a/includes/solution_packs.inc b/includes/solution_packs.inc index 72749d0d..52b5ba5b 100644 --- a/includes/solution_packs.inc +++ b/includes/solution_packs.inc @@ -131,7 +131,7 @@ function islandora_solution_pack_form(array $form, array &$form_state, $solution '#markup' => t('Object status: !image !status', array( '!image' => $solution_pack_status_info['image'], '!status' => $solution_pack_status_info['solution_pack'], - )), + )), '#prefix' => '
', '#suffix' => '
', ), @@ -623,7 +623,7 @@ function theme_islandora_viewers_table($variables) { 'header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'islandora-viewers-table'), - )); + )); $output .= drupal_render_children($form); return $output; } diff --git a/islandora.api.php b/islandora.api.php index 129787f4..80accfde 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -23,6 +23,16 @@ function hook_islandora_view_object($object, $user, $page_number, $page_size) { } +/** + * An alter hook to print friendly page for the given object. + * + * @param object $object + * The object form to print. + * @param string $output + * The object form to print + */ +function hook_islandora_view_print_object_alter($object, &$output) { +} /** * Generate an object's display for the given content model. * diff --git a/islandora.module b/islandora.module index 5b45fb1a..b295b7ea 100644 --- a/islandora.module +++ b/islandora.module @@ -36,6 +36,7 @@ define('FEDORA_MANAGE_PROPERTIES', 'manage object properties'); // Hooks. define('ISLANDORA_VIEW_HOOK', 'islandora_view_object'); +define('ISLANDORA_PRINT_HOOK', 'islandora_view_print_object'); define('ISLANDORA_EDIT_HOOK', 'islandora_edit_object'); define('ISLANDORA_OVERVIEW_HOOK', 'islandora_overview_object'); define('ISLANDORA_PRE_INGEST_HOOK', 'islandora_ingest_pre_ingest'); @@ -102,6 +103,13 @@ function islandora_menu() { 'access callback' => 'islandora_object_access_callback', 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), ); + $items['islandora/print/%islandora_object'] = array( + 'page callback' => 'islandora_printer_object', + 'page arguments' => array(2), + 'type' => MENU_NORMAL_ITEM, + 'access callback' => 'islandora_object_access_callback', + 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), + ); $items['islandora/object/%islandora_object/view'] = array( 'title' => 'View', 'type' => MENU_DEFAULT_LOCAL_TASK, @@ -289,6 +297,12 @@ function islandora_theme() { 'file' => 'theme/theme.inc', 'template' => 'theme/islandora-object-edit', 'variables' => array('islandora_object' => NULL), + ), + // Default edit page. + 'islandora_default_print' => array( + 'file' => 'theme/theme.inc', + 'template' => 'theme/islandora-object-print', + 'variables' => array('islandora_object' => NULL), ), // Admin table for solution pack viewer selection. 'islandora_viewers_table' => array( @@ -298,7 +312,11 @@ function islandora_theme() { // Print object view. 'islandora_object_print' => array( 'file' => 'theme/theme.inc', - 'variables' => array('object' => NULL, 'content' => array()), + 'template' => 'theme/islandora-object-print', + 'variables' => array( + 'object' => NULL, + 'content' => NULL, + 'islandora_content' => NULL), ), // Render a bunch of objects as either a grid or a list. 'islandora_objects' => array( @@ -744,8 +762,20 @@ function islandora_view_default_object() { function islandora_view_object(AbstractObject $object) { module_load_include('inc', 'islandora', 'includes/breadcrumb'); module_load_include('inc', 'islandora', 'includes/utilities'); + + // Add the print button via JavaScript. + $path = drupal_get_path('module', 'islandora'); + drupal_add_js(array( + 'islandora' => array( + 'print_img' => $path . '/images/print-icon.png'), + ), array('type' => 'setting')); + + drupal_add_js(array('islandora' => array('print_link' => '/islandora/print/' . $object->id)), array('type' => 'setting')); + drupal_add_js($path . '/js/add_print.js'); + drupal_set_title($object->label); drupal_set_breadcrumb(islandora_get_breadcrumbs($object)); + // Optional pager parameters. $page_number = (empty($_GET['page'])) ? '1' : $_GET['page']; $page_size = (empty($_GET['pagesize'])) ? '10' : $_GET['pagesize']; @@ -764,12 +794,73 @@ function islandora_view_object(AbstractObject $object) { // No results, use the default view. $output = islandora_default_islandora_view_object($object); } + arsort($output); drupal_alter($hooks, $object, $output); islandora_as_renderable_array($output); return $output; } +/** + * This will prepare an object to be printed. + * + * By default, all fedora objects can print DC record data, + * however, Solution packs that wish to modify the form + * to be printed must implement hook_islandora_view_print_object_alter, + * create a theme.tpl.php file, and return its markup by calling + * theme(themename.tpl.php). + * + * @param AbstractObject $object + * The object to print. + * + * @return string + * An HTML representation of this object. + */ +function islandora_printer_object(AbstractObject $object) { + + $output = array(); + $output = NULL; + $islandora_object = islandora_object_load($object->id); + $obj_pid = urldecode($object->id); + $resource_url = ''; + + // Check for a valid image/pdf/large image cmodel + // TODO: More preprocessing on large image and pdf to optimize view. + if (in_array('islandora:sp_basic_image', $islandora_object->models)) { + $resource_url = url("islandora/object/{$obj_pid}/datastream/OBJ/view"); + } + elseif (in_array('islandora:sp_large_image_cmodel', $islandora_object->models)) { + $resource_url = url("islandora/object/{$obj_pid}/datastream/JPG/view"); + } + elseif (in_array('islandora:sp_pdf', $islandora_object->models)) { + // Check for higher quality data stream if available. + $dsid = isset($obj['HQ_JPG']) ? 'HQ_JPG' : 'PREVIEW'; + $resource_url = url("islandora/object/{$obj_pid}/datastream/{$dsid}/view"); + } + + $params = array( + 'title' => $islandora_object->label, + 'path' => $resource_url, + ); + // Theme the image seperatly. + $variables['islandora_img'] = theme('image', $params); + $output = islandora_default_islandora_printer_object($object, $variables['islandora_img']); + + // Dispatch print hook. + foreach (islandora_build_hook_list(ISLANDORA_PRINT_HOOK, $object->models) as $hook) { + $temp = module_invoke_all($hook, $output); + islandora_as_renderable_array($temp); + if (!empty($temp)) { + $output = array_merge_recursive($output, $temp); + } + } + + arsort($output); + drupal_alter(ISLANDORA_PRINT_HOOK, $object, $output); + islandora_as_renderable_array($output); + + return $output; +} /** * Title callback for drupal title. @@ -807,6 +898,48 @@ function islandora_default_islandora_view_object($object) { ); } +/** + * Append the image alter to the printable form. + * + * @param AbstractObject $object + * The fedora object to print. + * @param unknown $alter + * The string representation of the themed viewable object. + * + * @return array + * A renderable array + */ +function islandora_default_islandora_printer_object($object, $alter) { + module_load_include('inc', 'islandora', 'includes/utilities'); + module_load_include('inc', 'islandora', 'includes/datastream'); + + $path = drupal_get_path('module', 'islandora'); + drupal_add_css($path . '/css/islandora.print.css'); + + $islandora_object = islandora_object_load($object->id); + $repository = $islandora_object->repository; + + try { + $dc = $islandora_object['DC']->content; + $dc_object = DublinCore::importFromXMLString($dc); + } + catch (Exception $e) { + drupal_set_message(t('Error retrieving object %s %t', array('%s' => $islandora_object->id, '%t' => $e->getMessage())), 'error', FALSE); + } + + $variables = isset($dc_object) ? $dc_object->asArray() : array(); + $output = theme('islandora_object_print', array( + 'object' => $object, + 'dc_array' => $variables, + 'islandora_content' => $alter)); + + return array( + 'Default output' => array( + '#markup' => $output, + ), + ); +} + /** * Just a wrapper around fetchings the IslandoraTuque object. * diff --git a/js/add_print.js b/js/add_print.js new file mode 100644 index 00000000..7af5c3ca --- /dev/null +++ b/js/add_print.js @@ -0,0 +1,18 @@ +/** + * @file +* JavaScript file responsable for the print button behaviour. +* +* The print button is added automatically to every view, as metadata +* can be printed from every object. +* +*/ +(function ($) { + $(document).ready(function() { + $('.tabs .primary').append(''); + $('#print_btn').css("cursor","pointer"); + $('#print_btn').click(function() { + window.location=Drupal.settings.islandora.print_link; + }); + }); +})(jQuery); + diff --git a/theme/islandora-object-img-print.tpl.php b/theme/islandora-object-img-print.tpl.php new file mode 100644 index 00000000..2c79a88e --- /dev/null +++ b/theme/islandora-object-img-print.tpl.php @@ -0,0 +1,18 @@ + + +
+ +
+ \ No newline at end of file diff --git a/theme/islandora-object-print.tpl.php b/theme/islandora-object-print.tpl.php new file mode 100644 index 00000000..3e6243bc --- /dev/null +++ b/theme/islandora-object-print.tpl.php @@ -0,0 +1,30 @@ + +
+
+ +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/theme/islandora-object.tpl.php b/theme/islandora-object.tpl.php index 13b40ba0..6fa306c3 100644 --- a/theme/islandora-object.tpl.php +++ b/theme/islandora-object.tpl.php @@ -60,6 +60,7 @@ ?>

+
diff --git a/theme/theme.inc b/theme/theme.inc index f07f95d4..51cc3bee 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -165,6 +165,7 @@ function islandora_preprocess_islandora_object_print(array &$variables) { * Implements theme_hook(). */ function theme_islandora_object_print(array &$variables) { + dsm(array('obj_print' => 'obj_in_print')); return drupal_render($variables['content']); }