diff --git a/api/fedora_item.inc b/api/fedora_item.inc index 01d71cfa..463ba6df 100644 --- a/api/fedora_item.inc +++ b/api/fedora_item.inc @@ -622,6 +622,23 @@ class Fedora_Item { return self::soap_call('modifyObject', $params, $quiet); } + function modify_datastream_by_reference($external_url, $dsid, $label, $mime_type, $force = FALSE, $logMessage = 'Modified by Islandora API',$quiet=FALSE) { + $params = array( + 'pid' => $this->pid, + 'dsID' => $dsid, + 'altIDs' => NULL, + 'dsLabel' => $label, + 'MIMEType' => $mime_type, + 'formatURI' => NULL, + 'dsLocation' => $external_url, + 'checksumType' => 'DISABLED', + 'checksum' => 'none', + 'logMessage' => $logMessage, + 'force' => $force + ); + return self::soap_call('modifyDatastreamByReference', $params, $quiet); + } + function modify_datastream_by_value($content, $dsid, $label, $mime_type, $force = FALSE, $logMessage = 'Modified by Islandora API',$quiet=FALSE) { $params = array( 'pid' => $this->pid, @@ -654,6 +671,7 @@ class Fedora_Item { case 'getNextPID': case 'getRelationships': case 'modifyDatastreamByValue': + case 'modifyDatastreamByReference': case 'purgeDatastream': case 'purgeObject': case 'modifyObject': diff --git a/form_elements/islandora_form_elements.module b/form_elements/islandora_form_elements.module index 86cf61a9..75214db0 100644 --- a/form_elements/islandora_form_elements.module +++ b/form_elements/islandora_form_elements.module @@ -24,6 +24,12 @@ function islandora_form_elements_elements() { '#sticky ' => FALSE, '#process' => array('ife_sticky_textarea_process'), ); + + $type['select'] = array( + '#input'=> TRUE, + '#sticky ' => FALSE, + '#process' => array('ife_sticky_select_process'), + ); $type['list'] = array( '#input'=>TRUE, @@ -57,19 +63,19 @@ function islandora_form_elements_elements() { $type['person'] = array( '#input' => TRUE, '#process' => array('ife_person_process'), - '#default_value' => array('fname'=>'', 'lname' => '', 'title' => '', 'role' => ''), + '#default_value' => array('name'=>'', 'date'=>'', 'subject'=>'', 'role' => ''), ); $type['organization'] = array( '#input' => TRUE, '#process' => array('ife_org_process'), - '#default_value' => array( 'organization' => '', 'conference' => ''), + '#default_value' => array( 'organization' => '', 'date'=>'', 'subject'=>'', 'role' => ''), ); $type['conference'] = array( '#input' => TRUE, '#process' => array('ife_conf_process'), - '#default_value' => array( 'conference' => ''), + '#default_value' => array( 'conference' => '', 'date'=>'', 'subject'=>'', 'role' => ''), ); $type['people'] = array( @@ -79,6 +85,7 @@ function islandora_form_elements_elements() { $type['datepicker'] = array( '#input' => TRUE, + '#process' => array('ife_datepicker_process'), ); return $type; @@ -140,7 +147,7 @@ function ife_people_process($element,$edit,&$form_state) $people= array(); if (isset($form_state['storage']['people']) && !empty($form_state['storage']['people'])) { foreach ($form_state['storage']['people'] as $ent) { - if ( trim($ent['fname']) != '' || trim($ent['lname']) != '' || trim($ent['organization']) != '' || trim($ent['title']) != '' || trim($ent['conference']) != '' || trim($ent['role']) != '' || trim($ent['date']) != '') { + if ( trim($ent['name']) != '' || trim($ent['organization']) != '' || trim($ent['conference']) != '' || trim($ent['role']) != '' || trim($ent['date']) != '') { $people[]=$ent; } } @@ -154,20 +161,21 @@ function ife_people_process($element,$edit,&$form_state) switch ($json->type) { case 'personal': - $person['fname']=$json->given; - $person['lname']=$json->family; - $person['title']=$json->title; + $person['name']=$json->name; $person['role']=$json->role; + $person['subject']=$json->subject; $person['date']=$json->date; break; case 'organization': $person['organization'] = $json->name; $person['role'] = $json->role; + $person['subject']=$json->subject; break; case 'conference': $person['conference'] = $json->name; $person['role'] = $json->role; $person['date'] = $json->date; + $person['subject']=$json->subject; break; } @@ -185,7 +193,7 @@ function ife_people_process($element,$edit,&$form_state) } } else { - $form_state['storage']['people']=array( array('fname'=>'','lname'=>'', 'title'=>'', 'role'=>'', 'date'=>'')); + $form_state['storage']['people']=array( array('name'=>'', 'role'=>'', 'date'=>'', 'subject' => '')); } } @@ -273,30 +281,18 @@ function ife_person_process($element) if (!isset($element['#value'])) { - $element['#value'] = array('fname'=>'', 'lname' => ''); + $element['#value'] = array('name'=>''); } - $element['fname'] = array( + $element['name'] = array( '#type' => 'textfield', - '#title'=> t('Given Name(s)'), + '#title'=> t('Name(s)'), '#size' => 30, - '#value' => $element['#value']['fname'], + '#value' => $element['#value']['name'], + '#description' => t('Please enter last name first, followed by a comma and first name.'), ); - - $element['lname'] = array( - '#type' => 'textfield', - '#title' => t('Family Name(s)'), - '#size' => 30, - '#value' => $element['#value']['lname'], - ); - - $element['title'] = array( - '#type' => 'textfield', - '#title' => t('Title'), - '#size' => 30, - '#value' => $element['#value']['title'], - ); + $element['date'] = array( '#type' => 'datepicker', @@ -313,6 +309,14 @@ function ife_person_process($element) '#value' => $element['#value']['role'], '#autocomplete_path' => 'autocomplete_marcrelator/', ); + + $element['subject'] = array( + '#type' => 'checkbox', + '#size'=>30, + '#description'=>t('If checked, this person will be listed as a subject term. If selected, role field does not apply.'), + '#title' => t('Subject'), + '#value' => $element['#value']['subject'], + ); $element['remove'] = array( @@ -339,7 +343,7 @@ function ife_org_process($element) if (!isset($element['#value'])) { - $element['#value'] = array('fname'=>'', 'lname' => ''); + $element['#value'] = array('name'=>''); } @@ -351,7 +355,15 @@ function ife_org_process($element) '#value' => $element['#value']['role'], '#autocomplete_path' => 'autocomplete_marcrelator/', ); - + + $element['subject'] = array( + '#type' => 'checkbox', + '#size'=>30, + '#description'=>t('If checked, this organization will be listed as a subject term. If selected, role field does not apply.'), + '#title' => t('Subject'), + '#value' => $element['#value']['subject'], + ); + $element['organization'] = array( '#type' => 'textfield', '#title' => t('Organization'), @@ -384,7 +396,7 @@ function ife_conf_process($element) if (!isset($element['#value'])) { - $element['#value'] = array('fname'=>'', 'lname' => ''); + $element['#value'] = array('name'=>''); } @@ -396,6 +408,13 @@ function ife_conf_process($element) '#autocomplete_path' => 'autocomplete_marcrelator/', ); + $element['subject'] = array( + '#type' => 'checkbox', + '#size'=>30, + '#description'=>t('If checked, this conference will be listed as a subject term. If selected, role field does not apply.'), + '#title' => t('Subject'), + '#value' => $element['#value']['subject'], + ); $element['conference'] = array( '#type' => 'textfield', @@ -454,6 +473,30 @@ function ife_sticky_textfield_process($element,$edit,&$form_state) return $element; } +/** + * Our process callback to expand the control. + */ +function ife_datepicker_process($element,$edit,&$form_state) +{ + + + if (isset($element['#sticky']) && $element['#sticky'] == TRUE) + { + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + + if (isset($element['#post'][$stickyName]) && strtolower($element['#post'][$stickyName]) == 'on') + { + $form_state['storage'][$element['#name']]=$element['#value']; + } elseif (isset($form_state['storage'][$element['#name']])) + { + $element['#value'] = $form_state['storage'][$element['#name']]; + $element['#sticky_on'] = TRUE; + } + } + + return $element; +} + /** @@ -481,6 +524,32 @@ function ife_sticky_textarea_process($element,$edit,&$form_state) return $element; } + +/** + * Our process callback to expand the control. + */ +function ife_sticky_select_process($element,$edit,&$form_state) +{ + + + if (isset($element['#sticky']) && $element['#sticky'] == TRUE) + { + $element['#type'] = 'sticky_select'; + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + + if (isset($element['#post'][$stickyName]) && strtolower($element['#post'][$stickyName]) == 'on') + { + $form_state['storage'][$element['#name']]=$element['#value']; + } elseif (isset($form_state['storage'][$element['#name']])) + { + $element['#value'] = $form_state['storage'][$element['#name']]; + $element['#sticky_on'] = TRUE; + } + } + + return $element; +} + /** * Our process callback to expand the control. */ @@ -488,6 +557,27 @@ function ife_copyright_process($element,$edit,&$form_state) { module_load_include('inc','islandora_form_elements','includes/creative_commons'); + if (isset($element['#sticky']) && $element['#sticky'] == TRUE) + { + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + + if (isset($element['#post'][$stickyName]) && strtolower($element['#post'][$stickyName]) == 'on') + { + $form_state['storage'][$element['#name']]=$element['#value']; + } elseif (isset($form_state['storage'][$element['#name']])) + { + $element['#value'] = $form_state['storage'][$element['#name']]; + $element['#sticky_on'] = TRUE; + } + } + + if ($element['#sticky']) { + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); + } + $element['#tree'] = TRUE; if (isset($element['#value']) && !is_array($element['#value'])) { @@ -500,7 +590,7 @@ function ife_copyright_process($element,$edit,&$form_state) { $element['#value'] = array('cc_commercial' => '', 'cc_modifications' => '', 'cc_jurisdiction' => ''); } - $element['cc'] = array('#type' => 'fieldset', '#title'=>$element['#title'], '#description' => '
preview
' , '#collapsible' => TRUE); + $element['cc'] = array('#type' => 'fieldset', '#title'=>$element['#title'], '#description' => $sticky.'
preview
' , '#collapsible' => TRUE); $element['cc']['cc_enable'] = array( '#type' => 'checkbox', @@ -579,9 +669,15 @@ function islandora_form_elements_theme() { 'sticky_textfield' => array( 'arguments' => array('element'), ), + 'sticky_textarea' => array( 'arguments' => array('element'), ), + + 'sticky_select' => array( + 'arguments' => array('element'), + ), + 'filechooser' => array( 'arguments' => array('element'), 'file' => 'includes/filechooser.inc' @@ -625,7 +721,7 @@ function theme_copyright($element) $path=drupal_get_path('module','islandora_form_elements'); drupal_add_js($path.'/js/copyright.js'); drupal_add_css($path.'/css/copyright.css'); - + return theme('form_element', $element, $element['#children']); } @@ -672,11 +768,13 @@ function theme_list($element) $output .= ' '. $element['#field_suffix'] .''; } - $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; - $output .= (isset($element['#sticky']) && $element['#sticky'] == TRUE?' Sticky?':'') . ''; + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); - return theme('form_element', $element, $output ) . $extra; + return theme('form_element', $element, $output . $sticky ) . $extra; } @@ -696,6 +794,7 @@ function theme_list($element) function theme_sticky_textarea($element) { $class = array('form-textarea'); + // Add teaser behavior (must come before resizable) if (!empty($element['#teaser'])) { drupal_add_js('misc/teaser.js'); @@ -711,8 +810,10 @@ function theme_sticky_textarea($element) { $class[] = 'resizable'; } + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; - $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?' Sticky?':''); + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); _form_set_class($element, $class); @@ -720,6 +821,33 @@ function theme_sticky_textarea($element) { } + +/** + * Format a sticky select. + * + * @param $element + * An associative array containing the properties of the element. + * Properties used: title, value, description, rows, cols, required, attributes + * @return + * A themed HTML string representing the textarea. + * + * @ingroup themeable + */ +function theme_sticky_select($element) { + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); + $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); + + + $select = ''; + $size = $element['#size'] ? ' size="'. $element['#size'] .'"' : ''; + _form_set_class($element, array('form-select')); + $multiple = $element['#multiple']; + return theme('form_element', $element, ''.$sticky); +} + + /** * Theme function to format the output. * @@ -759,11 +887,14 @@ function theme_datepicker($element) { $output .= ' '. $element['#field_suffix'] .''; } + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; - $output .= (isset($element['#sticky']) && $element['#sticky'] == TRUE?' Sticky?':'') . ''; + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); + - return theme('form_element', $element, $output ) . $extra; + return theme('form_element', $element, $output.$sticky ) . $extra; } @@ -803,11 +934,14 @@ function theme_sticky_textfield($element) { $output .= ' '. $element['#field_suffix'] .''; } + $path=drupal_get_path('module','islandora_form_elements'); + drupal_add_css($path.'/css/sticky.css'); $stickyName = preg_replace('/\]/','',array_pop(preg_split('/\[/',$element['#name']))).'-sticky'; - $output .= (isset($element['#sticky']) && $element['#sticky'] == TRUE?' Sticky?':'') . ''; + $sticky = (isset($element['#sticky']) && $element['#sticky'] == TRUE?'
':''); + - return theme('form_element', $element, $output ) . $extra; + return theme('form_element', $element, $output . $sticky) . $extra; } diff --git a/ilives/book.inc b/ilives/book.inc index d05f41d4..f3de4f00 100644 --- a/ilives/book.inc +++ b/ilives/book.inc @@ -21,6 +21,15 @@ class IslandoraBook { // Set #cache to true to create the $form_state cache $form['#cache'] = TRUE; + + // Give the user an option to enter a custom PID + $form['custom_pid'] = array( + '#type' => 'textfield', + '#title' => 'Custom PID', + '#description' => 'If you want to manually specify the PID for the new object, enter it here. '. + 'Leave it blank for an automatically-generated PID.', + ); + // Prompt the user to enter a record ID to be looked up in Evergreen. $form['unapi_url'] = array( '#type' => 'textfield', @@ -90,7 +99,7 @@ class IslandoraBook { return TRUE; } - public function handleIngestForm($form_values, $form, &$form_state) { + public function handleIngestForm($form_values) { /* * process the metadata form * Create fedora object @@ -115,16 +124,21 @@ class IslandoraBook { global $user; $mimetype = new MimeClass(); - $new_item = Fedora_Item::ingest_new_item($form_values['pid'], 'A', $title, + + $new_item = Fedora_Item::ingest_new_item(!empty($form_values['custom_pid']) ? $form_values['custom_pid'] : $form_values['pid'], 'A', $title, $user->name); $new_item->add_datastream_from_string($form_values['mods']['mods_record'], 'MODS', 'MODS Metadata', 'text/xml', 'X'); + $dc = transform_mods_to_dc($form_values['mods']['mods_record']); + if ($dc) { + $new_item->modify_datastream_by_value($dc, 'DC', 'Dublin Core XML Metadata', 'text/xml'); + } $new_item->add_relationship('hasModel', $form_values['content_model_pid'], FEDORA_MODEL_URI); $new_item->add_relationship(!empty($form_values['relationship']) ? $form_values['relationship'] : 'isMemberOfCollection', $form_values['collection_pid']); } - + public function buildAddPagesForm($form = array()) { } @@ -248,3 +262,25 @@ function ilives_add_single_page_object($book_pid, $page_file, $page_num = 1, $pa $page_item->add_relationship('isMemberOf', $book_pid); $page_item->add_datastream_from_file($page_file, 'TIFF', 'Archival TIFF', 'image/tiff', 'M'); } + +function transform_mods_to_dc($mods) { + $xp = new XsltProcessor(); + // create a DOM document and load the XSL stylesheet + $xsl = new DomDocument; + $xsl->load(drupal_get_path('module', 'fedora_ilives').'/xsl/MODS3-22simpleDC.xsl'); + + // import the XSL styelsheet into the XSLT process + $xp->importStylesheet($xsl); + + // create a DOM document and load the XML datat + $xml_doc = new DomDocument; + $xml_doc->loadXML($mods); + + // transform the XML into HTML using the XSL file + if ($dc = $xp->transformToXML($xml_doc)) { + return $dc; + } + else { + return FALSE; + } +} \ No newline at end of file diff --git a/ilives/fedora_ilives.module b/ilives/fedora_ilives.module index 1e40ce7b..84a4b4a5 100644 --- a/ilives/fedora_ilives.module +++ b/ilives/fedora_ilives.module @@ -203,9 +203,11 @@ function fedora_ilives_create_book_view($pid, $query = NULL) { $simpleDCxml = simplexml_load_string($dc_xml); $types = $simpleDCxml->xpath('//dc:type'); $ingested = 'false'; - foreach ($types as $type) { - if ($type == 'ingested') { - $ingested = 'true'; + if (!empty($types)) { + foreach ($types as $type) { + if ($type == 'ingested') { + $ingested = 'true'; + } } } diff --git a/ilives/xsl/MODS3-22simpleDC.xsl b/ilives/xsl/MODS3-22simpleDC.xsl new file mode 100644 index 00000000..4a4eff8d --- /dev/null +++ b/ilives/xsl/MODS3-22simpleDC.xsl @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + . + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- + + + + + -- + + + + + + + + + + + + + + + + + + + + + + + + -- + + + + + + + + + + + + + + + - + + + + + + + + + -- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Collection + + + DataSet + + + Service + + + Software + + + Image + + + InteractiveResource + + + MovingImage + + + PhysicalObject + + + Sound + + + StillImage + + + Text + + + Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- + + + + + + + + + + + -- + + + + + + + + + + + + + + + + + + + + + + , + + + + , + + + + + ( + + ) + + + ( + + ) + + + + + + + + + - + + + + + - + + + + + + + + + + + + diff --git a/plugins/ImageManipulation.inc b/plugins/ImageManipulation.inc index 2e2f9b1c..9971c367 100644 --- a/plugins/ImageManipulation.inc +++ b/plugins/ImageManipulation.inc @@ -17,8 +17,14 @@ class ImageManipulation { function createPreview($parameterArray, $dsid, $file, $file_ext) { $system = getenv('System'); $file_suffix = '_' . $dsid . '.' . $file_ext; - $height = $parameterArray['height']; - $width = $parameterArray['width']; + $width = $parameterArray['width']; + + if (!isset($parameterArray['height'])) { + $height = $width; + } else { + $height = $parameterArray['height']; + } + $returnValue = TRUE; $output = array(); @@ -29,7 +35,7 @@ class ImageManipulation { } if (!file_exists($destFile)) { - exec('convert -resize ' . $width . ' -quality 85 "' . $file . '"[0] -strip "' .$destFile . '" 2>&1 &', $output, $returnValue); + exec('convert -resize ' . $width . 'x'.$height.' -quality 85 "' . $file . '"[0] -strip "' .$destFile . '" 2>&1 &', $output, $returnValue); } else $returnValue = '0'; diff --git a/plugins/nmlt/scorm.inc b/plugins/nmlt/scorm.inc index 09b05076..13c77f4c 100644 --- a/plugins/nmlt/scorm.inc +++ b/plugins/nmlt/scorm.inc @@ -99,26 +99,28 @@ class SCORMObject { //$result = db_query("SELECT * FROM {content_node_field} nf INNER JOIN {content_node_field_instance} ni ON nf.field_name = ni.field_name WHERE nf.type='field_fedora_pid_reference'"); fedora_pidfield_redirect_to_node($this); - module_load_include('module', 'SCORM', 'SCORM'); - $dest_array = explode('/', urldecode(drupal_get_destination())); - $nid = $dest_array[count($dest_array) - 1]; - $node = node_load($nid); - - $tabset = array(); - - $tabset['my_tabset'] = array( - '#type' => 'tabset', - ); - - $tabset['my_tabset']['first_tab'] = array( + $tabset['my_tabset']['first_tab'] = array( '#type' => 'tabpage', '#title' => t('Description'), ); - $tabset['my_tabset']['second_tab'] = array( - '#type' => 'tabpage', - '#title' => t('Results'), - '#content' => scorm_show_results($node), - ); + if (module_load_include('module', 'SCORM', 'SCORM')) { + $dest_array = explode('/', urldecode(drupal_get_destination())); + $nid = $dest_array[count($dest_array) - 1]; + $node = node_load($nid); + + $tabset = array(); + + $tabset['my_tabset'] = array( + '#type' => 'tabset', + ); + $tabset['my_tabset']['second_tab'] = array( + '#type' => 'tabpage', + '#title' => t('Results'), + '#content' => scorm_show_results($node), + ); + } + + module_load_include('inc', 'fedora_repository', 'ObjectHelper'); $obj = new ObjectHelper(); $tabset['my_tabset']['first_tab']['tabset'] = array( diff --git a/workflow_client/plugins/image_resize.inc b/workflow_client/plugins/image_resize.inc index 9bbae454..d7e31b3a 100644 --- a/workflow_client/plugins/image_resize.inc +++ b/workflow_client/plugins/image_resize.inc @@ -39,7 +39,7 @@ class image_resize extends Process { $returnValue = TRUE; $output = array(); - $command = 'convert -resize '. $parameters['width'] .' -quality 85 '. $file . '[0] -strip '. $file . $file_suffix .' 2>&1 &'; + $command = 'convert -resize '. $parameters['width'].(isset($parameters['height'])?'x'.$parameters['height']:'') .' -quality 85 '. $file . '[0] -strip '. $file . $file_suffix .' 2>&1 &'; exec($command, $output, $returnValue); if (!file_exists($file . $file_suffix)) {