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);