diff --git a/config/install/field.field.media.fits_technical_metadata.field_attached_fits_node.yml b/config/install/field.field.media.fits_technical_metadata.field_attached_fits_node.yml deleted file mode 100644 index 9520ab94..00000000 --- a/config/install/field.field.media.fits_technical_metadata.field_attached_fits_node.yml +++ /dev/null @@ -1,27 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.media.field_attached_fits_node - - media.type.fits_technical_metadata - - node.type.fits_technical_metadata -id: media.fits_technical_metadata.field_attached_fits_node -field_name: field_attached_fits_node -entity_type: media -bundle: fits_technical_metadata -label: 'Attached FITS node' -description: '' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: - handler: 'default:node' - handler_settings: - target_bundles: - fits_technical_metadata: fits_technical_metadata - sort: - field: _none - auto_create: false - auto_create_bundle: '' -field_type: entity_reference diff --git a/config/install/field.field.node.fits_technical_metadata.field_data_of.yml b/config/install/field.field.node.fits_technical_metadata.field_data_of.yml deleted file mode 100644 index 47b4daee..00000000 --- a/config/install/field.field.node.fits_technical_metadata.field_data_of.yml +++ /dev/null @@ -1,20 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.node.field_data_of - - node.type.fits_technical_metadata -id: node.fits_technical_metadata.field_data_of -field_name: field_data_of -entity_type: node -bundle: fits_technical_metadata -label: 'Data of' -description: '' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: - handler: 'default:node' - handler_settings: { } -field_type: entity_reference diff --git a/config/install/field.storage.media.field_attached_fits_node.yml b/config/install/field.storage.media.field_attached_fits_node.yml deleted file mode 100644 index b3c4c605..00000000 --- a/config/install/field.storage.media.field_attached_fits_node.yml +++ /dev/null @@ -1,23 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - field_permissions - - media - - node -third_party_settings: - field_permissions: - permission_type: public -id: media.field_attached_fits_node -field_name: field_attached_fits_node -entity_type: media -type: entity_reference -settings: - target_type: node -module: core -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/config/install/field.storage.node.field_data_of.yml b/config/install/field.storage.node.field_data_of.yml deleted file mode 100644 index 02baf482..00000000 --- a/config/install/field.storage.node.field_data_of.yml +++ /dev/null @@ -1,22 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - field_permissions - - node -third_party_settings: - field_permissions: - permission_type: public -id: node.field_data_of -field_name: field_data_of -entity_type: node -type: entity_reference -settings: - target_type: node -module: core -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/config/install/node.type.fits_technical_metadata.yml b/config/install/node.type.fits_technical_metadata.yml deleted file mode 100644 index a53652d2..00000000 --- a/config/install/node.type.fits_technical_metadata.yml +++ /dev/null @@ -1,17 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - menu_ui -third_party_settings: - menu_ui: - available_menus: - - main - parent: 'main:' -name: 'Fits Technical Metadata' -type: fits_technical_metadata -description: 'Convenience node to hold indexable FITS values' -help: '' -new_revision: true -preview_mode: 1 -display_submitted: true diff --git a/islandora_fits.module b/islandora_fits.module index de7f6177..f86d3351 100644 --- a/islandora_fits.module +++ b/islandora_fits.module @@ -5,6 +5,7 @@ * Contains islandora_fits.module. */ +use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\media\MediaInterface; use Drupal\taxonomy\Entity\Term; @@ -68,23 +69,31 @@ function islandora_fits_media_presave(MediaInterface $media) { if ($media->bundle() != 'fits_technical_metadata') { return; } - $attached = $media->get('field_attached_fits_node')->referencedEntities()[0]; - $data_of = $media->get('field_media_of')->referencedEntities()[0]; - $title = $data_of->getTitle(); - if (!$attached) { - $node = Node::create(['type' => 'fits_technical_metadata']); - $node->setTitle("Fits Metadata of $title"); - $node->save(); - $media->field_attached_fits_node->target_id = $node->id(); - $attached = $node; - } $file_id = $media->get('field_media_file')->getValue()[0]['target_id']; $file = File::load($file_id); $data = file_get_contents($file->getFileUri()); - // Adds any new fields to FITS content type. - $transformer->add_node_fields($data); - $transformer->populate_node($data, $attached); - $attached->save(); + // Adds any new fields to FITS media type. + $has_new = $transformer->add_media_fields($data); + if (!$has_new) { + $transformer->populate_media($data, $media); + $media->set('field_complete', TRUE); + } else { + $media->set('field_complete', FALSE); + } + } +/** + * Implements hook_media_update(). + */ +function islandora_fits_media_update(MediaInterface $media) { + $complete = $media->get('field_complete')->value; + if (!$complete) { + $media->save(); + } +} + + + + diff --git a/src/Services/XMLTransform.php b/src/Services/XMLTransform.php index c8da72e0..6d4a4d04 100644 --- a/src/Services/XMLTransform.php +++ b/src/Services/XMLTransform.php @@ -235,7 +235,8 @@ class XMLTransform extends ServiceProviderBase { * @param $input_xml * @throws \Drupal\Core\Entity\EntityStorageException */ - public function add_node_fields($input_xml) { + public function add_media_fields($input_xml) { + $fields_added = FALSE; $data = $this->transformFits($input_xml); $all_fields = []; foreach ($data['#output'] as $datum) { @@ -243,30 +244,37 @@ class XMLTransform extends ServiceProviderBase { } $to_process = $this->normalize_names($all_fields); foreach ($to_process as $field) { - $exists = FieldStorageConfig::loadByName('node', $field['field_name']); + $exists = FieldStorageConfig::loadByName('media', $field['field_name']); if (!$exists) { $field_storage = FieldStorageConfig::create([ - 'entity_type' => 'node', + 'entity_type' => 'media', 'field_name' => $field['field_name'], 'type' => 'text', ]); - $field_storage->save(); + $field_storage->save(); + } + $bundle_fields = $this->entityManager->getFieldDefinitions('media', 'fits_technical_metadata'); + $bundle_keys = array_keys($bundle_fields); + if (!in_array($field['field_name'], $bundle_keys)) { + $field_storage = FieldStorageConfig::loadByName('media', $field['field_name']); FieldConfig::create([ 'field_storage' => $field_storage, 'bundle' => 'fits_technical_metadata', - 'label' => $field['field_name'], + 'label' => $field['field_label'], ])->save(); + $fields_added = TRUE; } } + return $fields_added; } /** - * Populates associated node. + * Populates media. * * @param $input_xml - * @param $node + * @param $media */ - public function populate_node($input_xml, &$node) { + public function populate_media($input_xml, &$media) { $data = $this->transformFits($input_xml); $all_fields = []; foreach ($data['#output'] as $datum) { @@ -279,9 +287,8 @@ class XMLTransform extends ServiceProviderBase { $field_name = substr("field_$normalized", 0, 32); $to_add[$field_name] = $field_value; } - foreach ($to_add as $field_name => $field_value) { - $node->set($field_name, $field_value); + $media->set($field_name, $field_value); } }