"islandora/object/{$object->id}", '#attributes' => array( 'enctype' => 'multipart/form-data' ), 'fieldset' => array( '#type' => 'fieldset', '#title' => 'Add a datastream', '#collapsible' => FALSE, '#collapsed' => FALSE, 'dsid' => array( '#title' => 'Datastream ID', '#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. Datastreams that ' . 'are defined by the content model don\'t currently exist: ' . '@unused_dsids.', array('@unused_dsids' => $unused_datastreams) ), '#type' => 'textfield', '#size' => 64, '#maxlength' => 64, '#required' => TRUE, '#element_validate' => array( 'islandora_add_datastream_form_field_is_not_an_existing_datastream_id', 'islandora_add_datastream_form_field_starts_with_a_letter', 'islandora_add_datastream_form_field_is_valid_dsid', ), '#autocomplete_path' => "islandora/object/{$object->id}/manage/datastreams/add/autocomplete" ), 'label' => array( '#title' => 'Datastream Label', '#required' => TRUE, '#size' => 64, '#maxlength' => 64, '#description' => t('A Human readable label'), '#type' => 'textfield', '#element_validate' => array('islandora_add_datastream_form_field_does_not_contain_a_forward_slash') ), 'file' => array( '#type' => 'managed_file', '#required' => TRUE, '#title' => t('Upload Document'), '#size' => 48, '#description' => t('Select a file to upload.
Files must be less than @size MB.', array('@size' => $upload_size)), '#default_value' => isset($form_state['values']['files']) ? $form_state['values']['files'] : NULL, '#upload_location' => 'temporary://', '#upload_validators' => array( 'file_validate_extensions' => array(NULL), // Assume its specified in MB 'file_validate_size' => array($upload_size * 1024 * 1024), ), ), 'submit' => array( '#type' => 'submit', '#value' => t('Add Datastream') ), ) ); } /** * Checks if the given form field doesn't already repersent a Datastream ID. * * @param array $element * The form field to check. * @param array $form_state * The Drupal form state. * @param array $form * The Drupal form. */ function islandora_add_datastream_form_field_is_not_an_existing_datastream_id(array $element, array &$form_state, array $form) { if (isset($form_state['object'][$element['#value']])) { form_error($element, t("@title already exists in the object.", array('@title' => $element['#title']))); } } /** * Checks if the given form field starts with a letter. * * @param array $element * The form field to check. * @param array $form_state * The Drupal form state. * @param array $form * The Drupal form. */ function islandora_add_datastream_form_field_starts_with_a_letter(array $element, array &$form_state, array $form) { if (!(preg_match("/^[a-zA-Z]/", $element['#value']))) { form_error($element, t("@title has to start with a letter.", array('@title' => $element['#title']))); } } /** * Checks if the given form field contains only valid characters for a * datastream id. * * @param array $element * The form field to check. * @param array $form_state * The Drupal form state. * @param array $form * The Drupal form. */ function islandora_add_datastream_form_field_is_valid_dsid(array $element, array &$form_state, array $form) { module_load_include('inc', 'islandora', 'includes/utilities'); if (!islandora_is_valid_dsid($element['#value'])) { form_error($element, t("@title contains invalid characters.", array('@title' => $element['#title']))); } } /** * Checks if the given form field contains a "/" character. * * @param array $element * The form field to check. * @param array $form_state * The Drupal form state. * @param array $form * The Drupal form. */ function islandora_add_datastream_form_field_does_not_contain_a_forward_slash(array $element, array &$form_state, array $form) { if (strpos($element['#value'], '/') !== FALSE) { form_error($element, t('@title cannot contain a "/" character.', array('@title' => $element['#title']))); } } /** * Checks if the given datastream id requires that the upload file be of a * certian MIME type. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. */ function islandora_add_datastream_form_validate(array $form, array &$form_state) { $file = file_load($form_state['values']['file']); $dsid = $form_state['values']['dsid']; if (isset($form_state['datastream_requirements'][$dsid]) && $file) { $allowed_types = $form_state['datastream_requirements'][$dsid]['mime']; $mime_detect = new MimeDetect(); $allowed_extensions = array_map(array($mime_detect, 'getExtension'), $allowed_types); $errors = file_validate_extensions($file, implode(' ', $allowed_extensions)); if (count($errors) > 0) { form_set_error('file', $errors[0]); } } } /** * Adds the new datastream based on the submitted values, only creates managed * datastreams at the moment. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. */ function islandora_add_datastream_form_submit(array $form, array &$form_state) { $object = $form_state['object']; $form_state['redirect'] = "islandora/object/{$object->id}"; $file = file_load($form_state['values']['file']); try { $ds = $object->constructDatastream($form_state['values']['dsid'], 'M'); $ds->label = $form_state['values']['label']; $ds->mimetype = $file->filemime; $path = drupal_realpath($file->uri); $ds->setContentFromFile($path); $object->ingestDatastream($ds); file_delete($file); } catch (exception $e) { drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error'); file_delete($file); // Make sure to delete anyways. return; } drupal_set_message(t("Successfully Added Datastream!")); } /** * Callback for an autocomplete field in the admin add datastream form. * It lists the missing required (may be optional) datastreams. * * @param FedoraObject $object * The object used to check for missing required datastreams used to populate * the options in this callback. * @param string $query * vThe user query to match against the missing required datastreams. */ function islandora_add_datastream_form_autocomplete_callback(FedoraObject $object, $query = '') { module_load_include('inc', 'islandora', 'includes/content_model'); module_load_include('inc', 'islandora', 'includes/utilities'); $dsids = array_keys(islandora_get_missing_datastreams_requirements($object)); $dsids = array_combine($dsids, $dsids); $query = trim($query); if (!empty($query)) { $dsids = array_filter($dsids, function($id) use($query) { return stripos($id, $query) !== FALSE; }); } drupal_json_output($dsids); }