3333use Finna \RecordDriver \Feature \ContainerFormatTrait ;
3434use Finna \RecordDriver \Feature \EncapsulatedRecordInterface ;
3535use Finna \RecordDriver \Feature \EncapsulatedRecordTrait ;
36+ use FinnaXml \XmlDoc ;
3637use NatLibFi \FinnaCodeSets \FinnaCodeSets ;
3738
39+ use function in_array ;
3840use function is_callable ;
3941
4042/**
@@ -60,6 +62,23 @@ class AipaLrmi extends SolrLrmi implements
6062 */
6163 protected FinnaCodeSets $ codeSets ;
6264
65+ /**
66+ * Fields filtered from the record by getFilteredXmlElement method.
67+ *
68+ * @var array
69+ */
70+ protected $ filterFields = [
71+ 'abstract ' ,
72+ 'description ' ,
73+ 'assignmentIdeas ' ,
74+ 'learningResource/studyObjectives ' ,
75+ 'learningResource/educationalLevel/name ' ,
76+ 'learningResource/educationalLevel/inDefinedTermSet/name ' ,
77+ 'learningResource/educationalAlignment/educationalSubject/educationalFramework ' ,
78+ 'learningResource/educationalAlignment/educationalSubject/targetName ' ,
79+ 'learningResource/teaches/name ' ,
80+ ];
81+
6382 /**
6483 * Attach Finna Code Sets library instance.
6584 *
@@ -267,7 +286,7 @@ public function getType(): string
267286 */
268287 protected function getEncapsulatedRecordElementTagName (): string
269288 {
270- return ' material ' ;
289+ return " { { $ this -> lrmiNs } } material" ;
271290 }
272291
273292 /**
@@ -283,53 +302,40 @@ protected function getEncapsulatedRecordFormat($item): string
283302 }
284303
285304 /**
286- * Return full record as a filtered SimpleXMLElement for public APIs.
305+ * Return full record as a filtered XmlDoc for public APIs.
287306 *
288- * @return \SimpleXMLElement
307+ * @return XmlDoc
289308 */
290- public function getFilteredXMLElement (): \ SimpleXMLElement
309+ public function getFilteredXmlElement (): XmlDoc
291310 {
292- $ record = parent ::getFilteredXMLElement ();
293- $ this ->doFilterFields ($ record , ['abstract ' , 'description ' , 'assignmentIdeas ' ]);
294- foreach ($ record ->learningResource as $ learningResource ) {
295- $ this ->doFilterFields ($ learningResource , ['studyObjectives ' ]);
296- foreach ($ learningResource ->educationalLevel as $ educationalLevel ) {
297- $ this ->doFilterFields ($ educationalLevel , ['name ' ]);
298- foreach ($ educationalLevel ->inDefinedTermSet as $ inDefinedTermSet ) {
299- $ this ->doFilterFields ($ inDefinedTermSet , ['name ' ]);
300- }
301- }
302- foreach ($ learningResource ->educationalAlignment as $ educationalAlignment ) {
303- foreach ($ educationalAlignment ->educationalSubject as $ educationalSubject ) {
304- $ this ->doFilterFields (
305- $ educationalSubject ,
306- ['educationalFramework ' , 'targetName ' ]
307- );
308- }
309- }
310- foreach ($ learningResource ->teaches as $ teaches ) {
311- $ this ->doFilterFields ($ teaches , ['name ' ]);
311+ $ record = parent ::getFilteredXmlElement ();
312+ $ record ->filter (
313+ function (array $ node , string $ path ) use ($ record ): bool {
314+ $ path = implode (
315+ '/ ' ,
316+ array_map (
317+ [$ record , 'localName ' ],
318+ explode ('/ ' , $ path )
319+ )
320+ );
321+ return in_array ($ path , $ this ->filterFields );
312322 }
313- }
323+ );
324+
314325 return $ this ->filterEncapsulatedRecords ($ record );
315326 }
316327
317328 /**
318329 * Helper method for filtering fields.
319330 *
320- * @param \SimpleXMLElement $baseElement Base element
321- * @param array $filterFields Fields to filter
331+ * @param XmlDoc $xmlDoc Document
332+ * @param array $filterFields Fields to filter (paths with local names of nodes)
322333 *
323334 * @return void
324335 */
325336 protected function doFilterFields (
326- \ SimpleXMLElement $ baseElement ,
337+ XmlDoc $ xmlDoc ,
327338 array $ filterFields
328339 ): void {
329- foreach ($ filterFields as $ filterField ) {
330- while ($ baseElement ->{$ filterField }) {
331- unset($ baseElement ->{$ filterField }[0 ]);
332- }
333- }
334340 }
335341}
0 commit comments