entityTypeManager = $entity_type_manager; $this->utils = $utils; $this->fileSystem = $file_system; $this->flysystemFactory = $flysystem_factory; $this->tempStoreFactory = $temp_store_factory; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container): self { return new self( $container->get('entity_type.manager'), $container->get('islandora.utils'), $container->get('file_system'), $container->get('flysystem_factory'), $container->get('tempstore.private') ); } /** * {@inheritdoc} */ public function getFormId(): string { return 'islandora_collection_harvest_form'; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state): array { $term = $this->utils->getTermForUri('http://purl.org/dc/dcmitype/Collection'); $collections = []; if ($term) { $query = $this->entityTypeManager->getStorage('node')->getQuery(); $query->condition('type', 'islandora_object'); $query->condition('field_model', $term->id(), 'IN'); $query->accessCheck(FALSE); $nids = $query->execute(); $nodes = $this->entityTypeManager->getStorage('node') ->loadMultiple($nids); foreach ($nodes as $node) { $collections[$node->id()] = $node->label(); } } $vid = 'islandora_media_use'; $terms = $this->entityTypeManager->getStorage('taxonomy_term') ->loadTree($vid); $media_use_options = []; foreach ($terms as $term) { $media_use_options[$term->tid] = $term->name; } $form['#attributes']['id'] = 'collection-harvest-form'; $form['collection'] = [ '#type' => 'select', '#title' => $this->t('Collection'), '#options' => $collections, '#required' => TRUE, ]; $form['media_use'] = [ '#type' => 'select', '#title' => $this->t('Media Use'), '#options' => $media_use_options, '#required' => TRUE, ]; $form['actions'] = [ '#type' => 'actions', 'submit' => [ '#type' => 'submit', '#value' => $this->t('Build Download'), '#button_type' => 'primary', ], ]; return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state): void { $collection_id = $form_state->getValue('collection'); $media_use_tid = $form_state->getValue('media_use'); $term = $this->entityTypeManager->getStorage('taxonomy_term') ->load($media_use_tid); if (!$term) { $this->messenger()->addError($this->t('Media use term not found.')); return; } // Load nodes in collection $query = $this->entityTypeManager->getStorage('node')->getQuery(); $query->condition('type', 'islandora_object'); $query->condition('field_member_of', $collection_id); $query->accessCheck(FALSE); $nids = $query->execute(); $media_entities = []; foreach ($nids as $nid) { $node = $this->entityTypeManager->getStorage('node')->load($nid); $media = $this->utils->getMediaWithTerm($node, $term); if ($media) { $source_field = $media->getSource() ->getConfiguration()['source_field'] ?? NULL; if ($source_field && $media->hasField($source_field) && !$media->get($source_field) ->isEmpty()) { $media_entities[] = $media; } } } if (empty($media_entities)) { $this->messenger() ->addError($this->t('No media found for this collection.')); return; } // Store in tempstore $temp_store = $this->tempStoreFactory->get('islandora_collection_harvest'); $zip_filename = 'collection_' . time() . '.zip'; $temp_store->set($zip_filename, $media_entities); $this->messenger() ->addStatus($this->t('Your ZIP download has been initiated. Please wait for the download to start.')); // Redirect to download route $form_state->setRedirect('islandora_collection_harvest.download_zip', ['filename' => $zip_filename]); } }