diff --git a/css/islandora.print.css b/css/islandora.print.css new file mode 100644 index 00000000..45fca341 --- /dev/null +++ b/css/islandora.print.css @@ -0,0 +1,72 @@ +/** + * @file + * Print styling + * + * We provide some sane print styling for Drupal, hiding most visuals. + */ +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; +} 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 e1cf9493..a80c41a5 100644 --- a/includes/solution_packs.inc +++ b/includes/solution_packs.inc @@ -173,7 +173,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' => '
', ), @@ -720,7 +720,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..4d54a00f 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -21,8 +21,30 @@ * An array whose values are markup. */ function hook_islandora_view_object($object, $user, $page_number, $page_size) { -} + $output = array(); + if (in_array('islandora:sp_basic_image', $object->models)) { + $resource_url = url("islandora/object/{$object->id}/datastream/OBJ/view"); + $params = array( + 'title' => $object->label, + 'path' => $resource_url, + ); + + // Theme the image seperatly. + $variables['islandora_img'] = theme('image', $params); + $output = theme('islandora_default_print', array( + 'islandora_content' => $variables['islandora_img'])); + } + return $output; +} +/** + * Generate a print friendly page for the given object. + * + * @param object $object + * The object form to print. + */ +function hook_islandora_view_print_object($object) { +} /** * Generate an object's display for the given content model. * diff --git a/islandora.module b/islandora.module index 8a8ee6be..8a136988 100644 --- a/islandora.module +++ b/islandora.module @@ -37,6 +37,7 @@ define('ISLANDORA_VIEW_DATASTREAM_HISTORY', 'view old datastream versions'); // 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'); @@ -103,6 +104,13 @@ function islandora_menu() { 'access callback' => 'islandora_object_access_callback', 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), ); + $items['islandora/object/%islandora_object/print'] = 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, @@ -264,15 +272,6 @@ function islandora_menu() { 'access arguments' => array(ISLANDORA_VIEW_DATASTREAM_HISTORY, 4), 'load arguments' => array(2), ); - $items['islandora/object/%islandora_object/print'] = array( - 'title' => 'Print Object', - 'page callback' => 'islandora_print_object', - 'page arguments' => array(2), - 'type' => MENU_CALLBACK, - 'access callback' => 'islandora_object_access', - 'access arguments' => array(FEDORA_VIEW_OBJECTS, 2), - 'load arguments' => array(2), - ); $items['islandora/object/%islandora_object/download_clip'] = array( 'page callback' => 'islandora_download_clip', 'page arguments' => array(2), @@ -330,7 +329,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( @@ -788,8 +791,24 @@ 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/object/' . $object->id . '/print')), + 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']; @@ -808,12 +827,47 @@ 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(); + $temp_arr = array(); + // Dispatch print hook. + foreach (islandora_build_hook_list(ISLANDORA_PRINT_HOOK, $object->models) as $hook) { + $temp = module_invoke_all($hook, $object); + islandora_as_renderable_array($temp); + if (!empty($temp)) { + $temp_arr = array_merge_recursive($temp_arr, $temp); + } + } + $output = islandora_default_islandora_printer_object($object, drupal_render($temp_arr)); + arsort($output); + islandora_as_renderable_array($output); + + // Prompt to print. + drupal_add_js('jQuery(document).ready(function () { window.print(); });', 'inline'); + return $output; +} /** * Title callback for drupal title. @@ -851,6 +905,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. * @@ -1245,24 +1341,6 @@ function islandora_entity_property_info() { return $info; } - -/** - * Renders the print page for the given object. - * - * Modules can either implement preprocess functions to append content onto the - * 'content' variable, or override the display by providing a theme suggestion. - * - * @param AbstractObject $object - * The object. - * - * @return array - * A renderable array. - */ -function islandora_print_object(AbstractObject $object) { - drupal_set_title($object->label); - return theme('islandora_object_print', array('object' => $object)); -} - /** * Menu callback downloads the given clip. */ 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..3ff21455 --- /dev/null +++ b/theme/islandora-object-img-print.tpl.php @@ -0,0 +1,18 @@ + + +
+ +
+ diff --git a/theme/islandora-object-print.tpl.php b/theme/islandora-object-print.tpl.php new file mode 100644 index 00000000..b9569061 --- /dev/null +++ b/theme/islandora-object-print.tpl.php @@ -0,0 +1,30 @@ + +
+
+ +
+
+ +
+ +
+
+
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 @@ ?>

+