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 @@
?>