From 8ed4573edd7fd22eb140d653292346086de0f109 Mon Sep 17 00:00:00 2001 From: Jason MacWilliams Date: Tue, 5 Jun 2012 11:07:46 -0300 Subject: [PATCH 1/4] updated object details page --- ObjectDetails.inc | 109 ++++++++--- formClass.inc | 28 ++- object_details_xslts/convertQDC.xsl | 33 ++++ object_details_xslts/mods2html.xsl | 232 ++++++++++++++++++++++++ plugins/FedoraObjectDetailedContent.inc | 3 +- 5 files changed, 369 insertions(+), 36 deletions(-) create mode 100644 object_details_xslts/convertQDC.xsl create mode 100644 object_details_xslts/mods2html.xsl diff --git a/ObjectDetails.inc b/ObjectDetails.inc index 96349868..8c2b7b45 100644 --- a/ObjectDetails.inc +++ b/ObjectDetails.inc @@ -1,5 +1,17 @@ array( @@ -29,11 +41,25 @@ function fedora_repository_islandora_object_details_display() { return $profiles; } +/** + * The renderer for the "hidden" display mode. In this mode, no data is + * displayed. This is supplied so you can disable the object details metadata + * display without disabling the tab entirely. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_hidden($item) { // do nothing return ""; } +/** + * The renderer for the "xslt" display mode. In this mode, an xslt is applied + * to the selected datastream to produce a user defined look and feel to the + * output data. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_XSLT($item) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); @@ -47,13 +73,13 @@ function fedora_repository_object_details_XSLT($item) { $xmlstr = $item->get_datastream_dissemination($dsid); if (empty($xmlstr)) { - return ''; + return t('Error - could not find datastream @dsid on object @pid
Please contact the site administrator.', + array('@dsid' => $dsid, '@pid' => $item->pid)); } try { $proc = new XsltProcessor(); } catch (Exception $e) { - drupal_set_message($e->getMessage(), 'error'); watchdog('fedora_repository', "Error while creating XSLT processor: @e", array('@e' => $e->getMessage()), WATCHDOG_ERROR); return; } @@ -61,25 +87,27 @@ function fedora_repository_object_details_XSLT($item) { $proc->setParameter('', 'baseUrl', $base_url); $proc->setParameter('', 'path', $base_url . '/' . $path); $input = NULL; - - $xsl_file = './'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl'); - if (is_readable($xsl_file)) { - $xsl = new DOMDocument(); - $xsl->load($xsl_file); - $input = new DOMDocument(); + $xsl = new DomDocument(); + try { + $xsl->load('./'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl')); + $input = new DomDocument(); $input->loadXML(trim($xmlstr)); - $xsl = $proc->importStylesheet($xsl); - $newdom = $proc->transformToDoc($input); - $output = $newdom->saveHTML(); - return $output; - } - else { - watchdog('fedora_repository', 'The XSLT file @xslt_name is not readable.', array( - '@xslt_name' => $xsl_file, - )); + } catch (Exception $e) { + watchdog('fedora_repository', "Problem loading XSL file: @e", array('@e' => $e->getMessage()), NULL, WATCHDOG_ERROR); } + $xsl = $proc->importStylesheet($xsl); + $newdom = $proc->transformToDoc($input); + $output = $newdom->saveHTML(); + return $output; } +/** + * The renderer for the "table" display mode. In this mode, the requested + * datastream is rendered using a simple table with keys(tags) on the left and + * values on the right. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_table($item) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); @@ -93,7 +121,8 @@ function fedora_repository_object_details_table($item) { $xmlstr = $item->get_datastream_dissemination($dsid); if (empty($xmlstr)) { - return ''; + return t('Error - could not find datastream @dsid on object @pid
Please contact the site administrator.', + array('@dsid' => $dsid, '@pid' => $item->pid)); } $simplexml = new SimpleXMLElement($xmlstr); @@ -123,7 +152,11 @@ function fedora_repository_object_details_table($item) { return theme('table', $headers, $rows, array('class' => 'dc-table')); } -// configuration pages +/** + * Configuration page for the xslt display mode. This mode requires two + * parameters: the datastream to render, and the xslt to apply to it. + * @return The configuration page. + */ function fedora_repository_object_details_XSLT_config() { $form = array(); $form['config'] = array( @@ -131,10 +164,22 @@ function fedora_repository_object_details_XSLT_config() { '#title' => t("XSLT display options"), ); + // locate the xslts available + $xslt_folder = "object_details_xslts/"; + $folder = drupal_get_path("module", "fedora_repository") ."/". $xslt_folder; + // retrieve the filenames from the system + $xslts = file_scan_directory($folder, ".xsl"); + $options = array(); + foreach ($xslts as $xsl) { + $options[$xslt_folder . $xsl->basename] = $xsl->basename; + } + $form['config']['xslt'] = array( - '#type' => 'textfield', + '#type' => 'select', '#title' => t("XSL transform to use"), '#default_value' => variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl'), + '#options' => $options, + '#key_type' => 'associative', '#required' => TRUE, ); $form['config']['dsid'] = array( @@ -151,7 +196,21 @@ function fedora_repository_object_details_XSLT_config() { return $form; } +/** + * Custom submit handler for the xslt configuration page. + * @param form + * @pararm form_state The user supplied values for the form. + */ +function fedora_repository_object_details_XSLT_config_submit($form, &$form_state) { + variable_set('islandora_object_details_xslt_sheet', $form_state['values']['xslt']); + variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']); +} +/** + * Configuration page for the table display mode. This mode requires only one + * parameter: the datastream to render. + * @return The configuration page. + */ function fedora_repository_object_details_table_config() { $form = array(); $form['config'] = array( @@ -174,11 +233,11 @@ function fedora_repository_object_details_table_config() { return $form; } -function fedora_repository_object_details_XSLT_config_submit($form, &$form_state) { - variable_set('islandora_object_details_xslt_sheet', $form_state['values']['xslt']); - variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']); -} - +/** + * Custom submit handler for the table configuration page. + * @param form + * @pararm form_state The user supplied values for the form. + */ function fedora_repository_object_details_table_config_submit($form, &$form_state) { variable_set('islandora_object_details_table_datastream', $form_state['values']['dsid']); } diff --git a/formClass.inc b/formClass.inc index c7d57843..fc3b1748 100644 --- a/formClass.inc +++ b/formClass.inc @@ -317,11 +317,19 @@ class formClass { $profiles = module_invoke_all("islandora_object_details_display"); $display_options = array(); - foreach ($profiles as $machine_name => $profile) { - $display_options[$machine_name] = $profile['name']; - $config_path = $profile['config']; - if (isset($config_path) && $config_path != ""){ - $display_options[$machine_name] .= " (". l("config", $config_path, array()) .")"; + // suppress php warnings from empty lists + if ($profiles) { + foreach ($profiles as $machine_name => $profile) { + // make sure the name exists (the bare minimum) + if (array_key_exists('name', $profile)) { + $display_options[$machine_name] = $profile['name']; + if (array_key_exists('config', $profile)) { + $config_path = $profile['config']; + if (isset($config_path) && $config_path != "") { + $display_options[$machine_name] .= " (". l("config", $config_path, array()) .")"; + } + } + } } } $form['tabs']['islandora_object_details_display_table'] = array( @@ -362,10 +370,10 @@ class formClass { '#description' => t('When enabled, restricts access to fedora object datastreams that are not listed in the Islandora Content Model for the object (unless the user is an administrator).'), ); - $form['advanced']['fedora_repository_use_imagecache_external_in_collection_view'] = array( - '#type' => 'checkbox', - '#title' => t('Allow imagecache_external use for thumbnails in collection view'), - '#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE), + $form['advanced']['fedora_repository_use_imagecache_external_in_collection_view'] = array( + '#type' => 'checkbox', + '#title' => t('Allow imagecache_external use for thumbnails in collection view'), + '#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE), '#description' => t('If enabled, the default collection list view (or ' . 'anywhere the function "@function" is used) will try to use ' . 'imagecache_external, defaulting to the "@preset" preset. XSLTs may ' . @@ -374,7 +382,7 @@ class formClass { '@function' => '_fedora_repository_render_image()', '@preset' => 'fedora_repository_collection_thumbnail', '@xsl' => 'sparql_to_html.xsl', - )), + )), ); $form['advanced']['fedora_collection_display_list'] = array( diff --git a/object_details_xslts/convertQDC.xsl b/object_details_xslts/convertQDC.xsl new file mode 100644 index 00000000..5d881e35 --- /dev/null +++ b/object_details_xslts/convertQDC.xsl @@ -0,0 +1,33 @@ + + + + + + + + + + +
+ + + + + + + + + + +

MetaData

+ +
+ = +
+
+
+ +
+ + +
\ No newline at end of file diff --git a/object_details_xslts/mods2html.xsl b/object_details_xslts/mods2html.xsl new file mode 100644 index 00000000..3f794523 --- /dev/null +++ b/object_details_xslts/mods2html.xsl @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + + + + + ( + + + + + + + Edition + ) + + + + ="", + + + + + () + + +
diff --git a/plugins/FedoraObjectDetailedContent.inc b/plugins/FedoraObjectDetailedContent.inc index c193c588..f1d7949b 100644 --- a/plugins/FedoraObjectDetailedContent.inc +++ b/plugins/FedoraObjectDetailedContent.inc @@ -65,7 +65,8 @@ class FedoraObjectDetailedContent { $dc_html = $details_function($this->item); } else { - // problem + // problem - display profile not found + watchdog('fedora_repository', "Error - could not find object details display function @function", array('@function' => $details_function), WATCHDOG_WARNING); } } From 1b43b3169d7d1eddd831372557c24b143a9f62dd Mon Sep 17 00:00:00 2001 From: Jason MacWilliams Date: Tue, 5 Jun 2012 13:42:54 -0300 Subject: [PATCH 2/4] fixed xslt paths --- ObjectDetails.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectDetails.inc b/ObjectDetails.inc index 8c2b7b45..46f5fdf7 100644 --- a/ObjectDetails.inc +++ b/ObjectDetails.inc @@ -89,7 +89,7 @@ function fedora_repository_object_details_XSLT($item) { $input = NULL; $xsl = new DomDocument(); try { - $xsl->load('./'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl')); + $xsl->load('./'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'object_details_xslts/convertQDC.xsl')); $input = new DomDocument(); $input->loadXML(trim($xmlstr)); } catch (Exception $e) { @@ -177,7 +177,7 @@ function fedora_repository_object_details_XSLT_config() { $form['config']['xslt'] = array( '#type' => 'select', '#title' => t("XSL transform to use"), - '#default_value' => variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl'), + '#default_value' => variable_get('islandora_object_details_xslt_sheet', 'object_details_xslts/convertQDC.xsl'), '#options' => $options, '#key_type' => 'associative', '#required' => TRUE, From 1872a0f47ef811c467a6065fb1cc57e79fc97de1 Mon Sep 17 00:00:00 2001 From: Jason MacWilliams Date: Tue, 5 Jun 2012 13:44:03 -0300 Subject: [PATCH 3/4] moved mods2html file to object_details_xslts/ --- xsl/mods2html.xsl | 207 ---------------------------------------------- 1 file changed, 207 deletions(-) delete mode 100644 xsl/mods2html.xsl diff --git a/xsl/mods2html.xsl b/xsl/mods2html.xsl deleted file mode 100644 index 194fcec2..00000000 --- a/xsl/mods2html.xsl +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : - - - - - - - - ( - - - - - - - Edition - ) - - - - ="", - - - - - () - - -
From 8428eb239378ca2b4e3ecc69d18dc757f23403a7 Mon Sep 17 00:00:00 2001 From: Jason MacWilliams Date: Tue, 5 Jun 2012 13:57:58 -0300 Subject: [PATCH 4/4] configured better error detection around a missing xslt file --- ObjectDetails.inc | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ObjectDetails.inc b/ObjectDetails.inc index 46f5fdf7..bc6bf02f 100644 --- a/ObjectDetails.inc +++ b/ObjectDetails.inc @@ -87,17 +87,24 @@ function fedora_repository_object_details_XSLT($item) { $proc->setParameter('', 'baseUrl', $base_url); $proc->setParameter('', 'path', $base_url . '/' . $path); $input = NULL; - $xsl = new DomDocument(); - try { - $xsl->load('./'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'object_details_xslts/convertQDC.xsl')); + + $xsl_file = './'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'object_details_xslts/convertQDC.xsl'); + // set an error message in case xslt parsing fails + $output = t("Failed to parse xslt file at @xsltFile", array('@xsltFile' => $xsl_file)); + if (is_readable($xsl_file)) { + $xsl = new DomDocument(); $input = new DomDocument(); - $input->loadXML(trim($xmlstr)); - } catch (Exception $e) { - watchdog('fedora_repository', "Problem loading XSL file: @e", array('@e' => $e->getMessage()), NULL, WATCHDOG_ERROR); + try { + $xsl->load($xsl_file); + + $input->loadXML(trim($xmlstr)); + } catch (Exception $e) { + watchdog('fedora_repository', "Problem loading XSL file: @e", array('@e' => $e->getMessage()), NULL, WATCHDOG_ERROR); + } + $xsl = $proc->importStylesheet($xsl); + $newdom = $proc->transformToDoc($input); + $output = $newdom->saveHTML(); } - $xsl = $proc->importStylesheet($xsl); - $newdom = $proc->transformToDoc($input); - $output = $newdom->saveHTML(); return $output; }