From dce598a814f1bf15896d5bfa179b84d50cb56b61 Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Tue, 8 Oct 2024 13:01:45 +0300 Subject: [PATCH] [FINNA-2675] Load encapsulated records without source limit Allows encapsulated records to be displayed regardless of the view's sources configuration. --- module/Finna/src/Finna/Record/Loader.php | 3 ++- .../Feature/ContainerFormatTrait.php | 18 ++++++++++++++---- .../Search/Solr/SolrExtensionsListener.php | 14 ++++++++++++-- .../Finna/View/Helper/Root/RecordFactory.php | 4 ++-- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/module/Finna/src/Finna/Record/Loader.php b/module/Finna/src/Finna/Record/Loader.php index 26d2b0910f5..6027035770f 100644 --- a/module/Finna/src/Finna/Record/Loader.php +++ b/module/Finna/src/Finna/Record/Loader.php @@ -215,7 +215,8 @@ public function loadBatchForSource( $records = parent::loadBatchForSource( $ids, $source, - $tolerateBackendExceptions + $tolerateBackendExceptions, + $params ); // Check the results for missing records and try to load them with their old IDs: diff --git a/module/Finna/src/Finna/RecordDriver/Feature/ContainerFormatTrait.php b/module/Finna/src/Finna/RecordDriver/Feature/ContainerFormatTrait.php index caeb29a3476..b1c315d036e 100644 --- a/module/Finna/src/Finna/RecordDriver/Feature/ContainerFormatTrait.php +++ b/module/Finna/src/Finna/RecordDriver/Feature/ContainerFormatTrait.php @@ -32,6 +32,7 @@ use Finna\Record\Loader; use Finna\RecordDriver\PluginManager; use VuFind\RecordDriver\AbstractBase; +use VuFindSearch\ParamBag; use VuFindSearch\Response\RecordInterface; use function count; @@ -142,9 +143,13 @@ public function getEncapsulatedRecord(string $id): ?RecordInterface $driver instanceof EncapsulatedRecordInterface && $needed = $driver->needsRecordLoaded() ) { - $driver->setLoadedRecord( - $this->recordLoader->load($needed['id'], $needed['source'], true) + $loadedRecord = $this->recordLoader->load( + $needed['id'], + $needed['source'], + true, + new ParamBag(['finna.ignore_source_filter' => 1]) ); + $driver->setLoadedRecord($loadedRecord); } return $driver; } @@ -342,17 +347,22 @@ protected function loadNeededRecords(array $records): void { $neededMap = []; $ids = []; + $params = []; foreach ($records as $i => $record) { if ( $record instanceof EncapsulatedRecordInterface && $needed = $record->needsRecordLoaded() ) { - $neededMap[$needed['source']][$needed['id']] = $i; + $source = $needed['source']; + $neededMap[$source][$needed['id']] = $i; $ids[] = $needed; + if (!isset($params[$source])) { + $params[$source] = new ParamBag(['finna.ignore_source_filter' => 1]); + } } } if (!empty($ids)) { - $loadedRecords = $this->recordLoader->loadBatch($ids); + $loadedRecords = $this->recordLoader->loadBatch($ids, params: $params); foreach ($loadedRecords as $loadedRecord) { $loadedSource = $loadedRecord->getSourceIdentifier(); $loadedId = $loadedRecord->getUniqueID(); diff --git a/module/Finna/src/Finna/Search/Solr/SolrExtensionsListener.php b/module/Finna/src/Finna/Search/Solr/SolrExtensionsListener.php index 1e593929b19..75ed7c55bd2 100644 --- a/module/Finna/src/Finna/Search/Solr/SolrExtensionsListener.php +++ b/module/Finna/src/Finna/Search/Solr/SolrExtensionsListener.php @@ -192,10 +192,20 @@ public function onSearchPost(EventInterface $event) */ protected function addDataSourceFilter(EventInterface $event) { + $command = $event->getParam('command'); + $params = $command->getSearchParameters(); if ($recordSources = $this->getActiveSources($event)) { - $params = $event->getParam('command')->getSearchParameters(); - $params->add('fq', static::TERMS_FILTER_PREFIX_SOURCE . implode("\u{001f}", $recordSources)); + // Don't add the filter if we're retrieving a batch of records and requested so (e.g. AIPA encapsulated + // records): + $context = $command->getContext(); + if ( + 'retrieve' !== $context + && ('retrieveBatch' !== $context || !$params->get('finna.ignore_source_filter')) + ) { + $params->add('fq', static::TERMS_FILTER_PREFIX_SOURCE . implode("\u{001f}", $recordSources)); + } } + $params->remove('finna.ignore_source_filter'); } /** diff --git a/module/Finna/src/Finna/View/Helper/Root/RecordFactory.php b/module/Finna/src/Finna/View/Helper/Root/RecordFactory.php index db5aaea667c..c3a87b18607 100644 --- a/module/Finna/src/Finna/View/Helper/Root/RecordFactory.php +++ b/module/Finna/src/Finna/View/Helper/Root/RecordFactory.php @@ -82,9 +82,9 @@ public function __invoke( $container->get(\VuFind\Form\Form::class), $container->get(\Finna\Service\UserPreferenceService::class), function ($options) use ($container) { - $result = clone $container + $result = $container ->get(\VuFind\Search\Results\PluginManager::class) - ->get('EncapsulatedRecords'); + ->get(\Finna\Search\EncapsulatedRecords\Results::class); $result->getParams()->initFromRequest(new Parameters($options)); return $result; }