3.0, 'path' => drupal_get_path('module', 'islandora_collection') . '/include', ); } /** * Implements hook_node_info(). */ function islandora_collection_node_info() { return array( ISLANDORA_COLLECTION_CONTENT_TYPE => array( 'name' => t("Collection"), 'base' => ISLANDORA_COLLECTION_CONTENT_TYPE, 'description' => t("A Drupal node modeling an pcdm:Collection."), ), ); } /** * Implements hook_form(). */ function islandora_collection_form($node, array &$form_state) { return node_content_form($node, $form_state); } /** * Implements hook_form_FORM_ID_alter(). */ function islandora_collection_form_islandora_collection_node_form_alter(&$form, array &$form_state, $form_id) { $node = $form_state['node']; // Add a collection picker if node is new (e.g. this is an insert form). if (!isset($node->nid) || isset($node->is_new)) { // Construct list of options from db and a default. $default = array('' => t('Fedora Root')); $from_db = db_select('node', 'n') ->fields('n', array('uuid', 'title')) ->condition('n.type', ISLANDORA_COLLECTION_CONTENT_TYPE) ->execute() ->fetchAllKeyed(); $options = $default + $from_db; // Add the select to the form. $form['parent_collection'] = array( '#type' => 'select', '#title' => t('Parent Collection'), '#description' => t('Select the parent collection to add this to. Select "Fedora Root" if you want it to be a top-level collection'), '#options' => $options, '#default_value' => '', '#weight' => -4, ); // Keep title on top. $form['title']['#weight'] = -5; // Tack on a custom submit handler to attach data on the entity for use // later on in the post action hooks. array_unshift($form['#submit'], 'islandora_collection_add_parent_uuid'); } } /** * Custom submit handler to pass along parent uuid. * * @param array $form * Drupal form. * @param array $form_state * Drupal form state. */ function islandora_collection_add_parent_uuid(array $form, array &$form_state) { $node = $form_state['node']; $node->parent_collection = ""; if (isset($form_state['parent_collection']['#value'])) { $node->parent_collection = $form_state['parent_collection']['#value']; } } /** * Implements hook_rdf_mapping(). */ function islandora_collection_rdf_mapping() { module_load_include('inc', 'islandora', 'include/rdf_mapping'); $rdf_types = array( ISLANDORA_PCDM_COLLECTION_RDF_TYPE, ISLANDORA_COLLECTION_RDF_TYPE, ); return islandora_get_default_rdf_mapping(ISLANDORA_COLLECTION_CONTENT_TYPE, $rdf_types); } /** * Implements hook_node_postinsert(). */ function islandora_collection_node_postinsert($node) { if (isset($_SERVER['HTTP_IGNORE_HOOKS']) && strcmp(strtolower($_SERVER['HTTP_IGNORE_HOOKS']), "true") == 0) { return; } // Exit early if it's not a collection. if (strcmp($node->type, ISLANDORA_COLLECTION_CONTENT_TYPE) != 0) { return; } $parent_collection = $node->parent_collection; $nodes = entity_uuid_load('node', array($node->uuid)); // Exit early if the node never was successfully inserted in the database. if (empty($nodes)) { return; } $node = array_pop($nodes); $url = "http://127.0.0.1:8181/islandora/rest/collection/$parent_collection"; // Don't forget the trailing slash. httprl_request($url, array( 'method' => 'POST', 'data' => json_encode($node), )); $response = httprl_send_request(); } /** * Implements hook_node_postupdate(). */ function islandora_collection_node_postupdate($node) { if (isset($_SERVER['HTTP_IGNORE_HOOKS']) && strcmp(strtolower($_SERVER['HTTP_IGNORE_HOOKS']), "true") == 0) { return; } // Exit early if it's not a collection. if (strcmp($node->type, ISLANDORA_COLLECTION_CONTENT_TYPE) != 0) { return; } // Unfortunately, there's no way to tell if the db transaction got rolled // back in this hook, so we'll default to doing it anyway so as not to miss // any updates. Open to suggestions on this one. But we gotta do post_action // hooks otherwise things can get crazy if the db transaction hasn't closed. $nodes = entity_uuid_load('node', array($node->uuid)); // Exit early if something has gone wrong and there's no node info. if (empty($nodes)) { return; } $node = array_pop($nodes); $uuid = $node->uuid; httprl_request("http://127.0.0.1:8181/islandora/rest/collection/$uuid", array( 'method' => 'PUT', 'data' => json_encode($node), )); $response = httprl_send_request(); } /** * Implements hook_node_postdelete(). */ function islandora_collection_node_postdelete($node) { if (isset($_SERVER['HTTP_IGNORE_HOOKS']) && strcmp(strtolower($_SERVER['HTTP_IGNORE_HOOKS']), "true") == 0) { return; } // Exit early if it's not a collection. if (strcmp($node->type, ISLANDORA_COLLECTION_CONTENT_TYPE) != 0) { return; } $uuid = $node->uuid; httprl_request("http://127.0.0.1:8181/islandora/rest/collection/$uuid", array( 'method' => 'DELETE', )); $response = httprl_send_request(); }