Browse Source

Merge pull request #127 from jmacwilliams/6.x

6.x
pull/128/merge
Jonathan Green 13 years ago
parent
commit
74f53c7b43
  1. 118
      ObjectDetails.inc
  2. 28
      formClass.inc
  3. 33
      object_details_xslts/convertQDC.xsl
  4. 37
      object_details_xslts/mods2html.xsl
  5. 3
      plugins/FedoraObjectDetailedContent.inc

118
ObjectDetails.inc

@ -1,5 +1,17 @@
<?php <?php
/**
* @file ObjectDetails.inc
* The functions required to define and respond to all the default object
* details display modes.
*/
/**
* Islandora core object details display modes. These are the default display
* modes that are always available.
* @return A list of display modes that can be used to render the object details
* page.
*/
function fedora_repository_islandora_object_details_display() { function fedora_repository_islandora_object_details_display() {
$profiles = array( $profiles = array(
'hidden' => array( 'hidden' => array(
@ -29,11 +41,25 @@ function fedora_repository_islandora_object_details_display() {
return $profiles; 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) { function fedora_repository_object_details_hidden($item) {
// do nothing // do nothing
return ""; 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) { function fedora_repository_object_details_XSLT($item) {
global $base_url; global $base_url;
$path = drupal_get_path('module', 'fedora_repository'); $path = drupal_get_path('module', 'fedora_repository');
@ -47,13 +73,13 @@ function fedora_repository_object_details_XSLT($item) {
$xmlstr = $item->get_datastream_dissemination($dsid); $xmlstr = $item->get_datastream_dissemination($dsid);
if (empty($xmlstr)) { if (empty($xmlstr)) {
return ''; return t('Error - could not find datastream @dsid on object @pid<br/>Please contact the site administrator.',
array('@dsid' => $dsid, '@pid' => $item->pid));
} }
try { try {
$proc = new XsltProcessor(); $proc = new XsltProcessor();
} catch (Exception $e) { } catch (Exception $e) {
drupal_set_message($e->getMessage(), 'error');
watchdog('fedora_repository', "Error while creating XSLT processor: @e", array('@e' => $e->getMessage()), WATCHDOG_ERROR); watchdog('fedora_repository', "Error while creating XSLT processor: @e", array('@e' => $e->getMessage()), WATCHDOG_ERROR);
return; return;
} }
@ -61,25 +87,34 @@ function fedora_repository_object_details_XSLT($item) {
$proc->setParameter('', 'baseUrl', $base_url); $proc->setParameter('', 'baseUrl', $base_url);
$proc->setParameter('', 'path', $base_url . '/' . $path); $proc->setParameter('', 'path', $base_url . '/' . $path);
$input = NULL; $input = NULL;
$xsl_file = './'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'xsl/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)) { if (is_readable($xsl_file)) {
$xsl = new DOMDocument(); $xsl = new DomDocument();
$xsl->load($xsl_file); $input = new DomDocument();
$input = new DOMDocument(); try {
$input->loadXML(trim($xmlstr)); $xsl->load($xsl_file);
$xsl = $proc->importStylesheet($xsl);
$newdom = $proc->transformToDoc($input); $input->loadXML(trim($xmlstr));
$output = $newdom->saveHTML(); } catch (Exception $e) {
return $output; watchdog('fedora_repository', "Problem loading XSL file: @e", array('@e' => $e->getMessage()), NULL, WATCHDOG_ERROR);
} }
else { $xsl = $proc->importStylesheet($xsl);
watchdog('fedora_repository', 'The XSLT file @xslt_name is not readable.', array( $newdom = $proc->transformToDoc($input);
'@xslt_name' => $xsl_file, $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) { function fedora_repository_object_details_table($item) {
global $base_url; global $base_url;
$path = drupal_get_path('module', 'fedora_repository'); $path = drupal_get_path('module', 'fedora_repository');
@ -93,7 +128,8 @@ function fedora_repository_object_details_table($item) {
$xmlstr = $item->get_datastream_dissemination($dsid); $xmlstr = $item->get_datastream_dissemination($dsid);
if (empty($xmlstr)) { if (empty($xmlstr)) {
return ''; return t('Error - could not find datastream @dsid on object @pid<br/>Please contact the site administrator.',
array('@dsid' => $dsid, '@pid' => $item->pid));
} }
$simplexml = new SimpleXMLElement($xmlstr); $simplexml = new SimpleXMLElement($xmlstr);
@ -123,7 +159,11 @@ function fedora_repository_object_details_table($item) {
return theme('table', $headers, $rows, array('class' => 'dc-table')); 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() { function fedora_repository_object_details_XSLT_config() {
$form = array(); $form = array();
$form['config'] = array( $form['config'] = array(
@ -131,10 +171,22 @@ function fedora_repository_object_details_XSLT_config() {
'#title' => t("XSLT display options"), '#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( $form['config']['xslt'] = array(
'#type' => 'textfield', '#type' => 'select',
'#title' => t("XSL transform to use"), '#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, '#required' => TRUE,
); );
$form['config']['dsid'] = array( $form['config']['dsid'] = array(
@ -151,7 +203,21 @@ function fedora_repository_object_details_XSLT_config() {
return $form; 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() { function fedora_repository_object_details_table_config() {
$form = array(); $form = array();
$form['config'] = array( $form['config'] = array(
@ -174,11 +240,11 @@ function fedora_repository_object_details_table_config() {
return $form; return $form;
} }
function fedora_repository_object_details_XSLT_config_submit($form, &$form_state) { /**
variable_set('islandora_object_details_xslt_sheet', $form_state['values']['xslt']); * Custom submit handler for the table configuration page.
variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']); * @param form
} * @pararm form_state The user supplied values for the form.
*/
function fedora_repository_object_details_table_config_submit($form, &$form_state) { function fedora_repository_object_details_table_config_submit($form, &$form_state) {
variable_set('islandora_object_details_table_datastream', $form_state['values']['dsid']); variable_set('islandora_object_details_table_datastream', $form_state['values']['dsid']);
} }

28
formClass.inc

@ -317,11 +317,19 @@ class formClass {
$profiles = module_invoke_all("islandora_object_details_display"); $profiles = module_invoke_all("islandora_object_details_display");
$display_options = array(); $display_options = array();
foreach ($profiles as $machine_name => $profile) { // suppress php warnings from empty lists
$display_options[$machine_name] = $profile['name']; if ($profiles) {
$config_path = $profile['config']; foreach ($profiles as $machine_name => $profile) {
if (isset($config_path) && $config_path != ""){ // make sure the name exists (the bare minimum)
$display_options[$machine_name] .= " (". l("config", $config_path, array()) .")"; 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( $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).'), '#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( $form['advanced']['fedora_repository_use_imagecache_external_in_collection_view'] = array(
'#type' => 'checkbox', '#type' => 'checkbox',
'#title' => t('Allow imagecache_external use for thumbnails in collection view'), '#title' => t('Allow imagecache_external use for thumbnails in collection view'),
'#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE), '#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE),
'#description' => t('If enabled, the default collection list view (or ' . '#description' => t('If enabled, the default collection list view (or ' .
'anywhere the function "@function" is used) will try to use ' . 'anywhere the function "@function" is used) will try to use ' .
'imagecache_external, defaulting to the "@preset" preset. XSLTs may ' . 'imagecache_external, defaulting to the "@preset" preset. XSLTs may ' .
@ -374,7 +382,7 @@ class formClass {
'@function' => '_fedora_repository_render_image()', '@function' => '_fedora_repository_render_image()',
'@preset' => 'fedora_repository_collection_thumbnail', '@preset' => 'fedora_repository_collection_thumbnail',
'@xsl' => 'sparql_to_html.xsl', '@xsl' => 'sparql_to_html.xsl',
)), )),
); );
$form['advanced']['fedora_collection_display_list'] = array( $form['advanced']['fedora_collection_display_list'] = array(

33
object_details_xslts/convertQDC.xsl

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="BASEURL">
<xsl:value-of select="$baseUrl"/>
</xsl:variable>
<xsl:variable name="PATH">
<xsl:value-of select="$path"/>
</xsl:variable>
<xsl:template match="/">
<div><table cellspacing="3" cellpadding="3"><tbody>
<tr><th colspan="3"><h3>MetaData</h3></th></tr>
<xsl:for-each select="/*/*">
<xsl:variable name="FULLFIELD" select="name()"/>
<xsl:variable name="FIELD" select="local-name()"/>
<xsl:variable name="DATA" select="text()"/>
<xsl:if test="$DATA != ' '">
<tr><td><strong><xsl:value-of select="local-name()"/></strong></td><td><xsl:value-of select="text()"/>
<xsl:for-each select="*">
<div>
<xsl:value-of select="local-name()"/> = <xsl:value-of select="text()"/>
</div>
</xsl:for-each>
</td></tr>
</xsl:if>
</xsl:for-each>
</tbody></table></div>
</xsl:template>
</xsl:stylesheet>

37
xsl/mods2html.xsl → object_details_xslts/mods2html.xsl

@ -3,11 +3,36 @@
<xsl:variable name="dictionary" select="document('http://www.loc.gov/standards/mods/modsDictionary.xml')/dictionary"/> <xsl:variable name="dictionary" select="document('http://www.loc.gov/standards/mods/modsDictionary.xml')/dictionary"/>
<xsl:template match="/"> <xsl:template match="/">
<!--html> <html>
<head> <head>
<style type="text/css">TD {vertical-align:top}</style> <style type="text/css">
.modsLabelTop {
}
.modsLabelLevel2 {
padding-left: 10px;
}
.modsLabelLevel3 {
padding-left: 20px;
}
.modsLabelLevel4 {
padding-left: 30px;
}
.modsValueTop {
}
.modsValueLevel2 {
}
.modsValueLevel3 {
}
</style>
</head> </head>
<body--> <body>
<xsl:choose> <xsl:choose>
<xsl:when test="mods:modsCollection"> <xsl:when test="mods:modsCollection">
<xsl:apply-templates select="mods:modsCollection"/> <xsl:apply-templates select="mods:modsCollection"/>
@ -16,8 +41,8 @@
<xsl:apply-templates select="mods:mods"/> <xsl:apply-templates select="mods:mods"/>
</xsl:when> </xsl:when>
</xsl:choose> </xsl:choose>
<!--/body> </body>
</html--> </html>
</xsl:template> </xsl:template>
<xsl:template match="mods:modsCollection"> <xsl:template match="mods:modsCollection">
@ -38,7 +63,7 @@
<span class="modsLabelTop"> <span class="modsLabelTop">
<xsl:call-template name="longName"> <xsl:call-template name="longName">
<xsl:with-param name="name"> <xsl:with-param name="name">
<xsl:value-of select="local-name()"/> <xsl:value-of select="local-name()"/>:
</xsl:with-param> </xsl:with-param>
</xsl:call-template> </xsl:call-template>
<xsl:call-template name="attr"/> <xsl:call-template name="attr"/>

3
plugins/FedoraObjectDetailedContent.inc

@ -65,7 +65,8 @@ class FedoraObjectDetailedContent {
$dc_html = $details_function($this->item); $dc_html = $details_function($this->item);
} }
else { 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);
} }
} }

Loading…
Cancel
Save