Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"league/mime-type-detection": "1.9.0",
"natlibfi/besimple-soap": "3.0.1",
"natlibfi/finna-code-sets": "0.5.2",
"natlibfi/finna-xml": "1.2.0",
"natlibfi/finna-xml": "1.5.0",
"natlibfi/php-html-parser": "4.0.1",
"phpoffice/phpspreadsheet": "^2.0",
"picqer/php-barcode-generator": "2.0.1",
Expand Down
14 changes: 7 additions & 7 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

76 changes: 43 additions & 33 deletions module/Finna/src/Finna/RecordDriver/AipaLrmi.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@
use Finna\RecordDriver\Feature\ContainerFormatTrait;
use Finna\RecordDriver\Feature\EncapsulatedRecordInterface;
use Finna\RecordDriver\Feature\EncapsulatedRecordTrait;
use FinnaXml\Notation;
use FinnaXml\XmlDoc;
use NatLibFi\FinnaCodeSets\FinnaCodeSets;

use function in_array;
use function is_callable;

/**
Expand All @@ -60,6 +63,23 @@ class AipaLrmi extends SolrLrmi implements
*/
protected FinnaCodeSets $codeSets;

/**
* Fields filtered from the record by getFilteredXmlElement method.
*
* @var array
*/
protected $filterFields = [
'abstract',
'description',
'assignmentIdeas',
'learningResource/studyObjectives',
'learningResource/educationalLevel/name',
'learningResource/educationalLevel/inDefinedTermSet/name',
'learningResource/educationalAlignment/educationalSubject/educationalFramework',
'learningResource/educationalAlignment/educationalSubject/targetName',
'learningResource/teaches/name',
];

/**
* Attach Finna Code Sets library instance.
*
Expand Down Expand Up @@ -267,7 +287,7 @@ public function getType(): string
*/
protected function getEncapsulatedRecordElementTagName(): string
{
return 'material';
return "{{$this->lrmiNs}}material";
}

/**
Expand All @@ -283,53 +303,43 @@ protected function getEncapsulatedRecordFormat($item): string
}

/**
* Return full record as a filtered SimpleXMLElement for public APIs.
* Return full record as a filtered XmlDoc for public APIs.
*
* @return \SimpleXMLElement
* @return XmlDoc
*/
public function getFilteredXMLElement(): \SimpleXMLElement
public function getFilteredXmlElement(): XmlDoc
{
$record = parent::getFilteredXMLElement();
$this->doFilterFields($record, ['abstract', 'description', 'assignmentIdeas']);
foreach ($record->learningResource as $learningResource) {
$this->doFilterFields($learningResource, ['studyObjectives']);
foreach ($learningResource->educationalLevel as $educationalLevel) {
$this->doFilterFields($educationalLevel, ['name']);
foreach ($educationalLevel->inDefinedTermSet as $inDefinedTermSet) {
$this->doFilterFields($inDefinedTermSet, ['name']);
}
}
foreach ($learningResource->educationalAlignment as $educationalAlignment) {
foreach ($educationalAlignment->educationalSubject as $educationalSubject) {
$this->doFilterFields(
$educationalSubject,
['educationalFramework', 'targetName']
);
}
}
foreach ($learningResource->teaches as $teaches) {
$this->doFilterFields($teaches, ['name']);
$record = parent::getFilteredXmlElement();
$record->filter(
function (array $node, string $path): bool {
$path = implode(
'/',
array_map(
function ($pathPart) {
[, $localName] = Notation::parse($pathPart);
return $localName;
},
explode('/', $path)
)
);
return in_array($path, $this->filterFields);
}
}
);

return $this->filterEncapsulatedRecords($record);
}

/**
* Helper method for filtering fields.
*
* @param \SimpleXMLElement $baseElement Base element
* @param array $filterFields Fields to filter
* @param XmlDoc $xmlDoc Document
* @param array $filterFields Fields to filter (paths with local names of nodes)
*
* @return void
*/
protected function doFilterFields(
\SimpleXMLElement $baseElement,
XmlDoc $xmlDoc,
array $filterFields
): void {
foreach ($filterFields as $filterField) {
while ($baseElement->{$filterField}) {
unset($baseElement->{$filterField}[0]);
}
}
}
}
18 changes: 10 additions & 8 deletions module/Finna/src/Finna/RecordDriver/CuratedRecord.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
use Finna\RecordDriver\Feature\EncapsulatedRecordInterface;
use Finna\RecordDriver\Feature\EncapsulatedRecordTrait;
use Finna\RecordDriver\Feature\FinnaXmlReaderTrait;
use FinnaXml\Notation;
use FinnaXml\XmlDoc;
use VuFind\RecordDriver\AbstractBase;
use VuFindSearch\Response\RecordInterface;

Expand Down Expand Up @@ -147,17 +149,17 @@ public function getNotes(): string
/**
* Return full record as a filtered SimpleXMLElement for public APIs.
*
* @return \SimpleXMLElement
* @return XmlDoc
*/
public function getFilteredXMLElement(): \SimpleXMLElement
public function getFilteredXMLElement(): XmlDoc
{
$record = clone $this->getXmlRecord();
$filterFields = ['comment'];
foreach ($filterFields as $filterField) {
while ($record->{$filterField}) {
unset($record->{$filterField}[0]);
$record = clone $this->getXmlDoc();
$record->filter(
function (array $node) use ($record): bool {
[, $localName] = Notation::parse($record->name($node));
return 'comment' === $localName;
}
}
);
// Only the URL of the single encapsulated record is in the XML record, so
// there is no need to call filterEncapsulatedRecords().
return $record;
Expand Down
2 changes: 1 addition & 1 deletion module/Finna/src/Finna/RecordDriver/CuratedRecordList.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public function getAdditionalType(): string
*/
protected function getEncapsulatedRecordElementTagName(): string
{
return 'curatedRecord';
return "{{$this->aipaNs}}curatedRecord";
}

/**
Expand Down
Loading