From 8c4ca4fb1e97f71410186fae7c1ca14d37802279 Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 08:03:06 -0300 Subject: [PATCH] Added collection policy creation to create child collection --- .../includes/ChildCollection.inc | 89 ++-- .../includes/CollectionManagement.inc | 431 +----------------- 2 files changed, 48 insertions(+), 472 deletions(-) diff --git a/islandora_basic_collection/includes/ChildCollection.inc b/islandora_basic_collection/includes/ChildCollection.inc index ed6728d9..5780f296 100644 --- a/islandora_basic_collection/includes/ChildCollection.inc +++ b/islandora_basic_collection/includes/ChildCollection.inc @@ -28,7 +28,7 @@ function islandora_create_child_collection_form($form, &$form_state, $this_colle } } $collection_namespace = substr($this_collection_pid, 0, strpos($this_collection_pid, ":")); - + $content_models = get_content_models_as_option_array(); unset($content_models['islandora:collectionCModel']); @@ -81,8 +81,8 @@ function islandora_create_child_collection_form($form, &$form_state, $this_colle '#type' => 'checkboxes', '#options' => $content_models, '#description' => t("Content models describe the behaviours of objects with which they are associated."), - ); - + ); + $form['child_creation']['submit'] = array( '#type' => 'submit', '#value' => t('Create collection'), @@ -92,24 +92,21 @@ function islandora_create_child_collection_form($form, &$form_state, $this_colle } function islandora_create_child_collection_form_validate($form, &$form_state) { - + } function islandora_create_child_collection_form_submit($form, &$form_state) { - global $base_root; + global $base_url; module_load_include('inc', 'islandora', '/includes/islandora.ingest'); - $thumbnail = $base_root . '/' . drupal_get_path('module', 'islandora_basic_collection') . '/Crystal_Clear_filesystem_folder_grey.png'; - $new_collection_pid = $form_state['values']['new_collection_pid']; - $new_collection_label = $form_state['values']['collection_name']; - $namespace = $form_state['values']['collection_namespace']; -// $all_cModels = get_content_models_as_option_array(); - $content_models = array('islandora:collectionCModel'); - $relationship = array( - 'uri' => FEDORA_RELS_EXT_URI, - 'value' => 'isMemberOfCollection', - ); + $thumbnail = $base_url . '/' . drupal_get_path('module', 'islandora_basic_collection') . '/Crystal_Clear_filesystem_folder_grey.png'; + $new_collection_pid = $form_state['values']['new_collection_pid']; + $new_collection_label = $form_state['values']['collection_name']; + $namespace = $form_state['values']['collection_namespace']; + $all_cModels = get_content_models_as_option_array(); + $collection_content_models = array(array('pid' => 'islandora:collectionCModel')); + $relationship = 'isMemberOfCollection'; - $collection_policy = ' + $collection_policy = ' @@ -119,31 +116,37 @@ function islandora_create_child_collection_form_submit($form, &$form_state) { isMemberOfCollection '; - - $content_models = $form_state['values']['content_models']; - $collection_policy_xml = new SimpleXMLElement($collection_policy); - foreach ($content_models as $content_model) { - if ($content_model) { - $node = $collection_policy_xml->content_models->addChild('content_model'); - $node->addAttribute('dsid', 'ISLANDORACM'); - $node->addAttribute('name', $all_cModels[$content_model]); - $node->addAttribute('namespace', $pid_namespace . ':1'); - $node->addAttribute('pid', $content_model); - } - } - - $fedora_object = islandora_ingest_get_object($content_models, $form_state['values']['current'], $relationship, $new_collection_pid); - $fedora_object->label = $new_collection_label; - $thumbnail_datastream = $fedora_object->constructDatastream('TN'); - $thumbnail_datastream->setContentFromUrl($thumbnail); - $thumbnail_datastream->label = 'Thumbnail'; - $thumbnail_datastream->mimetype = 'image/png'; - $fedora_object->ingestDatastream($thumbnail_datastream); - $policy_datastream = $fedora_object->constructDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'), 'X'); - $policy_datastream->setContentFromString($collection_policy_xml->saveXML()); - $policy_datastream->label = 'Collection policy'; - $fedora_object->ingestDatastream($policy_datastream); - $new_fedora_object = islandora_ingest_add_object($fedora_object); - - drupal_goto('/islandora/object/' . $new_collection_pid); + + $content_models = $form_state['values']['content_models']; + + $collection_policy_xml = new DOMDocument(); + $collection_policy_xml->loadXML($collection_policy); + + $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); + $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); + foreach ($content_models as $content_model) { + if ($content_model) { + $content_model_element = $collection_policy_xml->createElement('content_model'); + $content_model_element->setAttribute('name', $all_cModels[$content_model]); + $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + $content_model_element->setAttribute('namespace', $namespace . ':1'); + $content_model_element->setAttribute('pid', $content_model); + $content_models_element->item(0)->appendChild($content_model_element); + } + } + drupal_set_message($collection_policy_xml->saveXML()); + $fedora_object = islandora_ingest_get_object($collection_content_models, $form_state['values']['current'], $relationship, $new_collection_pid); + $fedora_object->label = $new_collection_label; + $thumbnail_datastream = $fedora_object->constructDatastream('TN'); + $thumbnail_datastream->setContentFromUrl($thumbnail); + $thumbnail_datastream->label = 'Thumbnail'; + $thumbnail_datastream->mimetype = 'image/png'; + $fedora_object->ingestDatastream($thumbnail_datastream); + $policy_datastream = $fedora_object->constructDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'), 'X'); + $policy_datastream->setContentFromString($collection_policy_xml->saveXML()); + $policy_datastream->label = 'Collection policy'; + $fedora_object->ingestDatastream($policy_datastream); + $new_fedora_object = islandora_ingest_add_object($fedora_object); + + drupal_goto('/islandora/object/' . $new_collection_pid); } \ No newline at end of file diff --git a/islandora_basic_collection/includes/CollectionManagement.inc b/islandora_basic_collection/includes/CollectionManagement.inc index d72bf080..52db0dfb 100644 --- a/islandora_basic_collection/includes/CollectionManagement.inc +++ b/islandora_basic_collection/includes/CollectionManagement.inc @@ -5,409 +5,6 @@ * CollectionManagement.inc */ -/** - * collection creation form - * @param array $form_state - * @param string $parent_collection_pid - * @param string $content_models - * @return array - */ -function collection_management_form($this_collection_pid, $content_models) { - module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); - module_load_include('inc', 'fedora_repository', 'CollectionPolicy'); - $restricted = FALSE; - if (variable_get('fedora_namespace_restriction_enforced', TRUE)) { - $restricted = TRUE; - $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); - $namespaces = explode(':', $allowed_string); - foreach ($namespaces as $namespace) { - if ($namespace) { - $allowed[trim($namespace)] = trim($namespace); - } - } - } - $collection_policy = CollectionPolicy::loadFromCollection($this_collection_pid); - - if ($collection_policy) { - $supported_collection_models = $collection_policy->getContentModels(); - } - $collection_namespace = substr($this_collection_pid, 0, strpos($this_collection_pid, ":")); - - $represented_content_models = get_represented_content_models($this_collection_pid); - $item = new Fedora_Item($this_collection_pid); - $collection_name = $item->objectProfile->objLabel; - $new_content_models = get_content_models_as_option_array(); - $current_models_in_policy = array(); - - if ($supported_collection_models) { - foreach ($supported_collection_models as $supported_model) { - $current_models_in_policy[$supported_model->pid] = $supported_model->pid; - } - } - $cm_options = array(); - $name_mappings = array(); - foreach ($content_models as $content_model) { - if ($content_model->pid != "islandora:collectionCModel") { - $item = new fedora_item($content_model->pid); - $cm_name = $item->objectProfile->objLabel; - $cm_options[$content_model->pid] = $cm_name; - } - } - - if (!empty($current_models_in_policy)) { - $show_delete = TRUE; - } - - - $content_models = get_content_models_as_option_array(); - unset($content_models['islandora:collectionCModel']); - - $form['child_creation'] = array( - '#title' => "Create Child Collection", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - ); - - $form['child_creation']['titlebox'] = array( - '#type' => 'item', - '#value' => t("Create New Child Collection within $this_collection_pid"), - ); - - $form['child_creation']['collection_name'] = array( - '#title' => "Collection Name", - '#type' => 'textfield', - '#description' => t("Human readable name for this collection"), - ); - - $form['child_creation']['new_collection_pid'] = array( - '#title' => "Collection PID", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => Fedora_Item::get_next_PID_in_namespace($collection_namespace), - '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection eg islandora:pamphlets"), - ); - if (!$restricted) { - $form['child_creation']['collection_namespace'] = array( - '#title' => "Collection Namespace", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => $collection_namespace, - '#description' => t("Namespace for objects in this collection."), - ); - } - else { - $form['child_creation']['collection_namespace'] = array( - '#title' => "Collection Namespace", - '#type' => 'select', - '#options' => $allowed, - '#default_value' => 'default', - '#description' => t("Namespace for objects in this collection."), - ); - } - $form['parent_collection'] = array( - '#type' => 'hidden', - '#value' => $this_collection_pid, - ); - - $form['collection_pid'] = array( - '#type' => 'hidden', - '#value' => $this_collection_pid, - ); - $form['child_creation']['content_models'] = array( - '#title' => "Choose allowable content models for this collection", - '#type' => 'checkboxes', - '#options' => $content_models, - '#description' => t("Content models describe the behaviours of objects with which they are associated."), - ); - - - $form['child_creation']['submit'] = array( - '#type' => 'submit', - '#value' => t('Create Collection'), - '#id' => 'create_child' - ); - $form['manage_collection_policy'] = array( - '#title' => "Manage Collection Policies", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - ); - - $form['manage_collection_policy']['add'] = array( - '#title' => "Add Content Model to Collection Policy", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => $show_delete, - ); - - $new_options = array(); - if (is_array($content_models) && is_array($cm_options)) { - $new_options = array_diff_key($content_models, $cm_options); - } - - $form ['manage_collection_policy']['add']['content_model_to_add'] = array( - '#title' => "Choose Content Model", - '#type' => 'select', - '#options' => $new_options, - '#description' => t("Choose content model to add to this collection policy."), - ); - - $form ['manage_collection_policy']['add']['new_cp_namespace'] = array( - '#title' => "Choose Namespace", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => $collection_namespace, - '#description' => t("Choose namespace for objects in this collection associated with this content model"), - ); - $form['manage_collection_policy']['add']['submit'] = array( - '#type' => 'submit', - '#value' => t('Add Content Model to Collection Policy'), - '#id' => 'add_cm' - ); - - if (count($current_models_in_policy) > 0) { - $form['manage_collection_policy']['remove'] = array( - '#title' => "Delete Content Model from Collection Policy", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - ); - - $form ['manage_collection_policy']['remove']['content_models_to_remove'] = array( - '#title' => "Choose Content Model to Remove", - '#type' => 'checkboxes', - '#options' => $current_models_in_policy, - '#description' => t("Choose content models to remove from this collection policy."), - ); - - - $form['manage_collection_policy']['remove']['submit'] = array( - '#type' => 'submit', - '#value' => t('Remove Content Model From Collection Policy'), - '#id' => 'remove_cm' - ); - } - - - $form['change_cmodel'] = array( - '#title' => "Change Content Models", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - ); - - $form['change_cmodel']['titlebox'] = array( - '#type' => 'item', - '#value' => t("Change Content Models within $this_collection_pid"), - ); - - $form['change_cmodel']['current_content_model'] = array( - '#title' => "Choose content model to be changed", - '#type' => 'select', - '#options' => $represented_content_models, - '#description' => t("All objects in this collection with the selected content model will be changed."), - ); - $form['change_cmodel']['new_content_model'] = array( - '#title' => "Choose new content model", - '#type' => 'select', - '#options' => $new_content_models, - '#description' => t("The new content model to be assigned to selected objects."), - ); - $form['change_cmodel']['collection_pid'] = array( - '#type' => 'hidden', - '#value' => $this_collection_pid, - ); - $form['change_cmodel']['submit'] = array( - '#type' => 'submit', - '#value' => t('Change Content Model Associations'), - '#id' => 'change_model', - ); - - return $form; -} - -/** - * collection creation form validate - * @param array $form - * @param array $form_state - */ -function collection_management_form_validate($form, &$form_state) { - if ($form_state['clicked_button']['#id'] == 'create_child') { - module_load_include('inc', 'fedora_repository', 'api/fedora_item'); - module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); - $pid = $form_state['values']['new_collection_pid']; - $item = new fedora_item($pid); - $needs_model = FALSE; - foreach ($form_state['values']['content_models'] as $key => $value) { - if (is_string($value)) { - - $needs_model = FALSE; - } - } - $checked = array_values($form_state['values']['content_models']); - if ($item->exists()) { - form_set_error('new_collection_pid', t("$pid already exists within your repository. the PID must be unique. Click on 'Manage This Collection' tab and enter new value.")); - return; - } - if (!valid_pid($pid)) { - form_set_error('new_collection_pid', t("$pid is not a valid identifier. Click on 'Manage This Collection' tab and enter new value.")); - return; - } - if ($needs_model) { - form_set_error('content_models', t("At least one content model must be selected. Click on 'Manage This Collection' tab and enter content model.")); - return; - } - } - if ($form_state['clicked_button']['#id'] == 'add_cm') { - - $name_parts = explode(":", $form_state['values']['new_cp_namespace']); - $namespace = $name_parts[0] . ":1"; - if (!valid_pid($namespace)) { - form_set_error('new_cp_namespace', t("Namespace must be valid. Click on 'Manage This Collection' tab and enter new value.")); - - return; - } - $form_state['values']['new_cp_namespace'] = $namespace; - } -} - -/** - * collection creation form submit - * @global user $user - * @param arary $form - * @param array $form_state - */ -function collection_management_form_submit($form, &$form_state) { - module_load_include('inc', 'fedora_repository', 'api/fedora_collection'); - module_load_include('inc', 'fedora_repository', 'api/fedora_item'); - module_load_include('inc', 'fedora_repository', 'api/dublin_core'); - global $user; - $collection_pid = $form_state['values']['parent_collection']; - $policy = CollectionPolicy::loadFromCollection($collection_pid, TRUE); - $collection_policy = ' - - - - - - - - isMemberOfCollection -'; - - - // add child collection to policy - if ($form_state['clicked_button']['#id'] == 'create_child') { - $module_path = drupal_get_path('module', 'fedora_repository'); - $thumbnail = drupal_get_path('module', 'Fedora_Repository') . '/images/Crystal_Clear_filesystem_folder_grey.png'; - $new_collection_pid = $form_state['values']['new_collection_pid']; - $new_collection_label = $form_state['values']['collection_name']; - $pid_namespace = $form_state['values']['collection_namespace']; - $all_cModels = get_content_models_as_option_array(); - - $content_models = $form_state['values']['content_models']; - $collection_policy_xml = simplexml_load_string($collection_policy); - foreach ($content_models as $content_model) { - if ($content_model) { - $node = $collection_policy_xml->content_models->addChild('content_model'); - $node->addAttribute('dsid', 'ISLANDORACM'); - $node->addAttribute('name', $all_cModels[$content_model]); - $node->addAttribute('namespace', $pid_namespace . ':1'); - $node->addAttribute('pid', $content_model); - } - } - $item = fedora_item::ingest_new_item($new_collection_pid, 'A', $new_collection_label, $user->name); - $item->add_relationship('isMemberOfCollection', $collection_pid, RELS_EXT_URI); - $item->add_relationship('hasModel', 'islandora:collectionCModel', FEDORA_MODEL_URI); - $item->add_datastream_from_string($collection_policy_xml->saveXML(), 'COLLECTION_POLICY', 'COLLECTION_POLICY', 'text/xml', 'X'); - $item->add_datastream_from_file($thumbnail, 'TN'); - drupal_goto("/fedora/repository/$new_collection_pid"); - } - - - // add content model to collection policy - if ($form_state['clicked_button']['#id'] == 'add_cm') { - if (!$policy) { - $item = new Fedora_Item($collection_pid); - $item->add_datastream_from_string($collection_policy, 'COLLECTION_POLICY', 'COLLECTION_POLICY', 'text/xml', 'X'); - $policy = CollectionPolicy::loadFromCollection($collection_pid, TRUE); - } - - $cp_namespace = $form_state['values']['new_cp_namespace']; - $cp_content_model = $form_state['values']['content_model_to_add']; - $policy->addModel(ContentModel::loadFromModel($cp_content_model), $cp_namespace); - $policy->saveToFedora(); - drupal_set_message("Collection model successfully added"); - } - - //remove content model from collection policy - if ($form_state['clicked_button']['#id'] == 'remove_cm') { - $candidates = $form_state['values']['content_models_to_remove']; - $count = 0; - foreach ($candidates as $candidate) { - if (is_string($candidate)) { - $policy->removeModel(ContentModel::loadFromModel($candidate)); - $count++; - } - } - if ($count > 0) { - $policy->saveToFedora(); - if ($count > 1) { - $s = 's'; - } - drupal_set_message("$count collection model$s removed"); - } - } - - - //change content model on selected objects - if ($form_state['clicked_button']['#id'] == 'change_model') { - $current_content_model = $form_state['values']['current_content_model']; - $new_content_model = $form_state['values']['new_content_model']; - - $add_to_policy = TRUE; - $policy_cms = $policy->getContentModels(); - foreach ($policy_cms as $policy_cm) { - if ($policy_cm->pid == $current_content_model) { - $namespace = $policy_cm->pid_namespace; - } - if ($policy_cm->pid == $new_content_model) { - $add_to_policy = FALSE; - } - } - if ($add_to_policy) { - $policy->addModel(ContentModel::loadFromModel($new_content_model), $namespace); - $policy->saveToFedora(); - } - $query = "select \$object from <#ri> - where (\$object - and (\$object - or \$object ) - and \$object )"; - $query = htmlentities(urlencode($query)); - $content = ''; - - $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); - $url .= "?type=tuples&flush=TRUE&format=csv&limit=$limit&offset=$offset&lang=itql&stream=on&query=" . $query; - $content .= do_curl($url); - $results = explode("\n", $content); - $object_pids = preg_replace('/^info:fedora\/|"object"/', '', $results); - $count = 0; - foreach ($object_pids as $object_pid) { - if (!$object_pid) { - continue; - } - $item = new fedora_item($object_pid); - $item->purge_relationship('hasModel', $current_content_model); - $item->add_relationship('hasModel', $new_content_model, FEDORA_MODEL_URI); - $count++; - } - drupal_set_message("$current_content_model changed to $new_content_model on $count objects"); - } - -} - /** * deletes PID * @param string $pid @@ -546,22 +143,6 @@ function get_related_items_as_array($collection_pid, $relationship = array('isMe return $results; } - -//function get_related_items_as_array($collection_pid, $relationship = 'isMemberOfCollection', $limit = 10000, $offset = 0, $active_objects_only = TRUE, $cmodel = NULL, $orderby = '$title') { -// $content = get_related_items_as_xml($collection_pid, $relationship, $limit, $offset, $active_objects_only, $cmodel, $orderby); -// if (empty($content)) { -// return array(); -// } -// -// $content = new SimpleXMLElement($content); -// -// $resultsarray = array(); -// foreach ($content->results->result as $result) { -// $resultsarray[] = substr($result->object->attributes()->uri, 12); // Remove 'info:fedora/'. -// } -// return $resultsarray; -//} - /** * gets the name of the content models for the specified object * this now returns an array of pids as in Fedora 3 we can have more then one Cmodel for an object @@ -570,9 +151,7 @@ function get_related_items_as_array($collection_pid, $relationship = array('isMe * @return array */ function get_content_models_list($pid, $include_fedora_system_content_models = FALSE) { -// module_load_include('inc', 'fedora_repository', 'CollectionClass'); -// module_load_include('inc', 'fedora_repository', 'ContentModel'); -// $collectionHelper = new CollectionClass(); + module_load_include('inc', 'islandora', 'RestConnection'); require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; $rest_connection = new RestConnection(); @@ -580,7 +159,6 @@ function get_related_items_as_array($collection_pid, $relationship = array('isMe $query = 'select $object from <#ri> where $object and $object '; -// $content_models = $collectionHelper->getRelatedItems($pid, $query); $content_models = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); if (empty($content_models)) { @@ -593,16 +171,12 @@ function get_related_items_as_array($collection_pid, $relationship = array('isMe continue; } $cmodels[] = substr(strstr($content_model['object']['uri'], '/'), 1); -// $cm = ContentModel::loadFromModel($cmodel_pid); -// if ($cm) { -// $cmodels[] = $cm; -// } } return $cmodels; } - /** + /** * Function: get_content_models_as_option_array * * Description: Returns an associative array of all available content models in Fedora instance @@ -649,7 +223,6 @@ function get_content_models_as_option_array() { function getContentModels($collection_pid, $showError = TRUE) { module_load_include('inc', 'islandora', 'RestConnection'); $rest_connection = new RestConnection(); -// module_load_include('inc', 'Fedora_Repository', 'ContentModel'); $collection_stream = $this->getCollectionPolicyStream($collection_pid); $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); $collection_stream = $collection_object->getDatastream('COLLECTION_POLICY');