From 7517be2a3ef8517c9735632c1927ec3ea857a142 Mon Sep 17 00:00:00 2001 From: Paul Pound Date: Mon, 28 May 2012 19:39:32 -0300 Subject: [PATCH] moved datastream form functions to datastream inc and started properties form --- includes/datastream.inc | 167 +++++++++++++++++++++++++++++++++ includes/object_properties.inc | 42 +++++++++ islandora.module | 166 +++++++------------------------- 3 files changed, 245 insertions(+), 130 deletions(-) create mode 100644 includes/object_properties.inc diff --git a/includes/datastream.inc b/includes/datastream.inc index 980977c4..2c7e58b2 100644 --- a/includes/datastream.inc +++ b/includes/datastream.inc @@ -172,3 +172,170 @@ function islandora_get_add_datastream_form($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')); + } +} + + +/** + * 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_add_datastream_form($form, &$form_state, $object_id) { + $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' => "$object_id" + ); + + $form['add_fieldset']['stream_label'] = array( + '#title' => 'Datastream Label', + '#required' => 'TRUE', + '#description' => t('A Human readable label'), + '#type' => 'textfield' + ); + + $form['#attributes']['enctype'] = 'multipart/form-data'; + $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'] = "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 $key => $value) { + $dsidsForForm[$key] = $key; + } + $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['add_fieldset']['stream_id']['#options'] = $dsidsForForm; + } + else { + $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.'), + '#type' => 'textfield', + '#weight' => -1, + ); + } + return $form; +} diff --git a/includes/object_properties.inc b/includes/object_properties.inc new file mode 100644 index 00000000..8897ff3b --- /dev/null +++ b/includes/object_properties.inc @@ -0,0 +1,42 @@ + 'hidden', + '#value' => $object_id, + ); + + $form['object_label'] = array( + '#title' => t('Item Label'), + '#default_value' => $islandora_object->label, + '#required' => 'TRUE', + '#description' => t('A Human readable label'), + '#type' => 'textfield' + ); + $form['object_owner'] = array( + '#title' => t('Owner'), + '#default_value' => $islandora_object->owner, + '#required' => FALSE, + '#description' => t('The owner id'), + '#type' => 'textfield', + ); + $form['object_state'] = array( + '#title' => t('State'), + '#default_value' => $islandora_object->state, + '#required' => TRUE, + '#description' => t('The items state, either active, inactive or deleted'), + '#type' => 'select', + '#options' => array ('A' => 'Active', 'I' => 'Inactive', 'D'=>'Deleted'), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => 'Update Properties', + ); + return $form; +} +?> diff --git a/islandora.module b/islandora.module index 7a0e89ef..521101bc 100644 --- a/islandora.module +++ b/islandora.module @@ -108,16 +108,16 @@ function islandora_menu() { 'access arguments' => array(FEDORA_VIEW), ); - /* + $items['islandora/object/%/add'] = array( 'title' => 'Add to an object', - //'file' => 'includes/add-menu.inc', - 'page callback' => 'islandora_add_datastream', - 'page arguments' => array(2), + 'file' => 'includes/datastream.inc', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('islandora_add_datastream_form',2), 'type' => MENU_NORMAL_ITEM, 'access arguments' => array(FEDORA_ADD_DS) ); - */ + $items['islandora/object/%/view'] = array( 'title' => 'View', @@ -155,8 +155,9 @@ function islandora_menu() { $items['islandora/object/%/manage/properties'] = array( 'title' => 'Properties', - 'page callback' => 'islandora_edit_properties', - 'page arguments' => array(2), + 'page callback' => 'drupal_get_form', + 'file' => 'includes/object_properties.inc', + 'page arguments' => array('islandora_edit_properties_form',2), 'type' => MENU_LOCAL_TASK, 'access arguments' => array(FEDORA_MODIFY_STATE), 'weight' => -5, @@ -344,12 +345,25 @@ function islandora_edit_object($object_id) { return $output; } +/** + * edit properties form + * @param type $object_id + * @return string + */ function islandora_edit_properties($object_id) { - return 'edit properties ' . $object_id; + $object = islandora_get_object($object_id); + if (isset($object)) { + module_load_include('inc','islandora','includes/object_properties'); + $form = drupal_get_form('islandora_edit_properties_form', $object); + drupal_set_title($object->label); + return drupal_render($form); + } + return ""; } /** * builds a default page for the edit tab + * * @param object $fedora_object * A tuque Fedora Object */ @@ -548,25 +562,10 @@ function islandora_permission() { } /** - * renders the add datastream from. - * @param string $object_id - * @return type + * preprocess for the default view template + * @global string $base_url + * @param array $variables */ -function islandora_add_datastream($object_id) { - if (!isset($object_id)) { - drupal_set_message(t('Cannot add datastream to object, object id not set')); - 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); - } - return ""; - // hook form alter might be enough here may not need a module invoke all -} - function islandora_preprocess_islandora_default(&$variables) { $islandora_object = $variables['islandora_object']; module_load_include('inc', 'islandora', 'includes/islandora_dublin_core'); @@ -586,6 +585,12 @@ function islandora_preprocess_islandora_default(&$variables) { } } +/** + * a helper function to get a connection and return an object + * @global object $user + * @param string $object_id + * @return FedoraObject + */ function islandora_get_object($object_id) { module_load_include('inc', 'islandora', 'RestConnection'); global $user; @@ -600,117 +605,18 @@ function islandora_get_object($object_id) { } /** - * 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 + * preprocess the edit template * @global string $base_url - * @global object $user - * Drupal user - * @param array $form - * @param array $form_state - * @return type + * @param array $variables + * theme variables for the edit template */ -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']; 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); + module_load_include('inc','islandora','includes/datastream'); + $variables['add_datastream_form'] = drupal_get_form('islandora_add_datastream_form', $islandora_object->id); 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';