saveNodeToOcfl($node); } /** * Implements hook_node_update(). */ function ocfl_storage_node_update(NodeInterface $node) { \Drupal::service('ocfl_storage.ocfl_service')->saveNodeToOcfl($node); } /** * Implements hook_node_delete(). * * Note: Actual OCFL implementations typically mark objects as deleted or * create a new version indicating deletion, rather than physically removing them. * For this simplified module, we'll just log the deletion. */ function ocfl_storage_node_delete(NodeInterface $node) { \Drupal::logger('ocfl_storage')->notice('Node %title (%nid) deleted. OCFL object will not be physically removed by this module, but a new version could be created to reflect deletion.', [ '%title' => $node->label(), '%nid' => $node->id(), ]); } /** * Implements hook_help(). */ function ocfl_storage_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { case 'help.page.ocfl_storage': $output = '
' . t('The OCFL Storage module provides a simplified, OCFL-like file system storage for uploaded files and node metadata. It aims to demonstrate how content could be versioned and managed in a structured way outside of Drupal\'s default file system.') . '
'; $output .= '' . t('When a node is saved or updated, this module attempts to store its fields (as JSON metadata) and any attached files within an OCFL-like structure in your Drupal private files directory. You can browse the stored objects via the "Browse OCFL Objects" link under Content.') . '
'; return $output; case 'ocfl_storage.browse': return '' . t('This page lists all OCFL-like objects currently stored by the module.') . '
'; case 'ocfl_storage.object_view': return '' . t('Details for a specific OCFL-like object, including its versions and contents.') . '
'; } } /** * Implements hook_menu_links_alter(). */ function ocfl_storage_menu_links_alter(&$links) { if (isset($links['system.admin_content'])) { $links['ocfl_storage.browse'] = [ 'title' => t('Browse OCFL Objects'), 'route_name' => 'ocfl_storage.browse', 'parent' => 'system.admin_content', 'weight' => 100, 'expanded' => FALSE, ]; } } /** * Implements hook_local_tasks_alter(). */ function ocfl_storage_local_tasks_alter(&$local_tasks, $route_name) { if ($route_name == 'ocfl_storage.browse') { // Add a tab for the main browse page if needed. $local_tasks['ocfl_storage.browse']['title'] = t('Browse Objects'); $local_tasks['ocfl_storage.browse']['base_route'] = 'ocfl_storage.browse'; } if ($route_name == 'ocfl_storage.object_view') { // Add a tab for the object view page. $local_tasks['ocfl_storage.object_view']['title'] = t('Object Details'); $local_tasks['ocfl_storage.object_view']['base_route'] = 'ocfl_storage.object_view'; } } /** * Implements hook_entity_type_alter(). * * This hook is used to define a custom parameter converter for OCFL object IDs. */ function ocfl_storage_entity_type_alter(array &$entity_types) { if (isset($entity_types['ocfl_object_id'])) { $entity_types['ocfl_object_id']->setHandlerClass('param_converter', 'Drupal\ocfl_storage\ParamConverter\OcflObjectIdConverter'); } }