From 39ac9b530678c348a41449a661ff3dd4b85c94a3 Mon Sep 17 00:00:00 2001 From: Paul Pound Date: Mon, 28 May 2012 16:00:03 -0300 Subject: [PATCH] added add datastream form --- includes/datastream.inc | 125 ++++++------ islandora-object-edit.tpl.php | 2 + islandora.module | 178 ++++++++++++++---- .../islandora_basic_image.module | 19 -- 4 files changed, 201 insertions(+), 123 deletions(-) diff --git a/includes/datastream.inc b/includes/datastream.inc index 6fa95ddc..980977c4 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -4,6 +4,7 @@ * @file datastream.inc */ +define('DS_COMP_STREAM', 'DS-COMPOSITE-MODEL'); /** * * @global object $user @@ -12,9 +13,6 @@ * @return stream * prints datastream to browser */ - -define('DS_COMP_STREAM', 'DS-COMPOSITE-MODEL'); - function islandora_datastream_as_attachment($object_id, $dsid) { module_load_include('inc', 'islandora', 'RestConnection'); global $user; @@ -36,7 +34,6 @@ function islandora_datastream_as_attachment($object_id, $dsid) { exit(); } - /** * * @param array $arr @@ -44,31 +41,29 @@ function islandora_datastream_as_attachment($object_id, $dsid) { * @param string $ds_comp_stream * the dscomposite stream as xml */ -function islandora_update_available_dsids_array(&$arr, $ds_comp_stream){ +function islandora_get_defined_dsids_array(&$arr, $ds_comp_stream) { $sxml = new SimpleXMLElement($ds_comp_stream); - foreach($sxml->dsTypeModel as $ds){ + foreach ($sxml->dsTypeModel as $ds) { //$arr[$ds['ID']] $mimes = array(); - foreach($ds->form as $form){ - $mimetype = (string)$form['MIME']; + foreach ($ds->form as $form) { + $mimetype = (string) $form['MIME']; $mimes[] = $mimetype; } - $dsid = (string)$ds['ID']; - if($dsid != 'AUDIT'){ - $arr[(string)$ds['ID']] = $mimes; + $dsid = (string) $ds['ID']; + if ($dsid != 'AUDIT') { + $arr[(string) $ds['ID']] = $mimes; } - } + } } /** - * this function may not be being used - * @param type $pid - * @param type $form_state - * @return string + * + * @global type $user + * @param string $object_id + * @return string|array */ -function islandora_add_datastream_form($object_id, &$form_state) { - //dump_vars($form_state); - // Populate the list of datastream IDs. +function islandora_get_unused_dsids($object_id) { module_load_include('inc', 'islandora', 'RestConnection'); global $user; try { @@ -76,76 +71,62 @@ function islandora_add_datastream_form($object_id, &$form_state) { $fedora_object = new FedoraObject($object_id, $restConnection->repository); } catch (Exception $e) { drupal_set_message(t('Error getting Islandora object %s ', array('%s' => $object_id)), 'error'); - return ""; + return; } if (!isset($fedora_object)) { drupal_set_message(t('Could not create add datastream form for %s'), array('%s' => $object_id)); return; } $models = $fedora_object->models; - $available_dsids = array(); + $defined_dsids = array(); if (isset($models)) { foreach ($models as $model) { try { $model_object = new FedoraObject($model, $restConnection->repository); - $dscomposite_stream = $model_object[DS_COMP_STREAM]->content; - islandora_update_available_dsids_array($available_dsids, $dscomposite_stream); + if (isset($model_object[DS_COMP_STREAM])) { + $dscomposite_stream = $model_object[DS_COMP_STREAM]->content; + islandora_get_defined_dsids_array($defined_dsids, $dscomposite_stream); + } } catch (Exception $e) { //do nothing as other objects may have a dscompsite stream } - //$model_ds_comp = } } - - /*if (!empty($content_models)) { - foreach ($content_models as $content_model) { - - - $newElements = $content_model->listDatastreams(); - if (!empty($newElements)) { - $available_dsids = array_merge($available_dsids, $newElements); - } - } - } - - $item = new Fedora_Item($pid); - $used_datastreams = $item->get_datastreams_list_as_SimpleXML(); - $used_datastream_ids = array(); - foreach ($used_datastreams->datastreamDef as $used_datastream) { - array_push($used_datastream_ids, $used_datastream->ID); - } - $unused_dsids = array(); - - if ($form_state['submitted'] && $form_state['clicked_button']['#value'] != 'OK') { - $form['add_datastream_label'] = array( - '#value' => t('

The datastream has been uploaded.

'), - '#weight' => -10, - ); - $form['#redirect'] = "fedora/repository/$pid/"; - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('OK') - ); - return $form; - } - if (!empty($available_dsids)) { - $unused_dsids = array_diff($available_dsids, $used_datastream_ids); - if (empty($unused_dsids)) { - return; + foreach ($defined_dsids as $key => $value) { + if (isset($fedora_object[$key])) { + unset($defined_dsids[$key]); //ds exists in the object so don't show in the dropdown } } + return $defined_dsids; +} - $form['add_datastream_label'] = array( +/** + * buids the default add datastream form + * @param string $object_id + * @param array $form_state + * @return array + * a form ready to be rendered with a call to Drupal render + */ +function islandora_get_add_datastream_form($object_id, &$form_state) { + $unused_dsids = islandora_get_unused_dsids($object_id); //$defined_dsids; + $form = array(); + $form['add_fieldset'] = array( + '#type' => 'fieldset', + '#title' => 'Add a datastream', + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['add_fieldset']['add_datastream_label'] = array( '#value' => t('

Add Datastream:

'), '#weight' => -10, ); $form['pid'] = array( '#type' => 'hidden', - '#value' => "$pid" + '#value' => "$object_id" ); - $form['stream_label'] = array( + $form['add_fieldset']['stream_label'] = array( '#title' => 'Datastream Label', '#required' => 'TRUE', '#description' => t('A Human readable label'), @@ -153,35 +134,35 @@ function islandora_add_datastream_form($object_id, &$form_state) { ); $form['#attributes']['enctype'] = 'multipart/form-data'; - $form['add-stream-file-location'] = array( + $form['add_fieldset']['add-stream-file-location'] = array( '#type' => 'file', '#title' => t('Upload Document'), '#size' => 48, // '#required'=>'TRUE', '#description' => t('The file to upload.') ); - $form['#redirect'] = "fedora/repository/$pid/"; - $form['submit'] = array( + $form['#redirect'] = "islandora/object/$object_id/"; + $form['add_fieldset']['submit'] = array( '#type' => 'submit', '#value' => t('Add Datastream') ); if (!empty($unused_dsids)) { $dsidsForForm = array(); - foreach ($unused_dsids as $dsid) { - $dsidsForForm[$dsid] = $dsid; + foreach ($unused_dsids as $key => $value) { + $dsidsForForm[$key] = $key; } - $form['stream_id'] = array( + $form['add_fieldset']['stream_id'] = array( '#type' => 'select', '#title' => t('Datastream ID'), '#default_value' => variable_get('feed_item_length', 'teaser'), '#weight' => '-1', '#description' => t('Datastream IDs defined by the content model.'), ); - $form['stream_id']['#options'] = array_combine($unused_dsids, $unused_dsids); + $form['add_fieldset']['stream_id']['#options'] = $dsidsForForm; } else { - $form['stream_id'] = array( + $form['add_fieldset']['stream_id'] = array( '#title' => 'Datastream ID', '#required' => 'TRUE', '#description' => t('An ID for this stream that is unique to this object. Must start with a letter and contain only alphanumeric characters and dashes and underscores.'), @@ -189,5 +170,5 @@ function islandora_add_datastream_form($object_id, &$form_state) { '#weight' => -1, ); } - return $form;*/ + return $form; } diff --git a/islandora-object-edit.tpl.php b/islandora-object-edit.tpl.php index 33674e6c..f06d8f64 100644 --- a/islandora-object-edit.tpl.php +++ b/islandora-object-edit.tpl.php @@ -52,7 +52,9 @@ foreach ($islandora_datastreams as $dsid => $ds) { print (' ' . l('download', $ds['download_url'])); print (' ' . l('delete', $ds['delete_url'])); print ('
'); + } +print (drupal_render($variables['add_datastream_form'])); print (l(t('Edit Metadata'),$variables['islandora_editmetadata_url'])); ?> diff --git a/islandora.module b/islandora.module index 01f92abe..cc05d079 100644 --- a/islandora.module +++ b/islandora.module @@ -59,14 +59,14 @@ function islandora_menu() { 'weight' => 0, ); /* may not need this - $items['admin/islandora/solution_packs'] = array( + $items['admin/islandora/solution_packs'] = array( 'title' => 'Solution Packs', 'description' => 'Install content models and collections required by installed solution packs.', 'page callback' => 'islandora_solution_packs_page', 'access arguments' => array(FEDORA_ADD_DS), 'file' => 'admin/islandora.solutionpacks.inc', 'type' => MENU_NORMAL_ITEM, - );*/ + ); */ $items['islandoracm.xsd'] = array( 'title' => 'Islandora Content Model XML Schema Definition', @@ -99,7 +99,7 @@ function islandora_menu() { 'type' => MENU_NORMAL_ITEM, 'access arguments' => array(FEDORA_VIEW), ); - + $items['islandora/object/%'] = array( 'title' => 'Repository', 'page callback' => 'islandora_view_object', @@ -111,8 +111,8 @@ function islandora_menu() { $items['islandora/object/%/add'] = array( 'title' => 'Add to an object', - 'file' => 'includes/add-menu.inc', - 'page callback' => 'islandora_add_callback', + //'file' => 'includes/add-menu.inc', + 'page callback' => 'islandora_add_datastream', 'page arguments' => array(2), 'type' => MENU_NORMAL_ITEM, 'access arguments' => array(FEDORA_ADD_DS) @@ -142,7 +142,7 @@ function islandora_menu() { 'type' => MENU_LOCAL_TASK, 'access arguments' => array(FEDORA_MODIFY_STATE), ); - + $items['islandora/object/%/manage/datastreams'] = array( 'title' => 'Datastreams', 'page callback' => 'islandora_edit_object', @@ -150,17 +150,17 @@ function islandora_menu() { 'type' => MENU_LOCAL_TASK, 'access arguments' => array(FEDORA_PURGE), 'weight' => -10, - ); - + ); + $items['islandora/object/%/manage/properties'] = array( 'title' => 'Properties', 'page callback' => 'islandora_edit_properties', 'page arguments' => array(2), - 'type' => MENU_LOCAL_TASK, + 'type' => MENU_LOCAL_TASK, 'access arguments' => array(FEDORA_MODIFY_STATE), 'weight' => -5, ); - + $items['islandora/object/%/delete'] = array( 'title' => 'Purge object', @@ -216,12 +216,9 @@ function islandora_menu() { return $items; } - - function islandora_admin_paths_alter(&$paths) { - + $paths['*/manage*'] = TRUE; - } /** @@ -346,8 +343,8 @@ function islandora_edit_object($object_id) { return $output; } -function islandora_edit_properties($object_id){ - return 'edit properties '.$object_id; +function islandora_edit_properties($object_id) { + return 'edit properties ' . $object_id; } /** @@ -444,11 +441,11 @@ function islandora_view_default_object() { * * @return string */ -function islandora_view_object($object_id) { +function islandora_view_object($object_id = NULL) { //return $object_id; if (!isset($object_id)) { - drupal_set_message(t('Cannot view object, object id not set')); - return; + $object_id = variable_get('islandora_repository_pid', 'islandora:root'); + //return; } $page_number = (empty($_GET['page'])) ? '1' : $_GET['page']; @@ -474,7 +471,7 @@ function islandora_view_object($object_id) { foreach ($arr as $key => $value) { $output .= $value; //if we have multiple modules handle one cmodel we need to iterate over multiple } - return $output; + return $output; } /** @@ -487,7 +484,7 @@ function islandora_islandora_view_object($object) { $supported_models = islandora_get_types(); $output = ""; foreach ($object->models as $model) { - if (isset($supported_models[$model][ISLANDORA_VIEW_HOOK]) && (boolean)$supported_models[$model][ISLANDORA_VIEW_HOOK] === TRUE) {//another module is handling the view + if (isset($supported_models[$model][ISLANDORA_VIEW_HOOK]) && (boolean) $supported_models[$model][ISLANDORA_VIEW_HOOK] === TRUE) {//another module is handling the view return; } } @@ -550,7 +547,7 @@ function islandora_permission() { } /** - * + * Not implemented * @param string $object_id * @return type */ @@ -559,14 +556,14 @@ function islandora_add_datastream($object_id) { drupal_set_message(t('Cannot add datastream to object, object id not set')); return; } - //send message to synapse - $object = new IslandoraObject($object_id); - - if (!isset($object)) { - drupal_set_message(t('Could not remove object, object not found')); - return; + $object = islandora_get_object($object_id); + if (isset($object)) { + $form = drupal_get_form('islandora_add_datastream_form', $object); + drupal_set_title($object->label); + return drupal_render($form); } - module_invoke_all('islandora_add_datastream', $object); //allow submodules to handle add datastream based on object type + return ""; + // hook form alter might be enough heremodule_invoke_all('islandora_add_datastream', $object); //allow submodules to handle add datastream based on object type } function islandora_preprocess_islandora_default(&$variables) { @@ -587,14 +584,131 @@ function islandora_preprocess_islandora_default(&$variables) { } } +function islandora_get_object($object_id) { + module_load_include('inc', 'islandora', 'RestConnection'); + global $user; + try { + $restConnection = new RestConnection($user); + $fedora_object = new FedoraObject($object_id, $restConnection->repository); + } catch (Exception $e) { + drupal_set_message(t('Error getting Islandora object %s', array('%s' => $object_id)), 'error'); + return NULL; + } + return $fedora_object; +} + +/** + * Builds the default add a datastream form. + * @param array $form + * @param array $form_state + * @param Object $islandora_object + * @return type + */ +function islandora_add_datastream_form($form, &$form_state, $islandora_object) { + module_load_include('inc', 'islandora', 'includes/datastream'); + $form = islandora_get_add_datastream_form($islandora_object->id, $form_state); + return $form; +} + +/** + * Default implmentation currently only does M (managed datastreams) + * other modules can hook form alter to add other functionality + * @global string $base_url + * @global object $user + * Drupal user + * @param array $form + * @param array $form_state + * @return type + */ +function islandora_add_datastream_form_submit($form, &$form_state) { + global $base_url; + if (!empty($form_state['submit']) && $form_state['submit'] == 'OK') { + $form_state['rebuild'] = TRUE; + return; + } + + $file = $form_state['values']['add-stream-file-location']; + $file = drupal_realpath($file); + $object_id = $form_state['values']['pid']; + $dsid = $form_state['values']['stream_id']; + $ds_label = $form_state['values']['stream_label']; // Add the file extention to the end of the label.; + //$dformat = $mimetype->getType($file); + $controlGroup = "M"; + //if ($dformat == 'text/xml') { + // $controlGroup = 'X'; + //} + global $user; + try { + $restConnection = new RestConnection($user); + $fedora_object = new FedoraObject($object_id, $restConnection->repository); + $ds = $fedora_object->constructDatastream($dsid, $controlGroup); + $ds->label = $ds_label; + $ds->setContentFromFile($file); + $fedora_object->ingestDatastream($ds); + $d_file = file_load($form_state['values']['fid']); + file_delete($d_file); + } catch (exception $e) { + drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error'); + return; + } + $form_state['rebuild'] = TRUE; +} + +/** + * validates this datastream id against its allowed mimetypes in the dscomposite + * of its content models. + * @param array $form + * @param array $form_state + * @return boolean + */ +function islandora_add_datastream_form_validate($form, &$form_state) { + module_load_include('inc', 'islandora', 'includes/MimeClass'); + $mimetype = new MimeClass(); + if ($form_state['clicked_button']['#value'] == 'OK') { + $form_state['rebuild'] = TRUE; + return; + } + $dsid = $form_state['values']['stream_id']; + $dsLabel = $form_state['values']['stream_label']; + if (strlen($dsid) > 64) { + form_set_error('', t('Data stream ID cannot be more than 64 characters.')); + return FALSE; + } + if (!(preg_match("/^[a-zA-Z]/", $dsid))) { + form_set_error('', t("Data stream ID (@dsid) has to start with a letter.", array('@dsid' => check_plain($dsid)))); + return FALSE; + } + if (strlen($dsLabel) > 64) { + form_set_error('', t('Data stream Label cannot be more than 64 characters.')); + return FALSE; + } + if (strpos($dsLabel, '/')) { + form_set_error('', t('Data stream Label cannot contain a "/".')); + return FALSE; + } + $mimetype = new MimeClass(); + $unused_dsids = islandora_get_unused_dsids($form_state['values']['pid']); + $types_allowed = $unused_dsids[$dsid]; + $arr = array(); + foreach ($types_allowed as $type) { + $arr[] = $mimetype->getExtension($type); + } + $file = file_save_upload('add-stream-file-location', array('file_validate_extensions' => $arr)); + if ($file) { + $form_state['values']['add-stream-file-location'] = $file->uri; + $form_state['values']['fid'] = $file->fid; //so we can load it to delete later + } + else { + form_set_error('add-stream-file-location', t('There was no file uploaded')); + } +} + function islandora_preprocess_islandora_default_edit(&$variables) { $islandora_object = $variables['islandora_object']; - //module_load_include('inc', 'islandora', 'includes/datastream'); - //$test = ''; - //$dsids = islandora_add_datastream_form($islandora_object->id, $test); global $base_url; $datastreams = array(); $variables['islandora_editmetadata_url'] = $base_url . '/islandora/edit_form/' . $islandora_object->id; + $variables['add_datastream_form'] = drupal_get_form('islandora_add_datastream_form', $islandora_object); foreach ($islandora_object as $ds) { $datastreams['download_url'] = $base_url . '/islandora/object/' . $islandora_object->id . '/datastream/' . $ds->id . '/download'; $datastreams['view_url'] = $base_url . '/islandora/object/' . $islandora_object->id . '/datastream/' . $ds->id . '/view'; diff --git a/islandora_basic_image/islandora_basic_image.module b/islandora_basic_image/islandora_basic_image.module index 0ad069e4..d86c5810 100644 --- a/islandora_basic_image/islandora_basic_image.module +++ b/islandora_basic_image/islandora_basic_image.module @@ -209,25 +209,6 @@ function islandora_basic_image_preprocess_islandora_basic_image(&$variables) { drupal_set_message(t('Error retrieving object %s %t', array('%s' => $islandora_object->id, '%t' => $e->getMessage())), 'error'); } $variables['islandora_dublin_core'] = $dc_object; - //create a nicer array for themers - //TODO: give this a better home - //$dc_array = array(); - //foreach ($dc_object as $element) { - // if (!empty($element)) { - // foreach ($element as $field => $value) { - // // split value if the result value is an array - // if (is_array($value)) { - // $value = implode(", ", $value); - // } - // $dc_label = explode(':', $field); - // $element_label = ucfirst($dc_label[1]); - // $dc_array[$field]['label'] = $element_label; - // $dc_array[$field]['value'] = strip_tags($value); - // $dc_array[$field]['class'] = strtolower( preg_replace('/[^A-Za-z0-9]/', '-', $field)); - // } - // } - //} - $variables['dc_array'] = $dc_object->as_formatted_array(); $variables['islandora_object_label'] = $islandora_object->label; $variables['theme_hook_suggestions'][] = 'islandora_basic_image__' . str_replace(':', '_', $islandora_object->id);