From e843dfe53ed42dc2d521e5286c5de22e1345cd47 Mon Sep 17 00:00:00 2001 From: Christos Sidiropoulos Date: Thu, 28 Sep 2023 14:28:32 +0000 Subject: [PATCH] Squashed commit of the following: commit 28a365c435d2defda6c1e29f3dc8fa7be3178be7 Author: Beatrycze Volk Date: Wed Sep 27 15:30:10 2023 +0200 [FEATURE] Reimplement SearchInDocument tool to create results' links in backend (#1002) Co-authored-by: Sebastian Meyer commit 8bb5550df94a0818f58df311369242ffbf7ee052 Author: Beatrycze Volk Date: Wed Sep 27 14:18:04 2023 +0200 [BUGFIX] Fix returns in controllers' main functions (#1001) Co-authored-by: Sebastian Meyer commit db4ecb12dfe483af012eb9f1c6fdcd12ff2f2044 Author: Beatrycze Volk Date: Wed Sep 27 13:46:34 2023 +0200 [BUGFIX] Reassign viewData['requestData'] after page is validated (#1000) Co-authored-by: Sebastian Meyer commit 72fcc8d2dac3014dc6d73b776187039f36ff9f23 Author: Beatrycze Volk Date: Wed Sep 27 13:17:31 2023 +0200 [DOCUMENTATION] Fix documentation for toolbox (#999) Co-authored-by: Sebastian Meyer commit b4fe188823688dfbb672a9bcc3f609442cd0d2a9 Author: Beatrycze Volk Date: Wed Sep 27 12:52:10 2023 +0200 [MAINTENANCE] Rename Doc class to AbstractDocument (#990) Co-authored-by: Sebastian Meyer commit ccf559d803a049ffa18f0aa564bb86529bb3efbd Author: Beatrycze Volk Date: Wed Sep 27 12:44:01 2023 +0200 [MAINTENANCE] Change initialization of DocumentRepository in DocumentTypeFunctionProvider (#960) commit 2116044d4467e9aa69f050321237a7cb1871540a Merge: 179f4d47 fa3cdee6 Author: Sebastian Meyer Date: Wed Sep 27 11:58:53 2023 +0200 Merge branch 'master' of https://github.com/kitodo/kitodo-presentation commit 179f4d47040cf9400b0c8a8e56a6e4a3c9ab3f0a Author: Sebastian Meyer Date: Wed Sep 27 11:58:32 2023 +0200 Update tests.yml commit fa3cdee669b94dbd59d7bd095ea8e8ded62b2d6d Author: Christopher Date: Wed Sep 27 11:20:29 2023 +0200 [BUGFIX] PageRepository class moved to Core (#1020) commit b7a16e1ccaf8ac3bdc909e5dfd9b5353ff95669f Author: Sebastian Meyer Date: Tue Sep 26 09:55:34 2023 +0200 Update composer.json commit 534a096c8b8bf88bdbae1d1df20cb17cd45e444e Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Sep 25 13:58:52 2023 +0200 [MAINTENANCE] Bump typo3/testing-framework from 6.16.9 to 7.0.4 (#1017) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit ddb1076b39b3339b448d047a095c4c63c964f556 Author: Sebastian Meyer Date: Fri Sep 15 20:19:09 2023 +0200 Remove redundant method setPage() commit ee43a786622c350e76e5c776b4576b84f0394481 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Sep 15 18:54:52 2023 +0200 [MAINTENANCE] Bump guzzlehttp/psr7 from 2.4.3 to 2.6.1 (#1016) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 5e069ebeb2702a69d43a3c93c05ad2646465f60e Merge: 109c4858 d0cf6894 Author: Sebastian Meyer Date: Fri Sep 15 18:45:32 2023 +0200 Merge branch 'effective-webwork-typo3v11' commit d0cf689457fd3312f066090bcc5e5c0de5551daf Author: Beatrycze Volk Date: Fri Sep 1 12:07:13 2023 +0200 [BUGFIX] Display issues correctly in ToC plugin (#964) Co-authored-by: Sebastian Meyer commit 650e8eb8babf8f20997d44634687cb1562efa3ec Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Aug 7 11:56:51 2023 +0200 [DEPENDENCY] Bump typo3/testing-framework from 6.16.8 to 6.16.9 (#996) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Meyer commit 3ba1c64073ad1b09898b7441c18f24e8ed8dd7b4 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Aug 7 11:39:12 2023 +0200 [DEPENDENCY] Bump typo3/html-sanitizer from 2.1.1 to 2.1.3 (#995) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 5ce393cafe9c4ada6a55a5725447c4d926d193b0 Author: Beatrycze Volk Date: Fri Jul 21 18:46:28 2023 +0200 [BUGFIX] Minor fixes in ToolboxController (#993) Co-authored-by: Sebastian Meyer commit e888384e7386a73d131eba5fd5f3ee26c1c14e53 Author: Beatrycze Volk Date: Fri Jul 21 18:43:28 2023 +0200 [BUGFIX] Minor fixes in Helper class (#992) Co-authored-by: Sebastian Meyer commit ce755eacd6f0fb4568c7ba1fe232afee69d92ac1 Author: Beatrycze Volk Date: Fri Jul 21 18:38:24 2023 +0200 [BUGFIX] Remove not needed call to createDocument function (#991) Co-authored-by: Sebastian Meyer commit f2add87751fedef9493ade6bbf36c9d0b87155b6 Author: Beatrycze Volk Date: Fri Jul 21 18:16:30 2023 +0200 [BUGFIX] Use $forceReload parameter in getInstance (#989) Co-authored-by: Sebastian Meyer commit e60d6b66ad19784a0c15fb0ce9da157d380cb983 Author: Beatrycze Volk Date: Fri Jul 21 18:02:42 2023 +0200 [BUGFIX] Remove not existing getUid and getLocation (#988) commit 9e77aa1a414d6cc4c0593d025094411edcfbe8fa Author: Beatrycze Volk Date: Thu Jul 20 18:01:22 2023 +0200 [BUGFIX] Resolve link to the parent if the parent is multivolume_work or multipart_manuscript (#985) Co-authored-by: Sebastian Meyer commit 36d9438ada1bca9016c1a1d0e0e280a400653731 Author: Beatrycze Volk Date: Thu Jul 20 16:18:19 2023 +0200 [MAINTENANCE] Fix and move Solr classes (#982) Co-authored-by: Sebastian Meyer commit 8726c276c0eec764ef4ceee1a4a415796b56756e Author: Beatrycze Volk Date: Thu Jul 20 16:05:49 2023 +0200 [BUGFIX] Fix return type for getTableOfContentsFromDb function (#986) Co-authored-by: Sebastian Meyer commit 08ef9f4990e613654af57da14c577c516fc534fc Author: Beatrycze Volk Date: Thu Jul 20 15:43:59 2023 +0200 [BUGFIX] Fix variable type and remove deprecations in FileLocationUpdater (#981) Co-authored-by: Sebastian Meyer commit a20b8187e0aaaa2188c5b8e43d05a2a016353de5 Author: Beatrycze Volk Date: Thu Jul 20 15:15:37 2023 +0200 [FEATURE] Use order in case volume_sorting is empty (#984) commit 0d590cc96ad2e7190589764b8972f936e39bcb4d Author: Christopher Date: Tue Jul 11 10:52:18 2023 +0200 [BUGFIX] Persist collection to prevent duplicates (#983) commit ddaaf04897421c5ac39c01056d3b710ccbf3dd01 Author: Beatrycze Volk Date: Tue Jun 27 13:31:46 2023 +0200 [BUGFIX] Fix logger docs in API classes (#980) Co-authored-by: Sebastian Meyer commit e39d8e95562bf5cf9953cf700d46c0b591b72121 Author: Beatrycze Volk Date: Tue Jun 27 12:51:26 2023 +0200 [BUGFIX] Fixes in Doc class (#979) commit b7f2404d15fa2eed4f47c9e434c6b6e6c4ad69e6 Author: Beatrycze Volk Date: Mon Jun 26 19:42:52 2023 +0200 [BUGFIX] Fix SolrSearch implementation (#978) Co-authored-by: Sebastian Meyer commit eb1bffd1f9557b5c53459bf4d4953ee832a4774c Author: Beatrycze Volk Date: Mon Jun 26 19:26:44 2023 +0200 [MAINTENANCE] Improve readability in SearchController (#977) Co-authored-by: Sebastian Meyer commit 8468a9510eaaa43c2d57f738807e76b49c9285eb Author: Beatrycze Volk Date: Mon Jun 26 19:21:49 2023 +0200 [MAINTENANCE] Remove unused imports and declarations (#976) Co-authored-by: Sebastian Meyer commit 201d32d4b792b7787b9d705502aff58a8debd82d Author: Beatrycze Volk Date: Mon Jun 26 18:36:45 2023 +0200 [FEATURE] Make amount of children rows configurable (#970) Co-authored-by: Sebastian Meyer commit ecf8b3c29bb3ad80ccfd86fce7d14dce0e36bad9 Author: Michael Kubina Date: Mon Jun 26 18:34:17 2023 +0200 [FEATURE] Add more search operators and fix highlighting (#948) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit eaf770e8bb1c3bb677f026dab8992e81ca75fd09 Author: Beatrycze Volk Date: Mon Jun 26 18:26:40 2023 +0200 [MAINTENANCE] Initialize metadata array with empty values in abstract Doc class (#961) Co-authored-by: Sebastian Meyer commit fc1f7318e38d0f1bfa7652a98b09d6429bd938ed Author: Beatrycze Volk Date: Mon Jun 26 16:37:18 2023 +0200 [MAINTENANCE] Adjust deprecated calls for database queries (#975) Co-authored-by: Sebastian Meyer commit 787fbaccf65abbe97a1e06776704afb226a8664b Author: Beatrycze Volk Date: Thu Jun 22 15:08:21 2023 +0200 [BUGFIX] Display volumes correctly in ToC plugin (#957) Co-authored-by: Sebastian Meyer commit d9963cf7b660f7e6f2aab5031164c4983b314d10 Author: Beatrycze Volk Date: Thu Jun 22 12:22:15 2023 +0200 [BUGFIX] Check if result returned from suggester is iterable before passing it to the array (#973) Co-authored-by: Sebastian Meyer commit 9826fcac4375aad79e349fa44db4420959c08df9 Author: Beatrycze Volk Date: Thu Jun 22 11:41:35 2023 +0200 [BUGFIX] Check for getDoc equal null in DocumentTypeFunctionProvider (#972) Co-authored-by: Sebastian Meyer commit 3ed0d61fdef1aaa71e3101f276d815b81c4bff08 Author: Beatrycze Volk Date: Thu Jun 22 11:23:26 2023 +0200 [BUGFIX] Fix error Illegal string offset 'id' (#971) commit 5271bfd02699a5f0685935c43b2f2fed8d355c72 Author: Sebastian Meyer Date: Mon Jun 12 18:13:13 2023 +0200 [BUGFIX] Revert #967 "Increase the amount of metadata loaded in collection view" (#969) commit a5285ccc52ea6822141c149713685ddfc4eff6d7 Author: Beatrycze Volk Date: Wed May 24 21:58:10 2023 +0200 [BUGFIX] Increase the amount of metadata loaded in collection view (#967) Co-authored-by: Sebastian Meyer commit 73eaa5f7236640c3cc4f1c6273b342faaf349043 Author: Michael Kubina Date: Wed May 24 21:52:45 2023 +0200 [BUGFIX] Prevent attempted indexing of improper dateformats (#963) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit bc51faaa03ecb271e1170fbb96c9ba49bca618df Author: Beatrycze Volk Date: Wed May 24 21:34:20 2023 +0200 [MAINTENANCE] Use parentHref for getting parent document uid while indexing (#958) Co-authored-by: Sebastian Meyer commit 87af8454b61cbf84998e57df8f7ece4283132750 Author: Beatrycze Volk Date: Wed May 24 21:24:44 2023 +0200 [BUGFIX] Sort entries in Table of Content plugin by orderlabel (#956) Co-authored-by: Sebastian Meyer commit 3a0a369a9bf8bd52730137ee767f540f4af323c9 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed May 24 21:18:26 2023 +0200 [MAINTENANCE] Bump typo3/testing-framework from 6.16.7 to 6.16.8 (#955) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Meyer commit 75cafd5ac417c4fc24407331f55b4dd192af4408 Author: Beatrycze Volk Date: Wed May 24 21:13:36 2023 +0200 [BUGFIX] Add cases for tools configured without tx_dlf_ (#951) Co-authored-by: Sebastian Meyer commit 70b80d209fde507df5fb2f14e0e12fe1c4b075da Author: Beatrycze Volk Date: Wed May 24 21:09:37 2023 +0200 [BUGFIX] Fix logger call for warning (#950) Co-authored-by: Sebastian Meyer commit 629e145a3d24c99342ec1e91af4e769b8955946a Author: Beatrycze Volk Date: Wed May 24 20:59:42 2023 +0200 [BUGFIX] Fix doc calls in MetadataController (#949) Co-authored-by: Sebastian Meyer commit eb1813e91a44971d10e3ee541833ca6c27ca7161 Author: Michael Kubina Date: Wed May 24 20:52:22 2023 +0200 [FEATURE] Add an option to preselect fulltext search as default (#905) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 751955e26e35efc292ab2585f5c60eb3f46592f5 Author: Michael Kubina Date: Thu Apr 20 17:33:14 2023 +0200 [BUG] Fix pagenavigation on sorted resultsets (#930) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 54a8090bd63d676c07ddadf43cabbc8323bcfcd5 Author: Michael Kubina Date: Thu Apr 20 17:18:05 2023 +0200 [BUGFIX] Fix missing lastPage option in Navigation-Plugin and swapped pageBack/pageStepBack (#945) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 596408ee8a9e9f508ad6e08b5cbb71beaccecfca Author: Beatrycze Volk Date: Thu Apr 20 17:03:42 2023 +0200 [MAINTENANCE] Move proxy URL configuration to AbstractController (#944) Co-authored-by: Sebastian Meyer commit 41b581c047b10866c43efa594f343a52cd787620 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 20 16:52:00 2023 +0200 [DEPENDENCY] Bump guzzlehttp/psr7 from 1.9.0 to 1.9.1 (#947) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit a66f94d0d0f09afecd8bedcb96bb912ebb9c7766 Author: Beatrycze Volk Date: Thu Apr 6 13:40:09 2023 +0200 Assign mimetype directly commit f81bc2e0bcdfd9f8de74d9001c145f5837bd537b Author: Beatrycze Volk Date: Wed Apr 5 18:01:19 2023 +0200 Remove sanitize for double request data It is already done in AbstractController commit ab221c176b4df100c963254ac0145696d8ff9ff3 Author: Beatrycze Volk Date: Wed Apr 5 14:57:27 2023 +0200 Change way for rendering tools in toolbox commit ccbc0a18790c34bec5361884303cda93f020b07a Author: Beatrycze Volk Date: Wed Apr 5 14:51:58 2023 +0200 Improve readability of toolbox typoscript commit e0c084815757471bc0ea74a074a2909948f8918b Author: Beatrycze Volk Date: Thu Mar 30 14:57:33 2023 +0200 Split parsing of metadata in printMetadata method commit aa7d3368b607f292714acb8fb4b551f7c504f197 Author: Beatrycze Volk Date: Thu Mar 30 14:40:31 2023 +0200 Add reference the current index in the foreach loop Avoid $i incrementation inside the loop commit 303fe26448eb3a53db3622d60a35a2f946532789 Author: Beatrycze Volk Date: Thu Mar 30 13:26:56 2023 +0200 Move build of metaCObjData to the own method commit 55e28b56d90636b22648074f909b1beccaf43188 Author: Beatrycze Volk Date: Tue Apr 4 15:06:58 2023 +0200 Add class property doc to shorten usage of $this->document->getDoc() commit 039ec07e2c2fe1bf2d478a655adcd3a8b1293912 Author: Beatrycze Volk Date: Tue Apr 4 14:50:58 2023 +0200 Move setPage out of else statement commit 8d6fc51b526f75b558d751dcd9427808575ce4e4 Author: Beatrycze Volk Date: Tue Apr 4 14:48:11 2023 +0200 Move page setting to own method commit f51e8bf98fb00a0eff0482278d987a2401fa80a9 Author: Beatrycze Volk Date: Thu Mar 30 15:12:18 2023 +0200 Move value translation for search facet to the own method commit e12a9e87a15b376084f26feed3390b7214d9cae3 Author: Beatrycze Volk Date: Thu Mar 30 12:33:42 2023 +0200 Move build of IIIF data to separated method commit 97374799dabcbb6c0dcb4102911d94ab368ec5eb Author: Beatrycze Volk Date: Thu Mar 30 11:57:22 2023 +0200 Add doc property to increase code readability commit 799742ff12baa811fba8a6ae559b27ff0ba0e441 Author: Beatrycze Volk Date: Wed Mar 29 16:40:49 2023 +0200 Move setup of default values to own method Avoid list of ifs with the same functionality commit a77a42fd7a1ac488e2b06ee140175a1662e1e809 Author: Sebastian Meyer Date: Wed Apr 5 13:06:55 2023 +0200 Move sanitation to separate method commit 083dfee01d5ca4446423bca26254dd69cda95ad9 Author: Sebastian Meyer Date: Wed Apr 5 12:53:13 2023 +0200 Log variable before unsetting it commit 39138c799259f0376f7fc1881f4cafeddc659a91 Author: Sebastian Meyer Date: Tue Apr 4 13:57:15 2023 +0200 Add helper function for validity check commit 51082b783ff1afc429999c753e541cbb9ea90fb7 Author: Sebastian Meyer Date: Tue Apr 4 13:28:34 2023 +0200 Update Classes/Controller/AbstractController.php Co-authored-by: Beatrycze Volk commit ea82442dfd0fbe0d4b4e6b3966f3a2fea0522ee3 Author: Sebastian Meyer Date: Mon Apr 3 17:48:53 2023 +0200 Fix XSS vulnerability commit 26958186e79c88aedae3d104d8047c2426e05509 Author: Beatrycze Volk Date: Tue Apr 4 16:29:01 2023 +0200 Move setPage to AbstractController commit 705a9adb44cc654c0e92fe9daf969c6496bb032b Author: Beatrycze Volk Date: Tue Apr 4 15:06:58 2023 +0200 Add class property doc to shorten usage of $this->document->getDoc() commit a97a78b251864e3c3727ea06abc667adcc761d92 Author: Beatrycze Volk Date: Tue Apr 4 14:50:58 2023 +0200 Move setPage out of else statement commit 2e69ba888637a3236d137bdf14edd71870aaebba Author: Beatrycze Volk Date: Tue Apr 4 14:48:11 2023 +0200 Move page setting to own method commit 262bea0dcee83c17e35d3afcfd46071e7f8bcb5a Author: Beatrycze Volk Date: Tue Apr 4 14:40:58 2023 +0200 Rename render tool functions to match the naming standards commit 05ce87dfe00d91751c0154ae2cdab535c150ce16 Author: Sebastian Meyer Date: Tue Mar 21 08:42:18 2023 +0100 Add additional check for empty core name commit 763256d9795538bbc8da73263d5c1be2cd83bee7 Author: Sebastian Meyer Date: Sun Mar 19 09:43:05 2023 +0100 Prevent db record when core fails commit f3b8004f33bf4b05f6cb523a6ef68ba3b0db7c44 Author: Sebastian Meyer Date: Sat Mar 18 10:13:12 2023 +0100 Add flash message for Solr core creation commit c4232496db383cc1e26952be67e679b9b37a6109 Author: Sebastian Meyer Date: Wed Mar 15 20:07:24 2023 +0100 Make Solr core name mandatory commit 109c48581f01b08d9529283e7c6ae6bb63441b0a Author: Beatrycze Volk Date: Fri Sep 1 12:07:13 2023 +0200 [BUGFIX] Display issues correctly in ToC plugin (#964) Co-authored-by: Sebastian Meyer commit 87be4c44eb4125c156e3bba9c2f0747a4fe5bde6 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Aug 7 11:56:51 2023 +0200 [DEPENDENCY] Bump typo3/testing-framework from 6.16.8 to 6.16.9 (#996) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Meyer commit b4faa7a9ad105dee0484c6f16e87fae0da6357bc Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Aug 7 11:39:12 2023 +0200 [DEPENDENCY] Bump typo3/html-sanitizer from 2.1.1 to 2.1.3 (#995) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 38b64cad5d7ea630fe063556404af46c9244220e Author: Beatrycze Volk Date: Fri Jul 21 18:46:28 2023 +0200 [BUGFIX] Minor fixes in ToolboxController (#993) Co-authored-by: Sebastian Meyer commit 0869183cf1567b36cd4d26676231b19588c51ecc Author: Beatrycze Volk Date: Fri Jul 21 18:43:28 2023 +0200 [BUGFIX] Minor fixes in Helper class (#992) Co-authored-by: Sebastian Meyer commit f1451a42dbde3343c42bca8599c19d731583c497 Author: Beatrycze Volk Date: Fri Jul 21 18:38:24 2023 +0200 [BUGFIX] Remove not needed call to createDocument function (#991) Co-authored-by: Sebastian Meyer commit 43ce528fa6f363051114923502a1830a4735f9c8 Author: Beatrycze Volk Date: Fri Jul 21 18:16:30 2023 +0200 [BUGFIX] Use $forceReload parameter in getInstance (#989) Co-authored-by: Sebastian Meyer commit c4a6fd0b8429fad1c4c04c6b168691c55a4221ae Author: Beatrycze Volk Date: Fri Jul 21 18:02:42 2023 +0200 [BUGFIX] Remove not existing getUid and getLocation (#988) commit c5a92681c5792ff8e63a991ec2f70fb0ff17120a Author: Beatrycze Volk Date: Thu Jul 20 18:01:22 2023 +0200 [BUGFIX] Resolve link to the parent if the parent is multivolume_work or multipart_manuscript (#985) Co-authored-by: Sebastian Meyer commit e3d09d8f069c3da6ea34db8e8b47ddc7f2c5c0a3 Author: Beatrycze Volk Date: Thu Jul 20 16:18:19 2023 +0200 [MAINTENANCE] Fix and move Solr classes (#982) Co-authored-by: Sebastian Meyer commit 613ade190f3bcac1e0a33833d8aade6eb37a47c5 Author: Beatrycze Volk Date: Thu Jul 20 16:05:49 2023 +0200 [BUGFIX] Fix return type for getTableOfContentsFromDb function (#986) Co-authored-by: Sebastian Meyer commit 2daf3dfe8a0546c2759330922b3a20cc838de724 Author: Beatrycze Volk Date: Thu Jul 20 15:43:59 2023 +0200 [BUGFIX] Fix variable type and remove deprecations in FileLocationUpdater (#981) Co-authored-by: Sebastian Meyer commit f78b6b3162efee0c42e751b2ff54a32937dc942a Author: Beatrycze Volk Date: Thu Jul 20 15:15:37 2023 +0200 [FEATURE] Use order in case volume_sorting is empty (#984) commit 53c5b99dacec52368de9ed359e955e1177fd03a2 Author: Christopher Date: Tue Jul 11 10:52:18 2023 +0200 [BUGFIX] Persist collection to prevent duplicates (#983) commit e1f382168f5ffcdb35044c62a94726a3fe3a12f4 Author: Beatrycze Volk Date: Tue Jun 27 13:31:46 2023 +0200 [BUGFIX] Fix logger docs in API classes (#980) Co-authored-by: Sebastian Meyer commit fe09c74637a9fdc925606d174b80378d87ed8576 Author: Beatrycze Volk Date: Tue Jun 27 12:51:26 2023 +0200 [BUGFIX] Fixes in Doc class (#979) commit 5e3251d2d3b313331927703e741a32290392740b Author: Beatrycze Volk Date: Mon Jun 26 19:42:52 2023 +0200 [BUGFIX] Fix SolrSearch implementation (#978) Co-authored-by: Sebastian Meyer commit e2fc25606706044ec5435da6cca6ebd96bb77911 Author: Beatrycze Volk Date: Mon Jun 26 19:26:44 2023 +0200 [MAINTENANCE] Improve readability in SearchController (#977) Co-authored-by: Sebastian Meyer commit 5fcc99def25ac78659d7c4475cc72f714c9ec5e4 Author: Beatrycze Volk Date: Mon Jun 26 19:21:49 2023 +0200 [MAINTENANCE] Remove unused imports and declarations (#976) Co-authored-by: Sebastian Meyer commit 20e09bd08fb17aa164b9c6c68db9f72efd35eae3 Author: Beatrycze Volk Date: Mon Jun 26 18:36:45 2023 +0200 [FEATURE] Make amount of children rows configurable (#970) Co-authored-by: Sebastian Meyer commit 72acb39756e79d28bd0b407d4a09618422435d23 Author: Michael Kubina Date: Mon Jun 26 18:34:17 2023 +0200 [FEATURE] Add more search operators and fix highlighting (#948) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit d0e29dae1d0c9d44d0e5ba19f5ea0dc54e0d4751 Author: Beatrycze Volk Date: Mon Jun 26 18:26:40 2023 +0200 [MAINTENANCE] Initialize metadata array with empty values in abstract Doc class (#961) Co-authored-by: Sebastian Meyer commit 7bda98d227f40f099ca1c1646c8b4c301ca25e77 Author: Beatrycze Volk Date: Mon Jun 26 16:37:18 2023 +0200 [MAINTENANCE] Adjust deprecated calls for database queries (#975) Co-authored-by: Sebastian Meyer commit ea1e2998e596c9afcc5292f0c1d73408281c40e2 Author: Beatrycze Volk Date: Thu Jun 22 15:08:21 2023 +0200 [BUGFIX] Display volumes correctly in ToC plugin (#957) Co-authored-by: Sebastian Meyer commit c81db52202e385041a49ef14107bdd3d97e42f7e Author: Beatrycze Volk Date: Thu Jun 22 12:22:15 2023 +0200 [BUGFIX] Check if result returned from suggester is iterable before passing it to the array (#973) Co-authored-by: Sebastian Meyer commit 70fbfce45ea5c203a76a24bf27139ee644e7b39d Author: Beatrycze Volk Date: Thu Jun 22 11:41:35 2023 +0200 [BUGFIX] Check for getDoc equal null in DocumentTypeFunctionProvider (#972) Co-authored-by: Sebastian Meyer commit cdc55ffa485d23d3364860408a35f6c5c8becd1e Author: Beatrycze Volk Date: Thu Jun 22 11:23:26 2023 +0200 [BUGFIX] Fix error Illegal string offset 'id' (#971) commit bc682185659873d42e38bedb437d46cba16c1d62 Author: Sebastian Meyer Date: Mon Jun 12 18:13:13 2023 +0200 [BUGFIX] Revert #967 "Increase the amount of metadata loaded in collection view" (#969) commit 4256816e4159699604c0b913e0a268928dcff34d Author: Beatrycze Volk Date: Wed May 24 21:58:10 2023 +0200 [BUGFIX] Increase the amount of metadata loaded in collection view (#967) Co-authored-by: Sebastian Meyer commit 9d9b7cec68e15da9537da71c6205911455710613 Author: Michael Kubina Date: Wed May 24 21:52:45 2023 +0200 [BUGFIX] Prevent attempted indexing of improper dateformats (#963) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 95c820dd73584076ff34ed7cf6b6cd9ac6152dec Author: Beatrycze Volk Date: Wed May 24 21:34:20 2023 +0200 [MAINTENANCE] Use parentHref for getting parent document uid while indexing (#958) Co-authored-by: Sebastian Meyer commit 2a81967a3c5c1c01d8e60aee014b926b0c6b07c8 Author: Beatrycze Volk Date: Wed May 24 21:24:44 2023 +0200 [BUGFIX] Sort entries in Table of Content plugin by orderlabel (#956) Co-authored-by: Sebastian Meyer commit 968c2a43b5f3d9405359ed73d274813352942e20 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed May 24 21:18:26 2023 +0200 [MAINTENANCE] Bump typo3/testing-framework from 6.16.7 to 6.16.8 (#955) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sebastian Meyer commit 2fff5094ca7c7ef68cc6cf2d100df62f25c785a3 Author: Beatrycze Volk Date: Wed May 24 21:13:36 2023 +0200 [BUGFIX] Add cases for tools configured without tx_dlf_ (#951) Co-authored-by: Sebastian Meyer commit f2aa5647966dec7c9e4aad401b666ec7160179a7 Author: Beatrycze Volk Date: Wed May 24 21:09:37 2023 +0200 [BUGFIX] Fix logger call for warning (#950) Co-authored-by: Sebastian Meyer commit 26cc64cc7a396e2ceded094f8024f45d86805fcb Author: Beatrycze Volk Date: Wed May 24 20:59:42 2023 +0200 [BUGFIX] Fix doc calls in MetadataController (#949) Co-authored-by: Sebastian Meyer commit 254a66adef35c3b05d1fa6e97b0ae8c00ae1e7fc Author: Michael Kubina Date: Wed May 24 20:52:22 2023 +0200 [FEATURE] Add an option to preselect fulltext search as default (#905) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 09156eaf89fdbe8c9c2e9fe37fd07c849eb45242 Author: Michael Kubina Date: Thu Apr 20 17:33:14 2023 +0200 [BUG] Fix pagenavigation on sorted resultsets (#930) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 57a611579f3f0846cfcb54c9395a59357aefb650 Author: Michael Kubina Date: Thu Apr 20 17:18:05 2023 +0200 [BUGFIX] Fix missing lastPage option in Navigation-Plugin and swapped pageBack/pageStepBack (#945) Co-authored-by: Michael Kubina Co-authored-by: Sebastian Meyer commit 54053e96aac3e662a1abad59608edc0380ff7700 Author: Beatrycze Volk Date: Thu Apr 20 17:03:42 2023 +0200 [MAINTENANCE] Move proxy URL configuration to AbstractController (#944) Co-authored-by: Sebastian Meyer commit 966b738760682490bb874eccf8e35261096e0a2a Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 20 16:52:00 2023 +0200 [DEPENDENCY] Bump guzzlehttp/psr7 from 1.9.0 to 1.9.1 (#947) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit d3c751a8692c01acb4b43530fe133bea8e49534d Author: Beatrycze Volk Date: Thu Apr 6 13:34:23 2023 +0200 Remove assignment of workLink variable commit 03164fa1194bb5c5257d5911fec4de8061536c1e Author: Beatrycze Volk Date: Thu Apr 6 13:40:09 2023 +0200 Assign mimetype directly commit 9c7e219d16db07dfaa076138779a09babaf331c9 Author: Beatrycze Volk Date: Wed Apr 5 18:01:19 2023 +0200 Remove sanitize for double request data It is already done in AbstractController commit 0054abb0f16369ed363b3bf0fc730e7c50cb92a7 Author: Beatrycze Volk Date: Wed Apr 5 14:57:27 2023 +0200 Change way for rendering tools in toolbox commit 433df246b0e24d45f867217d54c54f46b7fa5074 Author: Beatrycze Volk Date: Wed Apr 5 14:51:58 2023 +0200 Improve readability of toolbox typoscript commit 67cfe39bdd6f35eec2e34d49351f636fc391bc74 Merge: 4635ba00 3356d924 Author: Sebastian Meyer Date: Wed Apr 5 17:41:24 2023 +0200 Merge pull request #940 from beatrycze-volk/move-setpage-to-abstractcontroller [MAINTENANCE] Move setPage() to AbstractController commit 3356d9248d7982c843f9ec7b3ce7722bab75a423 Merge: 8c8d4040 4635ba00 Author: Sebastian Meyer Date: Wed Apr 5 17:23:45 2023 +0200 Merge branch 'master' into move-setpage-to-abstractcontroller commit 4635ba004fcfcb9e36826cbd88b205f82b5b9609 Author: Beatrycze Volk Date: Thu Mar 30 14:57:33 2023 +0200 Split parsing of metadata in printMetadata method commit 43b617e42602db2d298a950506121905aeb8214a Author: Beatrycze Volk Date: Thu Mar 30 14:40:31 2023 +0200 Add reference the current index in the foreach loop Avoid $i incrementation inside the loop commit a7590a1f4fd7fcaf1d3a9afa4520810c10996f82 Author: Beatrycze Volk Date: Thu Mar 30 13:26:56 2023 +0200 Move build of metaCObjData to the own method commit 8c8d40409cae8ef46f1ce1a3680b8b7b4cf05311 Author: Beatrycze Volk Date: Wed Apr 5 16:59:15 2023 +0200 Remove private setPage function from ToolboxController commit 6e9e63e81046cbc1e8553f2d3ae95d656c4d97e8 Merge: ed6c1ba7 7d8f037a Author: Sebastian Meyer Date: Wed Apr 5 16:50:50 2023 +0200 Merge branch 'master' into move-setpage-to-abstractcontroller commit 7d8f037a5a933bb5b9d418c993746b557c7d1608 Author: Beatrycze Volk Date: Tue Apr 4 15:06:58 2023 +0200 Add class property doc to shorten usage of $this->document->getDoc() commit 15740af5adc8f989ffbc452df5290f2cdcec1a8c Author: Beatrycze Volk Date: Tue Apr 4 14:50:58 2023 +0200 Move setPage out of else statement commit 3c36426fb803ada1dfd3db5a8e24bc89191e8255 Author: Beatrycze Volk Date: Tue Apr 4 14:48:11 2023 +0200 Move page setting to own method commit 38e759b1a1915904ff2c391fb2d1f1b9f36a33bb Author: Beatrycze Volk Date: Tue Apr 4 14:40:58 2023 +0200 Rename render tool functions to match the naming standards commit d8afc6e4a3991ab83c9efbf62d49f09d4875701f Author: Beatrycze Volk Date: Thu Mar 30 15:12:18 2023 +0200 Move value translation for search facet to the own method commit 89eface406e12984d1bf13d8ff6658e52253df85 Author: Beatrycze Volk Date: Thu Mar 30 12:33:42 2023 +0200 Move build of IIIF data to separated method commit 090f304c6eff39b26a169a010a156cca480daef8 Author: Beatrycze Volk Date: Thu Mar 30 11:57:22 2023 +0200 Add doc property to increase code readability commit 6f985185fd9ba700684827f7c02f67cbf6ab0121 Author: Beatrycze Volk Date: Wed Mar 29 16:40:49 2023 +0200 Move setup of default values to own method Avoid list of ifs with the same functionality commit a8ce9abf6042b3452f8652ce9eae56798230b651 Author: Sebastian Meyer Date: Wed Apr 5 13:06:55 2023 +0200 Move sanitation to separate method commit 8254852d13cc0c3f90d65114187f5f8be6b2e431 Author: Sebastian Meyer Date: Wed Apr 5 12:53:13 2023 +0200 Log variable before unsetting it commit 4b0644e7fdb0e04572895a28540302615e15c4bc Author: Sebastian Meyer Date: Tue Apr 4 13:57:15 2023 +0200 Add helper function for validity check commit 59bd3d4ed7ee003b2ef579861fbf3536f557e3cd Author: Sebastian Meyer Date: Tue Apr 4 13:28:34 2023 +0200 Update Classes/Controller/AbstractController.php Co-authored-by: Beatrycze Volk commit cd528de854b01e393e23288553d0c6a4040f907b Author: Sebastian Meyer Date: Mon Apr 3 17:48:53 2023 +0200 Fix XSS vulnerability commit ed6c1ba746ea619fd09733a7074d38334206173e Author: Beatrycze Volk Date: Tue Apr 4 16:29:01 2023 +0200 Move setPage to AbstractController commit 3640ebd63dcb900c0673ae427a1a056af0e86628 Author: Beatrycze Volk Date: Tue Apr 4 15:06:58 2023 +0200 Add class property doc to shorten usage of $this->document->getDoc() commit fd779f6c84d5db3b25089bf219174d95a21051ff Author: Beatrycze Volk Date: Tue Apr 4 14:50:58 2023 +0200 Move setPage out of else statement commit 2788841eee54030df3a5080b906ab0d3496c1876 Author: Beatrycze Volk Date: Tue Apr 4 14:48:11 2023 +0200 Move page setting to own method commit e8ff8036474da74b946e63e71228df36c4d2f8de Author: Beatrycze Volk Date: Tue Apr 4 14:40:58 2023 +0200 Rename render tool functions to match the naming standards commit df2e2ca0b71eea31db5fc776f06d55d6562ca4b0 Author: Christopher Timm Date: Wed Mar 22 17:40:38 2023 +0100 Revert change in collection TCA commit d417043188f91274cd8dfd9be679d3b4c4c562c0 Author: Christopher Timm Date: Wed Mar 22 17:30:06 2023 +0100 Remove l10n_state from test fixtures commit 3a676badd52392b59bdc7513793940ff25accaf5 Author: Christopher Timm Date: Wed Mar 22 17:25:44 2023 +0100 Add information for future TCA changes in development documentation commit 6a1ae83fca08bd970d74dc6731411035c7b32d24 Author: Christopher Timm Date: Wed Mar 22 17:24:39 2023 +0100 Remove "transOrigPointerField" and "showRecordFieldList" from TCA commit 44489977131713411da629c59cf1fe57dbeee3da Author: Christopher Timm Date: Wed Mar 22 17:07:29 2023 +0100 Object manager is no longer needed commit 52cd679c9a9e90f35eb86301a7e0feeba2006185 Author: Christopher Timm Date: Wed Mar 22 16:59:10 2023 +0100 Fix language ids in labels commit 6495c3924067e75aa3d656e17c8d7a3c639bb29e Author: Christopher Timm Date: Wed Mar 22 16:43:07 2023 +0100 Fix another search and replace mistake commit 82f4e5f4f0d5ab0abdec442b64a1391442ed9da1 Author: Christopher Timm Date: Wed Mar 22 16:22:25 2023 +0100 Replace escaped quote with double quotes commit c7403afc58a92856dabab6af706a2f99367737ac Author: Christopher Timm Date: Wed Mar 22 16:09:02 2023 +0100 Fix wrong language ids commit b224141d5dc1a8225c8626cec62a908a479d1b33 Merge: 69bef100 a7f53a1d Author: Sebastian Meyer Date: Tue Mar 21 10:00:41 2023 +0100 Merge pull request #927 from sebastian-meyer/fix-solr-core-creation [BUG] Make Solr core name mandatory commit a7f53a1d27a607287149d2002347fc88867af155 Author: Sebastian Meyer Date: Tue Mar 21 08:42:18 2023 +0100 Add additional check for empty core name commit 3466488e40bd67fdfa747251a750b5c7a54dabb9 Merge: f6879962 69bef100 Author: Christopher Date: Mon Mar 20 22:39:34 2023 +0100 Merge branch 'master' into typo3v11 commit f687996224f729280f3638b1ae4daf1e2167cfe1 Author: Christopher Timm Date: Mon Mar 20 22:36:56 2023 +0100 Change dev documentation commit 66a247728c42e95c8b083331111a66b2d44c1985 Author: Christopher Timm Date: Mon Mar 20 22:22:43 2023 +0100 Changes concerning TYPO3_MODE rolled back. Checking whether you are in backend or frontend mode requires the request as of version 12. This cannot be achieved with major changes at the moment. commit 519dabb42b16ccce4746bbe058645c5d90531c48 Author: Christopher Timm Date: Mon Mar 20 21:45:15 2023 +0100 Fix session handling in basket context commit a6d6b011ea770a93398026a4bc5a4bdf48d2a081 Author: Christopher Timm Date: Mon Mar 20 21:20:22 2023 +0100 Use uriBuilder directly in controller context and replace sesData_change with dataWasUpdated commit 7764a73aacdcebc315c578c528e14d8b09444de7 Author: Christopher Timm Date: Mon Mar 20 21:19:20 2023 +0100 Use dependency injection in Generator.php commit 9012322802ed5b86529fb243fac0d926eea94a4a Author: Christopher Timm Date: Mon Mar 20 21:17:56 2023 +0100 Use applicationType with request to check if fe or be and check cli request from "environment" commit 71e65330f7533d91ea03822a00706c602ab29f11 Author: Christopher Timm Date: Mon Mar 20 10:38:56 2023 +0100 Passing the document repository in the static add method commit d7e4d35fefc625b79c0cfb26fc6089fae9465de2 Author: Sebastian Meyer Date: Sun Mar 19 09:43:05 2023 +0100 Prevent db record when core fails commit dd5426eb4ad801f2ab4b0fe85105f031ebdafd6f Author: Sebastian Meyer Date: Sat Mar 18 10:13:12 2023 +0100 Add flash message for Solr core creation commit 670dd737c6a2651162079d7bd9e85ab10de4eea5 Merge: 99390342 69bef100 Author: Sebastian Meyer Date: Sat Mar 18 09:39:27 2023 +0100 Merge branch 'master' into fix-solr-core-creation commit 69bef100cf94aad22cc200235ee1219226b68185 Merge: 0ee4f178 7098f212 Author: Sebastian Meyer Date: Sat Mar 18 09:35:12 2023 +0100 Merge pull request #926 from sebastian-meyer/fix-be-messages [BUG] Fix messages for New Tenant module commit 7098f212a75215552aafaca0d65e2ca67eddb4ce Merge: 40ad6ad2 0ee4f178 Author: Sebastian Meyer Date: Sat Mar 18 09:31:47 2023 +0100 Merge branch 'master' into fix-be-messages commit 11057d52d8ee6eb0bd5948eb6c79e694010f4958 Author: Christopher Timm Date: Thu Mar 16 23:05:19 2023 +0100 Some columns in the test data removed for v11 commit a1ed0371fd0a7c6a6154d08105400ff0d3bb4bd4 Author: Christopher Timm Date: Thu Mar 16 23:03:07 2023 +0100 Remove xml language files commit 903c06bdabf838e592a7bd2e9b419d50e181de19 Author: Christopher Timm Date: Thu Mar 16 23:02:45 2023 +0100 Convert xml language files to xlf and adjust path.. ..to the language files in the helper class commit bf8c2ba6a81f42fda68dac9950fe7c6bf9f0090a Author: Christopher Timm Date: Thu Mar 16 18:43:57 2023 +0100 Convert labels.xml into (de.)locallang_label.xlf and replace filename in TCA commit 0ee4f178259c952ce932fdcaa57b8af8ebd6eb96 Merge: 94160c34 4afe20f0 Author: Sebastian Meyer Date: Thu Mar 16 10:15:50 2023 +0100 Merge pull request #924 from beatrycze-volk/fix-use-scalar-value-error [BUG] Fix use a scalar value as an array commit 4afe20f097c5f2e410d4ebc4bd3f8f68a7fe126d Merge: c1755f62 94160c34 Author: Sebastian Meyer Date: Wed Mar 15 21:01:59 2023 +0100 Merge branch 'master' into fix-use-scalar-value-error commit 993903422cdd518ef9c3b2c77f81d28f32b286b1 Merge: 3eea1c9a 94160c34 Author: Sebastian Meyer Date: Wed Mar 15 21:00:33 2023 +0100 Merge branch 'master' into fix-solr-core-creation commit 40ad6ad2e0537093923410aa585a486a87624e3f Merge: c123ec52 94160c34 Author: Sebastian Meyer Date: Wed Mar 15 21:00:13 2023 +0100 Merge branch 'master' into fix-be-messages commit 94160c34fee61b3c91a26937886afd4a4256130b Merge: 59e62c07 5494fc78 Author: Sebastian Meyer Date: Wed Mar 15 20:58:35 2023 +0100 Merge pull request #922 from csidirop/update/search-date-div [FEATURE] Wrap date search elements in own div class commit 5494fc789a2589f75c296200d858f8e1e3555047 Merge: 2d1f8feb 59e62c07 Author: Sebastian Meyer Date: Wed Mar 15 20:54:11 2023 +0100 Merge branch 'master' into update/search-date-div commit c123ec52d843327596d8fd1ba018ec84a8b75737 Merge: 4aa6f6a2 59e62c07 Author: Sebastian Meyer Date: Wed Mar 15 20:51:33 2023 +0100 Merge branch 'master' into fix-be-messages commit 3eea1c9a8e0e45647b27452f6a9e8ee2c601e10c Merge: 8eba1722 59e62c07 Author: Sebastian Meyer Date: Wed Mar 15 20:51:04 2023 +0100 Merge branch 'master' into fix-solr-core-creation commit 59e62c073de9ccc7f8fc8c094c5731a78d7c9a4b Author: Sebastian Meyer Date: Wed Mar 15 20:50:34 2023 +0100 Rename codacy.yml to codacy.yml.disabled commit 2d1f8feb89b5143e9f7a1e1fa31c478e4fc57412 Merge: 0c7d1d99 7b9af7d2 Author: Sebastian Meyer Date: Wed Mar 15 20:46:21 2023 +0100 Merge branch 'master' into update/search-date-div commit 7b9af7d2e2a767ff6e5985e34ec5b18d8abb17a2 Author: Sebastian Meyer Date: Wed Mar 15 20:22:39 2023 +0100 Update codeql.yml commit 8eba172299d86c219fbf2e6f326797080fd10165 Merge: c0d3f483 d4f66d02 Author: Sebastian Meyer Date: Wed Mar 15 20:19:48 2023 +0100 Merge branch 'master' into fix-solr-core-creation commit d4f66d020f1bb80e8d7d6b439dcbccbcfdae13c5 Author: Sebastian Meyer Date: Wed Mar 15 20:10:32 2023 +0100 Update codacy.yml commit c0d3f483498fe2aa235df9ba32da91bfc38afc68 Author: Sebastian Meyer Date: Wed Mar 15 20:07:24 2023 +0100 Make Solr core name mandatory commit 4aa6f6a2c3a809ef040ca76e49370915a93524b8 Author: Sebastian Meyer Date: Wed Mar 15 17:10:59 2023 +0100 Fix messages for New Tenant module commit 0897ba7c579aff86802338c45f50c8350f70437c Merge: f37187a8 a40da4a9 Author: Sebastian Meyer Date: Fri Mar 10 09:57:43 2023 +0100 Merge pull request #917 from csidirop/bugfix/newtenantfallback [MAINTENANCE] Add fallback option for getLLL() commit a40da4a989f22845506c0390aaad17c39bd86d93 Author: Chris Date: Fri Mar 10 09:07:42 2023 +0100 Update Classes/Controller/Backend/NewTenantController.php Use the whole key, because getLLL() is not just used for the metadata. Co-authored-by: Sebastian Meyer commit b17a5f7d3db1d1791312e4e5b036be226ee7b4e8 Author: Sebastian Meyer Date: Thu Mar 9 18:08:39 2023 +0100 Code Styling commit c1755f62ba3ed6c7cb683ec0968fdaf7d02092af Author: Beatrycze Volk Date: Tue Mar 7 14:40:59 2023 +0100 Fix use a scalar value as an array commit 0c7d1d9946389e8a4b6042e02f0750a2a6307eba Author: Christos Sidiropoulos Date: Thu Mar 2 09:54:03 2023 +0000 Wrap date search elements in own div class Signed-off-by: Christos Sidiropoulos commit 46fa3862811cd3ed52e6d566728b10d59b711364 Merge: 84877e9d f37187a8 Author: Christopher Date: Wed Mar 1 11:26:42 2023 +0100 Merge branch 'master' into typo3v11 commit 84877e9daf5e7cfb5f0d55b96be92a1bca055122 Author: Christopher Timm Date: Tue Feb 28 19:17:42 2023 +0100 Use injection methods in DocumentTypeFunctionProvider because in this case the construct method doesn't work. commit cf91525da572eea3aa4b0fce940b3b132c8e11f3 Author: Christopher Timm Date: Tue Feb 28 17:52:52 2023 +0100 Use dependency injection commit 8b5dd22022dd66e294aa632869dd123d7c0adc89 Author: Christopher Timm Date: Tue Feb 28 17:45:45 2023 +0100 Remove typo3v9 ext_typoscript_setup.txt commit fc02ce4768acffeb4bc02be608b8086d4be2b4ec Author: Christopher Timm Date: Tue Feb 28 17:44:48 2023 +0100 Remove typo3v9 helper function polyfillExtbaseClassesForTYPO3v9 commit 8b190c59a009055277817dd582aba554519113e0 Author: Christopher Timm Date: Tue Feb 28 16:47:02 2023 +0100 Use latest safe typo3 versions in composer.json and add composer.lock commit 075c62890239a44333128a8253775d8a7e2ad598 Author: Christopher Timm Date: Tue Feb 28 16:33:39 2023 +0100 Change typo3, php and mariadb versions in runTests.sh commit 4d732a432663f294f31f4e42a36ccddd22d607c5 Author: Christos Sidiropoulos Date: Fri Feb 24 13:22:42 2023 +0000 Add fallback option for getLLL Adds a fallback option in getLLL() if there is no translation for given key Signed-off-by: Christos Sidiropoulos commit f37187a8a6b559fee5e56574098896db5442ff4d Author: Sebastian Meyer Date: Thu Feb 23 09:17:13 2023 +0100 Update task-for-the-development-fund.md commit 81e0afdb93626237d494b41899aba6aad1238d10 Author: Christopher Date: Thu Feb 23 08:52:38 2023 +0100 Update composer typo3 version to 10.4 and 11.5 commit ace9ff8ba1a7ebc47bd076d75067b4a7b0630ca4 Author: Christopher Date: Thu Feb 23 08:47:07 2023 +0100 Change typo3 test workflow to 10.4 and 11.5 commit da9bc5dd2012c4292497f2c7111e4fcc1c325ff1 Merge: 0c1dc276 8c2081b9 Author: Sebastian Meyer Date: Thu Feb 23 07:44:33 2023 +0100 Merge pull request #914 from BFallert/tmp/navigation-double-single-view Fix SinglepageOn and Off and hint if numPages not > 0 commit 8c2081b9438efad1facf014d6a84d40659933c3c Author: Bernd Fallert Date: Mon Feb 20 19:43:35 2023 +0100 Fix SinglepageOn and Off and hint if numPages not > 0 commit a9f3c7381cdf40047995c969060cdf3872bdd688 Author: Christopher Timm Date: Wed Dec 28 11:25:15 2022 +0100 Replace f:widget.paginate with the new pagination core api. commit 1660fb2c8a367d72e6f53fae6313165fcd289fd8 Author: Christopher Timm Date: Wed Dec 28 11:25:15 2022 +0100 Replace f:widget.paginate with the new pagination core api. commit e7231d6391bfbf55a544aaff05c3e3c908c3cd5e Author: Christopher Timm Date: Wed Dec 28 11:10:56 2022 +0100 Use complete namespace and classname for plugin and module configuration. commit 84e2fe145fa5a1554202f18837e04210a6bef071 Author: Christopher Timm Date: Wed Dec 28 11:09:16 2022 +0100 PageRepository class moved from Frontend to Core Extension. Signed-off-by: Christos Sidiropoulos --- .../task-for-the-development-fund.md | 2 +- .github/codeql.yml | 4 +- .github/workflows/codacy.yml | 50 - .github/workflows/codeql.yml | 2 - .github/workflows/tests.yml | 6 +- Build/Documentation/dbdocs/Generator.php | 61 +- Build/Test/runTests.sh | 32 +- Classes/Api/Orcid/Client.php | 3 +- Classes/Api/Orcid/Profile.php | 3 +- Classes/Api/Viaf/Client.php | 3 +- Classes/Api/Viaf/Profile.php | 3 +- Classes/Command/BaseCommand.php | 114 +- Classes/Command/HarvestCommand.php | 11 +- Classes/Command/IndexCommand.php | 12 +- Classes/Command/ReindexCommand.php | 12 +- .../Common/{Doc.php => AbstractDocument.php} | 94 +- Classes/Common/Helper.php | 130 +- Classes/Common/IiifManifest.php | 72 +- Classes/Common/Indexer.php | 59 +- Classes/Common/MetsDocument.php | 89 +- .../SearchResult}/Highlight.php | 2 +- .../SearchResult}/Page.php | 2 +- .../SearchResult}/Region.php | 2 +- .../SearchResult}/ResultDocument.php | 8 +- Classes/Common/{ => Solr}/Solr.php | 26 +- Classes/Common/{ => Solr}/SolrSearch.php | 130 +- Classes/Common/{ => Solr}/SolrSearchQuery.php | 20 +- Classes/Common/SolrPaginator.php | 61 + Classes/Controller/AbstractController.php | 174 +- Classes/Controller/AudioPlayerController.php | 32 +- .../Backend/NewTenantController.php | 18 +- Classes/Controller/BasketController.php | 19 +- Classes/Controller/CalendarController.php | 40 +- Classes/Controller/CollectionController.php | 16 +- Classes/Controller/FeedsController.php | 4 +- Classes/Controller/ListViewController.php | 27 +- Classes/Controller/MetadataController.php | 415 ++-- Classes/Controller/NavigationController.php | 45 +- Classes/Controller/OaiPmhController.php | 6 +- Classes/Controller/PageGridController.php | 38 +- Classes/Controller/PageViewController.php | 69 +- Classes/Controller/SearchController.php | 264 ++- .../Controller/TableOfContentsController.php | 197 +- Classes/Controller/ToolboxController.php | 363 ++- Classes/Controller/View3DController.php | 50 +- Classes/Domain/Model/Document.php | 17 +- .../Domain/Repository/DocumentRepository.php | 47 +- Classes/Eid/SearchInDocument.php | 140 -- .../DocumentTypeFunctionProvider.php | 54 +- Classes/Hooks/ConfigurationForm.php | 2 +- Classes/Hooks/DataHandler.php | 27 +- .../Form/FieldInformation/SolrCoreStatus.php | 2 +- Classes/Middleware/SearchInDocument.php | 194 ++ Classes/{Eid => Middleware}/SearchSuggest.php | 39 +- Classes/Pagination/PageGridPagination.php | 92 + Classes/Pagination/PageGridPaginator.php | 92 + Classes/Updates/FileLocationUpdater.php | 20 +- Classes/Updates/MigrateSettings.php | 4 +- Configuration/FlexForms/Navigation.xml | 6 +- Configuration/FlexForms/Search.xml | 10 + Configuration/RequestMiddlewares.php | 28 + Configuration/TCA/tx_dlf_actionlog.php | 16 +- Configuration/TCA/tx_dlf_basket.php | 13 +- Configuration/TCA/tx_dlf_collections.php | 35 +- Configuration/TCA/tx_dlf_documents.php | 66 +- Configuration/TCA/tx_dlf_formats.php | 12 +- Configuration/TCA/tx_dlf_libraries.php | 27 +- Configuration/TCA/tx_dlf_mail.php | 10 +- Configuration/TCA/tx_dlf_metadata.php | 35 +- Configuration/TCA/tx_dlf_metadataformat.php | 13 +- Configuration/TCA/tx_dlf_printer.php | 8 +- Configuration/TCA/tx_dlf_solrcores.php | 9 +- Configuration/TCA/tx_dlf_structures.php | 21 +- Configuration/TCA/tx_dlf_tokens.php | 11 +- .../TypoScript/Toolbox/setup.typoscript | 34 +- Configuration/TypoScript/setup.typoscript | 15 + DEVELOPMENT.md | 12 +- Documentation/Administrator/Index.rst | 2 +- Documentation/Plugins/Index.rst | 55 + Resources/Private/Data/de.iso-639-1.xlf | 576 +++++ Resources/Private/Data/de.iso-639-2b.xlf | 1954 +++++++++++++++++ Resources/Private/Data/iso-639-1.xlf | 436 ++++ Resources/Private/Data/iso-639-1.xml | 296 --- Resources/Private/Data/iso-639-2b.xlf | 1468 +++++++++++++ Resources/Private/Data/iso-639-2b.xml | 984 --------- Resources/Private/Language/Labels.xml | 476 ---- Resources/Private/Language/de.locallang.xlf | 52 +- .../Private/Language/de.locallang_be.xlf | 6 +- .../Private/Language/de.locallang_labels.xlf | 842 +++++++ Resources/Private/Language/locallang.xlf | 6 + Resources/Private/Language/locallang_be.xlf | 3 + .../Private/Language/locallang_labels.xlf | 634 ++++++ .../Private/Partials/ListView/Results.html | 314 ++- .../Partials/ListView/SortingForm.html | 7 +- .../Private/Partials/Lists/Pagination.html | 53 + .../Templates/Backend/NewTenant/Index.html | 6 +- .../Private/Templates/Navigation/Main.html | 19 +- .../Private/Templates/PageGrid/Main.html | 58 +- Resources/Private/Templates/Search/Main.html | 30 +- Resources/Private/Templates/Toolbox/Main.html | 17 +- .../Public/JavaScript/PageView/PageView.js | 6 + .../JavaScript/PageView/SearchInDocument.js | 110 +- .../Public/JavaScript/Search/Suggester.js | 60 +- Tests/Fixtures/Common/documents_1.xml | 2 - Tests/Fixtures/Common/documents_fulltext.xml | 2 - Tests/Fixtures/Common/libraries.xml | 1 - Tests/Fixtures/Common/metadata.xml | 2 - Tests/Fixtures/Common/pages.xml | 10 - Tests/Fixtures/OaiPmh/pages.xml | 26 - Tests/Functional/Api/OaiPmhTest.php | 2 +- Tests/Functional/Common/MetsDocumentTest.php | 4 +- Tests/Functional/Common/SolrIndexingTest.php | 12 +- Tests/Functional/FunctionalTestCase.php | 2 +- .../Repository/DocumentRepositoryTest.php | 4 +- composer.json | 18 +- composer.lock | 1530 ++++++++----- ext_conf_template.txt | 140 +- ext_localconf.php | 80 +- ext_tables.php | 2 +- ext_typoscript_setup.txt | 71 - 120 files changed, 9717 insertions(+), 4562 deletions(-) delete mode 100644 .github/workflows/codacy.yml rename Classes/Common/{Doc.php => AbstractDocument.php} (95%) rename Classes/Common/{SolrSearchResult => Solr/SearchResult}/Highlight.php (98%) rename Classes/Common/{SolrSearchResult => Solr/SearchResult}/Page.php (97%) rename Classes/Common/{SolrSearchResult => Solr/SearchResult}/Region.php (98%) rename Classes/Common/{SolrSearchResult => Solr/SearchResult}/ResultDocument.php (97%) rename Classes/Common/{ => Solr}/Solr.php (95%) rename Classes/Common/{ => Solr}/SolrSearch.php (86%) rename Classes/Common/{ => Solr}/SolrSearchQuery.php (90%) create mode 100644 Classes/Common/SolrPaginator.php mode change 100755 => 100644 Classes/Controller/AbstractController.php delete mode 100644 Classes/Eid/SearchInDocument.php create mode 100644 Classes/Middleware/SearchInDocument.php rename Classes/{Eid => Middleware}/SearchSuggest.php (64%) create mode 100644 Classes/Pagination/PageGridPagination.php create mode 100644 Classes/Pagination/PageGridPaginator.php create mode 100644 Configuration/RequestMiddlewares.php create mode 100644 Resources/Private/Data/de.iso-639-1.xlf create mode 100644 Resources/Private/Data/de.iso-639-2b.xlf create mode 100644 Resources/Private/Data/iso-639-1.xlf delete mode 100644 Resources/Private/Data/iso-639-1.xml create mode 100644 Resources/Private/Data/iso-639-2b.xlf delete mode 100644 Resources/Private/Data/iso-639-2b.xml delete mode 100644 Resources/Private/Language/Labels.xml create mode 100644 Resources/Private/Language/de.locallang_labels.xlf create mode 100644 Resources/Private/Language/locallang_labels.xlf create mode 100644 Resources/Private/Partials/Lists/Pagination.html delete mode 100644 ext_typoscript_setup.txt diff --git a/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md b/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md index fdc48370c7..01d219d11d 100644 --- a/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md +++ b/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md @@ -2,7 +2,7 @@ name: Task for the development fund about: A working package which may be sponsored by the Kitodo e.V. development fund. title: "[FUND] " -labels: development fund 2023 +labels: ⭐ development fund 2023 assignees: '' --- diff --git a/.github/codeql.yml b/.github/codeql.yml index 75aba03dca..56085d7bf9 100644 --- a/.github/codeql.yml +++ b/.github/codeql.yml @@ -9,8 +9,8 @@ - note paths-ignore: - - Resources/Public/JavaScript/OpenLayers - - Resources/Public/JavaScript/Toastify - Resources/Public/JavaScript/jPlayer - Resources/Public/JavaScript/jQuery - Resources/Public/JavaScript/jQueryUI + - Resources/Public/JavaScript/OpenLayers + - Resources/Public/JavaScript/Toastify diff --git a/.github/workflows/codacy.yml b/.github/workflows/codacy.yml deleted file mode 100644 index 10af6956ab..0000000000 --- a/.github/workflows/codacy.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Codacy.com - -on: - # Trigger analysis when pushing in stable branches (which includes merging pull requests) - push: - branches: [ "master", "1.x", "2.x", "3.2.x", "3.3.x", "4.x" ] - pull_request: - branches: [ "master" ] - # Trigger analysis when a new release is drafted - release: - type: [ "created", "edited" ] - -permissions: - contents: read - -jobs: - codacy-security-scan: - permissions: - contents: read - security-events: write - actions: read - name: Security Scan - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - # Disabling shallow clone is recommended for improving relevancy of reporting - fetch-depth: 0 - - # Execute Codacy Analysis CLI and generate a SARIF output - - name: Run Codacy Analysis CLI - uses: codacy/codacy-analysis-cli-action@v4 - with: - # You can also omit the token and run the tools that support default configurations - project-token: ${{ secrets.CODACY_TOKEN }} - verbose: true - output: results.sarif - format: sarif - # Adjust severity of non-security issues - gh-code-scanning-compat: true - # Force 0 exit code to allow SARIF file generation - # This will handover control about PR rejection to the GitHub side - max-allowed-issues: 2147483647 - - # Upload the SARIF file generated in the previous step - - name: Upload SARIF results file - uses: github/codeql-action/upload-sarif@v2 - with: - sarif_file: results.sarif diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 8c650cca47..933e97ac4a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -5,8 +5,6 @@ on: branches: [ "master", "1.x", "2.x", "3.2.x", "3.3.x", "4.x" ] pull_request: branches: [ "master" ] - schedule: - - cron: "39 1 * * 1" jobs: analyze: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 23213f6e4b..f0209a3113 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,16 +2,16 @@ name: Unit and Functional Testing on: push: - branches: [master] + branches: [ "master" ] pull_request: - branches: [master] + branches: [ "master" ] jobs: test: runs-on: ubuntu-latest strategy: matrix: - typo3: [9.5, 10.4] + typo3: [ 10.4, 11.5 ] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/Build/Documentation/dbdocs/Generator.php b/Build/Documentation/dbdocs/Generator.php index 4d9c717adc..c5a18888ce 100644 --- a/Build/Documentation/dbdocs/Generator.php +++ b/Build/Documentation/dbdocs/Generator.php @@ -34,11 +34,6 @@ */ class Generator { - /** - * @var ObjectManager - */ - protected $objectManager; - /** * @var LanguageService */ @@ -49,11 +44,51 @@ class Generator */ protected $dataMapper; + /** + * @var SqlReader + */ + protected $sqlReader; + + /** + * @var ConfigurationManager + */ + protected $configurationManager; + + /** + * @param LanguageService $languageService + */ + public function injectLanguageService(LanguageService $languageService) + { + $this->languageService = $languageService; + } + + /** + * @param DataMapper $dataMapper + */ + public function injectDataMapper(DataMapper $dataMapper) + { + $this->dataMapper = $dataMapper; + } + + /** + * @param SqlReader $sqlReader + */ + public function injectSqlReader(DataMapper $sqlReader) + { + $this->sqlReader = $sqlReader; + } + + /** + * @param ConfigurationManager $configurationManager + */ + public function injectConfigurationManager(ConfigurationManager $configurationManager) + { + $this->configurationManager = $configurationManager; + } + public function __construct() { - $this->objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $this->languageService = $this->objectManager->get(LanguageService::class); - $this->dataMapper = $this->objectManager->get(DataMapper::class); + } /** @@ -62,9 +97,8 @@ public function __construct() */ public function collectTables(): array { - $sqlReader = $this->objectManager->get(SqlReader::class); - $sqlCode = $sqlReader->getTablesDefinitionString(true); - $createTableStatements = $sqlReader->getCreateTableStatementArray($sqlCode); + $sqlCode = $this->sqlReader->getTablesDefinitionString(true); + $createTableStatements = $this->sqlReader->getCreateTableStatementArray($sqlCode); $tableToClassName = $this->getTableClassMap(); @@ -92,10 +126,7 @@ public function collectTables(): array */ public function getTableClassMap(): array { - Helper::polyfillExtbaseClassesForTYPO3v9(); - - $configurationManager = $this->objectManager->get(ConfigurationManager::class); - $frameworkConfiguration = $configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $frameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $result = []; diff --git a/Build/Test/runTests.sh b/Build/Test/runTests.sh index 5213005b2c..dc73a9a756 100755 --- a/Build/Test/runTests.sh +++ b/Build/Test/runTests.sh @@ -73,12 +73,12 @@ Options: - functional: PHP functional tests - unit (default): PHP unit tests - -t <9.5|10.4> + -t <|10.4|11.5> Only with -s composerInstall Specifies which TYPO3 version to install. When unset, installs either the packages from composer.lock, or the latest version otherwise (default behavior of "composer install"). - - 9.5 - 10.4 + - 11.5 -a Only with -s functional @@ -96,7 +96,7 @@ Options: - mariadb (default): use mariadb - mysql: use MySQL server - -i <10.1|10.2|10.3|10.4|10.5> + -i <10.1|10.2|10.3|10.4|10.5|10.6|10.7|10.8|10.9|10.10> Only with -d mariadb Specifies on which version of mariadb tests are performed - 10.1 @@ -104,6 +104,11 @@ Options: - 10.3 (default) - 10.4 - 10.5 + - 10.6 + - 10.7 + - 10.8 + - 10.9 + - 10.10 -j <5.5|5.6|5.7|8.0> Only with -d mysql @@ -113,21 +118,22 @@ Options: - 5.7 - 8.0 - -p <7.4|8.0|8.1> + -p <7.4|8.0|8.1|8.2> Specifies the PHP minor version to be used - - 7.4 (default): use PHP 7.4 + - 7.4: (default) use PHP 7.4 - 8.0: use PHP 8.0 - 8.1: use PHP 8.1 + - 8.2: use PHP 8.2 (note that xdebug is currently not available for PHP8.2) -e "" - Only with -s functional|unit + Only with -s functional|functionalDeprecated|unit|unitDeprecated|unitRandom|acceptance Additional options to send to phpunit (unit & functional tests) or codeception (acceptance tests). For phpunit, options starting with "--" must be added after options starting with "-". - Example -e "-v --filter canDoEverything" to enable verbose output AND filter tests - named "canDoEverything" + Example -e "-v --filter canRetrieveValueWithGP" to enable verbose output AND filter tests + named "canRetrieveValueWithGP" -x - Only with -s functional|unit + Only with -s functional|functionalDeprecated|unit|unitDeprecated|unitRandom|acceptance|acceptanceInstall Send information to host instance for test or system under test break points. This is especially useful if a local PhpStorm instance is listening on default xdebug port 9003. A different port can be selected with -y @@ -141,10 +147,10 @@ Options: Run tests in watch mode. -u - Update existing typo3/core-testing-*:latest docker images. Maintenance call to docker pull latest - versions of the main php images. The images are updated once in a while and only the youngest - ones are supported by core testing. Use this if weird test errors occur. Also removes obsolete - image versions of typo3/core-testing-*. + Update existing typo3/core-testing-*:latest docker images and remove dangling local docker volumes. + Maintenance call to docker pull latest versions of the main php images. The images are updated once + in a while and only the latest ones are supported by core testing. Use this if weird test errors occur. + Also removes obsolete image versions of typo3/core-testing-*. -v Enable verbose script output. Shows variables and docker commands. diff --git a/Classes/Api/Orcid/Client.php b/Classes/Api/Orcid/Client.php index 8960c6285e..37f3d9a934 100644 --- a/Classes/Api/Orcid/Client.php +++ b/Classes/Api/Orcid/Client.php @@ -14,6 +14,7 @@ use Psr\Http\Message\RequestFactoryInterface; use TYPO3\CMS\Core\Http\RequestFactory; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -36,7 +37,7 @@ class Client /** * This holds the logger * - * @var LogManager + * @var Logger * @access protected */ protected $logger; diff --git a/Classes/Api/Orcid/Profile.php b/Classes/Api/Orcid/Profile.php index 740f73c335..f35a509f4f 100644 --- a/Classes/Api/Orcid/Profile.php +++ b/Classes/Api/Orcid/Profile.php @@ -14,6 +14,7 @@ use Kitodo\Dlf\Common\Helper; use TYPO3\CMS\Core\Http\RequestFactory; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -30,7 +31,7 @@ class Profile /** * This holds the logger * - * @var LogManager + * @var Logger * @access protected */ protected $logger; diff --git a/Classes/Api/Viaf/Client.php b/Classes/Api/Viaf/Client.php index 12279d37e2..5a3d5797f1 100644 --- a/Classes/Api/Viaf/Client.php +++ b/Classes/Api/Viaf/Client.php @@ -14,6 +14,7 @@ use Psr\Http\Message\RequestFactoryInterface; use TYPO3\CMS\Core\Http\RequestFactory; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -30,7 +31,7 @@ class Client /** * This holds the logger * - * @var LogManager + * @var Logger * @access protected */ protected $logger; diff --git a/Classes/Api/Viaf/Profile.php b/Classes/Api/Viaf/Profile.php index fc5af3afba..362ce4a98d 100644 --- a/Classes/Api/Viaf/Profile.php +++ b/Classes/Api/Viaf/Profile.php @@ -14,6 +14,7 @@ use Kitodo\Dlf\Common\Helper; use TYPO3\CMS\Core\Http\RequestFactory; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -30,7 +31,7 @@ class Profile /** * This holds the logger * - * @var LogManager + * @var Logger * @access protected */ protected $logger; diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index eaec203a6b..56497519de 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -12,7 +12,7 @@ namespace Kitodo\Dlf\Command; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\Indexer; use Kitodo\Dlf\Domain\Repository\CollectionRepository; @@ -78,6 +78,26 @@ class BaseCommand extends Command */ protected $extConf; + /** + * @var ConfigurationManager + */ + protected $configurationManager; + + public function __construct(CollectionRepository $collectionRepository, + DocumentRepository $documentRepository, + LibraryRepository $libraryRepository, + StructureRepository $structureRepository, + ConfigurationManager $configurationManager) + { + parent::__construct(); + + $this->collectionRepository = $collectionRepository; + $this->documentRepository = $documentRepository; + $this->libraryRepository = $libraryRepository; + $this->structureRepository = $structureRepository; + $this->configurationManager = $configurationManager; + } + /** * Initialize the extbase repository based on the given storagePid. * @@ -90,19 +110,10 @@ class BaseCommand extends Command protected function initializeRepositories($storagePid) { if (MathUtility::canBeInterpretedAsInteger($storagePid)) { - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $frameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $frameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $frameworkConfiguration['persistence']['storagePid'] = MathUtility::forceIntegerInRange((int) $storagePid, 0); - $configurationManager->setConfiguration($frameworkConfiguration); - - // TODO: When we drop support for TYPO3v9, we needn't/shouldn't use ObjectManager anymore - $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - - $this->collectionRepository = $objectManager->get(CollectionRepository::class); - $this->documentRepository = $objectManager->get(DocumentRepository::class); - $this->libraryRepository = $objectManager->get(LibraryRepository::class); - $this->structureRepository = $objectManager->get(StructureRepository::class); + $this->configurationManager->setConfiguration($frameworkConfiguration); // Get extension configuration. $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); @@ -156,7 +167,7 @@ protected function getSolrCores(int $pageId): array ) ->execute(); - while ($record = $result->fetch()) { + while ($record = $result->fetchAssociative()) { $solrCores[$record['index_name']] = $record['uid']; } @@ -172,12 +183,11 @@ protected function getSolrCores(int $pageId): array */ protected function saveToDatabase(Document $document) { - $success = false; - - $doc = $document->getDoc(); + $doc = $document->getCurrentDocument(); if ($doc === null) { - return $success; + return false; } + $persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); $doc->cPid = $this->storagePid; $metadata = $doc->getTitledata($this->storagePid); @@ -214,6 +224,8 @@ protected function saveToDatabase(Document $document) $documentCollection->setDescription(''); // add to CollectionRepository $this->collectionRepository->add($documentCollection); + // persist collection to prevent duplicates + $persistenceManager->persistAll(); } // add to document $document->addCollection($documentCollection); @@ -258,9 +270,9 @@ protected function saveToDatabase(Document $document) } } - // to be still (re-) implemented - // 'volume' => $metadata['volume'][0], - // 'volume_sorting' => $metadata['volume_sorting'][0], + // set volume data + $document->setVolume($metadata['volume'][0] ? : ''); + $document->setVolumeSorting($metadata['volume_sorting'][0] ? : $metadata['mets_order'][0] ? : ''); // Get UID of parent document. if ($document->getDocumentFormat() === 'METS') { @@ -275,12 +287,9 @@ protected function saveToDatabase(Document $document) $this->documentRepository->update($document); } - $persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); $persistenceManager->persistAll(); - $success = true; - - return $success; + return true; } /** @@ -293,38 +302,31 @@ protected function saveToDatabase(Document $document) */ protected function getParentDocumentUidForSaving(Document $document) { - $doc = $document->getDoc(); - - if ($doc !== null) { - // Same as MetsDocument::parentHref (TODO: Use it) - // Get the closest ancestor of the current document which has a MPTR child. - $parentMptr = $doc->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]//mets:div[@ID="' . $doc->toplevelId . '"]/ancestor::mets:div[./mets:mptr][1]/mets:mptr'); - if (!empty($parentMptr)) { - $parentLocation = (string) $parentMptr[0]->attributes('http://www.w3.org/1999/xlink')->href; - - // find document object by record_id of parent - $parentDoc = Doc::getInstance($parentLocation, ['storagePid' => $this->storagePid]); - - if ($parentDoc->recordId) { - $parentDocument = $this->documentRepository->findOneByRecordId($parentDoc->recordId); - - if ($parentDocument === null) { - // create new Document object - $parentDocument = GeneralUtility::makeInstance(Document::class); - } - - $parentDocument->setOwner($this->owner); - $parentDocument->setDoc($parentDoc); - $parentDocument->setLocation($parentLocation); - $parentDocument->setSolrcore($document->getSolrcore()); - - $success = $this->saveToDatabase($parentDocument); - - if ($success === true) { - // add to index - Indexer::add($parentDocument); - return $parentDocument->getUid(); - } + $doc = $document->getCurrentDocument(); + + if ($doc !== null && !empty($doc->parentHref)) { + // find document object by record_id of parent + $parent = AbstractDocument::getInstance($doc->parentHref, ['storagePid' => $this->storagePid]); + + if ($parent->recordId) { + $parentDocument = $this->documentRepository->findOneByRecordId($parent->recordId); + + if ($parentDocument === null) { + // create new Document object + $parentDocument = GeneralUtility::makeInstance(Document::class); + } + + $parentDocument->setOwner($this->owner); + $parentDocument->setCurrentDocument($parent); + $parentDocument->setLocation($doc->parentHref); + $parentDocument->setSolrcore($document->getSolrcore()); + + $success = $this->saveToDatabase($parentDocument); + + if ($success === true) { + // add to index + Indexer::add($parentDocument); + return $parentDocument->getUid(); } } } diff --git a/Classes/Command/HarvestCommand.php b/Classes/Command/HarvestCommand.php index 0a4ba6f27c..7de2580b32 100644 --- a/Classes/Command/HarvestCommand.php +++ b/Classes/Command/HarvestCommand.php @@ -12,19 +12,16 @@ namespace Kitodo\Dlf\Command; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Command\BaseCommand; -use Kitodo\Dlf\Common\Doc; use Kitodo\Dlf\Common\Indexer; use Kitodo\Dlf\Domain\Model\Document; -use Kitodo\Dlf\Domain\Model\Library; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Database\Connection; use Phpoaipmh\Endpoint; use Phpoaipmh\Exception\BaseOaipmhException; @@ -219,7 +216,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $docLocation = $baseLocation . http_build_query($params); // ...index the document... $document = null; - $doc = Doc::getInstance($docLocation, ['storagePid' => $this->storagePid], true); + $doc = AbstractDocument::getInstance($docLocation, ['storagePid' => $this->storagePid], true); if ($doc === null) { $io->warning('WARNING: Document "' . $docLocation . '" could not be loaded. Skip to next document.'); @@ -244,11 +241,11 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($io->isVerbose()) { $io->writeln(date('Y-m-d H:i:s') . ' Indexing ' . $document->getUid() . ' ("' . $document->getLocation() . '") on PID ' . $this->storagePid . ' and Solr core ' . $solrCoreUid . '.'); } - $document->setDoc($doc); + $document->setCurrentDocument($doc); // save to database $this->saveToDatabase($document); // add to index - Indexer::add($document); + Indexer::add($document, $this->documentRepository); } } diff --git a/Classes/Command/IndexCommand.php b/Classes/Command/IndexCommand.php index d4038b492f..6e356cc94b 100644 --- a/Classes/Command/IndexCommand.php +++ b/Classes/Command/IndexCommand.php @@ -12,12 +12,10 @@ namespace Kitodo\Dlf\Command; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Command\BaseCommand; -use Kitodo\Dlf\Common\Doc; use Kitodo\Dlf\Common\Indexer; -use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Domain\Model\Document; -use Kitodo\Dlf\Domain\Model\Library; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -160,11 +158,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $io->error('ERROR: Document with UID "' . $input->getOption('doc') . '" could not be found on PID ' . $this->storagePid . ' .'); exit(1); } else { - $doc = Doc::getInstance($document->getLocation(), ['storagePid' => $this->storagePid], true); + $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $this->storagePid], true); } } else if (GeneralUtility::isValidUrl($input->getOption('doc'))) { - $doc = Doc::getInstance($input->getOption('doc'), ['storagePid' => $this->storagePid], true); + $doc = AbstractDocument::getInstance($input->getOption('doc'), ['storagePid' => $this->storagePid], true); if ($doc->recordId) { $document = $this->documentRepository->findOneByRecordId($doc->recordId); @@ -194,11 +192,11 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($io->isVerbose()) { $io->section('Indexing ' . $document->getUid() . ' ("' . $document->getLocation() . '") on PID ' . $this->storagePid . ' and Solr core ' . $solrCoreUid . '.'); } - $document->setDoc($doc); + $document->setCurrentDocument($doc); // save to database $this->saveToDatabase($document); // add to index - Indexer::add($document); + Indexer::add($document, $this->documentRepository); } $io->success('All done!'); diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index 2862162150..6d2d35f74e 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -12,15 +12,13 @@ namespace Kitodo\Dlf\Command; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Command\BaseCommand; -use Kitodo\Dlf\Common\Doc; use Kitodo\Dlf\Common\Indexer; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; @@ -160,7 +158,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } foreach ($documents as $id => $document) { - $doc = Doc::getInstance($document->getLocation(), ['storagePid' => $this->storagePid], true); + $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $this->storagePid], true); if ($doc === null) { $io->warning('WARNING: Document "' . $document->getLocation() . '" could not be loaded. Skip to next document.'); @@ -173,14 +171,14 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($io->isVerbose()) { $io->writeln(date('Y-m-d H:i:s') . ' Indexing ' . ($id + 1) . '/' . count($documents) . ' with UID "' . $document->getUid() . '" ("' . $document->getLocation() . '") on PID ' . $this->storagePid . ' and Solr core ' . $solrCoreUid . '.'); } - $document->setDoc($doc); + $document->setCurrentDocument($doc); // save to database $this->saveToDatabase($document); // add to index - Indexer::add($document); + Indexer::add($document, $this->documentRepository); } // Clear document registry to prevent memory exhaustion. - Doc::clearRegistry(); + AbstractDocument::clearRegistry(); } $io->success('All done!'); diff --git a/Classes/Common/Doc.php b/Classes/Common/AbstractDocument.php similarity index 95% rename from Classes/Common/Doc.php rename to Classes/Common/AbstractDocument.php index 7b8a70f029..6007ec5e79 100644 --- a/Classes/Common/Doc.php +++ b/Classes/Common/AbstractDocument.php @@ -15,11 +15,8 @@ use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction; -use TYPO3\CMS\Core\Log\LogManager; +use TYPO3\CMS\Core\Log\Logger; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use Ubl\Iiif\Presentation\Common\Model\Resources\IiifResourceInterface; use Ubl\Iiif\Tools\IiifHelper; @@ -33,7 +30,6 @@ * @access public * @property int $cPid This holds the PID for the configuration * @property-read bool $hasFulltext Are there any fulltext files available? - * @property-read string $location This holds the documents location * @property-read array $metadataArray This holds the documents' parsed metadata array * @property-read int $numPages The holds the total number of pages * @property-read int $parentId This holds the UID of the parent document or zero if not multi-volumed @@ -49,12 +45,12 @@ * @property-read string $toplevelId This holds the toplevel structure's "@ID" (METS) or the manifest's "@id" (IIIF) * @abstract */ -abstract class Doc +abstract class AbstractDocument { /** * This holds the logger * - * @var LogManager + * @var Logger * @access protected */ protected $logger; @@ -227,7 +223,7 @@ abstract class Doc /** * This holds the singleton object of the document * - * @var array (\Kitodo\Dlf\Common\Doc) + * @var array (AbstractDocument) * @static * @access protected */ @@ -406,7 +402,7 @@ public abstract function getFileMimeType($id); * @param array $settings * @param bool $forceReload: Force reloading the document instead of returning the cached instance * - * @return \Kitodo\Dlf\Common\Doc|null Instance of this class, either MetsDocument or IiifManifest + * @return AbstractDocument|null Instance of this class, either MetsDocument or IiifManifest */ public static function &getInstance($location, $settings = [], $forceReload = false) { @@ -415,7 +411,7 @@ public static function &getInstance($location, $settings = [], $forceReload = fa $xml = null; $iiif = null; - if ($instance = self::getDocCache($location)) { + if ($instance = self::getDocCache($location) && !$forceReload) { return $instance; } else { $instance = null; @@ -561,6 +557,7 @@ protected function getFullTextFromXml($id) // ... and extension configuration. $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); $fileGrpsFulltext = GeneralUtility::trimExplode(',', $extConf['fileGrpFulltext']); + $textFormat = ""; if (!empty($this->physicalStructureInfo[$id])) { while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { if (!empty($this->physicalStructureInfo[$id]['files'][$fileGrpFulltext])) { @@ -660,7 +657,7 @@ public static function getTitle($uid, $recursive = false) ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { // Get title information. $title = $resArray['title']; $partof = $resArray['partof']; @@ -849,7 +846,7 @@ protected function loadFormats() ) ->execute(); - while ($resArray = $result->fetch()) { + while ($resArray = $result->fetchAssociative()) { // Update format registry. $this->formats[$resArray['type']] = [ 'rootElement' => $resArray['root'], @@ -889,6 +886,47 @@ public function registerNamespaces(&$obj) } } + /** + * Initialize metadata array with empty values. + * + * @access protected + * + * @param string $format of the document eg. METS + * + * @return array + */ + protected function initializeMetadata($format) { + return [ + 'title' => [], + 'title_sorting' => [], + 'description' => [], + 'author' => [], + 'holder' => [], + 'place' => [], + 'year' => [], + 'prod_id' => [], + 'record_id' => [], + 'opac_id' => [], + 'union_id' => [], + 'urn' => [], + 'purl' => [], + 'type' => [], + 'volume' => [], + 'volume_sorting' => [], + 'date' => [], + 'license' => [], + 'terms' => [], + 'restrictions' => [], + 'out_of_print' => [], + 'rights_info' => [], + 'collection' => [], + 'owner' => [], + 'mets_label' => [], + 'mets_orderlabel' => [], + 'document_format' => [$format] + ]; + } + /** * This returns $this->cPid via __get() * @@ -914,18 +952,6 @@ protected function _getHasFulltext() return $this->hasFulltext; } - /** - * This returns $this->location via __get() - * - * @access protected - * - * @return string The location of the document - */ - protected function _getLocation() - { - return $this->location; - } - /** * Format specific part of building the document's metadata array * @@ -1126,18 +1152,6 @@ protected abstract function _getThumbnail($forceReload = false); */ protected abstract function _getToplevelId(); - /** - * This returns $this->uid via __get() - * - * @access protected - * - * @return mixed The UID or the URL of the document - */ - protected function _getUid() - { - return $this->uid; - } - /** * This sets $this->cPid via __set() * @@ -1154,7 +1168,7 @@ protected function _setCPid($value) /** * This is a singleton class, thus the constructor should be private/protected - * (Get an instance of this class by calling \Kitodo\Dlf\Common\Doc::getInstance()) + * (Get an instance of this class by calling AbstractDocument::getInstance()) * * @access protected * @@ -1253,16 +1267,16 @@ private static function getDocCache(string $location) * set Cache for $doc * * @param string $location - * @param Doc $doc + * @param AbstractDocument $currentDocument * @return void */ - private static function setDocCache(string $location, Doc $doc) + private static function setDocCache(string $location, AbstractDocument $currentDocument) { $cacheIdentifier = md5($location); $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_dlf_doc'); // Save value in cache - $cache->set($cacheIdentifier, $doc); + $cache->set($cacheIdentifier, $currentDocument); } } diff --git a/Classes/Common/Helper.php b/Classes/Common/Helper.php index 7039349e90..3719808003 100644 --- a/Classes/Common/Helper.php +++ b/Classes/Common/Helper.php @@ -16,12 +16,17 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Http\RequestFactory; use TYPO3\CMS\Core\Log\LogManager; +use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Messaging\FlashMessageService; +use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Context\Context; +use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; +use TYPO3\CMS\Core\Domain\Repository\PageRepository; + /** * Helper class for the 'dlf' extension @@ -83,7 +88,7 @@ class Helper */ public static function addMessage($message, $title, $severity, $session = false, $queue = 'kitodo.default.flashMessages') { - $flashMessageService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Messaging\FlashMessageService::class); + $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); $flashMessageQueue = $flashMessageService->getMessageQueueByIdentifier($queue); $flashMessage = GeneralUtility::makeInstance( \TYPO3\CMS\Core\Messaging\FlashMessage::class, @@ -308,12 +313,12 @@ public static function encrypt($string) self::log('No encryption key set in TYPO3 configuration', LOG_SEVERITY_ERROR); return false; } - // Generate random initialisation vector. + // Generate random initialization vector. $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(self::$cipherAlgorithm)); $key = openssl_digest($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], self::$hashAlgorithm, true); // Encrypt data. $encrypted = openssl_encrypt($string, self::$cipherAlgorithm, $key, OPENSSL_RAW_DATA, $iv); - // Merge initialisation vector and encrypted data. + // Merge initialization vector and encrypted data. if ($encrypted !== false) { $encrypted = base64_encode($iv . $encrypted); } @@ -421,7 +426,7 @@ public static function getIndexNameFromUid($uid, $table, $pid = -1) $cache[$table] = []; - while ($row = $result->fetch()) { + while ($row = $result->fetchAssociative()) { $cache[$table][$makeCacheKey($row['pid'], $row['uid'])] = $cache[$table][$makeCacheKey(-1, $row['uid'])] = $row['index_name']; @@ -452,9 +457,9 @@ public static function getLanguageName($code) // Analyze code and set appropriate ISO table. $isoCode = strtolower(trim($code)); if (preg_match('/^[a-z]{3}$/', $isoCode)) { - $file = 'EXT:dlf/Resources/Private/Data/iso-639-2b.xml'; + $file = 'EXT:dlf/Resources/Private/Data/iso-639-2b.xlf'; } elseif (preg_match('/^[a-z]{2}$/', $isoCode)) { - $file = 'EXT:dlf/Resources/Private/Data/iso-639-1.xml'; + $file = 'EXT:dlf/Resources/Private/Data/iso-639-1.xlf'; } else { // No ISO code, return unchanged. return $code; @@ -499,7 +504,7 @@ public static function getDocumentStructures($pid = -1) ->where($where) ->execute(); - $allStructures = $kitodoStructures->fetchAll(); + $allStructures = $kitodoStructures->fetchAllAssociative(); // make lookup-table indexName -> uid $allStructures = array_column($allStructures, 'indexName', 'uid'); @@ -613,7 +618,7 @@ public static function isValidHttpUrl($url) /** * Merges two arrays recursively and actually returns the modified array. - * @see \TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule() + * @see ArrayUtility::mergeRecursiveWithOverrule() * * @access public * @@ -627,7 +632,7 @@ public static function isValidHttpUrl($url) */ public static function mergeRecursiveWithOverrule(array $original, array $overrule, $addKeys = true, $includeEmptyValues = true, $enableUnsetFeature = true) { - \TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule($original, $overrule, $addKeys, $includeEmptyValues, $enableUnsetFeature); + ArrayUtility::mergeRecursiveWithOverrule($original, $overrule, $addKeys, $includeEmptyValues, $enableUnsetFeature); return $original; } @@ -642,7 +647,7 @@ public static function mergeRecursiveWithOverrule(array $original, array $overru */ public static function renderFlashMessages($queue = 'kitodo.default.flashMessages') { - $flashMessageService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Messaging\FlashMessageService::class); + $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); $flashMessageQueue = $flashMessageService->getMessageQueueByIdentifier($queue); $flashMessages = $flashMessageQueue->getAllMessagesAndFlush(); $content = GeneralUtility::makeInstance(\Kitodo\Dlf\Common\KitodoFlashMessageRenderer::class) @@ -671,13 +676,14 @@ public static function translate($index_name, $table, $pid) self::log('Invalid PID ' . $pid . ' for translation', LOG_SEVERITY_WARNING); return $index_name; } - /** @var \TYPO3\CMS\Frontend\Page\PageRepository $pageRepository */ - $pageRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Frontend\Page\PageRepository::class); + /** @var PageRepository $pageRepository */ + $pageRepository = GeneralUtility::makeInstance(PageRepository::class); $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); + $languageContentId = $languageAspect->getContentId(); // Check if "index_name" is an UID. - if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($index_name)) { + if (MathUtility::canBeInterpretedAsInteger($index_name)) { $index_name = self::getIndexNameFromUid($index_name, $table, $pid); } /* $labels already contains the translated content element, but with the index_name of the translated content element itself @@ -702,42 +708,40 @@ public static function translate($index_name, $table, $pid) ->setMaxResults(1) ->execute(); - $allResults = $result->fetchAll(); + $row = $result->fetchAssociative(); - if (count($allResults) == 1) { + if ($row) { // Now we use the uid of the l18_parent to fetch the index_name of the translated content element. - $resArray = $allResults[0]; - $result = $queryBuilder ->select($table . '.index_name AS index_name') ->from($table) ->where( $queryBuilder->expr()->eq($table . '.pid', $pid), - $queryBuilder->expr()->eq($table . '.uid', $resArray['l18n_parent']), - $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageAspect->getContentId())), + $queryBuilder->expr()->eq($table . '.uid', $row['l18n_parent']), + $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageContentId)), self::whereExpression($table, true) ) ->setMaxResults(1) ->execute(); - $allResults = $result->fetchAll(); + $row = $result->fetchAssociative(); - if (count($allResults) == 1) { + if ($row) { // If there is an translated content element, overwrite the received $index_name. - $index_name = $allResults[0]['index_name']; + $index_name = $row['index_name']; } } // Check if we already got a translation. - if (empty($labels[$table][$pid][$languageAspect->getContentId()][$index_name])) { + if (empty($labels[$table][$pid][$languageContentId][$index_name])) { // Check if this table is allowed for translation. if (in_array($table, ['tx_dlf_collections', 'tx_dlf_libraries', 'tx_dlf_metadata', 'tx_dlf_structures'])) { $additionalWhere = $queryBuilder->expr()->in($table . '.sys_language_uid', [-1, 0]); - if ($languageAspect->getContentId() > 0) { + if ($languageContentId > 0) { $additionalWhere = $queryBuilder->expr()->andX( $queryBuilder->expr()->orX( $queryBuilder->expr()->in($table . '.sys_language_uid', [-1, 0]), - $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageAspect->getContentId())) + $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageContentId)) ), $queryBuilder->expr()->eq($table . '.l18n_parent', 0) ); @@ -756,13 +760,13 @@ public static function translate($index_name, $table, $pid) ->execute(); if ($result->rowCount() > 0) { - while ($resArray = $result->fetch()) { + while ($resArray = $result->fetchAssociative()) { // Overlay localized labels if available. - if ($languageAspect->getContentId() > 0) { - $resArray = $pageRepository->getRecordOverlay($table, $resArray, $languageAspect->getContentId(), $languageAspect->getLegacyOverlayType()); + if ($languageContentId > 0) { + $resArray = $pageRepository->getRecordOverlay($table, $resArray, $languageContentId, $languageAspect->getLegacyOverlayType()); } if ($resArray) { - $labels[$table][$pid][$languageAspect->getContentId()][$resArray['index_name']] = $resArray['label']; + $labels[$table][$pid][$languageContentId][$resArray['index_name']] = $resArray['label']; } } } else { @@ -773,8 +777,8 @@ public static function translate($index_name, $table, $pid) } } - if (!empty($labels[$table][$pid][$languageAspect->getContentId()][$index_name])) { - return $labels[$table][$pid][$languageAspect->getContentId()][$index_name]; + if (!empty($labels[$table][$pid][$languageContentId][$index_name])) { + return $labels[$table][$pid][$languageContentId][$index_name]; } else { return $index_name; } @@ -792,14 +796,15 @@ public static function translate($index_name, $table, $pid) */ public static function whereExpression($table, $showHidden = false) { + // TODO: Check with applicationType; TYPO3_MODE is removed in v12 if (\TYPO3_MODE === 'FE') { // Should we ignore the record's hidden flag? $ignoreHide = 0; if ($showHidden) { $ignoreHide = 1; } - /** @var \TYPO3\CMS\Frontend\Page\PageRepository $pageRepository */ - $pageRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Frontend\Page\PageRepository::class); + /** @var PageRepository $pageRepository */ + $pageRepository = GeneralUtility::makeInstance(PageRepository::class); $expression = $pageRepository->enableFields($table, $ignoreHide); if (!empty($expression)) { @@ -807,13 +812,14 @@ public static function whereExpression($table, $showHidden = false) } else { return ''; } + // TODO: Check with applicationType; TYPO3_MODE is removed in v12 } elseif (\TYPO3_MODE === 'BE') { return GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable($table) ->expr() ->eq($table . '.' . $GLOBALS['TCA'][$table]['ctrl']['delete'], 0); } else { - self::log('Unexpected TYPO3_MODE "' . \TYPO3_MODE . '"', LOG_SEVERITY_ERROR); + self::log('Unexpected TYPO3_MODE', LOG_SEVERITY_ERROR); return '1=-1'; } } @@ -838,45 +844,6 @@ public static function getLanguageService(): LanguageService return $GLOBALS['LANG']; } - /** - * Make classname configuration from `Classes.php` available in contexts - * where it normally isn't, and where the classical way via TypoScript won't - * work either. - * - * This transforms the structure used in `Classes.php` to that used in - * `ext_typoscript_setup.txt`. See commit 5e6110fb for a similar approach. - * - * @deprecated Remove once we drop support for TYPO3v9 - * - * @access public - */ - public static function polyfillExtbaseClassesForTYPO3v9() - { - $classes = require __DIR__ . '/../../Configuration/Extbase/Persistence/Classes.php'; - - $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $configurationManager = $objectManager->get(ConfigurationManager::class); - $frameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); - - $extbaseClassmap = &$frameworkConfiguration['persistence']['classes']; - if ($extbaseClassmap === null) { - $extbaseClassmap = []; - } - - foreach ($classes as $className => $classConfig) { - $extbaseClass = &$extbaseClassmap[$className]; - if ($extbaseClass === null) { - $extbaseClass = []; - } - if (!isset($extbaseClass['mapping'])) { - $extbaseClass['mapping'] = []; - } - $extbaseClass['mapping']['tableName'] = $classConfig['tableName']; - } - - $configurationManager->setConfiguration($frameworkConfiguration); - } - /** * Replacement for the TYPO3 GeneralUtility::getUrl(). * @@ -915,4 +882,19 @@ public static function getUrl(string $url) return $content; } + + /** + * Check if given value is a valid XML ID. + * @see https://www.w3.org/TR/xmlschema-2/#ID + * + * @access public + * + * @param mixed $id: The ID value to check + * + * @return bool: TRUE if $id is valid XML ID, FALSE otherwise + */ + public static function isValidXmlId($id): bool + { + return preg_match('/^[_a-z][_a-z0-9-.]*$/i', $id) === 1; + } } diff --git a/Classes/Common/IiifManifest.php b/Classes/Common/IiifManifest.php index 67da035bb2..c31cd439d1 100644 --- a/Classes/Common/IiifManifest.php +++ b/Classes/Common/IiifManifest.php @@ -56,7 +56,7 @@ * @property-read string $thumbnail This holds the document's thumbnail location * @property-read string $toplevelId This holds the toplevel manifest's @id */ -final class IiifManifest extends Doc +final class IiifManifest extends AbstractDocument { /** * This holds the manifest file as string for serialization purposes @@ -116,7 +116,7 @@ final class IiifManifest extends Doc /** * {@inheritDoc} - * @see Doc::establishRecordId() + * @see AbstractDocument::establishRecordId() */ protected function establishRecordId($pid) { @@ -153,7 +153,7 @@ protected function establishRecordId($pid) ) ) ->execute(); - while ($resArray = $result->fetch()) { + while ($resArray = $result->fetchAssociative()) { $recordIdPath = $resArray['querypath']; if (!empty($recordIdPath)) { try { @@ -172,7 +172,7 @@ protected function establishRecordId($pid) /** * {@inheritDoc} - * @see Doc::getDocument() + * @see AbstractDocument::getDocument() */ protected function getDocument() { @@ -257,7 +257,7 @@ protected function getUseGroups($use) /** * {@inheritDoc} - * @see Doc::_getPhysicalStructure() + * @see AbstractDocument::_getPhysicalStructure() */ protected function _getPhysicalStructure() { @@ -371,7 +371,7 @@ protected function _getPhysicalStructure() /** * {@inheritDoc} - * @see Doc::getDownloadLocation() + * @see AbstractDocument::getDownloadLocation() */ public function getDownloadLocation($id) { @@ -385,7 +385,7 @@ public function getDownloadLocation($id) /** * {@inheritDoc} - * @see Doc::getFileLocation() + * @see AbstractDocument::getFileLocation() */ public function getFileLocation($id) { @@ -410,7 +410,7 @@ public function getFileLocation($id) /** * {@inheritDoc} - * @see Doc::getFileMimeType() + * @see AbstractDocument::getFileMimeType() */ public function getFileMimeType($id) { @@ -436,7 +436,7 @@ public function getFileMimeType($id) /** * {@inheritDoc} - * @see Doc::getLogicalStructure() + * @see AbstractDocument::getLogicalStructure() */ public function getLogicalStructure($id, $recursive = false) { @@ -608,42 +608,16 @@ public function getManifestMetadata($id, $cPid = 0, $withDescription = true, $wi /** * {@inheritDoc} - * @see Doc::getMetadata() + * @see AbstractDocument::getMetadata() */ public function getMetadata($id, $cPid = 0) { if (!empty($this->metadataArray[$id]) && $this->metadataArray[0] == $cPid) { return $this->metadataArray[$id]; } - // Initialize metadata array with empty values. - // TODO initialize metadata in abstract class - $metadata = [ - 'title' => [], - 'title_sorting' => [], - 'author' => [], - 'place' => [], - 'year' => [], - 'prod_id' => [], - 'record_id' => [], - 'opac_id' => [], - 'union_id' => [], - 'urn' => [], - 'purl' => [], - 'type' => [], - 'volume' => [], - 'volume_sorting' => [], - 'date' => [], - 'license' => [], - 'terms' => [], - 'restrictions' => [], - 'out_of_print' => [], - 'rights_info' => [], - 'collection' => [], - 'owner' => [], - 'mets_label' => [], - 'mets_orderlabel' => [], - 'document_format' => ['IIIF'], - ]; + + $metadata = $this->initializeMetadata('IIIF'); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_dlf_metadata'); // Get hidden records, too. @@ -676,7 +650,7 @@ public function getMetadata($id, $cPid = 0) ) ->execute(); $iiifResource = $this->iiif->getContainedResourceById($id); - while ($resArray = $result->fetch()) { + while ($resArray = $result->fetchAssociative()) { // Set metadata field's value(s). if ($resArray['format'] > 0 && !empty($resArray['xpath']) && ($values = $iiifResource->jsonPath($resArray['xpath'])) != null) { if (is_string($values)) { @@ -721,7 +695,7 @@ public function getMetadata($id, $cPid = 0) /** * {@inheritDoc} - * @see Doc::_getSmLinks() + * @see AbstractDocument::_getSmLinks() */ protected function _getSmLinks() { @@ -782,7 +756,7 @@ private function smLinkCanvasToResource(CanvasInterface $canvas, IiifResourceInt /** * {@inheritDoc} - * @see Doc::getFullText() + * @see AbstractDocument::getFullText() */ //TODO: rewrite it to get full OCR public function getFullText($id) @@ -850,7 +824,7 @@ public function getIiif() /** * {@inheritDoc} - * @see Doc::init() + * @see AbstractDocument::init() */ protected function init($location) { @@ -859,7 +833,7 @@ protected function init($location) /** * {@inheritDoc} - * @see Doc::loadLocation() + * @see AbstractDocument::loadLocation() */ protected function loadLocation($location) { @@ -883,7 +857,7 @@ protected function loadLocation($location) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::prepareMetadataArray() + * @see AbstractDocument::prepareMetadataArray() */ protected function prepareMetadataArray($cPid) { @@ -893,7 +867,7 @@ protected function prepareMetadataArray($cPid) /** * {@inheritDoc} - * @see Doc::setPreloadedDocument() + * @see AbstractDocument::setPreloadedDocument() */ protected function setPreloadedDocument($preloadedDocument) { @@ -906,7 +880,7 @@ protected function setPreloadedDocument($preloadedDocument) /** * {@inheritDoc} - * @see Docu::ensureHasFulltextIsSet() + * @see AbstractDocument::ensureHasFulltextIsSet() */ protected function ensureHasFulltextIsSet() { @@ -953,7 +927,7 @@ protected function ensureHasFulltextIsSet() /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getThumbnail() + * @see AbstractDocument::_getThumbnail() */ protected function _getThumbnail($forceReload = false) { @@ -962,7 +936,7 @@ protected function _getThumbnail($forceReload = false) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getToplevelId() + * @see AbstractDocument::_getToplevelId() */ protected function _getToplevelId() { diff --git a/Classes/Common/Indexer.php b/Classes/Common/Indexer.php index e5bb01af5f..0fccb452fe 100644 --- a/Classes/Common/Indexer.php +++ b/Classes/Common/Indexer.php @@ -12,17 +12,15 @@ namespace Kitodo\Dlf\Common; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Domain\Repository\DocumentRepository; use Kitodo\Dlf\Domain\Model\Document; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Extbase\Object\ObjectManager; -use Ubl\Iiif\Presentation\Common\Model\Resources\AnnotationContainerInterface; -use Ubl\Iiif\Tools\IiifHelper; +use TYPO3\CMS\Core\Core\Environment; /** * Indexer class for the 'dlf' extension @@ -77,9 +75,9 @@ class Indexer protected static $processedDocs = []; /** - * Instance of \Kitodo\Dlf\Common\Solr class + * Instance of \Kitodo\Dlf\Common\Solr\Solr class * - * @var \Kitodo\Dlf\Common\Solr + * @var Solr * @access protected */ protected static $solr; @@ -93,7 +91,7 @@ class Indexer * * @return bool true on success or false on failure */ - public static function add(Document $document) + public static function add(Document $document, DocumentRepository $documentRepository) { if (in_array($document->getUid(), self::$processedDocs)) { return true; @@ -102,20 +100,16 @@ public static function add(Document $document) Helper::getLanguageService()->includeLLFile('EXT:dlf/Resources/Private/Language/locallang_be.xlf'); // Handle multi-volume documents. if ($parentId = $document->getPartof()) { - // initialize documentRepository - // TODO: When we drop support for TYPO3v9, we needn't/shouldn't use ObjectManager anymore - $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $documentRepository = $objectManager->get(DocumentRepository::class); // get parent document $parent = $documentRepository->findByUid($parentId); if ($parent) { // get XML document of parent - $doc = Doc::getInstance($parent->getLocation(), ['storagePid' => $parent->getPid()], true); + $doc = AbstractDocument::getInstance($parent->getLocation(), ['storagePid' => $parent->getPid()], true); if ($doc !== null) { - $parent->setDoc($doc); - $success = self::add($parent); + $parent->setCurrentDocument($doc); + $success = self::add($parent, $documentRepository); } else { - Helper::log('Could not load parent document with UID ' . $document->getDoc()->parentId, LOG_SEVERITY_ERROR); + Helper::log('Could not load parent document with UID ' . $document->getCurrentDocument()->parentId, LOG_SEVERITY_ERROR); return false; } } @@ -129,7 +123,7 @@ public static function add(Document $document) self::$solr->service->update($updateQuery); // Index every logical unit as separate Solr document. - foreach ($document->getDoc()->tableOfContents as $logicalUnit) { + foreach ($document->getCurrentDocument()->tableOfContents as $logicalUnit) { if ($success) { $success = self::processLogical($document, $logicalUnit); } else { @@ -137,10 +131,10 @@ public static function add(Document $document) } } // Index full text files if available. - if ($document->getDoc()->hasFulltext) { - foreach ($document->getDoc()->physicalStructure as $pageNumber => $xmlId) { + if ($document->getCurrentDocument()->hasFulltext) { + foreach ($document->getCurrentDocument()->physicalStructure as $pageNumber => $xmlId) { if ($success) { - $success = self::processPhysical($document, $pageNumber, $document->getDoc()->physicalStructureInfo[$xmlId]); + $success = self::processPhysical($document, $pageNumber, $document->getCurrentDocument()->physicalStructureInfo[$xmlId]); } else { break; } @@ -151,7 +145,7 @@ public static function add(Document $document) $updateQuery->addCommit(); self::$solr->service->update($updateQuery); - if (!(\TYPO3_REQUESTTYPE & \TYPO3_REQUESTTYPE_CLI)) { + if (!(Environment::isCli())) { if ($success) { Helper::addMessage( sprintf(Helper::getLanguageService()->getLL('flash.documentIndexed'), $document->getTitle(), $document->getUid()), @@ -172,7 +166,7 @@ public static function add(Document $document) } return $success; } catch (\Exception $e) { - if (!(\TYPO3_REQUESTTYPE & \TYPO3_REQUESTTYPE_CLI)) { + if (!(Environment::isCli())) { Helper::addMessage( Helper::getLanguageService()->getLL('flash.solrException') . ' ' . htmlspecialchars($e->getMessage()), Helper::getLanguageService()->getLL('flash.error'), @@ -185,7 +179,7 @@ public static function add(Document $document) return false; } } else { - if (!(\TYPO3_REQUESTTYPE & \TYPO3_REQUESTTYPE_CLI)) { + if (!(Environment::isCli())) { Helper::addMessage( Helper::getLanguageService()->getLL('flash.solrNoConnection'), Helper::getLanguageService()->getLL('flash.warning'), @@ -262,7 +256,7 @@ protected static function loadIndexConf($pid) ) ->execute(); - while ($indexing = $result->fetch()) { + while ($indexing = $result->fetchAssociative()) { if ($indexing['index_tokenized']) { self::$fields['tokenized'][] = $indexing['index_name']; } @@ -310,7 +304,7 @@ protected static function loadIndexConf($pid) protected static function processLogical(Document $document, array $logicalUnit) { $success = true; - $doc = $document->getDoc(); + $doc = $document->getCurrentDocument(); $doc->cPid = $document->getPid(); // Get metadata for logical unit. $metadata = $doc->metadataArray[$logicalUnit['id']]; @@ -322,7 +316,6 @@ protected static function processLogical(Document $document, array $logicalUnit) } // Create new Solr document. $updateQuery = self::$solr->service->createUpdate(); - $solrDoc = $updateQuery->createDocument(); $solrDoc = self::getSolrDocument($updateQuery, $document, $logicalUnit); if (MathUtility::canBeInterpretedAsInteger($logicalUnit['points'])) { $solrDoc->setField('page', $logicalUnit['points']); @@ -349,10 +342,9 @@ protected static function processLogical(Document $document, array $logicalUnit) } elseif (preg_match("/^[\d]{8}$/", $metadata['date'][0])){ $solrDoc->setField('date', date("Y-m-d", strtotime($metadata['date'][0]))); // convert any datetime to proper ISO extended datetime format and timezone for SOLR - } else { + } elseif (preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$/", $metadata['date'][0])) { $solrDoc->setField('date', date('Y-m-d\TH:i:s\Z', strtotime($metadata['date'][0]))); } - $solrDoc->setField('date', $metadata['date'][0]); } $solrDoc->setField('record_id', $metadata['record_id'][0]); $solrDoc->setField('purl', $metadata['purl'][0]); @@ -401,7 +393,7 @@ protected static function processLogical(Document $document, array $logicalUnit) $updateQuery->addDocument($solrDoc); self::$solr->service->update($updateQuery); } catch (\Exception $e) { - if (!(\TYPO3_REQUESTTYPE & \TYPO3_REQUESTTYPE_CLI)) { + if (!(Environment::isCli())) { Helper::addMessage( Helper::getLanguageService()->getLL('flash.solrException') . '
' . htmlspecialchars($e->getMessage()), Helper::getLanguageService()->getLL('flash.error'), @@ -441,7 +433,7 @@ protected static function processLogical(Document $document, array $logicalUnit) */ protected static function processPhysical(Document $document, $page, array $physicalUnit) { - $doc = $document->getDoc(); + $doc = $document->getCurrentDocument(); $doc->cPid = $document->getPid(); if ($doc->hasFulltext && $fullText = $doc->getFullText($physicalUnit['id'])) { // Read extension configuration. @@ -499,7 +491,7 @@ protected static function processPhysical(Document $document, $page, array $phys $updateQuery->addDocument($solrDoc); self::$solr->service->update($updateQuery); } catch (\Exception $e) { - if (!(\TYPO3_REQUESTTYPE & \TYPO3_REQUESTTYPE_CLI)) { + if (!(Environment::isCli())) { Helper::addMessage( Helper::getLanguageService()->getLL('flash.solrException') . '
' . htmlspecialchars($e->getMessage()), Helper::getLanguageService()->getLL('flash.error'), @@ -563,10 +555,10 @@ private static function getSolrDocument($updateQuery, $document, $unit, $fullTex $solrDoc->setField('uid', $document->getUid()); $solrDoc->setField('pid', $document->getPid()); $solrDoc->setField('partof', $document->getPartof()); - $solrDoc->setField('root', $document->getDoc()->rootId); + $solrDoc->setField('root', $document->getCurrentDocument()->rootId); $solrDoc->setField('sid', $unit['id']); $solrDoc->setField('type', $unit['type'], self::$fields['fieldboost']['type']); - $solrDoc->setField('collection', $document->getDoc()->metadataArray[$document->getDoc()->toplevelId]['collection']); + $solrDoc->setField('collection', $document->getCurrentDocument()->metadataArray[$document->getCurrentDocument()->toplevelId]['collection']); $solrDoc->setField('fulltext', $fullText); return $solrDoc; } @@ -595,8 +587,9 @@ private static function removeAppendsFromAuthor($authors) { * * @access private */ - private function __construct() + private function __construct(DocumentRepository $documentRepository) { // This is a static class, thus no instances should be created. + $this->documentRepository = $documentRepository; } } diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 53f1caaffa..b2070d238c 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -15,10 +15,10 @@ use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction; +use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; use Ubl\Iiif\Tools\IiifHelper; use Ubl\Iiif\Services\AbstractImageService; -use TYPO3\CMS\Core\Log\LogManager; /** * MetsDocument class for the 'dlf' extension. @@ -50,7 +50,7 @@ * @property-read string $toplevelId This holds the toplevel structure's @ID (METS) or the manifest's @id (IIIF) * @property-read string $parentHref URL of the parent document (determined via mptr element), or empty string if none is available */ -final class MetsDocument extends Doc +final class MetsDocument extends AbstractDocument { /** * Subsections / tags that may occur within ``. @@ -75,7 +75,7 @@ final class MetsDocument extends Doc * This maps the ID of each amdSec to the IDs of its children (techMD etc.). * When an ADMID references an amdSec instead of techMD etc., this is used to iterate the child elements. * - * @var string[] + * @var array * @access protected */ protected $amdSecChildIds = []; @@ -189,7 +189,7 @@ public function addMetadataFromMets(&$metadata, $id) /** * * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::establishRecordId() + * @see AbstractDocument::establishRecordId() */ protected function establishRecordId($pid) { @@ -210,7 +210,7 @@ protected function establishRecordId($pid) /** * * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getDownloadLocation() + * @see AbstractDocument::getDownloadLocation() */ public function getDownloadLocation($id) { @@ -236,7 +236,7 @@ public function getDownloadLocation($id) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getFileLocation() + * @see AbstractDocument::getFileLocation() */ public function getFileLocation($id) { @@ -254,7 +254,7 @@ public function getFileLocation($id) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getFileMimeType() + * @see AbstractDocument::getFileMimeType() */ public function getFileMimeType($id) { @@ -272,7 +272,7 @@ public function getFileMimeType($id) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getLogicalStructure() + * @see AbstractDocument::getLogicalStructure() */ public function getLogicalStructure($id, $recursive = false) { @@ -333,15 +333,18 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, $recurs $details['orderlabel'] = (isset($attributes['ORDERLABEL']) ? $attributes['ORDERLABEL'] : ''); $details['contentIds'] = (isset($attributes['CONTENTIDS']) ? $attributes['CONTENTIDS'] : ''); $details['volume'] = ''; - // Set volume information only if no label is set and this is the toplevel structure element. + // Set volume and year information only if no label is set and this is the toplevel structure element. if ( empty($details['label']) - && $details['id'] == $this->_getToplevelId() + && empty($details['orderlabel']) ) { $metadata = $this->getMetadata($details['id']); if (!empty($metadata['volume'][0])) { $details['volume'] = $metadata['volume'][0]; } + if (!empty($metadata['year'][0])) { + $details['year'] = $metadata['year'][0]; + } } $details['pagination'] = ''; $details['type'] = $attributes['TYPE']; @@ -418,7 +421,7 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, $recurs /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getMetadata() + * @see AbstractDocument::getMetadata() */ public function getMetadata($id, $cPid = 0) { @@ -442,36 +445,9 @@ public function getMetadata($id, $cPid = 0) ) { return $this->metadataArray[$id]; } - // Initialize metadata array with empty values. - $metadata = [ - 'title' => [], - 'title_sorting' => [], - 'description' => [], - 'author' => [], - 'holder' => [], - 'place' => [], - 'year' => [], - 'prod_id' => [], - 'record_id' => [], - 'opac_id' => [], - 'union_id' => [], - 'urn' => [], - 'purl' => [], - 'type' => [], - 'volume' => [], - 'volume_sorting' => [], - 'date' => [], - 'license' => [], - 'terms' => [], - 'restrictions' => [], - 'out_of_print' => [], - 'rights_info' => [], - 'collection' => [], - 'owner' => [], - 'mets_label' => [], - 'mets_orderlabel' => [], - 'document_format' => ['METS'], - ]; + + $metadata = $this->initializeMetadata('METS'); + $mdIds = $this->getMetadataIds($id); if (empty($mdIds)) { // There is no metadata section for this structure node. @@ -657,6 +633,7 @@ class_exists($class) if (empty($metadata['date'][0])) { $metadata['date'][0] = ''; } + // Files are not expected to reference a dmdSec if (isset($this->fileInfos[$id]) || isset($hasMetadataSection['dmdSec'])) { return $metadata; @@ -672,8 +649,10 @@ class_exists($class) * a logical structure node or to a file. * * @access protected + * * @param string $id: The "@ID" attribute of the file node - * @return void + * + * @return array */ protected function getMetadataIds($id) { @@ -721,7 +700,7 @@ protected function getMetadataIds($id) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::getFullText() + * @see AbstractDocument::getFullText() */ public function getFullText($id) { @@ -737,7 +716,7 @@ public function getFullText($id) /** * {@inheritDoc} - * @see Doc::getStructureDepth() + * @see AbstractDocument::getStructureDepth() */ public function getStructureDepth($logId) { @@ -762,7 +741,7 @@ public function getLogicalUnits(){ /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::init() + * @see AbstractDocument::init() */ protected function init($location) { @@ -787,7 +766,7 @@ protected function init($location) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::loadLocation() + * @see AbstractDocument::loadLocation() */ protected function loadLocation($location) { @@ -806,7 +785,7 @@ protected function loadLocation($location) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::ensureHasFulltextIsSet() + * @see AbstractDocument::ensureHasFulltextIsSet() */ protected function ensureHasFulltextIsSet() { @@ -818,7 +797,7 @@ protected function ensureHasFulltextIsSet() /** * {@inheritDoc} - * @see Doc::setPreloadedDocument() + * @see AbstractDocument::setPreloadedDocument() */ protected function setPreloadedDocument($preloadedDocument) { @@ -832,7 +811,7 @@ protected function setPreloadedDocument($preloadedDocument) /** * {@inheritDoc} - * @see Doc::getDocument() + * @see AbstractDocument::getDocument() */ protected function getDocument() { @@ -1006,7 +985,7 @@ protected function _getFileInfos() /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::prepareMetadataArray() + * @see AbstractDocument::prepareMetadataArray() */ protected function prepareMetadataArray($cPid) { @@ -1034,7 +1013,7 @@ protected function _getMets() /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getPhysicalStructure() + * @see AbstractDocument::_getPhysicalStructure() */ protected function _getPhysicalStructure() { @@ -1097,7 +1076,7 @@ protected function _getPhysicalStructure() /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getSmLinks() + * @see AbstractDocument::_getSmLinks() */ protected function _getSmLinks() { @@ -1116,7 +1095,7 @@ protected function _getSmLinks() /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getThumbnail() + * @see AbstractDocument::_getThumbnail() */ protected function _getThumbnail($forceReload = false) { @@ -1196,7 +1175,7 @@ protected function _getThumbnail($forceReload = false) /** * {@inheritDoc} - * @see \Kitodo\Dlf\Common\Doc::_getToplevelId() + * @see AbstractDocument::_getToplevelId() */ protected function _getToplevelId() { @@ -1226,7 +1205,7 @@ protected function _getToplevelId() /** * Try to determine URL of parent document. * - * @return string|null + * @return string */ public function _getParentHref() { diff --git a/Classes/Common/SolrSearchResult/Highlight.php b/Classes/Common/Solr/SearchResult/Highlight.php similarity index 98% rename from Classes/Common/SolrSearchResult/Highlight.php rename to Classes/Common/Solr/SearchResult/Highlight.php index 91243edc1c..66bf89429e 100644 --- a/Classes/Common/SolrSearchResult/Highlight.php +++ b/Classes/Common/Solr/SearchResult/Highlight.php @@ -10,7 +10,7 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Common\SolrSearchResult; +namespace Kitodo\Dlf\Common\Solr\SearchResult; /** * Highlight class for the 'dlf' extension. It keeps highlight for found search phrase. diff --git a/Classes/Common/SolrSearchResult/Page.php b/Classes/Common/Solr/SearchResult/Page.php similarity index 97% rename from Classes/Common/SolrSearchResult/Page.php rename to Classes/Common/Solr/SearchResult/Page.php index 8924671857..d35122d4cf 100644 --- a/Classes/Common/SolrSearchResult/Page.php +++ b/Classes/Common/Solr/SearchResult/Page.php @@ -10,7 +10,7 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Common\SolrSearchResult; +namespace Kitodo\Dlf\Common\Solr\SearchResult; /** * Page class for the 'dlf' extension. It keeps page in which search phrase was found. diff --git a/Classes/Common/SolrSearchResult/Region.php b/Classes/Common/Solr/SearchResult/Region.php similarity index 98% rename from Classes/Common/SolrSearchResult/Region.php rename to Classes/Common/Solr/SearchResult/Region.php index c89b0f0c12..a0b1536ac8 100644 --- a/Classes/Common/SolrSearchResult/Region.php +++ b/Classes/Common/Solr/SearchResult/Region.php @@ -10,7 +10,7 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Common\SolrSearchResult; +namespace Kitodo\Dlf\Common\Solr\SearchResult; /** * Region class for the 'dlf' extension. It keeps region in which search phrase was found. diff --git a/Classes/Common/SolrSearchResult/ResultDocument.php b/Classes/Common/Solr/SearchResult/ResultDocument.php similarity index 97% rename from Classes/Common/SolrSearchResult/ResultDocument.php rename to Classes/Common/Solr/SearchResult/ResultDocument.php index 1874912d71..65fc2c188f 100644 --- a/Classes/Common/SolrSearchResult/ResultDocument.php +++ b/Classes/Common/Solr/SearchResult/ResultDocument.php @@ -10,11 +10,7 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Common\SolrSearchResult; - -use Kitodo\Dlf\Common\SolrSearchResult\Highlight; -use Kitodo\Dlf\Common\SolrSearchResult\Page; -use Kitodo\Dlf\Common\SolrSearchResult\Region; +namespace Kitodo\Dlf\Common\Solr\SearchResult; /** * ResultDocument class for the 'dlf' extension. It keeps the result of the search in the SOLR index. @@ -202,7 +198,7 @@ public function getSnippets() } /** - * Get the thumnail URL + * Get the thumbnail URL * * @access public * diff --git a/Classes/Common/Solr.php b/Classes/Common/Solr/Solr.php similarity index 95% rename from Classes/Common/Solr.php rename to Classes/Common/Solr/Solr.php index 71ba7a5416..7c4b644869 100644 --- a/Classes/Common/Solr.php +++ b/Classes/Common/Solr/Solr.php @@ -10,14 +10,14 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Common; +namespace Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Helper; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; @@ -116,7 +116,7 @@ class Solr implements LoggerAwareInterface /** * This holds the singleton search objects with their core as array key * - * @var array (\Kitodo\Dlf\Common\Solr) + * @var array (\Kitodo\Dlf\Common\Solr\Solr) * @access protected */ protected static $registry = []; @@ -178,7 +178,7 @@ public static function createCore($core = '') } /** - * Escape all special characters in a query string + * Escape special characters in a query string * * @access public * @@ -188,16 +188,10 @@ public static function createCore($core = '') */ public static function escapeQuery($query) { - $helper = GeneralUtility::makeInstance(\Solarium\Core\Query\Helper::class); - // Escape query phrase or term. - if (preg_match('/^".*"$/', $query)) { - return $helper->escapePhrase(trim($query, '"')); - } else { - // Using a modified escape function here to retain whitespace, '*' and '?' for search truncation. - // @see https://github.com/solariumphp/solarium/blob/5.x/src/Core/Query/Helper.php#L70 for reference - /* return $helper->escapeTerm($query); */ - return preg_replace('/(\+|-|&&|\|\||!|\(|\)|\{|}|\[|]|\^|"|~|:|\/|\\\)/', '\\\$1', $query); - } + // Escape query by disallowing range and field operators + // Permit operators: wildcard, boolean, fuzzy, proximity, boost, grouping + // https://solr.apache.org/guide/solr/latest/query-guide/standard-query-parser.html + return preg_replace('/(\{|}|\[|]|:|\/|\\\)/', '\\\$1', $query); } /** @@ -237,7 +231,7 @@ public static function escapeQueryKeepField($query, $pid) ) ->execute(); - while ($resArray = $result->fetch()) { + while ($resArray = $result->fetchAssociative()) { $fields[] = $resArray['index_name'] . '_' . ($resArray['index_tokenized'] ? 't' : 'u') . ($resArray['index_stored'] ? 's' : 'u') . 'i'; } @@ -304,7 +298,7 @@ public static function getFields() * * @param mixed $core: Name or UID of the core to load or null to get core admin endpoint * - * @return \Kitodo\Dlf\Common\Solr Instance of this class + * @return \Kitodo\Dlf\Common\Solr\Solr Instance of this class */ public static function getInstance($core = null) { diff --git a/Classes/Common/SolrSearch.php b/Classes/Common/Solr/SolrSearch.php similarity index 86% rename from Classes/Common/SolrSearch.php rename to Classes/Common/Solr/SolrSearch.php index c0bcf6263e..bf7f0debbd 100644 --- a/Classes/Common/SolrSearch.php +++ b/Classes/Common/Solr/SolrSearch.php @@ -1,12 +1,13 @@ result['documents']); } - public function count() + public function count(): int { if ($this->result === null) { return 0; @@ -67,22 +102,22 @@ public function key() return $this->position; } - public function next() + public function next(): void { $this->position++; } - public function rewind() + public function rewind(): void { $this->position = 0; } - public function valid() + public function valid(): bool { return isset($this[$this->position]); } - public function offsetExists($offset) + public function offsetExists($offset): bool { $idx = $this->result['document_keys'][$offset]; return isset($this->result['documents'][$idx]); @@ -107,7 +142,7 @@ public function offsetGet($offset) // get title of parent/grandparent/... if empty if (empty($document['title']) && $document['partOf'] > 0) { - $superiorTitle = Doc::getTitle($document['partOf'], true); + $superiorTitle = AbstractDocument::getTitle($document['partOf'], true); if (!empty($superiorTitle)) { $document['title'] = '[' . $superiorTitle . ']'; } @@ -117,12 +152,12 @@ public function offsetGet($offset) return $document; } - public function offsetSet($offset, $value) + public function offsetSet($offset, $value): void { throw new \Exception("SolrSearch: Modifying result list is not supported"); } - public function offsetUnset($offset) + public function offsetUnset($offset): void { throw new \Exception("SolrSearch: Modifying result list is not supported"); } @@ -243,16 +278,16 @@ public function prepare() $virtualCollectionsQueryString = ''; foreach ($this->collection as $collectionEntry) { // check for virtual collections query string - if($collectionEntry->getIndexSearch()) { + if ($collectionEntry->getIndexSearch()) { $virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR ('. $collectionEntry->getIndexSearch() . ')' ; } else { $collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"'; } } - + // distinguish between simple collection browsing and actual searching within the collection(s) - if(!empty($collectionsQueryString)) { - if(empty($query)) { + if (!empty($collectionsQueryString)) { + if (empty($query)) { $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)'; } else { $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))'; @@ -260,7 +295,7 @@ public function prepare() } // virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separatly - if(!empty($virtualCollectionsQueryString)) { + if (!empty($virtualCollectionsQueryString)) { $virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')'; } @@ -339,9 +374,9 @@ public function submit($start, $rows, $processResults = true) } if ($documents[$doc['uid']]) { // translate language code if applicable - if($doc['metadata']['language']) { - foreach($doc['metadata']['language'] as $indexName => $language) { - $doc['metadata']['language'][$indexName] = Helper::getLanguageName($doc['metadata']['language'][$indexName]); + if ($doc['metadata']['language']) { + foreach ($doc['metadata']['language'] as $indexName => $language) { + $doc['metadata']['language'][$indexName] = Helper::getLanguageName($language); } } if ($doc['toplevel'] === false) { @@ -364,7 +399,9 @@ public function submit($start, $rows, $processResults = true) if ($this->searchParams['fulltext'] == '1') { $searchResult['snippet'] = $doc['snippet']; $searchResult['highlight'] = $doc['highlight']; - $searchResult['highlight_word'] = $this->searchParams['query']; + $searchResult['highlight_word'] = preg_replace('/^;|;$/', '', // remove ; at beginning or end + preg_replace('/;+/', ';', // replace any multiple of ; with a single ; + preg_replace('/[{~\d*}{\s+}{^=*\d+.*\d*}`~!@#$%\^&*()_|+-=?;:\'",.<>\{\}\[\]\\\]/', ';', $this->searchParams['query']))); // replace search operators and special characters with ; } $documents[$doc['uid']]['searchResults'][] = $searchResult; } @@ -377,11 +414,12 @@ public function submit($start, $rows, $processResults = true) if ($this->searchParams['fulltext'] != '1') { $documents[$doc['uid']]['page'] = 1; $children = $childrenOf[$doc['uid']] ?? []; + $childrenRows = !empty($this->settings['childrenRows']) ? intval($this->settings['childrenRows']) : 100; if (!empty($children)) { $metadataOf = $this->fetchToplevelMetadataFromSolr([ 'query' => 'partof:' . $doc['uid'], 'start' => 0, - 'rows' => 100, + 'rows' => $childrenRows, ]); foreach ($children as $docChild) { // We need only a few fields from the children, but we need them as array. @@ -521,6 +559,10 @@ protected function searchSolr($parameters = [], $enableCache = true) // Perform search for all documents with the same uid that either fit to the search or marked as toplevel. $response = $solr->service->executeRequest($solrRequest); + // return empty resultSet on error-response + if ($response->getStatusCode() == 400) { + return $resultSet; + } $result = $solr->service->createResult($selectQuery, $response); $uidGroup = $result->getGrouping()->getGroup('uid'); @@ -535,25 +577,7 @@ protected function searchSolr($parameters = [], $enableCache = true) foreach ($uidGroup as $group) { foreach ($group as $record) { - $resultDocument = new ResultDocument($record, $highlighting, $fields); - - $document = [ - 'id' => $resultDocument->getId(), - 'page' => $resultDocument->getPage(), - 'snippet' => $resultDocument->getSnippets(), - 'thumbnail' => $resultDocument->getThumbnail(), - 'title' => $resultDocument->getTitle(), - 'toplevel' => $resultDocument->getToplevel(), - 'type' => $resultDocument->getType(), - 'uid' => !empty($resultDocument->getUid()) ? $resultDocument->getUid() : $parameters['uid'], - 'highlight' => $resultDocument->getHighlightsIds(), - ]; - foreach ($parameters['listMetadataRecords'] as $indexName => $solrField) { - if (!empty($record->$solrField)) { - $document['metadata'][$indexName] = $record->$solrField; - } - } - $resultSet['documents'][] = $document; + $resultSet['documents'][] = $this->getDocument($record, $highlighting, $fields, $parameters); } } @@ -567,4 +591,28 @@ protected function searchSolr($parameters = [], $enableCache = true) } return $resultSet; } + + private function getDocument($record, $highlighting, $fields, $parameters) { + $resultDocument = new ResultDocument($record, $highlighting, $fields); + + $document = [ + 'id' => $resultDocument->getId(), + 'page' => $resultDocument->getPage(), + 'snippet' => $resultDocument->getSnippets(), + 'thumbnail' => $resultDocument->getThumbnail(), + 'title' => $resultDocument->getTitle(), + 'toplevel' => $resultDocument->getToplevel(), + 'type' => $resultDocument->getType(), + 'uid' => !empty($resultDocument->getUid()) ? $resultDocument->getUid() : $parameters['uid'], + 'highlight' => $resultDocument->getHighlightsIds(), + ]; + + foreach ($parameters['listMetadataRecords'] as $indexName => $solrField) { + if (!empty($record->$solrField)) { + $document['metadata'][$indexName] = $record->$solrField; + } + } + + return $document; + } } diff --git a/Classes/Common/SolrSearchQuery.php b/Classes/Common/Solr/SolrSearchQuery.php similarity index 90% rename from Classes/Common/SolrSearchQuery.php rename to Classes/Common/Solr/SolrSearchQuery.php index d62e7586d7..c170ef4be2 100644 --- a/Classes/Common/SolrSearchQuery.php +++ b/Classes/Common/Solr/SolrSearchQuery.php @@ -1,6 +1,6 @@ solrSearch = $solrSearch; diff --git a/Classes/Common/SolrPaginator.php b/Classes/Common/SolrPaginator.php new file mode 100644 index 0000000000..7ce877b0ff --- /dev/null +++ b/Classes/Common/SolrPaginator.php @@ -0,0 +1,61 @@ + + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + +namespace Kitodo\Dlf\Common; + +use TYPO3\CMS\Core\Pagination\AbstractPaginator; + +class SolrPaginator extends AbstractPaginator +{ + /** + * @var SolrSearch + */ + private $solrSearch; + + /** + * @var array + */ + private $paginatedItems = []; + + public function __construct( + SolrSearch $solrSearch, + int $currentPageNumber = 1, + int $itemsPerPage = 25 + ) { + $this->solrSearch = $solrSearch; + $this->setCurrentPageNumber($currentPageNumber); + $this->setItemsPerPage($itemsPerPage); + + $this->updateInternalState(); + } + + protected function updatePaginatedItems(int $itemsPerPage, int $offset): void + { + $this->solrSearch->submit($offset, $itemsPerPage); + $this->paginatedItems = $this->solrSearch->toArray(); + } + + protected function getTotalAmountOfItems(): int + { + return $this->solrSearch->count(); + } + + protected function getAmountOfItemsOnCurrentPage(): int + { + return count($this->paginatedItems); + } + + public function getPaginatedItems(): iterable + { + return $this->paginatedItems; + } +} diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php old mode 100755 new mode 100644 index 96c92629d1..4ab2100b78 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -11,18 +11,18 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Domain\Model\Document; use Kitodo\Dlf\Domain\Repository\DocumentRepository; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; -use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Pagination\PaginationInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; - +use TYPO3\CMS\Core\Pagination\PaginatorInterface; /** * Abstract controller class for most of the plugin controller. @@ -88,10 +88,9 @@ public function injectDocumentRepository(DocumentRepository $documentRepository) protected function initialize() { $this->requestData = GeneralUtility::_GPmerged('tx_dlf'); - if (empty($this->requestData['page'])) { - $this->requestData['page'] = 1; - } - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); + + // Sanitize user input to prevent XSS attacks. + $this->sanitizeRequestData(); // Get extension configuration. $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); @@ -108,28 +107,33 @@ protected function initialize() * * @access protected * - * @param array $requestData: The request data + * @param int $documentId: The document's UID (fallback: $this->requestData[id]) * * @return void */ - protected function loadDocument($requestData) + protected function loadDocument(int $documentId = 0) { + // Get document ID from request data if not passed as parameter. + if ($documentId === 0 && !empty($this->requestData['id'])) { + $documentId = $this->requestData['id']; + } + // Try to get document format from database - if (!empty($requestData['id'])) { + if (!empty($documentId)) { $doc = null; - if (MathUtility::canBeInterpretedAsInteger($requestData['id'])) { + if (MathUtility::canBeInterpretedAsInteger($documentId)) { // find document from repository by uid - $this->document = $this->documentRepository->findOneByIdAndSettings((int) $requestData['id']); + $this->document = $this->documentRepository->findOneByIdAndSettings($documentId); if ($this->document) { - $doc = Doc::getInstance($this->document->getLocation(), $this->settings, true); + $doc = AbstractDocument::getInstance($this->document->getLocation(), $this->settings, true); } else { - $this->logger->error('Invalid UID "' . $requestData['id'] . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); + $this->logger->error('Invalid UID "' . $documentId . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); } - } else if (GeneralUtility::isValidUrl($requestData['id'])) { + } else if (GeneralUtility::isValidUrl($documentId)) { - $doc = Doc::getInstance($requestData['id'], $this->settings, true); + $doc = AbstractDocument::getInstance($documentId, $this->settings, true); if ($doc !== null) { if ($doc->recordId) { @@ -146,33 +150,54 @@ protected function loadDocument($requestData) $doc->cPid = max(intval($this->settings['storagePid']), 0); } - $this->document->setLocation($requestData['id']); + $this->document->setLocation($documentId); } else { - $this->logger->error('Invalid location given "' . $requestData['id'] . '" for document loading'); + $this->logger->error('Invalid location given "' . $documentId . '" for document loading'); } } if ($this->document !== null && $doc !== null) { - $this->document->setDoc($doc); + $this->document->setCurrentDocument($doc); } - } elseif (!empty($requestData['recordId'])) { + } elseif (!empty($this->requestData['recordId'])) { - $this->document = $this->documentRepository->findOneByRecordId($requestData['recordId']); + $this->document = $this->documentRepository->findOneByRecordId($this->requestData['recordId']); if ($this->document !== null) { - $doc = Doc::getInstance($this->document->getLocation(), $this->settings, true); + $doc = AbstractDocument::getInstance($this->document->getLocation(), $this->settings, true); if ($this->document !== null && $doc !== null) { - $this->document->setDoc($doc); + $this->document->setCurrentDocument($doc); } else { - $this->logger->error('Failed to load document with record ID "' . $requestData['recordId'] . '"'); + $this->logger->error('Failed to load document with record ID "' . $this->requestData['recordId'] . '"'); } } } else { - $this->logger->error('Invalid ID "' . $requestData['id'] . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); + $this->logger->error('Invalid ID "' . $documentId . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); } } + /** + * Configure URL for proxy. + * + * @access protected + * + * @param string $url URL for proxy configuration + * + * @return void + */ + protected function configureProxyUrl(&$url) { + $this->uriBuilder->reset() + ->setTargetPageUid($GLOBALS['TSFE']->id) + ->setCreateAbsoluteUri(!empty($this->settings['forceAbsoluteUrl'])) + ->setArguments([ + 'eID' => 'tx_dlf_pageview_proxy', + 'url' => $url, + 'uHash' => GeneralUtility::hmac($url, 'PageViewProxy') + ]) + ->build(); + } + /** * Checks if doc is missing or is empty (no pages) * @@ -180,7 +205,7 @@ protected function loadDocument($requestData) */ protected function isDocMissingOrEmpty() { - return $this->isDocMissing() || $this->document->getDoc()->numPages < 1; + return $this->isDocMissing() || $this->document->getCurrentDocument()->numPages < 1; } /** @@ -190,7 +215,7 @@ protected function isDocMissingOrEmpty() */ protected function isDocMissing() { - return $this->document === null || $this->document->getDoc() === null; + return $this->document === null || $this->document->getCurrentDocument() === null; } /** @@ -219,6 +244,77 @@ protected function getParametersSafely($parameterName) return null; } + /** + * Sanitize input variables. + * + * @access protected + * + * @return void + */ + protected function sanitizeRequestData() + { + // tx_dlf[id] may only be an UID or URI. + if ( + !empty($this->requestData['id']) + && !MathUtility::canBeInterpretedAsInteger($this->requestData['id']) + && !GeneralUtility::isValidUrl($this->requestData['id']) + ) { + $this->logger->warning('Invalid ID or URI "' . $this->requestData['id'] . '" for document loading'); + unset($this->requestData['id']); + } + + // tx_dlf[page] may only be a positive integer or valid XML ID. + if ( + !empty($this->requestData['page']) + && !MathUtility::canBeInterpretedAsInteger($this->requestData['page']) + && !Helper::isValidXmlId($this->requestData['page']) + ) { + $this->requestData['page'] = 1; + } + + // tx_dlf[double] may only be 0 or 1. + $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); + } + + /** + * Sets page value. + * + * @access protected + * + * @return void + */ + protected function setPage() { + if (!empty($this->requestData['logicalPage'])) { + $this->requestData['page'] = $this->document->getCurrentDocument()->getPhysicalPage($this->requestData['logicalPage']); + // The logical page parameter should not appear again + unset($this->requestData['logicalPage']); + } + + $this->setDefaultPage(); + } + + /** + * Sets default page value. + * + * @access protected + * + * @return void + */ + protected function setDefaultPage() { + // Set default values if not set. + // $this->requestData['page'] may be integer or string (physical structure @ID) + if ( + (int) $this->requestData['page'] > 0 + || empty($this->requestData['page']) + ) { + $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getCurrentDocument()->numPages, 1); + } else { + $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getCurrentDocument()->physicalStructure); + } + // reassign viewData to get correct page + $this->viewData['requestData'] = $this->requestData; + } + /** * This is the constructor * @@ -230,4 +326,28 @@ public function __construct() { $this->initialize(); } + + /** + * build simple pagination + * + * @param PaginationInterface $pagination + * @param PaginatorInterface $paginator + * @return array + */ + protected function buildSimplePagination(PaginationInterface $pagination, PaginatorInterface $paginator) + { + $firstPage = $pagination->getFirstPageNumber(); + $lastPage = $pagination->getLastPageNumber(); + + return [ + 'lastPageNumber' => $lastPage, + 'firstPageNumber' => $firstPage, + 'nextPageNumber' => ($pagination->getNextPageNumber()), + 'previousPageNumber' => $pagination->getPreviousPageNumber(), + 'startRecordNumber' => $pagination->getStartRecordNumber(), + 'endRecordNumber' => $pagination->getEndRecordNumber(), + 'currentPageNumber' => $paginator->getCurrentPageNumber(), + 'pages' => range($firstPage, $lastPage) + ]; + } } diff --git a/Classes/Controller/AudioPlayerController.php b/Classes/Controller/AudioPlayerController.php index e05db0ac43..078cc71573 100644 --- a/Classes/Controller/AudioPlayerController.php +++ b/Classes/Controller/AudioPlayerController.php @@ -14,7 +14,6 @@ use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Core\Utility\PathUtility; /** @@ -75,39 +74,30 @@ protected function addPlayerJS() public function mainAction() { // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ($this->isDocMissingOrEmpty()) { // Quit without doing anything if required variables are not set. - return ''; - } else { - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } + + $this->setDefaultPage(); + // Check if there are any audio files available. $fileGrpsAudio = GeneralUtility::trimExplode(',', $this->extConf['fileGrpAudio']); while ($fileGrpAudio = array_shift($fileGrpsAudio)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpAudio])) { + $fileGroupAudio = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpAudio]; + if (!empty($fileGroupAudio)) { // Get audio data. - $this->audio['url'] = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpAudio]); - $this->audio['label'] = $this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['label']; - $this->audio['mimetype'] = $this->document->getDoc()->getFileMimeType($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpAudio]); + $this->audio['url'] = $this->document->getCurrentDocument()->getFileLocation($fileGroupAudio); + $this->audio['label'] = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page']]]['label']; + $this->audio['mimetype'] = $this->document->getCurrentDocument()->getFileMimeType($fileGroupAudio); break; } } + if (!empty($this->audio)) { // Add jPlayer javascript. $this->addPlayerJS(); - } else { - // Quit without doing anything if required variables are not set. - return ''; } } } diff --git a/Classes/Controller/Backend/NewTenantController.php b/Classes/Controller/Backend/NewTenantController.php index 3e40b0c05a..1db29a792e 100644 --- a/Classes/Controller/Backend/NewTenantController.php +++ b/Classes/Controller/Backend/NewTenantController.php @@ -11,7 +11,7 @@ namespace Kitodo\Dlf\Controller\Backend; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Controller\AbstractController; use Kitodo\Dlf\Domain\Model\Format; use Kitodo\Dlf\Domain\Model\Metadata; @@ -22,18 +22,14 @@ use Kitodo\Dlf\Domain\Repository\MetadataRepository; use Kitodo\Dlf\Domain\Repository\StructureRepository; use Kitodo\Dlf\Domain\Repository\SolrCoreRepository; - use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; - use TYPO3\CMS\Core\Exception\SiteNotFoundException; use TYPO3\CMS\Core\Site\Entity\NullSite; -use TYPO3\CMS\Core\Site\Entity\Site; -use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\Site\SiteFinder; /** @@ -280,11 +276,13 @@ public function addSolrCoreAction() $newRecord = GeneralUtility::makeInstance(SolrCore::class); $newRecord->setLabel($this->getLLL('flexform.solrcore', $this->siteLanguages[0]->getTypo3Language(), $beLabels). ' (PID ' . $this->pid . ')'); $indexName = Solr::createCore(''); - $newRecord->setIndexName($indexName); + if (!empty($indexName)) { + $newRecord->setIndexName($indexName); - $this->solrCoreRepository->add($newRecord); + $this->solrCoreRepository->add($newRecord); - $doPersist = true; + $doPersist = true; + } } // We must persist here, if we changed anything. @@ -419,8 +417,10 @@ protected function getLLL($index, $lang, $langArray) { if (isset($langArray[$lang][$index][0]['target'])) { return $langArray[$lang][$index][0]['target']; - } else { + } elseif (isset($langArray['default'][$index][0]['target'])) { return $langArray['default'][$index][0]['target']; + } else { + return 'Missing translation for ' . $index; } } } diff --git a/Classes/Controller/BasketController.php b/Classes/Controller/BasketController.php index c47556f6cf..b4155ca299 100644 --- a/Classes/Controller/BasketController.php +++ b/Classes/Controller/BasketController.php @@ -12,7 +12,6 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Doc; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Domain\Model\ActionLog; use Kitodo\Dlf\Domain\Model\Basket; @@ -207,7 +206,7 @@ public function mainAction() protected function getBasketData() { // get user session - $sessionId = $GLOBALS['TSFE']->fe_user->id; + $userSession = $GLOBALS['TSFE']->fe_user->getSession(); $context = GeneralUtility::makeInstance(Context::class); // Checking if a user is logged in @@ -216,18 +215,18 @@ protected function getBasketData() if ($userIsLoggedIn) { $basket = $this->basketRepository->findOneByFeUserId((int) $GLOBALS['TSFE']->fe_user->user['uid']); } else { - $GLOBALS['TSFE']->fe_user->setKey('ses', 'tx_dlf_basket', ''); - $GLOBALS['TSFE']->fe_user->sesData_change = true; + $userSession->set('ses', 'tx_dlf_basket', ''); + $userSession->dataWasUpdated(); $GLOBALS['TSFE']->fe_user->storeSessionData(); - $basket = $this->basketRepository->findOneBySessionId($sessionId); + $basket = $this->basketRepository->findOneBySessionId($userSession->getIdentifier()); } // session does not exist if ($basket === null) { // create new basket in db $basket = GeneralUtility::makeInstance(Basket::class); - $basket->setSessionId($sessionId); + $basket->setSessionId($userSession->getIdentifier()); $basket->setFeUserId($userIsLoggedIn ? $GLOBALS['TSFE']->fe_user->user['uid'] : 0); } @@ -300,7 +299,7 @@ protected function getEntry($data) protected function getDocumentData($id, $data) { // get document instance to load further information - $this->loadDocument(['id' => $id]); + $this->loadDocument((int) $id); if ($this->document) { // replace url param placeholder $urlParams = str_replace("##page##", (int) $data['page'], $this->settings['pdfparams']); @@ -395,20 +394,20 @@ protected function addToBasket($_piVars, $basket) $items = []; } // get document instance to load further information - $this->loadDocument(['id' => $documentItem['id']]); + $this->loadDocument((int) $documentItem['id']); if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. return; } // set endpage for toc and subentry based on logid if (($_piVars['addToBasket'] == 'subentry') or ($_piVars['addToBasket'] == 'toc')) { - $smLinks = $this->document->getDoc()->smLinks; + $smLinks = $this->document->getCurrentDocument()->smLinks; $pageCounter = sizeof($smLinks['l2p'][$_piVars['logId']]); $documentItem['endpage'] = ($documentItem['startpage'] + $pageCounter) - 1; } // add whole document if ($_piVars['addToBasket'] == 'list') { - $documentItem['endpage'] = $this->document->getDoc()->numPages; + $documentItem['endpage'] = $this->document->getCurrentDocument()->numPages; } $arrayKey = $documentItem['id'] . '_' . $page; if (!empty($documentItem['startX'])) { diff --git a/Classes/Controller/CalendarController.php b/Classes/Controller/CalendarController.php index 6ddad59c78..7a4639a47a 100644 --- a/Classes/Controller/CalendarController.php +++ b/Classes/Controller/CalendarController.php @@ -14,8 +14,6 @@ use Kitodo\Dlf\Domain\Model\Document; use Kitodo\Dlf\Domain\Repository\StructureRepository; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Utility\GeneralUtility; /** * Controller class for the plugin 'Calendar'. @@ -62,13 +60,13 @@ public function mainAction() } // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ($this->document === null) { // Quit without doing anything if required variables are not set. - return ''; + return; } - $metadata = $this->document->getDoc()->getTitledata(); + $metadata = $this->document->getCurrentDocument()->getTitledata(); if (!empty($metadata['type'][0])) { $type = $metadata['type'][0]; } else { @@ -103,16 +101,16 @@ public function mainAction() public function calendarAction() { // access arguments passed by the mainAction() - $mainrequestData = $this->request->getArguments(); + $mainRequestData = $this->request->getArguments(); // merge both arguments together --> passing id by GET parameter tx_dlf[id] should win - $this->requestData = array_merge($this->requestData, $mainrequestData); + $this->requestData = array_merge($this->requestData, $mainRequestData); // Load current document. - $this->loadDocument($this->requestData); - if ($this->document === null) { + $this->loadDocument(); + if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. - return ''; + return; } $documents = $this->documentRepository->getChildrenOfYearAnchor($this->document->getUid(), $this->structureRepository->findOneByIndexName('issue')); @@ -121,7 +119,7 @@ public function calendarAction() // Process results. if ($documents->count() === 0) { - $toc = $this->document->getDoc()->tableOfContents; + $toc = $this->document->getCurrentDocument()->tableOfContents; foreach ($toc[0]['children'] as $year) { foreach ($year['children'] as $month) { @@ -212,14 +210,14 @@ public function calendarAction() $this->view->assign('issueData', $issueData); // Link to current year. - $linkTitleData = $this->document->getDoc()->getTitledata(); + $linkTitleData = $this->document->getCurrentDocument()->getTitledata(); $yearLinkTitle = !empty($linkTitleData['mets_orderlabel'][0]) ? $linkTitleData['mets_orderlabel'][0] : $linkTitleData['mets_label'][0]; $this->view->assign('calendarData', $calendarData); $this->view->assign('documentId', $this->document->getUid()); $this->view->assign('yearLinkTitle', $yearLinkTitle); - $this->view->assign('parentDocumentId', $this->document->getPartof() ?: $this->document->getDoc()->tableOfContents[0]['points']); - $this->view->assign('allYearDocTitle', $this->document->getDoc()->getTitle($this->document->getPartof()) ?: $this->document->getDoc()->tableOfContents[0]['label']); + $this->view->assign('parentDocumentId', $this->document->getPartof() ?: $this->document->getCurrentDocument()->tableOfContents[0]['points']); + $this->view->assign('allYearDocTitle', $this->document->getCurrentDocument()->getTitle($this->document->getPartof()) ?: $this->document->getCurrentDocument()->tableOfContents[0]['label']); } /** @@ -232,16 +230,16 @@ public function calendarAction() public function yearsAction() { // access arguments passed by the mainAction() - $mainrequestData = $this->request->getArguments(); + $mainRequestData = $this->request->getArguments(); // merge both arguments together --> passing id by GET parameter tx_dlf[id] should win - $this->requestData = array_merge($this->requestData, $mainrequestData); + $this->requestData = array_merge($this->requestData, $mainRequestData); // Load current document. - $this->loadDocument($this->requestData); - if ($this->document === null) { + $this->loadDocument(); + if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. - return ''; + return; } // Get all children of anchor. This should be the year anchor documents @@ -250,7 +248,7 @@ public function yearsAction() $years = []; // Process results. if (count($documents) === 0) { - foreach ($this->document->getDoc()->tableOfContents[0]['children'] as $id => $year) { + foreach ($this->document->getCurrentDocument()->tableOfContents[0]['children'] as $id => $year) { $yearLabel = empty($year['label']) ? $year['orderlabel'] : $year['label']; if (empty($yearLabel)) { @@ -304,7 +302,7 @@ public function yearsAction() } $this->view->assign('documentId', $this->document->getUid()); - $this->view->assign('allYearDocTitle', $this->document->getDoc()->getTitle($this->document->getUid())); + $this->view->assign('allYearDocTitle', $this->document->getCurrentDocument()->getTitle($this->document->getUid())); } /** diff --git a/Classes/Controller/CollectionController.php b/Classes/Controller/CollectionController.php index 707458dbd3..3fa41d0161 100644 --- a/Classes/Controller/CollectionController.php +++ b/Classes/Controller/CollectionController.php @@ -11,11 +11,7 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; -use Kitodo\Dlf\Domain\Model\Collection; -use Kitodo\Dlf\Domain\Model\Document; -use Kitodo\Dlf\Domain\Model\Metadata; +use Kitodo\Dlf\Common\Solr\Solr; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use Kitodo\Dlf\Domain\Repository\CollectionRepository; @@ -164,9 +160,9 @@ public function showAction(\Kitodo\Dlf\Domain\Model\Collection $collection) } // Pagination of Results: Pass the currentPage to the fluid template to calculate current index of search result. - $widgetPage = $this->getParametersSafely('@widget_0'); - if (empty($widgetPage)) { - $widgetPage = ['currentPage' => 1]; + $currentPage = $this->getParametersSafely('page'); + if (empty($currentPage)) { + $currentPage = 1; } $searchParams['collection'] = $collection; @@ -175,7 +171,7 @@ public function showAction(\Kitodo\Dlf\Domain\Model\Collection $collection) $this->redirect('main', 'ListView', null, [ 'searchParameter' => $searchParams, - 'widgetPage' => $widgetPage + 'page' => $currentPage ], $this->settings['targetPid'] ); } @@ -192,7 +188,7 @@ public function showAction(\Kitodo\Dlf\Domain\Model\Collection $collection) $this->view->assign('viewData', $this->viewData); $this->view->assign('documents', $solrResults); $this->view->assign('collection', $collection); - $this->view->assign('widgetPage', $widgetPage); + $this->view->assign('page', $currentPage); $this->view->assign('lastSearch', $searchParams); $this->view->assign('sortableMetadata', $sortableMetadata); $this->view->assign('listedMetadata', $listedMetadata); diff --git a/Classes/Controller/FeedsController.php b/Classes/Controller/FeedsController.php index 83742864af..684f842d20 100644 --- a/Classes/Controller/FeedsController.php +++ b/Classes/Controller/FeedsController.php @@ -11,7 +11,7 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Domain\Repository\LibraryRepository; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -89,7 +89,7 @@ public function mainAction() if ((empty($document->getTitle()) || !empty($this->settings['prependSuperiorTitle'])) && !empty($document->getPartof()) ) { - $superiorTitle = Doc::getTitle($document->getPartof(), true); + $superiorTitle = AbstractDocument::getTitle($document->getPartof(), true); if (!empty($superiorTitle)) { $title .= '[' . $superiorTitle . ']'; } diff --git a/Classes/Controller/ListViewController.php b/Classes/Controller/ListViewController.php index 403419fa24..2f31436bd4 100644 --- a/Classes/Controller/ListViewController.php +++ b/Classes/Controller/ListViewController.php @@ -11,10 +11,8 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Domain\Model\Collection; -use Kitodo\Dlf\Domain\Model\Metadata; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\MathUtility; +use Kitodo\Dlf\Common\SolrPaginator; +use TYPO3\CMS\Core\Pagination\SimplePagination; use Kitodo\Dlf\Domain\Repository\MetadataRepository; use Kitodo\Dlf\Domain\Repository\CollectionRepository; @@ -80,9 +78,10 @@ public function mainAction() } } - $widgetPage = $this->getParametersSafely('@widget_0'); - if (empty($widgetPage)) { - $widgetPage = ['currentPage' => 1]; + // Get current page from request data because the parameter is shared between plugins + $currentPage = $this->requestData['page']; + if (empty($currentPage)) { + $currentPage = 1; } $GLOBALS['TSFE']->fe_user->setKey('ses', 'widgetPage', $widgetPage); @@ -92,17 +91,27 @@ public function mainAction() // get all metadata records to be shown in results $listedMetadata = $this->metadataRepository->findByIsListed(true); - $solrResults = []; + $solrResults = null; $numResults = 0; if (is_array($this->searchParams) && !empty($this->searchParams)) { $solrResults = $this->documentRepository->findSolrByCollection($collection ? : null, $this->settings, $this->searchParams, $listedMetadata); $numResults = $solrResults->getNumFound(); + + $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; + if (empty($itemsPerPage)) { + $itemsPerPage = 25; + } + $solrPaginator = new SolrPaginator($solrResults, $currentPage, $itemsPerPage); + $simplePagination = new SimplePagination($solrPaginator); + + $pagination = $this->buildSimplePagination($simplePagination, $solrPaginator); + $this->view->assignMultiple([ 'pagination' => $pagination, 'paginator' => $solrPaginator ]); } $this->view->assign('viewData', $this->viewData); $this->view->assign('documents', $solrResults); $this->view->assign('numResults', $numResults); - $this->view->assign('widgetPage', $widgetPage); + $this->view->assign('page', $currentPage); $this->view->assign('lastSearch', $this->searchParams); $this->view->assign('sortableMetadata', $sortableMetadata); diff --git a/Classes/Controller/MetadataController.php b/Classes/Controller/MetadataController.php index 79304c8d09..7cb6c27ab2 100644 --- a/Classes/Controller/MetadataController.php +++ b/Classes/Controller/MetadataController.php @@ -11,11 +11,9 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\IiifManifest; -use Kitodo\Dlf\Domain\Model\Collection; -use Kitodo\Dlf\Domain\Model\Metadata; use Kitodo\Dlf\Domain\Repository\CollectionRepository; use Kitodo\Dlf\Domain\Repository\MetadataRepository; use Kitodo\Dlf\Domain\Repository\StructureRepository; @@ -31,6 +29,11 @@ */ class MetadataController extends AbstractController { + /** + * @var Doc + */ + private $doc; + /** * @var CollectionRepository */ @@ -71,46 +74,37 @@ public function injectStructureRepository(StructureRepository $structureReposito } /** - * @return string|void + * @return void */ public function mainAction() { - $this->cObj = $this->configurationManager->getContentObject(); - // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. - return ''; + return; } else { // Set default values if not set. - if (!isset($this->settings['rootline'])) { - $this->settings['rootline'] = 0; - } - if (!isset($this->settings['originalIiifMetadata'])) { - $this->settings['originalIiifMetadata'] = 0; - } - if (!isset($this->settings['displayIiifDescription'])) { - $this->settings['displayIiifDescription'] = 1; - } - if (!isset($this->settings['displayIiifRights'])) { - $this->settings['displayIiifRights'] = 1; - } - if (!isset($this->settings['displayIiifLinks'])) { - $this->settings['displayIiifLinks'] = 1; - } + $this->setDefault('rootline', 0); + $this->setDefault('originalIiifMetadata', 0); + $this->setDefault('displayIiifDescription', 1); + $this->setDefault('displayIiifRights', 1); + $this->setDefault('displayIiifLinks', 1); } - $useOriginalIiifManifestMetadata = $this->settings['originalIiifMetadata'] == 1 && $this->document->getDoc() instanceof IiifManifest; + + $this->doc = $this->document->getCurrentDocument(); + + $useOriginalIiifManifestMetadata = $this->settings['originalIiifMetadata'] == 1 && $this->doc instanceof IiifManifest; $metadata = $this->getMetadata(); // Get titledata? - if (empty($metadata) || ($this->settings['rootline'] == 1 && $metadata[0]['_id'] != $this->document->getDoc()->toplevelId)) { - $data = $useOriginalIiifManifestMetadata ? $this->document->getDoc()->getManifestMetadata($this->document->getDoc()->toplevelId, $this->settings['storagePid']) : $this->document->getDoc()->getTitledata($this->settings['storagePid']); - $data['_id'] = $this->document->getDoc()->toplevelId; + if (empty($metadata) || ($this->settings['rootline'] == 1 && $metadata[0]['_id'] != $this->doc->toplevelId)) { + $data = $useOriginalIiifManifestMetadata ? $this->doc->getManifestMetadata($this->doc->toplevelId, $this->settings['storagePid']) : $this->doc->getTitledata($this->settings['storagePid']); + $data['_id'] = $this->doc->toplevelId; array_unshift($metadata, $data); } if (empty($metadata)) { $this->logger->warning('No metadata found for document with UID ' . $this->document->getUid()); - return ''; + return; } ksort($metadata); @@ -130,140 +124,21 @@ public function mainAction() protected function printMetadata(array $metadata, $useOriginalIiifManifestMetadata = false) { if ($useOriginalIiifManifestMetadata) { - $iiifData = []; - foreach ($metadata as $row) { - foreach ($row as $key => $group) { - if ($key == '_id') { - continue; - } - if (!is_array($group)) { - if ( - IRI::isAbsoluteIri($group) - && (($scheme = (new IRI($group))->getScheme()) == 'http' || $scheme == 'https') - ) { - // Build link - $iiifData[$key] = [ - 'label' => $key, - 'value' => $group, - 'buildUrl' => true, - ]; - } else { - // Data output - $iiifData[$key] = [ - 'label' => $key, - 'value' => $group, - 'buildUrl' => false, - ]; - } - } else { - foreach ($group as $label => $value) { - if ($label == '_id') { - continue; - } - if (is_array($value)) { - $value = implode($this->settings['separator'], $value); - } - // NOTE: Labels are to be escaped in Fluid template - if (IRI::isAbsoluteIri($value) && (($scheme = (new IRI($value))->getScheme()) == 'http' || $scheme == 'https')) { - $nolabel = $value == $label; - $iiifData[$key]['data'][] = [ - 'label' => $nolabel ? '' : $label, - 'value' => $value, - 'buildUrl' => true, - ]; - } else { - $iiifData[$key]['data'][] = [ - 'label' => $label, - 'value' => $value, - 'buildUrl' => false, - ]; - } - } - } - $this->view->assign('useIiif', true); - $this->view->assign('iiifData', $iiifData); - } - } + $iiifData = $this->buildIiifData($metadata); + $this->view->assign('useIiif', true); + $this->view->assign('iiifData', $iiifData); } else { // findBySettings also sorts entries by the `sorting` field $metadataResult = $this->metadataRepository->findBySettings([ 'is_listed' => !$this->settings['showFull'], ]); - // Collect raw metadata into an array that will be passed as data to cObj. - // This lets metadata wraps reference (own or foreign) values via TypoScript "field". - $metaCObjData = []; - - $buildUrl = []; - $externalUrl = []; - $i = 0; - foreach ($metadata as $section) { - $metaCObjData[$i] = []; + foreach ($metadata as $i => $section) { foreach ($section as $name => $value) { // NOTE: Labels are to be escaped in Fluid template - $metaCObjData[$i][$name] = is_array($value) - ? implode($this->settings['separator'], $value) - : $value; - - if ($name == 'title') { - // Get title of parent document if needed. - if (empty(implode('', $value)) && $this->settings['getTitle'] && $this->document->getPartof()) { - $superiorTitle = Doc::getTitle($this->document->getPartof(), true); - if (!empty($superiorTitle)) { - $metadata[$i][$name] = ['[' . $superiorTitle . ']']; - } - } - if (!empty($value)) { - $metadata[$i][$name][0] = $metadata[$i][$name][0]; - // Link title to pageview. - if ($this->settings['linkTitle'] && $section['_id']) { - $details = $this->document->getDoc()->getLogicalStructure($section['_id']); - $buildUrl[$i][$name]['buildUrl'] = [ - 'id' => $this->document->getUid(), - 'page' => (!empty($details['points']) ? intval($details['points']) : 1), - 'targetPid' => (!empty($this->settings['targetPid']) ? $this->settings['targetPid'] : 0), - ]; - } - } - } elseif (($name == 'author' || $name == 'holder') && !empty($value) && !empty($value[0]['url'])) { - $externalUrl[$i][$name]['externalUrl'] = $value[0]; - } elseif (($name == 'geonames' || $name == 'wikidata' || $name == 'wikipedia') && !empty($value)) { - $externalUrl[$i][$name]['externalUrl'] = [ - 'name' => $value[0], - 'url' => $value[0] - ]; - } elseif ($name == 'owner' && empty($value)) { - // no owner is found by metadata records --> take the one associated to the document - $library = $this->document->getOwner(); - if ($library) { - $metadata[$i][$name][0] = $library->getLabel(); - } - } elseif ($name == 'type' && !empty($value)) { - // Translate document type. - $structure = $this->structureRepository->findOneByIndexName($metadata[$i][$name][0]); - if ($structure) { - $metadata[$i][$name][0] = $structure->getLabel(); - } - } elseif ($name == 'collection' && !empty($value)) { - // Check if collections isn't hidden. - $j = 0; - foreach ($value as $entry) { - $collection = $this->collectionRepository->findOneByIndexName($entry); - if ($collection) { - $metadata[$i][$name][$j] = $collection->getLabel() ? : ''; - $j++; - } - } - } elseif ($name == 'language' && !empty($value)) { - // Translate ISO 639 language code. - foreach ($metadata[$i][$name] as &$langValue) { - $langValue = Helper::getLanguageName($langValue); - } - } elseif (!empty($value)) { - $metadata[$i][$name][0] = $metadata[$i][$name][0]; - } + $this->parseMetadata($i, $name, $value, $metadata); if (is_array($metadata[$i][$name])) { $metadata[$i][$name] = array_values(array_filter($metadata[$i][$name], function($metadataValue) @@ -272,15 +147,215 @@ protected function printMetadata(array $metadata, $useOriginalIiifManifestMetada })); } } - $i++; } - $this->view->assign('buildUrl', $buildUrl); - $this->view->assign('externalUrl', $externalUrl); + $this->view->assign('buildUrl', $this->buildUrlFromMetadata($metadata)); + $this->view->assign('externalUrl', $this->buildExternalUrlFromMetadata($metadata)); $this->view->assign('documentMetadataSections', $metadata); $this->view->assign('configMetadata', $metadataResult); $this->view->assign('separator', $this->settings['separator']); - $this->view->assign('metaCObjData', $metaCObjData); + $this->view->assign('metaCObjData', $this->buildMetaCObjData($metadata)); + } + } + + /** + * Builds the IIIF data array from metadata array + * + * @access private + * + * @param array $metadata The metadata array + * + * @return array The IIIF data array ready for output + */ + private function buildIiifData(array $metadata): array + { + $iiifData = []; + + foreach ($metadata as $row) { + foreach ($row as $key => $group) { + if ($key == '_id') { + continue; + } + + if (!is_array($group)) { + $iiifData[$key] = $this->buildIiifDataGroup($key, $group); + } else { + foreach ($group as $label => $value) { + if ($label == '_id') { + continue; + } + if (is_array($value)) { + $value = implode($this->settings['separator'], $value); + } + + $iiifData[$key]['data'][] = $this->buildIiifDataGroup($label, $value); + } + } + } + } + + return $iiifData; + } + + /** + * Builds the IIIF data array from label and value + * + * @access private + * + * @param string $label The label string + * @param string $value The value string + * + * @return array The IIIF data array ready for output + */ + private function buildIiifDataGroup(string $label, string $value): array + { + // NOTE: Labels are to be escaped in Fluid template + if (IRI::isAbsoluteIri($value) && ($scheme = (new IRI($value))->getScheme()) == 'http' || $scheme == 'https') { + //TODO: should really label be converted to empty string if equal to value? + $label = $value == $label ? '' : $label; + $buildUrl = true; + } else { + $buildUrl = false; + } + + return [ + 'label' => $label, + 'value' => $value, + 'buildUrl' => $buildUrl, + ]; + } + + /** + * Collects raw metadata into an array that will be passed as data to cObj. + * This lets metadata wraps reference (own or foreign) values via TypoScript "field". + * + * @access private + * + * @param array $metadata The metadata array + * + * @return array The raw metadata array ready for output + */ + private function buildMetaCObjData(array $metadata) + { + $metaCObjData = []; + + foreach ($metadata as $i => $section) { + $metaCObjData[$i] = []; + + foreach ($section as $name => $value) { + $metaCObjData[$i][$name] = is_array($value) + ? implode($this->settings['separator'], $value) + : $value; + } + } + + return $metaCObjData; + } + + /** + * Builds URLs array for given metadata array. + * + * @access private + * + * @param array $metadata The metadata array + * + * @return array URLs + */ + private function buildUrlFromMetadata(array $metadata) + { + $buildUrl = []; + + foreach ($metadata as $i => $section) { + if ($this->settings['linkTitle'] && $section['_id'] && isset($section['title']) && !empty($section['title'])) { + $details = $this->doc->getLogicalStructure($section['_id']); + $buildUrl[$i]['title'] = [ + 'id' => $this->document->getUid(), + 'page' => (!empty($details['points']) ? intval($details['points']) : 1), + 'targetPid' => (!empty($this->settings['targetPid']) ? $this->settings['targetPid'] : 0), + ]; + } + } + + return $buildUrl; + } + + /** + * Builds external URLs array for given metadata array. + * + * @access private + * + * @param array $metadata The metadata array + * + * @return array external URLs + */ + private function buildExternalUrlFromMetadata(array $metadata) + { + $externalUrl = []; + + foreach ($metadata as $i => $section) { + foreach ($section as $name => $value) { + if (($name == 'author' || $name == 'holder') && !empty($value) && !empty($value[0]['url'])) { + $externalUrl[$i][$name]['externalUrl'] = $value[0]; + } elseif (($name == 'geonames' || $name == 'wikidata' || $name == 'wikipedia') && !empty($value)) { + $externalUrl[$i][$name]['externalUrl'] = [ + 'name' => $value[0], + 'url' => $value[0] + ]; + } + } + } + + return $externalUrl; + } + + /** + * Parses metadata. + * + * @access private + * + * @param int $i The index of metadata array + * @param string $name The name of section in metadata array + * @param mixed $value The value of section in metadata array + * @param array $metadata The metadata array passed as reference + * + * @return void + */ + private function parseMetadata(int $i, string $name, $value, array &$metadata) : void { + if ($name == 'title') { + // Get title of parent document if needed. + if (empty(implode('', $value)) && $this->settings['getTitle'] && $this->document->getPartof()) { + $superiorTitle = AbstractDocument::getTitle($this->document->getPartof(), true); + if (!empty($superiorTitle)) { + $metadata[$i][$name] = ['[' . $superiorTitle . ']']; + } + } + } elseif ($name == 'owner' && empty($value)) { + // no owner is found by metadata records --> take the one associated to the document + $library = $this->document->getOwner(); + if ($library) { + $metadata[$i][$name][0] = $library->getLabel(); + } + } elseif ($name == 'type' && !empty($value)) { + // Translate document type. + $structure = $this->structureRepository->findOneByIndexName($metadata[$i][$name][0]); + if ($structure) { + $metadata[$i][$name][0] = $structure->getLabel(); + } + } elseif ($name == 'collection' && !empty($value)) { + // Check if collections isn't hidden. + $j = 0; + foreach ($value as $entry) { + $collection = $this->collectionRepository->findOneByIndexName($entry); + if ($collection) { + $metadata[$i][$name][$j] = $collection->getLabel() ? : ''; + $j++; + } + } + } elseif ($name == 'language' && !empty($value)) { + // Translate ISO 639 language code. + foreach ($metadata[$i][$name] as &$langValue) { + $langValue = Helper::getLanguageName($langValue); + } } } @@ -297,9 +372,9 @@ private function getMetadata() if ($this->settings['rootline'] < 2) { // Get current structure's @ID. $ids = []; - if (!empty($this->document->getDoc()->physicalStructure[$this->requestData['page']]) && !empty($this->document->getDoc()->smLinks['p2l'][$this->document->getDoc()->physicalStructure[$this->requestData['page']]])) { - foreach ($this->document->getDoc()->smLinks['p2l'][$this->document->getDoc()->physicalStructure[$this->requestData['page']]] as $logId) { - $count = $this->document->getDoc()->getStructureDepth($logId); + if (!empty($this->doc->physicalStructure[$this->requestData['page']]) && !empty($this->doc->smLinks['p2l'][$this->doc->physicalStructure[$this->requestData['page']]])) { + foreach ($this->doc->smLinks['p2l'][$this->doc->physicalStructure[$this->requestData['page']]] as $logId) { + $count = $this->doc->getStructureDepth($logId); $ids[$count][] = $logId; } } @@ -332,12 +407,12 @@ private function getMetadata() */ private function getMetadataForIds($id, $metadata) { - $useOriginalIiifManifestMetadata = $this->settings['originalIiifMetadata'] == 1 && $this->document->getDoc() instanceof IiifManifest; + $useOriginalIiifManifestMetadata = $this->settings['originalIiifMetadata'] == 1 && $this->doc instanceof IiifManifest; foreach ($id as $sid) { if ($useOriginalIiifManifestMetadata) { - $data = $this->document->getDoc()->getManifestMetadata($sid, $this->settings['storagePid']); + $data = $this->doc->getManifestMetadata($sid, $this->settings['storagePid']); } else { - $data = $this->document->getDoc()->getMetadata($sid, $this->settings['storagePid']); + $data = $this->doc->getMetadata($sid, $this->settings['storagePid']); } if (!empty($data)) { $data['_id'] = $sid; @@ -346,4 +421,20 @@ private function getMetadataForIds($id, $metadata) } return $metadata; } + + /** + * Sets default value for setting if not yet set. + * + * @access private + * + * @param string $setting name of setting + * @param int $value 0 or 1 + * + * @return void + */ + private function setDefault($setting, $value) { + if (!isset($this->settings[$setting])) { + $this->settings[$setting] = $value; + } + } } diff --git a/Classes/Controller/NavigationController.php b/Classes/Controller/NavigationController.php index 0664fe3033..8718e72fb8 100644 --- a/Classes/Controller/NavigationController.php +++ b/Classes/Controller/NavigationController.php @@ -11,8 +11,6 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Helper; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; /** @@ -32,8 +30,7 @@ class NavigationController extends AbstractController */ public function pageSelectAction(\Kitodo\Dlf\Domain\Model\PageSelectForm $pageSelectForm = NULL) { if ($pageSelectForm) { - $uriBuilder = $this->getControllerContext()->getUriBuilder(); - $uri = $uriBuilder->reset() + $uri = $this->uriBuilder->reset() ->setArguments( [ 'tx_dlf' => [ @@ -56,40 +53,25 @@ public function pageSelectAction(\Kitodo\Dlf\Domain\Model\PageSelectForm $pageSe public function mainAction() { // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. - return ''; + return; + } + + // Set default values if not set. + if ($this->document->getCurrentDocument()->numPages > 0) { + $this->setPage(); } else { - // Set default values if not set. - if ($this->document->getDoc()->numPages > 0) { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); - } else { - $this->requestData['page'] = 0; - $this->requestData['double'] = 0; - } + $this->requestData['page'] = 0; + $this->requestData['double'] = 0; } // Steps for X pages backward / forward. Double page view uses double steps. $pageSteps = $this->settings['pageStep'] * ($this->requestData['double'] + 1); $this->view->assign('pageSteps', $pageSteps); - $this->view->assign('numPages', $this->document->getDoc()->numPages); + $this->view->assign('numPages', $this->document->getCurrentDocument()->numPages); $this->view->assign('viewData', $this->viewData); if ($GLOBALS['TSFE']->fe_user->getKey('ses', 'search')) { @@ -113,8 +95,9 @@ public function mainAction() } $pageOptions = []; - for ($i = 1; $i <= $this->document->getDoc()->numPages; $i++) { - $pageOptions[$i] = '[' . $i . ']' . ($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$i]]['orderlabel'] ? ' - ' . htmlspecialchars($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$i]]['orderlabel']) : ''); + for ($i = 1; $i <= $this->document->getCurrentDocument()->numPages; $i++) { + $orderLabel = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$i]]['orderlabel']; + $pageOptions[$i] = '[' . $i . ']' . ($orderLabel ? ' - ' . htmlspecialchars($orderLabel) : ''); } $this->view->assign('pageOptions', $pageOptions); diff --git a/Classes/Controller/OaiPmhController.php b/Classes/Controller/OaiPmhController.php index 49ad0b9ae6..224ecbbdb2 100644 --- a/Classes/Controller/OaiPmhController.php +++ b/Classes/Controller/OaiPmhController.php @@ -12,7 +12,7 @@ namespace Kitodo\Dlf\Controller; use TYPO3\CMS\Core\Utility\GeneralUtility; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Domain\Model\Token; use Kitodo\Dlf\Domain\Repository\CollectionRepository; use Kitodo\Dlf\Domain\Repository\LibraryRepository; @@ -587,7 +587,7 @@ protected function fetchDocumentUIDs() $result = $this->collectionRepository->getIndexNameForSolr($this->settings, $this->parameters['set']); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { if ($resArray['index_query'] != "") { $solr_query .= '(' . $resArray['index_query'] . ')'; } else { @@ -699,7 +699,7 @@ protected function generateOutputForDocumentList(array $documentListSet) $documents = $this->documentRepository->getOaiDocumentList($this->settings, $documentsToProcess); $records = []; - while ($resArray = $documents->fetch()) { + while ($resArray = $documents->fetchAssociative()) { // we need the collections as array later $resArray['collections'] = explode(' ', $resArray['collections']); diff --git a/Classes/Controller/PageGridController.php b/Classes/Controller/PageGridController.php index 4b58281ad6..3253c97c78 100644 --- a/Classes/Controller/PageGridController.php +++ b/Classes/Controller/PageGridController.php @@ -11,6 +11,10 @@ namespace Kitodo\Dlf\Controller; +use TYPO3\CMS\Core\Pagination\ArrayPaginator; +use Kitodo\Dlf\Pagination\PageGridPagination; +use Kitodo\Dlf\Pagination\PageGridPaginator; +use TYPO3\CMS\Core\Pagination\SimplePagination; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @@ -31,18 +35,18 @@ class PageGridController extends AbstractController */ public function mainAction() { - $this->loadDocument($this->requestData); + $this->loadDocument(); if ( $this->isDocMissingOrEmpty() || empty($this->extConf['fileGrpThumbs']) ) { // Quit without doing anything if required variables are not set. - return ''; + return; } $entryArray = []; - $numPages = $this->document->getDoc()->numPages; + $numPages = $this->document->getCurrentDocument()->numPages; // Iterate through visible page set and display thumbnails. for ($i = 1; $i <= $numPages; $i++) { $foundEntry = $this->getEntry($i, $this->extConf['fileGrpThumbs']); @@ -50,7 +54,23 @@ public function mainAction() $entryArray[] = $foundEntry; } - $this->view->assign('pageGridEntries', $entryArray); + // Get current page from request data because the parameter is shared between plugins + $currentPage = $this->requestData['page']; + if (empty($currentPage)) { + $currentPage = 1; + } + + $itemsPerPage = $this->settings['paginate']['itemsPerPage']; + if (empty($itemsPerPage)) { + $itemsPerPage = 25; + } + + $pageGridPaginator = new PageGridPaginator($entryArray, $currentPage, $itemsPerPage); + $pageGridPagination = new PageGridPagination($pageGridPaginator); + + $pagination = $this->buildSimplePagination($pageGridPagination, $pageGridPaginator); + $this->view->assignMultiple([ 'pagination' => $pagination, 'paginator' => $pageGridPaginator ]); + $this->view->assign('docUid', $this->requestData['id']); } @@ -67,17 +87,17 @@ public function mainAction() protected function getEntry($number, $fileGrpThumbs) { // Set pagination. - $entry['pagination'] = htmlspecialchars($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$number]]['orderlabel']); + $entry['pagination'] = htmlspecialchars($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$number]]['orderlabel']); $entry['page'] = $number; $entry['thumbnail'] = ''; // Get thumbnail or placeholder. $fileGrpsThumb = GeneralUtility::trimExplode(',', $fileGrpThumbs); - if (is_array($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$number]]['files'])) { - if (array_intersect($fileGrpsThumb, array_keys($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$number]]['files'])) !== []) { + if (is_array($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$number]]['files'])) { + if (array_intersect($fileGrpsThumb, array_keys($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$number]]['files'])) !== []) { while ($fileGrpThumb = array_shift($fileGrpsThumb)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$number]]['files'][$fileGrpThumb])) { - $entry['thumbnail'] = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$number]]['files'][$fileGrpThumb]); + if (!empty($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$number]]['files'][$fileGrpThumb])) { + $entry['thumbnail'] = $this->document->getCurrentDocument()->getFileLocation($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$number]]['files'][$fileGrpThumb]); break; } } diff --git a/Classes/Controller/PageViewController.php b/Classes/Controller/PageViewController.php index 8d34fe44ca..f0f2adc130 100644 --- a/Classes/Controller/PageViewController.php +++ b/Classes/Controller/PageViewController.php @@ -18,7 +18,6 @@ use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Core\Database\Connection; use Ubl\Iiif\Presentation\Common\Model\Resources\ManifestInterface; use Ubl\Iiif\Presentation\Common\Vocabulary\Motivation; @@ -79,7 +78,7 @@ class PageViewController extends AbstractController public function mainAction() { // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); $this->parseOCRengines(GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf')['ocrEngines']."/".GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf')['ocrEnginesConfig']); $this->clearPageCache(); //Proccess request: Do OCR on given image(s): @@ -89,27 +88,16 @@ public function mainAction() if ($this->isDocMissingOrEmpty()) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ((int) $this->requestData['page'] > 0 || empty($this->requestData['page'])) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); + return; } + + $this->setPage(); + // Get image data. $this->images[0] = $this->getImage($this->requestData['page']); $this->fulltexts[0] = $this->getFulltext($this->requestData['page']); $this->annotationContainers[0] = $this->getAnnotationContainers($this->requestData['page']); - if ($this->requestData['double'] && $this->requestData['page'] < $this->document->getDoc()->numPages) { + if ($this->requestData['double'] && $this->requestData['page'] < $this->document->getCurrentDocument()->numPages) { $this->images[1] = $this->getImage($this->requestData['page'] + 1); $this->fulltexts[1] = $this->getFulltext($this->requestData['page'] + 1); $this->annotationContainers[1] = $this->getAnnotationContainers($this->requestData['page'] + 1); @@ -144,23 +132,13 @@ protected function getFulltext($page) while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { //check if and where fulltext is present: - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpFulltext])) { //fulltext is remote present - $fulltext['url'] = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpFulltext]); + $fileGroupFulltext = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$page]]['files'][$fileGrpFulltext]; + if (!empty($fileGroupFulltext)) { //fulltext is remote present + $fulltext['url'] = $this->document->getCurrentDocument()->getFileLocation($fileGroupFulltext); if ($this->settings['useInternalProxy']) { - // Configure @action URL for form. - $uri = $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri(!empty($this->settings['forceAbsoluteUrl']) ? true : false) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $fulltext['url'], - 'uHash' => GeneralUtility::hmac($fulltext['url'], 'PageViewProxy') - ]) - ->build(); - - $fulltext['url'] = $uri; + $this->configureProxyUrl($fulltext['url']); } - $fulltext['mimetype'] = $this->document->getDoc()->getFileMimeType($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpFulltext]); + $fulltext['mimetype'] = $this->document->getCurrentDocument()->getFileMimeType($fileGroupFulltext); break; } else if (FullTextGenerator::checkLocal(Doc::$extKey, $this->document, $page)) { //fulltext is locally present //check server protocol (https://stackoverflow.com/a/14270161): @@ -219,9 +197,9 @@ protected function addViewerJS() */ protected function getAnnotationContainers($page) { - if ($this->document->getDoc() instanceof IiifManifest) { - $canvasId = $this->document->getDoc()->physicalStructure[$page]; - $iiif = $this->document->getDoc()->getIiif(); + if ($this->document->getCurrentDocument() instanceof IiifManifest) { + $canvasId = $this->document->getCurrentDocument()->physicalStructure[$page]; + $iiif = $this->document->getCurrentDocument()->getIiif(); if ($iiif instanceof ManifestInterface) { $canvas = $iiif->getContainedResourceById($canvasId); /* @var $canvas \Ubl\Iiif\Presentation\Common\Model\Resources\CanvasInterface */ @@ -281,24 +259,15 @@ protected function getImage($page) $fileGrpsImages = GeneralUtility::trimExplode(',', $this->extConf['fileGrpImages']); while ($fileGrpImages = array_pop($fileGrpsImages)) { // Get image link. - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpImages])) { - $image['url'] = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpImages]); - $image['mimetype'] = $this->document->getDoc()->getFileMimeType($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrpImages]); + $fileGroupImage = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$page]]['files'][$fileGrpImages]; + if (!empty($fileGroupImage)) { + $image['url'] = $this->document->getCurrentDocument()->getFileLocation($fileGroupImage); + $image['mimetype'] = $this->document->getCurrentDocument()->getFileMimeType($fileGroupImage); // Only deliver static images via the internal PageViewProxy. // (For IIP and IIIF, the viewer needs to build and access a separate metadata URL, see `getMetdadataURL` in `OLSources.js`.) if ($this->settings['useInternalProxy'] && !str_contains(strtolower($image['mimetype']), 'application')) { - // Configure @action URL for form. - $uri = $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri(!empty($this->settings['forceAbsoluteUrl']) ? true : false) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $image['url'], - 'uHash' => GeneralUtility::hmac($image['url'], 'PageViewProxy') - ]) - ->build(); - $image['url'] = $uri; + $this->configureProxyUrl($image['url']); } break; } else { diff --git a/Classes/Controller/SearchController.php b/Classes/Controller/SearchController.php index bb0e8100e6..f94ba0a3f4 100644 --- a/Classes/Controller/SearchController.php +++ b/Classes/Controller/SearchController.php @@ -1,4 +1,5 @@ * @@ -13,8 +14,7 @@ use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\Indexer; -use Kitodo\Dlf\Common\Solr; -use TYPO3\CMS\Extbase\Utility\LocalizationUtility; +use Kitodo\Dlf\Common\Solr\Solr; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -102,36 +102,39 @@ public function mainAction() $listRequestData = GeneralUtility::_GPmerged('tx_dlf_listview'); if (isset($listRequestData['searchParameter']) && is_array($listRequestData['searchParameter'])) { - $this->searchParams = array_merge($this->searchParams ? : [], $listRequestData['searchParameter']); + $this->searchParams = array_merge($this->searchParams ?: [], $listRequestData['searchParameter']); $listViewSearch = true; $GLOBALS['TSFE']->fe_user->setKey('ses', 'search', $this->searchParams); } // sanitize date search input - if(empty($this->searchParams['dateFrom']) && !empty($this->searchParams['dateTo'])) { + if (empty($this->searchParams['dateFrom']) && !empty($this->searchParams['dateTo'])) { $this->searchParams['dateFrom'] = '*'; } - if(empty($this->searchParams['dateTo']) && !empty($this->searchParams['dateFrom'])) { + if (empty($this->searchParams['dateTo']) && !empty($this->searchParams['dateFrom'])) { $this->searchParams['dateTo'] = 'NOW'; } - if($this->searchParams['dateFrom'] > $this->searchParams['dateTo']) { + if ($this->searchParams['dateFrom'] > $this->searchParams['dateTo']) { $tmpDate = $this->searchParams['dateFrom']; $this->searchParams['dateFrom'] = $this->searchParams['dateTo']; $this->searchParams['dateTo'] = $tmpDate; } // Pagination of Results: Pass the currentPage to the fluid template to calculate current index of search result. - $widgetPage = $this->getParametersSafely('@widget_0'); - if (empty($widgetPage)) { - $widgetPage = ['currentPage' => 1]; + $currentPage = $this->getParametersSafely('page'); + if (empty($currentPage)) { + $currentPage = 1; } // If a targetPid is given, the results will be shown by ListView on the target page. if (!empty($this->settings['targetPid']) && !empty($this->searchParams) && !$listViewSearch) { - $this->redirect('main', 'ListView', null, + $this->redirect( + 'main', + 'ListView', + null, [ 'searchParameter' => $this->searchParams, - 'widgetPage' => $widgetPage + 'page' => $currentPage ], $this->settings['targetPid'] ); } @@ -144,7 +147,7 @@ public function mainAction() // get all metadata records to be shown in results $listedMetadata = $this->metadataRepository->findByIsListed(true); - $solrResults = []; + $solrResults = null; $numResults = 0; // Do not execute the Solr search if used together with ListView plugin. if (!$listViewSearch) { @@ -152,16 +155,15 @@ public function mainAction() $numResults = $solrResults->getNumFound(); } - $this->view->assign('documents', $solrResults); + $this->view->assign('documents', !empty($solrResults) ? $solrResults : []); $this->view->assign('numResults', $numResults); - $this->view->assign('widgetPage', $widgetPage); + $this->view->assign('page', $currentPage); $this->view->assign('lastSearch', $this->searchParams); $this->view->assign('listedMetadata', $listedMetadata); $this->view->assign('sortableMetadata', $sortableMetadata); // Add the facets menu $this->addFacetsMenu(); - } // Get additional fields for extended search. @@ -192,7 +194,7 @@ protected function addFacetsMenu() { // Quit without doing anything if no facets are configured. if (empty($this->settings['facets']) && empty($this->settings['facetCollections'])) { - return ''; + return; } // Get facets from plugin configuration. @@ -216,7 +218,6 @@ protected function addFacetsMenu() */ public function makeFacetsMenuArray($facets) { - $menuArray = []; // Set default value for facet search. $search = [ 'query' => '*:*', @@ -255,44 +256,9 @@ public function makeFacetsMenuArray($facets) } } - // if collections are given, we prepare the collection query string - // extract collections from collection parameter - $collection = null; - if ($this->searchParams['collection']) { - foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) { - $collection[] = $this->collectionRepository->findByUid($collectionEntry); - } - - } - if ($collection) { - $collectionsQueryString = ''; - $virtualCollectionsQueryString = ''; - foreach ($collection as $collectionEntry) { - // check for virtual collections query string - if($collectionEntry->getIndexSearch()) { - $virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR ('. $collectionEntry->getIndexSearch() . ')' ; - } - else { - $collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"'; - } - } - - // distinguish between simple collection browsing and actual searching within the collection(s) - if(!empty($collectionsQueryString)) { - if(empty($searchParams['query'])) { - $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)'; - } else { - $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))'; - } - } - - // virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separatly - if(!empty($virtualCollectionsQueryString)) { - $virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')'; - } - - // combine both querystrings into a single filterquery via OR if both are given, otherwise pass either of those - $search['params']['filterquery'][]['query'] = implode(" OR ", array_filter([$collectionsQueryString, $virtualCollectionsQueryString])); + $collectionsQuery = $this->addCollectionsQuery($searchParams['query']); + if (!empty($collectionsQuery)) { + $search['params']['filterquery'][]['query'] = $collectionsQuery; } // add filter query for date search @@ -355,6 +321,13 @@ public function makeFacetsMenuArray($facets) $search['params']['query'] = $search['query']; // Perform search. $selectQuery = $solr->service->createSelect($search['params']); + // check for solr response + $solrRequest = $solr->service->createRequest($selectQuery); + $response = $solr->service->executeRequest($solrRequest); + // return empty facet on solr error + if ($response->getStatusCode() == 400) { + return []; + } $results = $solr->service->select($selectQuery); $facet = $results->getFacetSet(); @@ -372,46 +345,63 @@ public function makeFacetsMenuArray($facets) } } - // Process results. - if ($facet) { - foreach ($facet as $field => $values) { - $entryArray = []; - $entryArray['field'] = substr($field, 0, strpos($field, '_faceting')); - $entryArray['count'] = 0; - $entryArray['_OVERRIDE_HREF'] = ''; - $entryArray['ITEM_STATE'] = 'NO'; - // Count number of facet values. - $i = 0; - foreach ($values as $value => $count) { - if ($count > 0) { - // check if facet collection configuration exists - if (!empty($this->settings['facetCollections'])) { - if ($field == "collection_faceting" && !in_array($value, $facetCollectionArray)) { - continue; - } - } - $entryArray['count']++; - if ($entryArray['ITEM_STATE'] == 'NO') { - $entryArray['ITEM_STATE'] = 'IFSUB'; - } - $entryArray['_SUB_MENU'][] = $this->getFacetsMenuEntry($field, $value, $count, $search, $entryArray['ITEM_STATE']); - if (++$i == $this->settings['limit']) { - break; - } - } else { - break; - } + return $this->processResults($facet, $facetCollectionArray, $search); + } + + /** + * Add the collection query string, if the collections are given. + * + * @access private + * + * @param string $query The current query + * + * @return string The collection query string + */ + private function addCollectionsQuery($query) { + // if collections are given, we prepare the collections query string + // extract collections from collection parameter + $collections = null; + if ($this->searchParams['collection']) { + foreach (explode(',', $this->searchParams['collection']) as $collectionEntry) { + $collections[] = $this->collectionRepository->findByUid($collectionEntry); + } + } + if ($collections) { + $collectionsQueryString = ''; + $virtualCollectionsQueryString = ''; + foreach ($collections as $collectionEntry) { + // check for virtual collections query string + if ($collectionEntry->getIndexSearch()) { + $virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR (' . $collectionEntry->getIndexSearch() . ')'; + } else { + $collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"'; + } + } + + // distinguish between simple collection browsing and actual searching within the collection(s) + if (!empty($collectionsQueryString)) { + if (empty($query)) { + $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)'; + } else { + $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))'; } - $menuArray[] = $entryArray; } + + // virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separately + if (!empty($virtualCollectionsQueryString)) { + $virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')'; + } + + // combine both querystrings into a single filterquery via OR if both are given, otherwise pass either of those + return implode(" OR ", array_filter([$collectionsQueryString, $virtualCollectionsQueryString])); } - return $menuArray; + return ""; } /** * Creates an array for a HMENU entry of a facet value. * - * @access protected + * @access private * * @param string $field: The facet's index_name * @param string $value: The facet's value @@ -421,25 +411,10 @@ public function makeFacetsMenuArray($facets) * * @return array The array for the facet's menu entry */ - protected function getFacetsMenuEntry($field, $value, $count, $search, &$state) + private function getFacetsMenuEntry($field, $value, $count, $search, &$state) { $entryArray = []; - // Translate value. - if ($field == 'owner_faceting') { - // Translate name of holding library. - $entryArray['title'] = htmlspecialchars(Helper::translate($value, 'tx_dlf_libraries', $this->settings['storagePid'])); - } elseif ($field == 'type_faceting') { - // Translate document type. - $entryArray['title'] = htmlspecialchars(Helper::translate($value, 'tx_dlf_structures', $this->settings['storagePid'])); - } elseif ($field == 'collection_faceting') { - // Translate name of collection. - $entryArray['title'] = htmlspecialchars(Helper::translate($value, 'tx_dlf_collections', $this->settings['storagePid'])); - } elseif ($field == 'language_faceting') { - // Translate ISO 639 language code. - $entryArray['title'] = htmlspecialchars(Helper::getLanguageName($value)); - } else { - $entryArray['title'] = htmlspecialchars($value); - } + $entryArray['title'] = $this->translateValue($field, $value); $entryArray['count'] = $count; $entryArray['doNotLinkIt'] = 0; // Check if facet is already selected. @@ -466,14 +441,91 @@ protected function getFacetsMenuEntry($field, $value, $count, $search, &$state) return $entryArray; } + /** + * Process results. + * + * @access private + * + * @param array $facet + * @param array $facetCollectionArray + * @param array $search + * + * @return array menu array + */ + private function processResults($facet, $facetCollectionArray, $search) { + $menuArray = []; + + if ($facet) { + foreach ($facet as $field => $values) { + $entryArray = []; + $entryArray['field'] = substr($field, 0, strpos($field, '_faceting')); + $entryArray['count'] = 0; + $entryArray['_OVERRIDE_HREF'] = ''; + $entryArray['ITEM_STATE'] = 'NO'; + // Count number of facet values. + $i = 0; + foreach ($values as $value => $count) { + if ($count > 0) { + // check if facet collection configuration exists + if (!empty($this->settings['facetCollections'])) { + if ($field == "collection_faceting" && !in_array($value, $facetCollectionArray)) { + continue; + } + } + $entryArray['count']++; + if ($entryArray['ITEM_STATE'] == 'NO') { + $entryArray['ITEM_STATE'] = 'IFSUB'; + } + $entryArray['_SUB_MENU'][] = $this->getFacetsMenuEntry($field, $value, $count, $search, $entryArray['ITEM_STATE']); + if (++$i == $this->settings['limit']) { + break; + } + } else { + break; + } + } + $menuArray[] = $entryArray; + } + } + return $menuArray; + } + + /** + * Translates value depending on the index name. + * + * @param string $field: The facet's index_name + * @param string $value: The facet's value + * + * @return string + */ + private function translateValue($field, $value) + { + switch ($field) { + case 'owner_faceting': + // Translate name of holding library. + return htmlspecialchars(Helper::translate($value, 'tx_dlf_libraries', $this->settings['storagePid'])); + case 'type_faceting': + // Translate document type. + return htmlspecialchars(Helper::translate($value, 'tx_dlf_structures', $this->settings['storagePid'])); + case 'collection_faceting': + // Translate name of collection. + return htmlspecialchars(Helper::translate($value, 'tx_dlf_collections', $this->settings['storagePid'])); + case 'language_faceting': + // Translate ISO 639 language code. + return htmlspecialchars(Helper::getLanguageName($value)); + default: + return htmlspecialchars($value); + } + } + /** * Returns the extended search form and adds the JS files necessary for extended search. * - * @access protected + * @access private * * @return string The extended search form or an empty string */ - protected function addExtendedSearch() + private function addExtendedSearch() { // Quit without doing anything if no fields for extended search are selected. if ( diff --git a/Classes/Controller/TableOfContentsController.php b/Classes/Controller/TableOfContentsController.php index 4f3f371d6f..957ee62258 100644 --- a/Classes/Controller/TableOfContentsController.php +++ b/Classes/Controller/TableOfContentsController.php @@ -14,7 +14,6 @@ use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\MetsDocument; use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Core\Utility\GeneralUtility; /** * Controller class for plugin 'Table Of Contents'. @@ -37,21 +36,19 @@ class TableOfContentsController extends AbstractController /** * The main method of the plugin * + * @access public + * * @return void */ public function mainAction() { // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. return; } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } + $this->setPage(); $this->view->assign('toc', $this->makeMenuArray()); } @@ -60,56 +57,32 @@ public function mainAction() /** * This builds a menu array for HMENU * - * @access protected + * @access private + * * @return array HMENU array */ - protected function makeMenuArray() + private function makeMenuArray() { - // Set default values for page if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); $menuArray = []; // Does the document have physical elements or is it an external file? if ( - !empty($this->document->getDoc()->physicalStructure) + !empty($this->document->getCurrentDocument()->physicalStructure) || !MathUtility::canBeInterpretedAsInteger($this->requestData['id']) ) { - // Get all logical units the current page or track is a part of. - if ( - !empty($this->requestData['page']) - && !empty($this->document->getDoc()->physicalStructure) - ) { - $this->activeEntries = array_merge((array) $this->document->getDoc()->smLinks['p2l'][$this->document->getDoc()->physicalStructure[0]], - (array) $this->document->getDoc()->smLinks['p2l'][$this->document->getDoc()->physicalStructure[$this->requestData['page']]]); - if ( - !empty($this->requestData['double']) - && $this->requestData['page'] < $this->document->getDoc()->numPages - ) { - $this->activeEntries = array_merge($this->activeEntries, - (array) $this->document->getDoc()->smLinks['p2l'][$this->document->getDoc()->physicalStructure[$this->requestData['page'] + 1]]); - } - } + $this->getAllLogicalUnits(); // Go through table of contents and create all menu entries. - foreach ($this->document->getDoc()->tableOfContents as $entry) { + foreach ($this->document->getCurrentDocument()->tableOfContents as $entry) { $menuArray[] = $this->getMenuEntry($entry, true); } } else { // Go through table of contents and create top-level menu entries. - foreach ($this->document->getDoc()->tableOfContents as $entry) { + foreach ($this->document->getCurrentDocument()->tableOfContents as $entry) { $menuArray[] = $this->getMenuEntry($entry, false); } // Build table of contents from database. $result = $this->documentRepository->getTableOfContentsFromDb($this->document->getUid(), $this->document->getPid(), $this->settings); - $allResults = $result->fetchAll(); + $allResults = $result->fetchAllAssociative(); if (count($allResults) > 0) { $menuArray[0]['ITEM_STATE'] = 'CURIFSUB'; @@ -119,6 +92,7 @@ protected function makeMenuArray() 'label' => !empty($resArray['mets_label']) ? $resArray['mets_label'] : $resArray['title'], 'type' => $resArray['type'], 'volume' => $resArray['volume'], + 'year' => $resArray['year'], 'orderlabel' => $resArray['mets_orderlabel'], 'pagination' => '', 'targetUid' => $resArray['uid'] @@ -127,33 +101,36 @@ protected function makeMenuArray() } } } + $this->sortMenu($menuArray); return $menuArray; } /** * This builds an array for one menu entry * - * @access protected + * @access private * - * @param array $entry : The entry's array from \Kitodo\Dlf\Common\Doc->getLogicalStructure + * @param array $entry : The entry's array from AbstractDocument->getLogicalStructure * @param bool $recursive : Whether to include the child entries * * @return array HMENU array for menu entry */ - protected function getMenuEntry(array $entry, $recursive = false) + private function getMenuEntry(array $entry, $recursive = false) { $entry = $this->resolveMenuEntry($entry); $entryArray = []; // Set "title", "volume", "type" and "pagination" from $entry array. - $entryArray['title'] = !empty($entry['label']) ? $entry['label'] : $entry['orderlabel']; + $entryArray['title'] = $this->setTitle($entry); $entryArray['volume'] = $entry['volume']; + $entryArray['year'] = $entry['year']; $entryArray['orderlabel'] = $entry['orderlabel']; - $entryArray['type'] = Helper::translate($entry['type'], 'tx_dlf_structures', $this->settings['storagePid']); + $entryArray['type'] = $this->getTranslatedType($entry['type']); $entryArray['pagination'] = htmlspecialchars($entry['pagination']); $entryArray['_OVERRIDE_HREF'] = ''; $entryArray['doNotLinkIt'] = 1; $entryArray['ITEM_STATE'] = 'NO'; + // Build menu links based on the $entry['points'] array. if ( !empty($entry['points']) @@ -208,7 +185,7 @@ protected function getMenuEntry(array $entry, $recursive = false) if ( $entryArray['ITEM_STATE'] == 'CUR' || is_string($entry['points']) - || empty($this->document->getDoc()->smLinks['l2p'][$entry['id']]) + || empty($this->document->getCurrentDocument()->smLinks['l2p'][$entry['id']]) ) { $entryArray['_SUB_MENU'] = []; foreach ($entry['children'] as $child) { @@ -232,17 +209,19 @@ protected function getMenuEntry(array $entry, $recursive = false) * This is so that when linking from a child document back to its parent, * that link is via UID, so that subsequently the parent's TOC is built from database. * + * @access private + * * @param array $entry * @return array */ - protected function resolveMenuEntry($entry) + private function resolveMenuEntry($entry) { // If the menu entry points to the parent document, // resolve to the parent UID set on indexation. - $doc = $this->document->getDoc(); + $doc = $this->document->getCurrentDocument(); if ( $doc instanceof MetsDocument - && $entry['points'] === $doc->parentHref + && ($entry['points'] === $doc->parentHref || $this->isMultiElement($entry['type'])) && !empty($this->document->getPartof()) ) { unset($entry['points']); @@ -251,4 +230,126 @@ protected function resolveMenuEntry($entry) return $entry; } + + /** + * Get all logical units the current page or track is a part of. + * + * @access private + * + * @return void + */ + private function getAllLogicalUnits() { + if ( + !empty($this->requestData['page']) + && !empty($this->document->getCurrentDocument()->physicalStructure) + ) { + $this->activeEntries = array_merge((array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[0]], + (array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page']]]); + if ( + !empty($this->requestData['double']) + && $this->requestData['page'] < $this->document->getCurrentDocument()->numPages + ) { + $this->activeEntries = array_merge($this->activeEntries, + (array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page'] + 1]]); + } + } + } + + /** + * Get translated type of entry. + * + * @access private + * + * @param string $type + * + * @return string + */ + private function getTranslatedType($type) { + return Helper::translate($type, 'tx_dlf_structures', $this->settings['storagePid']); + } + + /** + * Check if element has type 'multivolume_work' or 'multipart_manuscript'. + * For Kitodo.Production prior to version 3.x, hierarchical child documents + * always come with their own METS file for their parent document, even + * if multiple documents in fact have the same parent. To make sure that all + * of them point to the same parent document in Kitodo.Presentation, we + * need some workaround here. + * + * @todo Should be removed when Kitodo.Production 2.x is no longer supported. + * + * @access private + * + * @param string $type + * + * @return bool + */ + private function isMultiElement($type) { + return $type === 'multivolume_work' || $type === 'multipart_manuscript'; + } + /** + * Set title from entry. + * + * @access private + * + * @param array $entry + * + * @return string + */ + private function setTitle($entry) { + if (empty($entry['label']) && empty($entry['orderlabel'])) { + foreach ($this->settings['titleReplacements'] as $titleReplacement) { + if ($entry['type'] == $titleReplacement['type']) { + $fields = explode(",", $titleReplacement['fields']); + $title = ''; + foreach ($fields as $field) { + if ($field == 'type') { + $title .= $this->getTranslatedType($entry['type']) . ' '; + } else { + $title .= $entry[$field] . ' '; + } + } + + return trim($title); + } + } + } + return $entry['label'] ?: $entry['orderlabel']; + } + + /** + * Sort menu by orderlabel. + * + * @access private + * + * @param array &$menu + * + * @return void + */ + private function sortMenu(&$menu) { + if ($menu[0]['type'] == $this->getTranslatedType("newspaper")) { + $this->sortSubMenu($menu); + } + if ($menu[0]['type'] == $this->getTranslatedType("year")) { + $this->sortSubMenu($menu); + } + } + + /** + * Sort sub menu e.g years of the newspaper by orderlabel. + * + * @access private + * + * @param array &$menu + * + * @return void + */ + private function sortSubMenu(&$menu) { + usort($menu[0]['_SUB_MENU'], function ($firstElement, $secondElement) { + if (!empty($firstElement['orderlabel'])) { + return $firstElement['orderlabel'] <=> $secondElement['orderlabel']; + } + return $firstElement['year'] <=> $secondElement['year']; + }); + } } diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 7232976ca9..74c70744ce 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -12,9 +12,8 @@ namespace Kitodo\Dlf\Controller; use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Plugin\FullTextGenerator; -use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Utility\MathUtility; /** * Controller class for plugin 'Toolbox'. @@ -26,6 +25,15 @@ */ class ToolboxController extends AbstractController { + + /** + * This holds the current document + * + * @var \Kitodo\Dlf\Common\AbstractDocument + * @access private + */ + private $doc; + /** * The main method of the plugin * @@ -34,49 +42,91 @@ class ToolboxController extends AbstractController public function mainAction() { // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); $this->view->assign('double', $this->requestData['double']); - $tools = explode(',', $this->settings['tools']); - // Add the tools to the toolbox. - foreach ($tools as $tool) { - $tool = trim(str_replace('tx_dlf_', '', $tool)); - $this->$tool(); - $this->view->assign($tool, true); + if (!$this->isDocMissingOrEmpty()) { + $this->doc = $this->document->getCurrentDocument(); } + + $this->renderTool(); + $this->view->assign('viewData', $this->viewData); + } + + /** + * Renders tool in the toolbox. + * + * @access private + * + * @return void + */ + private function renderTool() { + if (!empty($this->settings['tool'])) { + switch ($this->settings['tool']) { + case 'tx_dlf_annotationtool': + case 'annotationtool': + $this->renderToolByName('renderAnnotationTool'); + break; + case 'tx_dlf_fulltextdownloadtool': + case 'fulltextdownloadtool': + $this->renderToolByName('renderFulltextDownloadTool'); + break; + case 'tx_dlf_fulltexttool': + case 'fulltexttool': + $this->renderToolByName('renderFulltextTool'); + break; + case 'tx_dlf_imagedownloadtool': + case 'imagedownloadtool': + $this->renderToolByName('renderImageDownloadTool'); + break; + case 'tx_dlf_imagemanipulationtool': + case 'imagemanipulationtool': + $this->renderToolByName('renderImageManipulationTool'); + break; + case 'tx_dlf_pdfdownloadtool': + case 'pdfdownloadtool': + $this->renderToolByName('renderPdfDownloadTool'); + break; + case 'tx_dlf_searchindocumenttool': + case 'searchindocumenttool': + $this->renderToolByName('renderSearchInDocumentTool'); + break; + default: + $this->logger->warning('Incorrect tool configuration: "' . $this->settings['tool'] . '". This tool does not exist.'); + } + } + } + + /** + * Renders tool by the name in the toolbox. + * + * @access private + * + * @return void + */ + private function renderToolByName(string $tool) { + $this->$tool(); + $this->view->assign($tool, true); } /** * Renders the annotation tool * + * @access private + * * @return void */ - public function annotationtool() + private function renderAnnotationTool() { if ($this->isDocMissingOrEmpty()) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } - $annotationContainers = $this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['annotationContainers']; + $this->setPage(); + + $annotationContainers = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[$this->requestData['page']]]['annotationContainers']; if ( $annotationContainers != null && sizeof($annotationContainers) > 0 @@ -90,86 +140,46 @@ public function annotationtool() /** * Renders the fulltext download tool * + * @access private + * * @return void */ - public function fulltextdownloadtool() + private function renderFulltextDownloadTool() { if ( $this->isDocMissingOrEmpty() || empty($this->extConf['fileGrpFulltext']) ) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } + + $this->setPage(); + // Get text download. - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); - while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext])) { - $fullTextFile = $this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext]; - break; - } - } - if (!empty($fullTextFile)) { - $this->view->assign('fulltextDownload', true); - } else { - $this->view->assign('fulltextDownload', false); - } + $this->view->assign('fulltextDownload', !$this->isFullTextEmpty()); } /** * Renders the fulltext tool * + * @access private + * * @return void */ - public function fulltexttool() + private function renderFulltextTool() { if ( $this->isDocMissingOrEmpty() || empty($this->extConf['fileGrpFulltext']) ) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } - } - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); - while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext])) { - $fullTextFile = $this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext]; - break; - } + return; } - if (!empty($fullTextFile) || FullTextGenerator::checkLocal(\Kitodo\Dlf\Common\Doc::$extKey, $this->document, $this->requestData['page'])) { + + $this->setPage(); + + if (!$this->isFullTextEmpty() || FullTextGenerator::checkLocal(\Kitodo\Dlf\Common\Doc::$extKey, $this->document, $this->requestData['page'])) { $this->view->assign('fulltext', true); $this->view->assign('activateFullTextInitially', MathUtility::forceIntegerInRange($this->settings['activateFullTextInitially'], 0, 1, 0)); } else { @@ -180,33 +190,22 @@ public function fulltexttool() /** * Renders the image download tool * + * @access private + * * @return void */ - public function imagedownloadtool() + private function renderImageDownloadTool() { if ( $this->isDocMissingOrEmpty() || empty($this->settings['fileGrpsImageDownload']) ) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } + + $this->setPage(); + $imageArray = []; // Get left or single page download. $imageArray[0] = $this->getImage($this->requestData['page']); @@ -219,33 +218,33 @@ public function imagedownloadtool() /** * Get image's URL and MIME type * - * @access protected + * @access private * * @param int $page: Page number * * @return array Array of image links and image format information */ - protected function getImage($page) + private function getImage($page) { $image = []; // Get @USE value of METS fileGrp. - $fileGrps = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $this->settings['fileGrpsImageDownload']); + $fileGrps = GeneralUtility::trimExplode(',', $this->settings['fileGrpsImageDownload']); while ($fileGrp = @array_pop($fileGrps)) { // Get image link. - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrp])) { - $image['url'] = $this->document->getDoc()->getDownloadLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrp]); - $image['mimetype'] = $this->document->getDoc()->getFileMimeType($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$page]]['files'][$fileGrp]); + $fileGroup = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[$page]]['files'][$fileGrp]; + if (!empty($fileGroup)) { + $image['url'] = $this->doc->getDownloadLocation($fileGroup); + $image['mimetype'] = $this->doc->getFileMimeType($fileGroup); switch ($image['mimetype']) { case 'image/jpeg': - $mimetypeLabel = ' (JPG)'; + $image['mimetypeLabel'] = ' (JPG)'; break; case 'image/tiff': - $mimetypeLabel = ' (TIFF)'; + $image['mimetypeLabel'] = ' (TIFF)'; break; default: - $mimetypeLabel = ''; + $image['mimetypeLabel'] = ''; } - $image['mimetypeLabel'] = $mimetypeLabel; break; } else { $this->logger->warning('File not found in fileGrp "' . $fileGrp . '"'); @@ -257,9 +256,11 @@ protected function getImage($page) /** * Renders the image manipulation tool * + * @access private + * * @return void */ - public function imagemanipulationtool() + private function renderImageManipulationTool() { // Set parent element for initialization. $parentContainer = !empty($this->settings['parentContainer']) ? $this->settings['parentContainer'] : '.tx-dlf-imagemanipulationtool'; @@ -271,33 +272,22 @@ public function imagemanipulationtool() /** * Renders the PDF download tool * + * @access private + * * @return void */ - public function pdfdownloadtool() + private function renderPdfDownloadTool() { if ( $this->isDocMissingOrEmpty() || empty($this->extConf['fileGrpDownload']) ) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } + + $this->setPage(); + // Get single page downloads. $this->view->assign('pageLinks', $this->getPageLink()); // Get work download. @@ -307,44 +297,46 @@ public function pdfdownloadtool() /** * Get page's download link * - * @access protected + * @access private * * @return array Link to downloadable page */ - protected function getPageLink() + private function getPageLink() { - $page1Link = ''; - $page2Link = ''; + $firstPageLink = ''; + $secondPageLink = ''; $pageLinkArray = []; $pageNumber = $this->requestData['page']; $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['fileGrpDownload']); // Get image link. while ($fileGrpDownload = array_shift($fileGrpsDownload)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$pageNumber]]['files'][$fileGrpDownload])) { - $page1Link = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$pageNumber]]['files'][$fileGrpDownload]); + $firstFileGroupDownload = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[$pageNumber]]['files'][$fileGrpDownload]; + if (!empty($firstFileGroupDownload)) { + $firstPageLink = $this->doc->getFileLocation($firstFileGroupDownload); // Get second page, too, if double page view is activated. + $secondFileGroupDownload = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[$pageNumber + 1]]['files'][$fileGrpDownload]; if ( $this->requestData['double'] - && $pageNumber < $this->document->getDoc()->numPages - && !empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$pageNumber + 1]]['files'][$fileGrpDownload]) + && $pageNumber < $this->doc->numPages + && !empty($secondFileGroupDownload) ) { - $page2Link = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$pageNumber + 1]]['files'][$fileGrpDownload]); + $secondPageLink = $this->doc->getFileLocation($secondFileGroupDownload); } break; } } if ( - empty($page1Link) - && empty($page2Link) + empty($firstPageLink) + && empty($secondPageLink) ) { $this->logger->warning('File not found in fileGrps "' . $this->extConf['fileGrpDownload'] . '"'); } - if (!empty($page1Link)) { - $pageLinkArray[0] = $page1Link; + if (!empty($firstPageLink)) { + $pageLinkArray[0] = $firstPageLink; } - if (!empty($page2Link)) { - $pageLinkArray[1] = $page2Link; + if (!empty($secondPageLink)) { + $pageLinkArray[1] = $secondPageLink; } return $pageLinkArray; } @@ -352,30 +344,29 @@ protected function getPageLink() /** * Get work's download link * - * @access protected + * @access private * * @return string Link to downloadable work */ - protected function getWorkLink() + private function getWorkLink() { $workLink = ''; $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['fileGrpDownload']); // Get work link. while ($fileGrpDownload = array_shift($fileGrpsDownload)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[0]]['files'][$fileGrpDownload])) { - $workLink = $this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[0]]['files'][$fileGrpDownload]); + $fileGroupDownload = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[0]]['files'][$fileGrpDownload]; + if (!empty($fileGroupDownload)) { + $workLink = $this->doc->getFileLocation($fileGroupDownload); break; } else { - $details = $this->document->getDoc()->getLogicalStructure($this->document->getDoc()->toplevelId); + $details = $this->doc->getLogicalStructure($this->doc->toplevelId); if (!empty($details['files'][$fileGrpDownload])) { - $workLink = $this->document->getDoc()->getFileLocation($details['files'][$fileGrpDownload]); + $workLink = $this->doc->getFileLocation($details['files'][$fileGrpDownload]); break; } } } - if (!empty($workLink)) { - $workLink = $workLink; - } else { + if (empty($workLink)) { $this->logger->warning('File not found in fileGrps "' . $this->extConf['fileGrpDownload'] . '"'); } return $workLink; @@ -384,9 +375,11 @@ protected function getWorkLink() /** * Renders the searchInDocument tool * + * @access private + * * @return void */ - public function searchindocumenttool() + private function renderSearchInDocumentTool() { if ( $this->isDocMissingOrEmpty() @@ -394,34 +387,13 @@ public function searchindocumenttool() || empty($this->settings['solrcore']) ) { // Quit without doing anything if required variables are not set. - return ''; - } else { - if (!empty($this->requestData['logicalPage'])) { - $this->requestData['page'] = $this->document->getDoc()->getPhysicalPage($this->requestData['logicalPage']); - // The logical page parameter should not appear again - unset($this->requestData['logicalPage']); - } - // Set default values if not set. - // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { - $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getDoc()->numPages, 1); - } else { - $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getDoc()->physicalStructure); - } + return; } + $this->setPage(); + // Quit if no fulltext file is present - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); - while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { - if (!empty($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext])) { - $fullTextFile = $this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext]; - break; - } - } - if (empty($fullTextFile)) { + if ($this->isFullTextEmpty()) { return; } @@ -430,6 +402,7 @@ public function searchindocumenttool() 'LABEL_QUERY_URL' => $this->settings['queryInputName'], 'LABEL_START' => $this->settings['startInputName'], 'LABEL_ID' => $this->settings['idInputName'], + 'LABEL_PID' => $this->settings['pidInputName'], 'LABEL_PAGE_URL' => $this->settings['pageInputName'], 'LABEL_HIGHLIGHT_WORD' => $this->settings['highlightWordInputName'], 'LABEL_ENCRYPTED' => $this->settings['encryptedInputName'], @@ -445,11 +418,11 @@ public function searchindocumenttool() * In case there is defined documentIdUrlSchema then the id will * extracted from this URL. * - * @access protected + * @access private * * @return string with current document id */ - protected function getCurrentDocumentId() + private function getCurrentDocumentId() { $id = $this->document->getUid(); @@ -481,11 +454,11 @@ protected function getCurrentDocumentId() /** * Get the encrypted Solr core name * - * @access protected + * @access private * * @return string with encrypted core name */ - protected function getEncryptedCoreName() + private function getEncryptedCoreName() { // Get core name. $name = Helper::getIndexNameFromUid($this->settings['solrcore'], 'tx_dlf_solrcores'); @@ -495,4 +468,22 @@ protected function getEncryptedCoreName() } return $name; } + + /** + * Check if the full text is empty. + * + * @access private + * + * @return bool true if empty, false otherwise + */ + private function isFullTextEmpty() { + $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); + while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { + $fullTextFile = $this->doc->physicalStructureInfo[$this->doc->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext]; + if (!empty($fullTextFile)) { + break; + } + } + return empty($fullTextFile); + } } diff --git a/Classes/Controller/View3DController.php b/Classes/Controller/View3DController.php index fd1a710765..ed99b4d602 100644 --- a/Classes/Controller/View3DController.php +++ b/Classes/Controller/View3DController.php @@ -11,9 +11,6 @@ namespace Kitodo\Dlf\Controller; -use Kitodo\Dlf\Common\Doc; -use TYPO3\CMS\Core\Utility\GeneralUtility; - /** * Plugin 'View3D' for the 'dlf' extension * @@ -25,24 +22,23 @@ class View3DController extends AbstractController { /** - * @return string|void + * @return void */ public function mainAction() { - $this->cObj = $this->configurationManager->getContentObject(); // Load current document. - $this->loadDocument($this->requestData); + $this->loadDocument(); if ( $this->isDocMissingOrEmpty() - || $this->document->getDoc()->metadataArray['LOG_0001']['type'][0] != 'object' + || $this->document->getCurrentDocument()->metadataArray['LOG_0001']['type'][0] != 'object' ) { // Quit without doing anything if required variables are not set. - return ''; + return; } else { - $model = trim($this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[1]]['files']['DEFAULT'])); + $model = trim($this->document->getCurrentDocument()->getFileLocation($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[1]]['files']['DEFAULT'])); $this->view->assign('3d', $model); - $modelConverted = trim($this->document->getDoc()->getFileLocation($this->document->getDoc()->physicalStructureInfo[$this->document->getDoc()->physicalStructure[1]]['files']['CONVERTED'])); + $modelConverted = trim($this->document->getCurrentDocument()->getFileLocation($this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[1]]['files']['CONVERTED'])); $xml = $this->requestData['id']; $settingsParts = explode("/", $model); @@ -55,37 +51,9 @@ public function mainAction() } if ($this->settings['useInternalProxy']) { - $absoluteUri = !empty($this->settings['forceAbsoluteUrl']) ? true : false; - - $model = $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri($absoluteUri) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $model, - 'uHash' => GeneralUtility::hmac($model, 'PageViewProxy') - ]) - ->build(); - - $xml = $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri($absoluteUri) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $xml, - 'uHash' => GeneralUtility::hmac($xml, 'PageViewProxy') - ]) - ->build(); - - $modelSettings = $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri($absoluteUri) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $modelSettings, - 'uHash' => GeneralUtility::hmac($modelSettings, 'PageViewProxy') - ]) - ->build(); + $this->configureProxyUrl($model); + $this->configureProxyUrl($xml); + $this->configureProxyUrl($modelSettings); } $this->view->assign('model', $model); diff --git a/Classes/Domain/Model/Document.php b/Classes/Domain/Model/Document.php index dbd0c1ecf4..72a38208e7 100644 --- a/Classes/Domain/Model/Document.php +++ b/Classes/Domain/Model/Document.php @@ -12,6 +12,7 @@ namespace Kitodo\Dlf\Domain\Model; +use Kitodo\Dlf\Common\AbstractDocument; use TYPO3\CMS\Extbase\Annotation as Extbase; use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy; use TYPO3\CMS\Extbase\Persistence\ObjectStorage; @@ -38,9 +39,9 @@ class Document extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity /** * This contains the representative of the raw XML / IIIF data of the document. * - * @var \Kitodo\Dlf\Common\Doc|null + * @var AbstractDocument|null */ - protected $doc = null; + protected $currentDocument = null; /** * @var string @@ -204,19 +205,19 @@ protected function initStorageObjects() } /** - * @return \Kitodo\Dlf\Common\Doc + * @return AbstractDocument */ - public function getDoc(): ?\Kitodo\Dlf\Common\Doc + public function getCurrentDocument(): ?AbstractDocument { - return $this->doc; + return $this->currentDocument; } /** - * @param \Kitodo\Dlf\Common\Doc $doc + * @param AbstractDocument $currentDocument */ - public function setDoc(\Kitodo\Dlf\Common\Doc $doc): void + public function setCurrentDocument(AbstractDocument $currentDocument): void { - $this->doc = $doc; + $this->currentDocument = $currentDocument; } /** diff --git a/Classes/Domain/Repository/DocumentRepository.php b/Classes/Domain/Repository/DocumentRepository.php index 2bcbc7adfd..ed7b588e65 100644 --- a/Classes/Domain/Repository/DocumentRepository.php +++ b/Classes/Domain/Repository/DocumentRepository.php @@ -12,16 +12,17 @@ namespace Kitodo\Dlf\Domain\Repository; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; -use Kitodo\Dlf\Common\SolrSearch; +use Kitodo\Dlf\Common\Solr\SolrSearch; +use Kitodo\Dlf\Domain\Model\Collection; use Kitodo\Dlf\Domain\Model\Document; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Extbase\Persistence\QueryInterface; +use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult; class DocumentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository { @@ -46,7 +47,7 @@ class DocumentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository * * @param array $parameters * - * @return \Kitodo\Dlf\Domain\Model\Document|null + * @return Document|null */ public function findOneByParameters($parameters) { @@ -63,7 +64,7 @@ public function findOneByParameters($parameters) } else if (isset($parameters['location']) && GeneralUtility::isValidUrl($parameters['location'])) { - $doc = Doc::getInstance($parameters['location'], [], true); + $doc = AbstractDocument::getInstance($parameters['location'], [], true); if ($doc->recordId) { $document = $this->findOneByRecordId($doc->recordId); @@ -78,11 +79,11 @@ public function findOneByParameters($parameters) } if ($document !== null && $doc === null) { - $doc = Doc::getInstance($document->getLocation(), [], true); + $doc = AbstractDocument::getInstance($document->getLocation(), [], true); } if ($doc !== null) { - $document->setDoc($doc); + $document->setCurrentDocument($doc); } return $document; @@ -91,7 +92,7 @@ public function findOneByParameters($parameters) /** * Find the oldest document * - * @return \Kitodo\Dlf\Domain\Model\Document|null + * @return Document|null */ public function findOldestDocument() { @@ -116,7 +117,7 @@ public function getChildrenOfYearAnchor($partOf, $structure) $query->matching($query->equals('partof', $partOf)); $query->setOrderings([ - 'mets_orderlabel' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING + 'mets_orderlabel' => QueryInterface::ORDER_ASCENDING ]); return $query->execute(); @@ -128,7 +129,7 @@ public function getChildrenOfYearAnchor($partOf, $structure) * @param int $uid * @param array $settings * - * @return \Kitodo\Dlf\Domain\Model\Document|null + * @return Document|null */ public function findOneByIdAndSettings($uid, $settings = []) { @@ -208,7 +209,7 @@ public function findAllByCollectionsLimited($collections, $limit = 50) * Volumes are documents that are both * a) "leaf" elements i.e. partof != 0 * b) "root" elements that are not referenced by other documents ("root" elements that have no descendants) - + * * @param array $settings * * @return array @@ -249,7 +250,7 @@ public function getStatisticsForSelectedCollection($settings) $queryBuilder->expr()->eq('tx_dlf_relations_joins.ident', $queryBuilder->createNamedParameter('docs_colls')) ) ->execute() - ->fetchColumn(0); + ->fetchFirstColumn(); $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_dlf_documents'); @@ -294,7 +295,7 @@ public function getStatisticsForSelectedCollection($settings) $queryBuilder->expr()->eq('tx_dlf_relations_joins.ident', $queryBuilder->createNamedParameter('docs_colls')) ) ->execute() - ->fetchColumn(0); + ->fetchFirstColumn(); } else { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_dlf_documents'); @@ -309,7 +310,7 @@ public function getStatisticsForSelectedCollection($settings) Helper::whereExpression('tx_dlf_documents') ) ->execute() - ->fetchColumn(0); + ->fetchFirstColumn(); $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_dlf_documents'); @@ -333,7 +334,7 @@ public function getStatisticsForSelectedCollection($settings) $queryBuilder->expr()->notIn('tx_dlf_documents.uid', $subQuery) ) ->execute() - ->fetchColumn(0); + ->fetchFirstColumn(); } return ['titles' => $countTitles, 'volumes' => $countVolumes]; @@ -346,7 +347,7 @@ public function getStatisticsForSelectedCollection($settings) * @param int $pid * @param array $settings * - * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface + * @return \Doctrine\DBAL\ForwardCompatibility\Result */ public function getTableOfContentsFromDb($uid, $pid, $settings) { @@ -359,11 +360,12 @@ public function getTableOfContentsFromDb($uid, $pid, $settings) $excludeOtherWhere = 'tx_dlf_documents.pid=' . intval($settings['storagePid']); } // Check if there are any metadata to suggest. - $result = $queryBuilder + return $queryBuilder ->select( 'tx_dlf_documents.uid AS uid', 'tx_dlf_documents.title AS title', 'tx_dlf_documents.volume AS volume', + 'tx_dlf_documents.year AS year', 'tx_dlf_documents.mets_label AS mets_label', 'tx_dlf_documents.mets_orderlabel AS mets_orderlabel', 'tx_dlf_structures_join.index_name AS type' @@ -386,7 +388,6 @@ public function getTableOfContentsFromDb($uid, $pid, $settings) ->addOrderBy('tx_dlf_documents.volume_sorting') ->addOrderBy('tx_dlf_documents.mets_orderlabel') ->execute(); - return $result; } /** @@ -427,7 +428,7 @@ public function getOaiRecord($settings, $parameters) // Create a prepared statement for the passed SQL query, bind the given params with their binding types and execute the query $statement = $connection->executeQuery($sql, $values, $types); - return $statement->fetch(); + return $statement->fetchAssociative(); } /** @@ -509,7 +510,7 @@ public function findAllByUids($uids, $checkPartof = false) $allDocuments = []; $documentStructures = Helper::getDocumentStructures($this->settings['storagePid']); // Process documents in a usable array structure - while ($resArray = $kitodoDocuments->fetch()) { + while ($resArray = $kitodoDocuments->fetchAssociative()) { $resArray['structure'] = $documentStructures[$resArray['structure']]; $allDocuments[$resArray['uid']] = $resArray; } @@ -540,11 +541,11 @@ public function findChildrenOfEach(array $uids) /** * Find all documents with given collection from Solr * - * @param \TYPO3\CMS\Extbase\Persistence\Generic\QueryResult|\Kitodo\Dlf\Domain\Model\Collection $collection + * @param QueryResult|Collection $collection * @param array $settings * @param array $searchParams - * @param \TYPO3\CMS\Extbase\Persistence\Generic\QueryResult $listedMetadata - * @return array + * @param QueryResult $listedMetadata + * @return SolrSearch */ public function findSolrByCollection($collection, $settings, $searchParams, $listedMetadata = null) { diff --git a/Classes/Eid/SearchInDocument.php b/Classes/Eid/SearchInDocument.php deleted file mode 100644 index 812e028dc9..0000000000 --- a/Classes/Eid/SearchInDocument.php +++ /dev/null @@ -1,140 +0,0 @@ - - * - * This file is part of the Kitodo and TYPO3 projects. - * - * @license GNU General Public License version 3 or later. - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - */ - -namespace Kitodo\Dlf\Eid; - -use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; -use Kitodo\Dlf\Common\SolrSearchResult\ResultDocument; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use TYPO3\CMS\Core\Http\Response; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * eID search in document for plugin 'Search' of the 'dlf' extension - * - * @author Alexander Bigga - * @package TYPO3 - * @subpackage dlf - * @access public - */ -class SearchInDocument -{ - /** - * The main method of the eID script - * - * @param ServerRequestInterface $request - * @return ResponseInterface JSON response of search suggestions - */ - public function main(ServerRequestInterface $request) - { - $output = [ - 'documents' => [], - 'numFound' => 0 - ]; - // Get input parameters and decrypt core name. - $parameters = $request->getParsedBody(); - if ($parameters === null) { - throw new \InvalidArgumentException('No parameters passed!', 1632322297); - } - $encrypted = (string) $parameters['encrypted']; - $start = intval($parameters['start']); - if (empty($encrypted)) { - throw new \InvalidArgumentException('No valid parameter passed!', 1580585079); - } - - $core = Helper::decrypt($encrypted); - - // Perform Solr query. - $solr = Solr::getInstance($core); - $fields = Solr::getFields(); - - if ($solr->ready) { - $query = $solr->service->createSelect(); - $query->setFields([$fields['id'], $fields['uid'], $fields['page']]); - $query->setQuery($this->getQuery($fields, $parameters)); - $query->setStart($start)->setRows(20); - $query->addSort($fields['page'], $query::SORT_ASC); - $query->getHighlighting(); - $solrRequest = $solr->service->createRequest($query); - - // it is necessary to add the custom parameters to the request - // because query object doesn't allow custom parameters - - // field for which highlighting is going to be performed, - // is required if you want to have OCR highlighting - $solrRequest->addParam('hl.ocr.fl', $fields['fulltext']); - // return the coordinates of highlighted search as absolute coordinates - $solrRequest->addParam('hl.ocr.absoluteHighlights', 'on'); - // max amount of snippets for a single page - $solrRequest->addParam('hl.snippets', 40); - // we store the fulltext on page level and can disable this option - $solrRequest->addParam('hl.ocr.trackPages', 'off'); - - $response = $solr->service->executeRequest($solrRequest); - $result = $solr->service->createResult($query, $response); - /** @scrutinizer ignore-call */ - $output['numFound'] = $result->getNumFound(); - $data = $result->getData(); - $highlighting = $data['ocrHighlighting']; - - foreach ($result as $record) { - $resultDocument = new ResultDocument($record, $highlighting, $fields); - - $document = [ - 'id' => $resultDocument->getId(), - 'uid' => !empty($resultDocument->getUid()) ? $resultDocument->getUid() : $parameters['uid'], - 'page' => $resultDocument->getPage(), - 'snippet' => $resultDocument->getSnippets(), - 'highlight' => $resultDocument->getHighlightsIds() - ]; - $output['documents'][] = $document; - } - } - // Create response object. - /** @var Response $response */ - $response = GeneralUtility::makeInstance(Response::class); - $response->getBody()->write(json_encode($output)); - return $response; - } - - /** - * Build SOLR query for given fields and parameters. - * - * @access private - * - * @param array $fields array of SOLR index fields - * @param array|object $parameters parsed from request body - * - * @return string SOLR query - */ - private function getQuery($fields, $parameters) - { - return $fields['fulltext'] . ':(' . Solr::escapeQuery((string) $parameters['q']) . ') AND ' . $fields['uid'] . ':' . $this->getUid($parameters['uid']); - } - - /** - * Check if uid is number, if yes convert it to int, - * otherwise leave uid not changed. - * - * @access private - * - * @param string $uid of the document - * - * @return int|string uid of the document - */ - private function getUid($uid) - { - return is_numeric($uid) ? intval($uid) : $uid; - } -} diff --git a/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php b/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php index 0cb17d095b..8d498eb31c 100644 --- a/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php +++ b/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php @@ -12,7 +12,7 @@ namespace Kitodo\Dlf\ExpressionLanguage; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\IiifManifest; use Kitodo\Dlf\Domain\Model\Document; @@ -24,7 +24,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; -use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; /** * Provider class for additional "getDocumentType" function to the ExpressionLanguage. @@ -56,11 +56,28 @@ public function getFunctions() */ protected $document; + /** + * @var ConfigurationManager + */ + protected $configurationManager; + + public function injectConfigurationManager(ConfigurationManager $configurationManager) + { + $this->configurationManager = $configurationManager; + } + /** * @var DocumentRepository */ protected $documentRepository; - + + /** + * @param DocumentRepository $documentRepository + */ + public function injectDocumentRepository(DocumentRepository $documentRepository) + { + $this->documentRepository = $documentRepository; + } /** * Initialize the extbase repositories * @@ -70,17 +87,12 @@ public function getFunctions() */ protected function initializeRepositories($storagePid) { - Helper::polyfillExtbaseClassesForTYPO3v9(); - - // TODO: When we drop support for TYPO3v9, we needn't/shouldn't use ObjectManager anymore - $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $configurationManager = $objectManager->get(ConfigurationManager::class); - $frameworkConfiguration = $configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $frameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $frameworkConfiguration['persistence']['storagePid'] = MathUtility::forceIntegerInRange((int) $storagePid, 0); - $configurationManager->setConfiguration($frameworkConfiguration); + $this->configurationManager->setConfiguration($frameworkConfiguration); - $this->documentRepository = $objectManager->get(DocumentRepository::class); + $this->documentRepository = GeneralUtility::makeInstance(DocumentRepository::class); } /** @@ -112,17 +124,17 @@ function($arguments, $cPid) // Load document with current plugin parameters. $this->loadDocument($queryParams['tx_dlf'], $cPid); - if ($this->document === null) { + if ($this->document === null || $this->document->getCurrentDocument() === null) { return $type; } // Set PID for metadata definitions. - $this->document->getDoc()->cPid = $cPid; + $this->document->getCurrentDocument()->cPid = $cPid; - $metadata = $this->document->getDoc()->getTitledata($cPid); + $metadata = $this->document->getCurrentDocument()->getTitledata($cPid); if (!empty($metadata['type'][0])) { // Calendar plugin does not support IIIF (yet). Abort for all newspaper related types. if ( - $this->document->getDoc() instanceof IiifManifest + $this->document->getCurrentDocument() instanceof IiifManifest && array_search($metadata['type'][0], ['newspaper', 'ephemera', 'year', 'issue']) !== false ) { return $type; @@ -155,13 +167,13 @@ protected function loadDocument($requestData, int $pid) // find document from repository by uid $this->document = $this->documentRepository->findOneByIdAndSettings((int) $requestData['id'], ['storagePid' => $pid]); if ($this->document) { - $doc = Doc::getInstance($this->document->getLocation(), ['storagePid' => $pid], true); + $doc = AbstractDocument::getInstance($this->document->getLocation(), ['storagePid' => $pid], true); } else { $this->logger->error('Invalid UID "' . $requestData['id'] . '" or PID "' . $pid . '" for document loading'); } } else if (GeneralUtility::isValidUrl($requestData['id'])) { - $doc = Doc::getInstance($requestData['id'], ['storagePid' => $pid], true); + $doc = AbstractDocument::getInstance($requestData['id'], ['storagePid' => $pid], true); if ($doc !== null) { if ($doc->recordId) { @@ -180,7 +192,7 @@ protected function loadDocument($requestData, int $pid) } if ($this->document !== null && $doc !== null) { - $this->document->setDoc($doc); + $this->document->setCurrentDocument($doc); } } elseif (!empty($requestData['recordId'])) { @@ -188,15 +200,15 @@ protected function loadDocument($requestData, int $pid) $this->document = $this->documentRepository->findOneByRecordId($requestData['recordId']); if ($this->document !== null) { - $doc = Doc::getInstance($this->document->getLocation(), ['storagePid' => $pid], true); + $doc = AbstractDocument::getInstance($this->document->getLocation(), ['storagePid' => $pid], true); if ($this->document !== null && $doc !== null) { - $this->document->setDoc($doc); + $this->document->setCurrentDocument($doc); } else { $this->logger->error('Failed to load document with record ID "' . $requestData['recordId'] . '"'); } } } else { - $this->logger->error('Invalid UID "' . $requestData['id'] . '" or PID "' . $pid . '" for document loading'); + $this->logger->error('Empty UID or invalid PID "' . $pid . '" for document loading'); } } } diff --git a/Classes/Hooks/ConfigurationForm.php b/Classes/Hooks/ConfigurationForm.php index 63afd479ef..2a52f8c818 100644 --- a/Classes/Hooks/ConfigurationForm.php +++ b/Classes/Hooks/ConfigurationForm.php @@ -13,7 +13,7 @@ namespace Kitodo\Dlf\Hooks; use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Localization\LanguageService; diff --git a/Classes/Hooks/DataHandler.php b/Classes/Hooks/DataHandler.php index 51aec26b84..404a89cc00 100644 --- a/Classes/Hooks/DataHandler.php +++ b/Classes/Hooks/DataHandler.php @@ -12,12 +12,11 @@ namespace Kitodo\Dlf\Hooks; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\Indexer; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Domain\Repository\DocumentRepository; -use Kitodo\Dlf\Domain\Model\Document; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; @@ -118,6 +117,8 @@ public function processDatamap_postProcessFieldArray($status, $table, $id, &$fie $fieldArray['index_name'] = Solr::createCore($fieldArray['index_name']); if (empty($fieldArray['index_name'])) { $this->logger->error('Could not create new Apache Solr core'); + // Unset all fields to prevent new database record if Solr core creation failed. + unset($fieldArray); } break; } @@ -148,7 +149,7 @@ public function processDatamap_postProcessFieldArray($status, $table, $id, &$fie ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { // Reset storing to current. $fieldArray['index_stored'] = $resArray['is_listed']; } @@ -173,7 +174,7 @@ public function processDatamap_postProcessFieldArray($status, $table, $id, &$fie ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { // Reset indexing to current. $fieldArray['index_indexed'] = $resArray['index_autocomplete']; } @@ -235,7 +236,7 @@ public function processDatamap_afterDatabaseOperations($status, $table, $id, &$f ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { if ($resArray['hidden']) { // Establish Solr connection. $solr = Solr::getInstance($resArray['core']); @@ -249,10 +250,10 @@ public function processDatamap_afterDatabaseOperations($status, $table, $id, &$f } else { // Reindex document. $document = $this->getDocumentRepository()->findByUid($id); - $doc = Doc::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); + $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); if ($document !== null && $doc !== null) { - $document->setDoc($doc); - Indexer::add($document); + $document->setCurrentDocument($doc); + Indexer::add($document, $this->getDocumentRepository()); } else { $this->logger->error('Failed to re-index document with UID ' . $id); } @@ -312,7 +313,7 @@ public function processCmdmap_postProcess($command, $table, $id) ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { switch ($command) { case 'move': case 'delete': @@ -331,9 +332,9 @@ public function processCmdmap_postProcess($command, $table, $id) case 'undelete': // Reindex document. $document = $this->getDocumentRepository()->findByUid($id); - $doc = Doc::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); + $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); if ($document !== null && $doc !== null) { - $document->setDoc($doc); + $document->setCurrentDocument($doc); Indexer::add($document); } else { $this->logger->error('Failed to re-index document with UID ' . $id); @@ -366,7 +367,7 @@ public function processCmdmap_postProcess($command, $table, $id) ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetch()) { + if ($resArray = $result->fetchAssociative()) { // Establish Solr connection. $solr = Solr::getInstance(); if ($solr->ready) { diff --git a/Classes/Hooks/Form/FieldInformation/SolrCoreStatus.php b/Classes/Hooks/Form/FieldInformation/SolrCoreStatus.php index e28ba1c98b..dff2574e20 100644 --- a/Classes/Hooks/Form/FieldInformation/SolrCoreStatus.php +++ b/Classes/Hooks/Form/FieldInformation/SolrCoreStatus.php @@ -13,7 +13,7 @@ namespace Kitodo\Dlf\Hooks\Form\FieldInformation; use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use TYPO3\CMS\Backend\Form\AbstractNode; /** diff --git a/Classes/Middleware/SearchInDocument.php b/Classes/Middleware/SearchInDocument.php new file mode 100644 index 0000000000..44894cf6d0 --- /dev/null +++ b/Classes/Middleware/SearchInDocument.php @@ -0,0 +1,194 @@ + + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + +namespace Kitodo\Dlf\Middleware; + +use Kitodo\Dlf\Common\Helper; +use Kitodo\Dlf\Common\Solr\Solr; +use Kitodo\Dlf\Common\Solr\SearchResult\ResultDocument; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\MiddlewareInterface; +use Psr\Http\Server\RequestHandlerInterface; +use TYPO3\CMS\Core\Http\Response; +use TYPO3\CMS\Core\Site\SiteFinder; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * Search in document Middleware for plugin 'Search' of the 'dlf' extension + * + * @author Alexander Bigga + * @author Beatrycze Volk + * @package TYPO3 + * @subpackage dlf + * @access public + */ +class SearchInDocument implements MiddlewareInterface +{ + /** + * This holds the solr instance + * + * @var \Kitodo\Dlf\Common\Solr\Solr + * @access private + */ + private $solr; + + /** + * This holds the solr fields + * + * @var array + * @access private + */ + private $fields; + + /** + * The process method of the middleware. + * + * @access public + * + * @param ServerRequestInterface $request + * @param RequestHandlerInterface $handler + * + * @return ResponseInterface JSON response of documents + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + $response = $handler->handle($request); + // Get input parameters and decrypt core name. + $parameters = $request->getParsedBody(); + // Return if not this middleware + if (!isset($parameters['middleware']) || ($parameters['middleware'] != 'dlf/search-in-document')) { + return $response; + } + + $encrypted = (string) $parameters['encrypted']; + if (empty($encrypted)) { + throw new \InvalidArgumentException('No valid parameter passed: ' . $parameters['middleware'] . ' ' . $parameters['encrypted'] . '!', 1580585079); + } + + $output = [ + 'documents' => [], + 'numFound' => 0 + ]; + + $core = Helper::decrypt($encrypted); + + // Perform Solr query. + $this->solr = Solr::getInstance($core); + $this->fields = Solr::getFields(); + + if ($this->solr->ready) { + $result = $this->executeSolrQuery($parameters); + /** @scrutinizer ignore-call */ + $output['numFound'] = $result->getNumFound(); + $data = $result->getData(); + $highlighting = $data['ocrHighlighting']; + + $siteFinder = GeneralUtility::makeInstance(SiteFinder::class); + $site = $siteFinder->getSiteByPageId($parameters['pid']); + + foreach ($result as $record) { + $resultDocument = new ResultDocument($record, $highlighting, $this->fields); + + $url = (string) $site->getRouter()->generateUri( + $parameters['pid'], + [ + 'tx_dlf[id]' => !empty($resultDocument->getUid()) ? $resultDocument->getUid() : $parameters['uid'], + 'tx_dlf[page]' => $resultDocument->getPage(), + 'tx_dlf[highlight_word]' => $parameters['q'] + ] + ); + + $document = [ + 'id' => $resultDocument->getId(), + 'uid' => !empty($resultDocument->getUid()) ? $resultDocument->getUid() : $parameters['uid'], + 'page' => $resultDocument->getPage(), + 'snippet' => $resultDocument->getSnippets(), + 'highlight' => $resultDocument->getHighlightsIds(), + 'url' => $url + ]; + $output['documents'][] = $document; + } + } + + // Create response object. + /** @var Response $response */ + $response = GeneralUtility::makeInstance(Response::class); + $response->getBody()->write(json_encode($output)); + return $response; + } + + /** + * Execute SOLR query. + * + * @access private + * + * @param array $parameters array of query parameters + * + * @return \Solarium\Core\Query\Result\ResultInterface result + */ + private function executeSolrQuery($parameters) + { + $query = $this->solr->service->createSelect(); + $query->setFields([$this->fields['id'], $this->fields['uid'], $this->fields['page']]); + $query->setQuery($this->getQuery($parameters)); + $query->setStart(intval($parameters['start']))->setRows(20); + $query->addSort($this->fields['page'], $query::SORT_ASC); + $query->getHighlighting(); + $solrRequest = $this->solr->service->createRequest($query); + + // it is necessary to add the custom parameters to the request + // because query object doesn't allow custom parameters + + // field for which highlighting is going to be performed, + // is required if you want to have OCR highlighting + $solrRequest->addParam('hl.ocr.fl', $this->fields['fulltext']); + // return the coordinates of highlighted search as absolute coordinates + $solrRequest->addParam('hl.ocr.absoluteHighlights', 'on'); + // max amount of snippets for a single page + $solrRequest->addParam('hl.snippets', 40); + // we store the fulltext on page level and can disable this option + $solrRequest->addParam('hl.ocr.trackPages', 'off'); + + $response = $this->solr->service->executeRequest($solrRequest); + return $this->solr->service->createResult($query, $response); + } + + /** + * Build SOLR query for given fields and parameters. + * + * @access private + * + * @param array|object $parameters parsed from request body + * + * @return string SOLR query + */ + private function getQuery($parameters) + { + return $this->fields['fulltext'] . ':(' . Solr::escapeQuery((string) $parameters['q']) . ') AND ' . $this->fields['uid'] . ':' . $this->getUid($parameters['uid']); + } + + /** + * Check if uid is number, if yes convert it to int, + * otherwise leave uid not changed. + * + * @access private + * + * @param string $uid of the document + * + * @return int|string uid of the document + */ + private function getUid($uid) + { + return is_numeric($uid) ? intval($uid) : $uid; + } +} diff --git a/Classes/Eid/SearchSuggest.php b/Classes/Middleware/SearchSuggest.php similarity index 64% rename from Classes/Eid/SearchSuggest.php rename to Classes/Middleware/SearchSuggest.php index 413dce72b9..4dde41c078 100644 --- a/Classes/Eid/SearchSuggest.php +++ b/Classes/Middleware/SearchSuggest.php @@ -10,39 +10,51 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Eid; +namespace Kitodo\Dlf\Middleware; -use Kitodo\Dlf\Common\Helper; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\MiddlewareInterface; +use Psr\Http\Server\RequestHandlerInterface; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Http\Response; use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Utility\GeneralUtility; /** - * eID search suggestions for plugin 'Search' of the 'dlf' extension + * Search suggestions Middleware for plugin 'Search' of the 'dlf' extension * * @author Henrik Lochmann * @author Sebastian Meyer + * @author Beatrycze Volk * @package TYPO3 * @subpackage dlf * @access public */ -class SearchSuggest +class SearchSuggest implements MiddlewareInterface { /** - * The main method of the eID script + * The process method of the middleware. + * + * @access public * * @param ServerRequestInterface $request + * @param RequestHandlerInterface $handler + * * @return ResponseInterface XML response of search suggestions */ - public function main(ServerRequestInterface $request) + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $output = []; + $response = $handler->handle($request); // Get input parameters and decrypt core name. $parameters = $request->getParsedBody(); + // Return if not this middleware + if (!isset($parameters['middleware']) || ($parameters['middleware'] != 'dlf/search-suggest')) { + return $response; + } + + $output = []; $solrCore = (string) $parameters['solrcore']; $uHash = (string) $parameters['uHash']; if (hash_equals(GeneralUtility::hmac((string) (new Typo3Version()) . Environment::getExtensionsPath(), 'SearchSuggest'), $uHash) === false) { @@ -57,14 +69,17 @@ public function main(ServerRequestInterface $request) $query->setRows(0); $results = $solr->service->select($query)->getResponse()->getBody(); $result = json_decode($results); - foreach ($result->spellcheck->suggestions as $suggestions) { - if (is_object($suggestions)) { - foreach ($suggestions->suggestion as $suggestion) { - $output[] = $suggestion; + if (is_iterable($result->spellcheck->suggestions)) { + foreach ($result->spellcheck->suggestions as $suggestions) { + if (is_object($suggestions)) { + foreach ($suggestions->suggestion as $suggestion) { + $output[] = $suggestion; + } } } } } + // Create response object. /** @var Response $response */ $response = GeneralUtility::makeInstance(Response::class); diff --git a/Classes/Pagination/PageGridPagination.php b/Classes/Pagination/PageGridPagination.php new file mode 100644 index 0000000000..5cdeb65b58 --- /dev/null +++ b/Classes/Pagination/PageGridPagination.php @@ -0,0 +1,92 @@ + + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + +namespace Kitodo\Dlf\Pagination; + +use TYPO3\CMS\Core\Pagination\PaginationInterface; +use TYPO3\CMS\Core\Pagination\PaginatorInterface; + + +final class PageGridPagination implements PaginationInterface +{ + /** + * @var PageGridPaginator + */ + protected $paginator; + + public function __construct(PaginatorInterface $paginator) + { + $this->paginator = $paginator; + } + + public function getPreviousPageNumber(): ?int + { + $previousPage = (int) (($this->paginator->getCurrentPageNumber() - 1) * $this->paginator->getPublicItemsPerPage()) - ($this->paginator->getPublicItemsPerPage() - 1); + + if ($previousPage > $this->paginator->getNumberOfPages()) { + return null; + } + + return $previousPage >= $this->getFirstPageNumber() + ? $previousPage + : null + ; + } + + public function getNextPageNumber(): ?int + { + $nextPage = (int) ($this->paginator->getCurrentPageNumber() * count($this->paginator->getPaginatedItems()) + 1); + + return $nextPage <= $this->paginator->getNumberOfPages() + ? $nextPage + : null + ; + } + + public function getFirstPageNumber(): int + { + return 1; + } + + public function getLastPageNumber(): int + { + return $this->paginator->getNumberOfPages(); + } + + public function getStartRecordNumber(): int + { + if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) { + return 0; + } + + return $this->paginator->getKeyOfFirstPaginatedItem() + 1; + } + + public function getEndRecordNumber(): int + { + if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) { + return 0; + } + + return $this->paginator->getKeyOfLastPaginatedItem() + 1; + } + + /** + * @return int[] + */ + public function getAllPageNumbers(): array + { + return range($this->getFirstPageNumber(), $this->getLastPageNumber()); + } +} diff --git a/Classes/Pagination/PageGridPaginator.php b/Classes/Pagination/PageGridPaginator.php new file mode 100644 index 0000000000..e98c25c42b --- /dev/null +++ b/Classes/Pagination/PageGridPaginator.php @@ -0,0 +1,92 @@ +items = $items; + $this->publicItemsPerPage = $itemsPerPage; + $this->setCurrentPageNumber((int) ceil(($currentPageNumber / $this->publicItemsPerPage))); + $this->setItemsPerPage($itemsPerPage); + + $this->updateInternalState(); + } + + /** + * @return iterable|array + */ + public function getPaginatedItems(): iterable + { + return $this->paginatedItems; + } + + protected function updatePaginatedItems(int $itemsPerPage, int $offset): void + { + $this->paginatedItems = array_slice($this->items, $offset, $itemsPerPage); + } + + protected function getTotalAmountOfItems(): int + { + return count($this->items); + } + + protected function getAmountOfItemsOnCurrentPage(): int + { + return count($this->paginatedItems); + } + + /** + * @return int + */ + public function getPublicItemsPerPage(): int + { + return $this->publicItemsPerPage; + } + + /** + * @param int $publicItemsPerPage + */ + public function setPublicItemsPerPage(int $publicItemsPerPage): void + { + $this->publicItemsPerPage = $publicItemsPerPage; + } + + +} diff --git a/Classes/Updates/FileLocationUpdater.php b/Classes/Updates/FileLocationUpdater.php index c8f5296127..162ff9c4e5 100644 --- a/Classes/Updates/FileLocationUpdater.php +++ b/Classes/Updates/FileLocationUpdater.php @@ -12,21 +12,19 @@ namespace Kitodo\Dlf\Updates; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; -use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; -use TYPO3\CMS\Install\Updates\ChattyInterface; - -use Doctrine\DBAL\DBALException; +use Doctrine\DBAL\Exception; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use Symfony\Component\Console\Output\OutputInterface; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder; -use TYPO3\CMS\Core\Resource\File; use TYPO3\CMS\Core\Resource\ResourceStorage; use TYPO3\CMS\Core\Resource\StorageRepository; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; +use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; +use TYPO3\CMS\Install\Updates\ChattyInterface; /** * Migrate reference of thumbnail image in collections record. @@ -53,7 +51,7 @@ class FileLocationUpdater implements UpgradeWizardInterface, ChattyInterface, Lo /** * Array with table and fields to migrate * - * @var string + * @var array */ protected $fieldsToMigrate = [ 'tx_dlf_collections' => 'thumbnail' @@ -179,13 +177,13 @@ protected function getRecordsFromTable($countOnly = false) ) ->orderBy('uid') ->execute() - ->fetchAll(); + ->fetchAllAssociative(); if ($countOnly === true) { $numResults += count($result); } else { $allResults[$table] = $result; } - } catch (DBALException $e) { + } catch (Exception $e) { throw new \RuntimeException( 'Database query failed. Error was: ' . $e->getPrevious()->getMessage(), 1511950673 @@ -268,7 +266,7 @@ protected function migrateField($table, $row) 'storage', $queryBuilder->createNamedParameter($storageUid, \PDO::PARAM_INT) ) - )->execute()->fetch(); + )->execute()->fetchAssociative(); // the file exists if (is_array($existingFileRecord)) { diff --git a/Classes/Updates/MigrateSettings.php b/Classes/Updates/MigrateSettings.php index cb26136e95..22b939fede 100644 --- a/Classes/Updates/MigrateSettings.php +++ b/Classes/Updates/MigrateSettings.php @@ -83,7 +83,7 @@ public function executeUpdate(): bool ->execute(); // Update the found record sets - while ($record = $statement->fetch()) { + while ($record = $statement->fetchAssociative()) { $queryBuilder = $connection->createQueryBuilder(); $updateResult = $queryBuilder->update('tt_content') ->where( @@ -129,7 +129,7 @@ public function updateNecessary(): bool ->execute(); // Update the found record sets - while ($record = $statement->fetch()) { + while ($record = $statement->fetchAssociative()) { $oldSettingsFound = $this->checkForOldSettings($record['pi_flexform']); if ($oldSettingsFound === true) { // We found at least one field to be updated --> break here diff --git a/Configuration/FlexForms/Navigation.xml b/Configuration/FlexForms/Navigation.xml index 806b0adedd..e1c551be23 100644 --- a/Configuration/FlexForms/Navigation.xml +++ b/Configuration/FlexForms/Navigation.xml @@ -60,15 +60,15 @@ LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.pageLast pageLast - + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.listview listview - + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.zoom zoom - + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.rotation rotation diff --git a/Configuration/FlexForms/Search.xml b/Configuration/FlexForms/Search.xml index 955b9fce51..e85f1cd055 100644 --- a/Configuration/FlexForms/Search.xml +++ b/Configuration/FlexForms/Search.xml @@ -41,6 +41,16 @@ + + + 1 + + + check + 0 + + + 1 diff --git a/Configuration/RequestMiddlewares.php b/Configuration/RequestMiddlewares.php new file mode 100644 index 0000000000..a75ae101d0 --- /dev/null +++ b/Configuration/RequestMiddlewares.php @@ -0,0 +1,28 @@ + + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + +return [ + 'frontend' => [ + 'dlf/search-in-document' => [ + 'target' => \Kitodo\Dlf\Middleware\SearchInDocument::class, + 'after' => [ + 'typo3/cms-frontend/prepare-tsfe-rendering' + ] + ], + 'dlf/search-suggest' => [ + 'target' => \Kitodo\Dlf\Middleware\SearchSuggest::class, + 'after' => [ + 'typo3/cms-frontend/prepare-tsfe-rendering' + ] + ], + ], +]; diff --git a/Configuration/TCA/tx_dlf_actionlog.php b/Configuration/TCA/tx_dlf_actionlog.php index 1653b3edee..5d7b8c08fb 100644 --- a/Configuration/TCA/tx_dlf_actionlog.php +++ b/Configuration/TCA/tx_dlf_actionlog.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog', 'label' => 'label', 'crdate' => 'crdate', 'cruser_id' => 'user_id', @@ -28,7 +28,7 @@ ], 'columns' => [ 'label' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -38,12 +38,12 @@ ], ], 'user_id' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.user_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.user_id', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.fe_cruser_id.none', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.fe_cruser_id.none', 0], ], 'foreign_table' => 'fe_users', 'foreign_table_where' => 'ORDER BY fe_users.username', @@ -54,7 +54,7 @@ ], ], 'file_name' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.file_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.file_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -64,7 +64,7 @@ ], ], 'count_pages' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.count_pages', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.count_pages', 'config' => [ 'type' => 'input', 'size' => 30, @@ -74,7 +74,7 @@ ], ], 'name' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -85,7 +85,7 @@ ] ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_actionlog.tab1,label,name,file_name,crdate,count_pages'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_actionlog.tab1,label,name,file_name,crdate,count_pages'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_basket.php b/Configuration/TCA/tx_dlf_basket.php index bb0dcf8463..7d693d13b2 100644 --- a/Configuration/TCA/tx_dlf_basket.php +++ b/Configuration/TCA/tx_dlf_basket.php @@ -12,12 +12,11 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket', 'label' => 'label', 'tstamp' => 'tstamp', 'fe_user_id' => 'fe_user_id', 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', @@ -29,7 +28,7 @@ ], 'columns' => [ 'label' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -39,7 +38,7 @@ ], ], 'session_id' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket.sessionId', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket.sessionId', 'config' => [ 'type' => 'input', 'size' => 30, @@ -49,7 +48,7 @@ ], ], 'doc_ids' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket.docIds', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket.docIds', 'config' => [ 'type' => 'input', 'size' => 30, @@ -59,7 +58,7 @@ ], ], 'fe_user_id' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket.feUser', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket.feUser', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', @@ -73,7 +72,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_basket.tab1,label,session_id,doc_ids,fe_user_id'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_basket.tab1,label,session_id,doc_ids,fe_user_id'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_collections.php b/Configuration/TCA/tx_dlf_collections.php index 27ca627714..6ae430f11c 100644 --- a/Configuration/TCA/tx_dlf_collections.php +++ b/Configuration/TCA/tx_dlf_collections.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections', 'label' => 'label', 'tstamp' => 'tstamp', 'crdate' => 'crdate', @@ -20,7 +20,6 @@ 'fe_cruser_id' => 'fe_cruser_id', 'fe_admin_lock' => 'fe_admin_lock', 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', @@ -101,7 +100,7 @@ ], 'label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -113,7 +112,7 @@ 'index_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.index_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -130,7 +129,7 @@ 'index_search' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.index_search', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.index_search', 'config' => [ 'type' => 'text', 'size' => 30, @@ -142,7 +141,7 @@ 'oai_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.oai_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.oai_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -154,7 +153,7 @@ 'description' => [ 'exclude' => 1, 'l10n_mode' => 'mergeIfNotBlank', // deprecated in 8.7 but kept for upgrade wizard - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.description', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.description', 'config' => [ 'behaviour' => [ 'allowLanguageSynchronization' => true @@ -170,7 +169,7 @@ 'thumbnail' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.thumbnail', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.thumbnail', 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( 'image', [ @@ -189,7 +188,7 @@ 'priority' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.priority', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.priority', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', @@ -210,7 +209,7 @@ 'documents' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.documents', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.documents', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingleBox', @@ -231,12 +230,12 @@ 'owner' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.owner', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.owner', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.owner.none', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.owner.none', 0], ], 'foreign_table' => 'tx_dlf_libraries', 'foreign_table_where' => 'AND tx_dlf_libraries.sys_language_uid IN (-1,0) ORDER BY tx_dlf_libraries.label', @@ -249,12 +248,12 @@ 'fe_cruser_id' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.fe_cruser_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.fe_cruser_id', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.fe_cruser_id.none', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.fe_cruser_id.none', 0], ], 'foreign_table' => 'fe_users', 'foreign_table_where' => 'ORDER BY fe_users.username', @@ -267,7 +266,7 @@ 'fe_admin_lock' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.fe_admin_lock', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.fe_admin_lock', 'config' => [ 'type' => 'check', 'default' => 0, @@ -276,12 +275,12 @@ 'status' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.status', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.status', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.status.default', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.status.default', 0], ], 'size' => 1, 'minitems' => 1, @@ -291,7 +290,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.tab1,label,--palette--;;1,description,--palette--;;2,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_collections.tab3,hidden,fe_group,status,owner,fe_cruser_id,--palette--;;3'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.tab1,label,--palette--;;1,description,--palette--;;2,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_collections.tab3,hidden,fe_group,status,owner,fe_cruser_id,--palette--;;3'], ], 'palettes' => [ '1' => ['showitem' => 'index_name, --linebreak--, index_search, --linebreak--, oai_name'], diff --git a/Configuration/TCA/tx_dlf_documents.php b/Configuration/TCA/tx_dlf_documents.php index 3089bc7776..2ae6d5c3d2 100644 --- a/Configuration/TCA/tx_dlf_documents.php +++ b/Configuration/TCA/tx_dlf_documents.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents', 'label' => 'title', 'tstamp' => 'tstamp', 'crdate' => 'crdate', @@ -102,7 +102,7 @@ ], 'prod_id' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.prod_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.prod_id', 'config' => [ 'type' => 'input', 'size' => 30, @@ -113,7 +113,7 @@ ], 'location' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.location', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.location', 'config' => [ 'type' => 'input', 'size' => 30, @@ -124,7 +124,7 @@ ], 'record_id' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.record_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.record_id', 'config' => [ 'type' => 'input', 'size' => 30, @@ -135,7 +135,7 @@ ], 'opac_id' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.opac_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.opac_id', 'config' => [ 'type' => 'input', 'size' => 30, @@ -146,7 +146,7 @@ ], 'union_id' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.union_id', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.union_id', 'config' => [ 'type' => 'input', 'size' => 30, @@ -157,7 +157,7 @@ ], 'urn' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.urn', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.urn', 'config' => [ 'type' => 'input', 'size' => 30, @@ -168,7 +168,7 @@ ], 'purl' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.purl', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.purl', 'config' => [ 'type' => 'input', 'size' => 30, @@ -179,7 +179,7 @@ ], 'title' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.title', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.title', 'config' => [ 'type' => 'input', 'size' => 30, @@ -190,7 +190,7 @@ ], 'title_sorting' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.title_sorting', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.title_sorting', 'config' => [ 'type' => 'input', 'size' => 30, @@ -201,7 +201,7 @@ ], 'author' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.author', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.author', 'config' => [ 'type' => 'input', 'size' => 30, @@ -212,7 +212,7 @@ ], 'year' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.year', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.year', 'config' => [ 'type' => 'input', 'size' => 30, @@ -223,7 +223,7 @@ ], 'place' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.place', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.place', 'config' => [ 'type' => 'input', 'size' => 30, @@ -234,7 +234,7 @@ ], 'thumbnail' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.thumbnail', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.thumbnail', 'config' => [ 'type' => 'user', 'renderType' => 'thumbnailCustomElement' @@ -242,7 +242,7 @@ ], 'structure' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.structure', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.structure', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', @@ -255,7 +255,7 @@ ], ], 'partof' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.partof', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.partof', 'config' => [ 'type' => 'group', 'internal_type' => 'db', @@ -276,7 +276,7 @@ ], 'volume' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.volume', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.volume', 'config' => [ 'type' => 'input', 'size' => 30, @@ -287,7 +287,7 @@ ], 'volume_sorting' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.volume_sorting', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.volume_sorting', 'config' => [ 'type' => 'input', 'size' => 30, @@ -298,7 +298,7 @@ ], 'license' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.license', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.license', 'config' => [ 'type' => 'input', 'size' => 30, @@ -309,7 +309,7 @@ ], 'terms' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.terms', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.terms', 'config' => [ 'type' => 'input', 'size' => 30, @@ -320,7 +320,7 @@ ], 'restrictions' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.restrictions', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.restrictions', 'config' => [ 'type' => 'input', 'size' => 30, @@ -331,7 +331,7 @@ ], 'out_of_print' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.out_of_print', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.out_of_print', 'config' => [ 'type' => 'input', 'size' => 30, @@ -342,7 +342,7 @@ ], 'rights_info' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.rights_info', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.rights_info', 'config' => [ 'type' => 'input', 'size' => 30, @@ -353,7 +353,7 @@ ], 'mets_label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.mets_label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.mets_label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -364,7 +364,7 @@ ], 'mets_orderlabel' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.mets_orderlabel', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.mets_orderlabel', 'config' => [ 'type' => 'input', 'size' => 30, @@ -375,7 +375,7 @@ ], 'collections' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.collections', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.collections', 'config' => [ 'type' => 'select', 'renderType' => 'selectMultipleSideBySide', @@ -394,7 +394,7 @@ ], 'owner' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.owner', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.owner', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', @@ -414,12 +414,12 @@ ], 'status' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.status', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.status', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.status.default', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.status.default', 0], ], 'size' => 1, 'minitems' => 1, @@ -429,13 +429,13 @@ ], 'document_format' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.document_format', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.document_format', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.document_format.mets', 'METS'], - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.document_format.iiif', 'IIIF'], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.document_format.mets', 'METS'], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.document_format.iiif', 'IIIF'], ], 'size' => 1, 'minitems' => 1, @@ -444,7 +444,7 @@ ] ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.tab1,--palette--;;1,author,--palette--;;2,structure,--palette--;;3,collections,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.tab2,--palette--;;4,--palette--;;5,--palette--;;6,--palette--;;7,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_documents.tab3,--palette--;;8,hidden,--palette--;;9,fe_group,status,owner,license,'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.tab1,--palette--;;1,author,--palette--;;2,structure,--palette--;;3,collections,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.tab2,--palette--;;4,--palette--;;5,--palette--;;6,--palette--;;7,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_documents.tab3,--palette--;;8,hidden,--palette--;;9,fe_group,status,owner,license,'], ], 'palettes' => [ '1' => ['showitem' => 'title, title_sorting, --linebreak--, mets_label, thumbnail'], diff --git a/Configuration/TCA/tx_dlf_formats.php b/Configuration/TCA/tx_dlf_formats.php index 08f9aa2d14..12eff7e1a0 100644 --- a/Configuration/TCA/tx_dlf_formats.php +++ b/Configuration/TCA/tx_dlf_formats.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats', 'label' => 'type', 'tstamp' => 'tstamp', 'crdate' => 'crdate', @@ -27,7 +27,7 @@ ], 'columns' => [ 'type' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats.type', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats.type', 'config' => [ 'type' => 'input', 'size' => 30, @@ -37,7 +37,7 @@ ], ], 'root' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats.root', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats.root', 'config' => [ 'type' => 'input', 'size' => 30, @@ -47,7 +47,7 @@ ], ], 'namespace' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats.namespace', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats.namespace', 'config' => [ 'type' => 'input', 'size' => 30, @@ -57,7 +57,7 @@ ], ], 'class' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats.class', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats.class', 'config' => [ 'type' => 'input', 'size' => 30, @@ -68,7 +68,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_formats.tab1,type,root,namespace,class'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_formats.tab1,type,root,namespace,class'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_libraries.php b/Configuration/TCA/tx_dlf_libraries.php index adbc743030..87aebc781d 100644 --- a/Configuration/TCA/tx_dlf_libraries.php +++ b/Configuration/TCA/tx_dlf_libraries.php @@ -12,13 +12,12 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries', 'label' => 'label', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', @@ -66,7 +65,7 @@ ], 'label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -78,7 +77,7 @@ 'index_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.index_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -94,7 +93,7 @@ ], 'website' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.website', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.website', 'config' => [ 'type' => 'input', 'size' => 30, @@ -105,7 +104,7 @@ ], 'contact' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.contact', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.contact', 'config' => [ 'type' => 'input', 'size' => 30, @@ -117,7 +116,7 @@ 'image' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.image', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.image', 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig('image', [ 'appearance' => [ 'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference' @@ -126,7 +125,7 @@ ], 'oai_label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.oai_label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.oai_label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -136,7 +135,7 @@ ], 'oai_base' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.oai_base', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.oai_base', 'config' => [ 'type' => 'input', 'size' => 30, @@ -147,7 +146,7 @@ ], 'opac_label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.opac_label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.opac_label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -157,7 +156,7 @@ ], 'opac_base' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.opac_base', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.opac_base', 'config' => [ 'type' => 'input', 'size' => 30, @@ -168,7 +167,7 @@ ], 'union_label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.union_label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.union_label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -178,7 +177,7 @@ ], 'union_base' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.union_base', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.union_base', 'config' => [ 'type' => 'input', 'size' => 30, @@ -189,7 +188,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.tab1,label,--palette--;;1,website,contact,image,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_libraries.tab3,oai_label,--palette--;;2,opac_label,--palette--;;3,union_label,--palette--;;4'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.tab1,label,--palette--;;1,website,contact,image,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_libraries.tab3,oai_label,--palette--;;2,opac_label,--palette--;;3,union_label,--palette--;;4'], ], 'palettes' => [ '1' => ['showitem' => 'index_name'], diff --git a/Configuration/TCA/tx_dlf_mail.php b/Configuration/TCA/tx_dlf_mail.php index 3ac2728acc..b8cd2a4756 100644 --- a/Configuration/TCA/tx_dlf_mail.php +++ b/Configuration/TCA/tx_dlf_mail.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_mail', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_mail', 'label' => 'label', 'sortby' => 'sorting', 'delete' => 'deleted', @@ -24,7 +24,7 @@ ], 'columns' => [ 'label' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_mail', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_mail', 'config' => [ 'type' => 'input', 'size' => 30, @@ -34,7 +34,7 @@ ], ], 'name' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_mail.name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_mail.name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -43,7 +43,7 @@ ], ], 'mail' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_mail.mail', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_mail.mail', 'config' => [ 'type' => 'input', 'size' => 30, @@ -54,7 +54,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_mail.tab1,label,name,mail'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_mail.tab1,label,name,mail'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_metadata.php b/Configuration/TCA/tx_dlf_metadata.php index 4bdb97b53c..4db0cc5c17 100644 --- a/Configuration/TCA/tx_dlf_metadata.php +++ b/Configuration/TCA/tx_dlf_metadata.php @@ -12,13 +12,12 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata', 'label' => 'label', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'sortby' => 'sorting', 'delete' => 'deleted', @@ -77,7 +76,7 @@ ], 'label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -89,7 +88,7 @@ 'index_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -106,7 +105,7 @@ 'format' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.format', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.format', 'config' => [ 'type' => 'inline', 'foreign_table' => 'tx_dlf_metadataformat', @@ -129,7 +128,7 @@ ], 'default_value' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.default_value', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.default_value', 'config' => [ 'type' => 'input', 'size' => 30, @@ -140,7 +139,7 @@ ], 'wrap' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.wrap', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.wrap', 'config' => [ 'behaviour' => [ 'allowLanguageSynchronization' => true @@ -158,7 +157,7 @@ 'index_tokenized' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_tokenized', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_tokenized', 'config' => [ 'type' => 'check', 'default' => 0, @@ -167,7 +166,7 @@ 'index_stored' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_stored', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_stored', 'config' => [ 'type' => 'check', 'default' => 0, @@ -176,7 +175,7 @@ 'index_indexed' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_indexed', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_indexed', 'config' => [ 'type' => 'check', 'default' => 1, @@ -185,7 +184,7 @@ 'index_boost' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_boost', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_boost', 'config' => [ 'type' => 'input', 'size' => 5, @@ -197,7 +196,7 @@ 'is_sortable' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.is_sortable', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.is_sortable', 'config' => [ 'type' => 'check', 'default' => 0, @@ -206,7 +205,7 @@ 'is_facet' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.is_facet', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.is_facet', 'config' => [ 'type' => 'check', 'default' => 0, @@ -215,7 +214,7 @@ 'is_listed' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.is_listed', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.is_listed', 'config' => [ 'type' => 'check', 'default' => 0, @@ -224,7 +223,7 @@ 'index_autocomplete' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.index_autocomplete', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.index_autocomplete', 'config' => [ 'type' => 'check', 'default' => 0, @@ -233,12 +232,12 @@ 'status' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.status', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.status', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.status.default', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.status.default', 0], ], 'size' => 1, 'minitems' => 1, @@ -248,7 +247,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.tab1,label,--palette--;;1,format,default_value,wrap,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadata.tab3,hidden,status'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.tab1,label,--palette--;;1,format,default_value,wrap,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadata.tab3,hidden,status'], ], 'palettes' => [ '1' => ['showitem' => 'index_name, --linebreak--, index_tokenized, index_stored, index_indexed, index_boost, --linebreak--, is_sortable, is_facet, is_listed, index_autocomplete'], diff --git a/Configuration/TCA/tx_dlf_metadataformat.php b/Configuration/TCA/tx_dlf_metadataformat.php index 14ccf18450..4baa5c8e0d 100644 --- a/Configuration/TCA/tx_dlf_metadataformat.php +++ b/Configuration/TCA/tx_dlf_metadataformat.php @@ -12,13 +12,12 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat', 'label' => 'encoded', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', // There are no translations of metadataformat records. But to avoid error messages of the datahandler on translating metadata records, we have to add these fields here. - 'transOrigPointerField' => 'l18n_parent', 'delete' => 'deleted', 'iconfile' => 'EXT:dlf/Resources/Public/Icons/txdlfmetadata.png', 'rootLevel' => 0, @@ -66,7 +65,7 @@ ], 'encoded' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat.encoded', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat.encoded', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', @@ -80,7 +79,7 @@ ], 'xpath' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat.xpath', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat.xpath', 'config' => [ 'type' => 'input', 'size' => 30, @@ -91,7 +90,7 @@ ], 'xpath_sorting' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat.xpath_sorting', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat.xpath_sorting', 'config' => [ 'type' => 'input', 'size' => 30, @@ -102,7 +101,7 @@ ], 'mandatory' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat.mandatory', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat.mandatory', 'config' => [ 'type' => 'check', 'default' => 0, @@ -110,7 +109,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_metadataformat.tab1,encoded,xpath,xpath_sorting,mandatory'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_metadataformat.tab1,encoded,xpath,xpath_sorting,mandatory'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_printer.php b/Configuration/TCA/tx_dlf_printer.php index 9a1faee207..c33b21e3be 100644 --- a/Configuration/TCA/tx_dlf_printer.php +++ b/Configuration/TCA/tx_dlf_printer.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_printer', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_printer', 'label' => 'label', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', @@ -24,7 +24,7 @@ ], 'columns' => [ 'label' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_printer.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_printer.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -34,7 +34,7 @@ ], ], 'print' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_printer.printcommand', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_printer.printcommand', 'config' => [ 'type' => 'input', 'size' => 30, @@ -45,7 +45,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_printer.tab1,label,print'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_printer.tab1,label,print'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_solrcores.php b/Configuration/TCA/tx_dlf_solrcores.php index 12f2edf6d4..2f5dc68ae6 100644 --- a/Configuration/TCA/tx_dlf_solrcores.php +++ b/Configuration/TCA/tx_dlf_solrcores.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_solrcores', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_solrcores', 'label' => 'label', 'tstamp' => 'tstamp', 'crdate' => 'crdate', @@ -27,7 +27,7 @@ ], 'columns' => [ 'label' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_solrcores.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_solrcores.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -37,13 +37,14 @@ ], ], 'index_name' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_solrcores.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_solrcores.index_name', 'config' => [ 'type' => 'input', 'size' => 30, 'max' => 255, 'eval' => 'alphanum,nospace,unique', 'default' => '', + 'readOnly' => 1, 'fieldInformation' => [ 'solrCoreStatus' => [ 'renderType' => 'solrCoreStatus', @@ -53,7 +54,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_solrcores.tab1,label,index_name'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_solrcores.tab1,label,index_name'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TCA/tx_dlf_structures.php b/Configuration/TCA/tx_dlf_structures.php index 6aa9b8d773..92707eb008 100644 --- a/Configuration/TCA/tx_dlf_structures.php +++ b/Configuration/TCA/tx_dlf_structures.php @@ -12,13 +12,12 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures', 'label' => 'label', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', @@ -78,7 +77,7 @@ 'toplevel' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.toplevel', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.toplevel', 'config' => [ 'type' => 'check', 'default' => 0, @@ -87,7 +86,7 @@ ], 'label' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -99,7 +98,7 @@ 'index_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.index_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -116,7 +115,7 @@ 'oai_name' => [ 'exclude' => 1, 'l10n_mode' => 'exclude', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.oai_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.oai_name', 'config' => [ 'type' => 'input', 'size' => 30, @@ -129,12 +128,12 @@ 'exclude' => 1, 'l10n_mode' => 'exclude', 'displayCond' => 'FIELD:toplevel:REQ:true', - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.thumbnail', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.thumbnail', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.thumbnail.self', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.thumbnail.self', 0], ], 'foreign_table' => 'tx_dlf_structures', 'foreign_table_where' => 'AND tx_dlf_structures.pid=###CURRENT_PID### AND tx_dlf_structures.toplevel=0 AND tx_dlf_structures.sys_language_uid IN (-1,0) ORDER BY tx_dlf_structures.label', @@ -146,12 +145,12 @@ ], 'status' => [ 'exclude' => 1, - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.status', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.status', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ - ['LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.status.default', 0], + ['LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.status.default', 0], ], 'size' => 1, 'minitems' => 1, @@ -161,7 +160,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.tab1,toplevel,label,--palette--;;1,thumbnail,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_structures.tab3,hidden,status'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.tab1,toplevel,label,--palette--;;1,thumbnail,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.tab2,sys_language_uid,l18n_parent,l18n_diffsource,--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_structures.tab3,hidden,status'], ], 'palettes' => [ '1' => ['showitem' => 'index_name, --linebreak--, oai_name'], diff --git a/Configuration/TCA/tx_dlf_tokens.php b/Configuration/TCA/tx_dlf_tokens.php index 331ac91537..997ce00ab1 100644 --- a/Configuration/TCA/tx_dlf_tokens.php +++ b/Configuration/TCA/tx_dlf_tokens.php @@ -12,7 +12,7 @@ return [ 'ctrl' => [ - 'title' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_tokens', + 'title' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_tokens', 'label' => 'token', 'tstamp' => 'tstamp', 'crdate' => 'crdate', @@ -22,12 +22,9 @@ 'rootLevel' => -1, 'searchFields' => 'token', ], - 'interface' => [ - 'showRecordFieldList' => 'token,options', - ], 'columns' => [ 'token' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_tokens.label', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_tokens.label', 'config' => [ 'type' => 'input', 'size' => 30, @@ -37,7 +34,7 @@ ], ], 'options' => [ - 'label' => 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_tokens.index_name', + 'label' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_tokens.index_name', 'config' => [ 'type' => 'input', 'eval' => 'alphanum,nospace', @@ -46,7 +43,7 @@ ], ], 'types' => [ - '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_tokens.tab1,token,options'], + '0' => ['showitem' => '--div--;LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_tokens.tab1,token,options'], ], 'palettes' => [ '1' => ['showitem' => ''], diff --git a/Configuration/TypoScript/Toolbox/setup.typoscript b/Configuration/TypoScript/Toolbox/setup.typoscript index 1b4774e50f..f29e440b00 100644 --- a/Configuration/TypoScript/Toolbox/setup.typoscript +++ b/Configuration/TypoScript/Toolbox/setup.typoscript @@ -1,11 +1,23 @@ -plugin.tx_dlf_fulltexttool.settings.activateFullTextInitially = 0 -plugin.tx_dlf_fulltexttool.settings.fullTextScrollElement = html, body -plugin.tx_dlf_fulltexttool.settings.searchHlParameters = tx_dlf[highlight_word] -plugin.tx_dlf_searchindocumenttool.settings.searchUrl = -plugin.tx_dlf_searchindocumenttool.settings.documentIdUrlSchema = -plugin.tx_dlf_searchindocumenttool.settings.idInputName = tx_dlf[id] -plugin.tx_dlf_searchindocumenttool.settings.queryInputName = tx_dlf[query] -plugin.tx_dlf_searchindocumenttool.settings.startInputName = tx_dlf[start] -plugin.tx_dlf_searchindocumenttool.settings.pageInputName = tx_dlf[page] -plugin.tx_dlf_searchindocumenttool.settings.highlightWordInputName = tx_dlf[highlight_word] -plugin.tx_dlf_searchindocumenttool.settings.encryptedInputName = tx_dlf[encrypted] +plugin.tx_dlf_fulltexttool { + settings { + tool = fulltexttool + activateFullTextInitially = 0 + fullTextScrollElement = html, body + searchHlParameters = tx_dlf[highlight_word] + } +} + +plugin.tx_dlf_searchindocumenttool { + settings { + tool = searchindocumenttool + searchUrl = + documentIdUrlSchema = + idInputName = tx_dlf[id] + pidInputName = tx_dlf[pid] + queryInputName = tx_dlf[query] + startInputName = tx_dlf[start] + pageInputName = tx_dlf[page] + highlightWordInputName = tx_dlf[highlight_word] + encryptedInputName = tx_dlf[encrypted] + } +} diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript index 8db181bfcc..211c9c913b 100644 --- a/Configuration/TypoScript/setup.typoscript +++ b/Configuration/TypoScript/setup.typoscript @@ -104,3 +104,18 @@ plugin.tx_dlf_search { } } } + +plugin.tx_dlf_tableofcontents { + settings { + titleReplacements { + 0 { + type = issue + fields = type,year + } + 1 { + type = volume + fields = type,volume + } + } + } +} diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 2b36204258..d5308c6856 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -20,6 +20,15 @@ ## Future Changes +### TCA type "language" +The TCA field 'sys_language_uid' of table 'tx_dlf_collections' is defined as the 'languageField' and should therefore use the TCA type 'language' instead of TCA type 'select' with 'foreign_table=sys_language' or 'special=languages'. + +### Forward() in controller actions will be removed in TYPO3 12 + +Instead of calling $this->forward() the controller action must return a ForwardResponse + +https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/11.0/Deprecation-92815-ActionControllerForward.html + ### Pagination Widget will be removed in TYPO3 11 https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/11.0/Breaking-92529-AllFluidWidgetFunctionalityRemoved.html @@ -36,12 +45,11 @@ Before running any of the tests, please install the project dependencies. Choose ```bash # If you use PHP 7.3 or 7.4 (supported by Kitodo) -composer update --with=typo3/cms-core:^9.5 composer update --with=typo3/cms-core:^10.4 # If you use PHP 8 -composer install-via-docker -- -t 9.5 composer install-via-docker -- -t 10.4 +composer install-via-docker -- -t 11.5 ``` ### Quick Start diff --git a/Documentation/Administrator/Index.rst b/Documentation/Administrator/Index.rst index c3c4d3e2ef..2bb2acc53d 100644 --- a/Documentation/Administrator/Index.rst +++ b/Documentation/Administrator/Index.rst @@ -172,7 +172,7 @@ This is not possible anymore, but instead they must be included via the overarch // After lib.imagemanipulation < tt_content.list.20.dlf_toolbox { settings { - tools = imagemanipulationtool + tool = imagemanipulationtool } } diff --git a/Documentation/Plugins/Index.rst b/Documentation/Plugins/Index.rst index 2f43f5fcd3..068e6cfcb2 100644 --- a/Documentation/Plugins/Index.rst +++ b/Documentation/Plugins/Index.rst @@ -250,6 +250,9 @@ The collection plugin shows one collection, all collections or selected collecti Data type :Default: Default + :Description: + Description + - :Property: collections @@ -257,6 +260,14 @@ The collection plugin shows one collection, all collections or selected collecti :ref:`t3tsref:data-type-list` :Default: + - :Property: + childrenRows + :Data Type: + :ref:`t3tsref:data-type-integer` + :Default: + :Description: + It defines for how many children documents metadata should be fetched + - :Property: show_userdefined :Data Type: @@ -693,6 +704,8 @@ Search Data type :Default: Default + :Description: + Description - :Property: fulltext @@ -700,6 +713,28 @@ Search :ref:`t3tsref:data-type-boolean` :Default: + - :Property: + fulltextPreselect + :Data Type: + :ref:`t3tsref:data-type-boolean` + :Default: + 0 + + - :Property: + datesearch + :Data Type: + :ref:`t3tsref:data-type-boolean` + :Default: + 0 + + - :Property: + childrenRows + :Data Type: + :ref:`t3tsref:data-type-integer` + :Default: + :Description: + It defines for how many children documents metadata should be fetched + - :Property: solrcore :Data Type: @@ -832,6 +867,8 @@ Table Of Contents Data type :Default: Default + :Description: + Description - :Property: excludeOther_ @@ -859,6 +896,24 @@ Table Of Contents :ref:`t3tsref:data-type-page-id` :Default: + - :Property: + titleReplacement + :Data Type: + :ref:`t3tsref:data-type-list` + :Default: + :Description: + List containing types for which title should be replaced + when the label is empty. The defined fields are used for + replacement. Example data: + 0 { + type = issue + fields = type,year + } + 1 { + type = volume + fields = type,volume + } + Toolbox ------- diff --git a/Resources/Private/Data/de.iso-639-1.xlf b/Resources/Private/Data/de.iso-639-1.xlf new file mode 100644 index 0000000000..19e0188456 --- /dev/null +++ b/Resources/Private/Data/de.iso-639-1.xlf @@ -0,0 +1,576 @@ + + + +
+ LFEditor +
+ + + Afar + Afar + + + Abkhazian + Abchasisch + + + Afrikaans + Afrikaans + + + Amharic + Amharisch + + + Arabic + Arabisch + + + Assamese + Assamesisch + + + Aymara + Aymara + + + Azerbaijani + Aserbaidschanisch + + + Bashkir + Baschkirisch + + + Byelorussian + Belorussisch + + + Bulgarian + Bulgarisch + + + Bihari + Biharisch + + + Bislama + Bislamisch + + + Bengali + Bengalisch + + + Tibetan + Tibetanisch + + + Breton + Bretonisch + + + Catalan + Katalanisch + + + Corsican + Korsisch + + + Czech + Tschechisch + + + Welsh + Walisisch + + + Danish + Dänisch + + + German + Deutsch + + + Dzongkha + Dzongkha, Bhutani + + + Greek + Griechisch + + + English + Englisch + + + Esperanto + Esperanto + + + Spanish + Spanisch + + + Estonian + Estnisch + + + Basque + Baskisch + + + Persian + Persisch + + + Finnish + Finnisch + + + Fijian + Fiji + + + Faroese + Färöisch + + + French + Französisch + + + Frisian + Friesisch + + + Irish + Irisch + + + Scottish Gaelic + Schottisches Gälisch + + + Galician + Galizisch + + + Guarani + Guarani + + + Gujarati + Gujaratisch + + + Hausa + Haussa + + + Hebrew + Hebräisch + + + Hindi + Hindi + + + Croatian + Kroatisch + + + Hungarian + Ungarisch + + + Armenian + Armenisch + + + Interlingua + Interlingua + + + Indonesian + Indonesisch + + + Interlingue, Occidental + Interlingue + + + Inupiak + Inupiak + + + Icelandic + Isländisch + + + Italian + Italienisch + + + Inuktitut + Inuktitut (Eskimo) + + + Hebrew + Hebräisch + + + Japanese + Japanisch + + + Yiddish + Jiddish + + + Javanese + + + Javanese + + + Georgian + Georgisch + + + Kazakh + Kasachisch + + + Kalaallisut, Greenlandic + Kalaallisut (Grönländisch) + + + Khmer + Kambodschanisch + + + Kannada + Kannada + + + Korean + Koreanisch + + + Kashmiri + Kaschmirisch + + + Kurdish + Kurdisch + + + Kirghiz, Kyrgyz + Kirgisisch + + + Latin + Lateinisch + + + Lingala + Lingala + + + Lao + Laotisch + + + Lithuanian + Litauisch + + + Latvian + Lettisch + + + Malagasy + Malagasisch + + + Maori + Maorisch + + + Macedonian + Mazedonisch + + + Malayalam + Malajalam + + + Mongolian + Mongolisch + + + Moldavian + Moldavisch + + + Marathi + Marathi + + + Malay + Malaysisch + + + Maltese + Maltesisch + + + Burmese + Burmesisch + + + Nauru + Nauruisch + + + Nepali + Nepalesisch + + + Dutch + Holländisch + + + Norwegian + Norwegisch + + + Occitan + Okzitanisch + + + Oromo + Oromo + + + Oriya + Oriya + + + Panjabi + Pundjabisch + + + Polish + Polnisch + + + Pushto + Paschtu + + + Portuguese + Portugiesisch + + + Quechua + Quechua + + + Romansh + Rätoromanisch + + + Rundi + Kirundisch + + + Romanian + Rumänisch + + + Russian + Russisch + + + Kinyarwanda + Kijarwanda + + + Sanskrit + Sanskrit + + + Sindhi + Zinti + + + Sango + Sango + + + Serbo-Croatian + Serbokroatisch + + + Sinhalese + Singhalesisch + + + Slovak + Slowakisch + + + Slovenian + Slowenisch + + + Samoan + Samoanisch + + + Shona + Schonisch + + + Somali + Somalisch + + + Albanian + Albanisch + + + Serbian + Serbisch + + + Swati + Swasiländisch + + + Southern Sotho + Sesothisch + + + Sundanese + Sudanesisch + + + Swedish + Schwedisch + + + Swahili + Suaheli + + + Tamil + Tamilisch + + + Telugu + Tegulu + + + Tajik + Tadschikisch + + + Thai + Thai + + + Tigrinya + Tigrinja + + + Turkmen + Turkmenisch + + + Tagalog + Tagalog + + + Tswana + Sezuan + + + Tonga + Tongaisch + + + Turkish + Türkisch + + + Tsonga + Tsongaisch + + + Tatar + Tatarisch + + + Twi + Twi + + + Uighur + Uigur + + + Ukrainian + Ukrainisch + + + Urdu + Urdu + + + Uzbek + Usbekisch + + + Vietnamese + Vietnamesisch + + + Volapük + Volapük + + + Wolof + Wolof + + + Xhosa + Xhosa + + + Yiddish + Jiddish + + + Yoruba + Joruba + + + Zhuang + Zhuang + + + Chinese + Chinesisch + + + Zulu + Zulu + + +
+
diff --git a/Resources/Private/Data/de.iso-639-2b.xlf b/Resources/Private/Data/de.iso-639-2b.xlf new file mode 100644 index 0000000000..1e9b348918 --- /dev/null +++ b/Resources/Private/Data/de.iso-639-2b.xlf @@ -0,0 +1,1954 @@ + + + +
+ LFEditor +
+ + + Afar + Danakil-Sprache + + + Abkhazian + Abchasisch + + + Achinese + Aceh-Sprache + + + Acoli + Acholi-Sprache + + + Adangme + Adangme-Sprache + + + Adyghe, Adygei + Adygisch + + + Afro-Asiatic languages + Hamitosemitische Sprachen + + + Afrihili + Afrihili + + + Afrikaans + Afrikaans + + + Ainu + Ainu-Sprache + + + Akan + Akan-Sprache + + + Akkadian + Akkadisch + + + Albanian + Albanisch + + + Aleut + Aleutisch + + + Algonquian languages + Algonkin-Sprachen + + + Southern Altai + Altaisch + + + Amharic + Amharisch + + + Old English (ca.450-1100) + Altenglisch (ca.450-1100) + + + Angika + Anga-Sprache + + + Apache languages + Apachen-Sprachen + + + Arabic + Arabisch + + + Official/Imperial Aramaic (700-300 BCE) + Aramäisch (700-300 v.Chr.) + + + Aragonese + Aragonesisch + + + Armenian + Armenisch + + + Mapudungun, Mapuche + Arauka-Sprachen + + + Arapaho + Arapaho-Sprache + + + Artificial languages + Kunstsprachen + + + Arawak + Arawak-Sprachen + + + Assamese + Assamesisch + + + Asturian, Bable, Leonese, Asturleonese + Asturisch + + + Athapascan languages + Athapaskische Sprachen + + + Australian languages + Australische Sprachen + + + Avaric + Awarisch + + + Avestan + Avestisch + + + Awadhi + Awadhī + + + Aymara + Aymará-Sprache + + + Azerbaijani + Aserbeidschanisch + + + Banda languages + Banda-Sprachen (Ubangi-Sprachen) + + + Bamileke languages + Bamileke-Sprachen + + + Bashkir + Baschkirisch + + + Baluchi + Belutschisch + + + Bambara + Bambara-Sprache + + + Balinese + Balinesisch + + + Basque + Baskisch + + + Basa + Basaa-Sprache + + + Baltic languages + Baltische Sprachen + + + Beja, Bedawiyet + Bedauye + + + Byelorussian + Weißrussisch + + + Bemba + Bemba-Sprache + + + Bengali + Bengali + + + Berber languages + Berbersprachen + + + Bhojpuri + Bhojpurī + + + Bihari languages + Bihari + + + Bikol + Bikol-Sprache + + + Bini, Edo + Edo-Sprache + + + Bislama + Beach-la-mar + + + Siksika + Blackfoot-Sprache + + + Bantu + Bantusprachen + + + Bosnian + Bosnisch + + + Braj + Braj-Bhakha + + + Breton + Bretonisch + + + Batak languages + Batak-Sprache + + + Buriat + Burjatisch + + + Buginese + Bugi-Sprache + + + Bulgarian + Bulgarisch + + + Burmese + Birmanisch + + + Blin, Bilin + Bilin-Sprache + + + Caddo + Caddo-Sprachen + + + Central American Indian languages + Zentralamerikanische Indianersprachen + + + Galibi Carib + Karibische Sprachen + + + Catalan, Valencian + Katalanisch + + + Caucasian languages + Kaukasische Sprachen + + + Cebuano + Cebuano + + + Celtic languages + Keltische Sprachen + + + Chamorro + Chamorro-Sprache + + + Chibcha + Chibcha-Sprachen + + + Chechen + Tschetschenisch + + + Chagatai + Tschagataisch + + + Chinese + Chinesisch + + + Chuukese + Trukesisch + + + Mari + Tscheremissisch + + + Chinook jargon + Chinook-Jargon + + + Choctaw + Choctaw-Sprache + + + Chipewyan, Dene Suline + Chipewyan-Sprache + + + Cherokee + Cherokee-Sprache + + + Church Slavic, Old Bulgarian + Kirchenslawisch + + + Chuvash + Tschuwaschisch + + + Cheyenne + Cheyenne-Sprache + + + Chamic languages + Cham-Sprachen + + + Coptic + Koptisch + + + Cornish + Kornisch + + + Corsican + Korsisch + + + English-based Creoles and pidgins + Kreolisch-Englisch + + + French-based Creoles and pidgins + Kreolisch-Französisch + + + Portuguese-based Creoles and pidgins + Kreolisch-Portugiesisch + + + Cree + Cree-Sprache + + + Crimean Tatar, Crimean Turkish + Krimtatarisch + + + Creoles and pidgins + Kreolische Sprachen, Pidginsprachen + + + Kashubian + Kaschubisch + + + Cushitic languages + Kuschitische Sprachen + + + Czech + Tschechisch + + + Dakota + Dakota-Sprache + + + Danish + Dänisch + + + Dargwa + Darginisch + + + Land Dayak languages + Dajakisch + + + Delaware + Delaware-Sprache + + + Slave (Athapascan) + Slave-Sprache + + + Dogrib + Dogrib-Sprache + + + Dinka + Dinka-Sprache + + + Divehi, Dhivehi, Maldivian + Maledivisch + + + Dogri + Dogrī + + + Dravidian languages + Drawidische Sprachen + + + Lower Sorbian + Niedersorbisch + + + Duala + Duala-Sprachen + + + Middle Dutch (ca.1050-1350) + Mittelniederländisch (ca.1050-1350) + + + Dutch + Niederländisch + + + Dyula + Dyula-Sprache + + + Dzongkha + Dzongkha + + + Efik + Efik + + + Ancient Egyptian + Ägyptisch + + + Ekajuk + Ekajuk + + + Elamite + Elamisch + + + English + Englisch + + + Middle English (1100-1500) + Mittelenglisch (1100-1500) + + + Esperanto + Esperanto + + + Estonian + Estnisch + + + Ewe + Ewe-Sprache + + + Ewondo + Ewondo + + + Fang + Pangwe-Sprache + + + Faroese + Färöisch + + + Fanti + Fante-Sprache + + + Fijian + Fidschi-Sprache + + + Filipino, Pilipino + Pilipino + + + Finnish + Finnisch + + + Finno-Ugrian languages + Finnougrische Sprachen + + + Fon + Fon-Sprache + + + French + Französisch + + + Middle French (ca.1400-1600) + Mittelfranzösisch (ca.1400-1600) + + + Old French (842-ca.1400) + Altfranzösisch (842-ca.1400) + + + Northern Frisian + Nordfriesisch + + + Eastern Frisian + Ostfriesisch + + + Western Frisian + Friesisch + + + Fulah + Ful + + + Friulian + Friulisch + + + Ga + Ga-Sprache + + + Gayo + Gayo-Sprache + + + Gbaya + Gbaya-Sprache + + + Germanic languages + Germanische Sprachen + + + Georgian + Georgisch + + + German + Deutsch + + + Geez + Altäthiopisch + + + Gilbertese + Gilbertesisch + + + Gaelic, Scottish Gaelic + Gälisch-Schottisch + + + Irish + Irisch + + + Galician + Galicisch + + + Manx + Manx + + + Middle High German (ca.1050-1500) + Mittelhochdeutsch (ca.1050-1500) + + + Old High German (ca.750-1050) + Althochdeutsch (ca.750-1050) + + + Gondi + Gondi-Sprache + + + Gorontalo + Gorontalesisch + + + Gothic + Gotisch + + + Grebo + Grebo-Sprache + + + Ancient Greek (to 1453) + Griechisch (bis 1453) + + + Modern Greek (1453-) + Neugriechisch (ab 1453) + + + Guarani + Guaraní-Sprache + + + Swiss German, Alemannic, Alsatian + Schweizerdeutsch + + + Gujarati + Gujarātī-Sprache + + + Gwich'in + Kutchin-Sprache + + + Haida + Haida-Sprache + + + Haitian, Haitian Creole + Haïtien (Haiti-Kreolisch) + + + Hausa + Haussa-Sprache + + + Hawaiian + Hawaiisch + + + Hebrew + Hebräisch + + + Herero + Herero-Sprache + + + Hiligaynon + Hiligaynon-Sprache + + + Himachali languages, Western Pahari languages + Himachali + + + Hindi + Hindi + + + Hittite + Hethitisch + + + Hmong, Mong + Miao-Sprachen + + + Hiri Motu + Hiri-Motu + + + Croatian + Kroatisch + + + Upper Sorbian + Obersorbisch + + + Hungarian + Ungarisch + + + Hupa + Hupa-Sprache + + + Iban + Iban-Sprache + + + Igbo + Ibo-Sprache + + + Icelandic + Isländisch + + + Ido + Ido + + + Sichuan Yi, Nuosu + Lalo-Sprache + + + Ijo languages + Ijo-Sprache + + + Inuktitut + Inuktitut + + + Interlingue, Occidental + Interlingue + + + Iloko + Ilokano-Sprache + + + Interlingua + Interlingua + + + Indic languages + Indoarische Sprachen + + + Indonesian + Bahasa Indonesia + + + Indo-European languages + Indogermanische Sprachen + + + Ingush + Inguschisch + + + Inupiak + Inupik + + + Iranian languages + Iranische Sprachen + + + Iroquoian languages + Irokesische Sprachen + + + Italian + Italienisch + + + Javanese + Javanisch + + + Javanese + Javanisch + + + Lojban + Lojban + + + Japanese + Japanisch + + + Judeo-Persian + Jüdisch-Persisch + + + Judeo-Arabic + Jüdisch-Arabisch + + + Kara-Kalpak + Karakalpakisch + + + Kabyle + Kabylisch + + + Kachin, Jingpho + Kachin-Sprache + + + Kalaallisut, Greenlandic + Grönländisch + + + Kamba + Kamba-Sprache + + + Kannada + Kannada + + + Karen languages + Karenisch + + + Kashmiri + Kaschmiri + + + Kanuri + Kanuri-Sprache + + + Kawi + Kawi + + + Kazakh + Kasachisch + + + Kabardian + Kabardinisch + + + Khasi + Khasi-Sprache + + + Khoisan languages + Khoisan-Sprachen + + + Khmer + Kambodschanisch + + + Khotanese, Sakan + Sakisch + + + Kikuyu, Gikuyu + Kikuyu-Sprache + + + Kinyarwanda + Rwanda-Sprache + + + Kirghiz, Kyrgyz + Kirgisisch + + + Kimbundu + Kimbundu-Sprache + + + Konkani + Konkani + + + Komi + Komi-Sprache + + + Kongo + Kongo-Sprache + + + Korean + Koreanisch + + + Kosraean + Kosraeanisch + + + Kpelle + Kpelle-Sprache + + + Karachay-Balkar + Karatschaiisch-Balkarisch + + + Karelian + Karelisch + + + Kru languages + Kru-Sprachen + + + Kurukh + Oraon-Sprache + + + Kuanyama, Kwanyama + Kwanyama-Sprache + + + Kumyk + Kumükisch + + + Kurdish + Kurdisch + + + Kutenai + Kutenai-Sprache + + + Ladino + Judenspanisch + + + Lahnda + Lahndā + + + Lamba + Lamba-Sprache (Bantusprache) + + + Lao + Laotisch + + + Latin + Latein + + + Latvian + Lettisch + + + Lezghian + Lesgisch + + + Limburgan, Limburgish + Limburgisch + + + Lingala + Lingala + + + Lithuanian + Litauisch + + + Mongo + Mongo-Sprache + + + Lozi + Rotse-Sprache + + + Luxembourgish, Letzeburgesch + Luxemburgisch + + + Luba-Lulua + Lulua-Sprache + + + Luba-Katanga + Luba-Katanga-Sprache + + + Ganda + Ganda-Sprache + + + Luiseno + Luiseño-Sprache + + + Lunda + Lunda-Sprache + + + Luo (Kenya and Tanzania) + Luo-Sprache + + + Lushai + Lushai-Sprache + + + Macedonian + Makedonisch + + + Madurese + Maduresisch + + + Magahi + Khotta + + + Marshallese + Marschallesisch + + + Maithili + Maithili + + + Makasar + Makassarisch + + + Malayalam + Malayalam + + + Mandingo + Malinke-Sprache + + + Maori + Maori-Sprache + + + Austronesian languages + Austronesische Sprachen + + + Marathi + Marathi + + + Masai + Massai-Sprache + + + Malay + Malaiisch + + + Moksha + Mokscha-Sprache + + + Mandar + Mandaresisch + + + Mende + Mende-Sprache + + + Middle Irish (900-1200) + Mittelirisch (900-1200) + + + Mi'kmaq, Micmac + Micmac-Sprache + + + Minangkabau + Minangkabau-Sprache + + + Uncoded languages + Einzelne andere Sprachen + + + Mon-Khmer languages + Mon-Khmer-Sprachen + + + Malagasy + Malagassi-Sprache + + + Maltese + Maltesisch + + + Manchu + Mandschurisch + + + Manipuri + Meithei-Sprache + + + Manobo languages + Manobo-Sprachen + + + Mohawk + Mohawk-Sprache + + + Moldavian + Moldavisch + + + Mongolian + Mongolisch + + + Mossi + Mossi-Sprache + + + Multiple languages + Mehrere Sprachen + + + Munda languages + Mundasprachen + + + Creek + Muskogisch + + + Mirandese + Mirandesisch + + + Marwari + Mārwārī + + + Mayan languages + Maya-Sprachen + + + Erzya + Erza-Mordwinisch + + + Nahuatl languages + Nahuatl + + + North American Indian languages + Nordamerikanische Indianersprachen + + + Neapolitan + Neapel (Mundart) + + + Nauru + Nauruanisch + + + Navajo, Navaho + Navajo-Sprache + + + South Ndebele + Ndebele-Sprache (Transvaal) + + + North Ndebele + Ndebele-Sprache (Simbabwe) + + + Ndonga + Ndonga + + + Low German, Low Saxon + Niederdeutsch + + + Nepali + Nepali + + + Newari, Nepal Bhasa + Newārī + + + Nias + Nias-Sprache + + + Niger-Kordofanian languages + Nigerkordofanische Sprachen + + + Niuean + Niue-Sprache + + + Norwegian Nynorsk + Nynorsk + + + Norwegian Bokmål + Bokmål + + + Nogai + Nogaisch + + + Old Norse + Altnorwegisch + + + Norwegian + Norwegisch + + + N'Ko + N'Ko + + + Pedi, Sepedi, Northern Sotho + Pedi-Sprache + + + Nubian languages + Nubische Sprachen + + + Classical Newari, Classical Nepal Bhasa + Alt-Newārī + + + Chichewa, Chewa, Nyanja + Nyanja-Sprache + + + Nyamwezi + Nyamwezi-Sprache + + + Nyankole + Nkole-Sprache + + + Nyoro + Nyoro-Sprache + + + Nzima + Nzima-Sprache + + + Occitan (post 1500), Provençal + Okzitanisch (ab 1500) + + + Ojibwa + Ojibwa-Sprache + + + Oriya + Oriya-Sprache + + + Oromo + Galla-Sprache + + + Osage + Osage-Sprache + + + Ossetian, Ossetic + Ossetisch + + + Ottoman Turkish (1500-1928) + Osmanisch (1500-1928) + + + Otomian languages + Otomangue-Sprachen + + + Papuan languages + Papuasprachen + + + Pangasinan + Pangasinan-Sprache + + + Pahlavi + Mittelpersisch + + + Pampanga, Kapampangan + Pampanggan-Sprache + + + Panjabi, Punjabi + Pandschabi-Sprache + + + Papiamento + Papiamento + + + Palauan + Palau-Sprache + + + Old Persian (ca.600-400 BCE) + Altpersisch (ca.600-400 v.Chr.) + + + Persian + Persisch + + + Philippine languages + Philippinisch-Austronesisch + + + Phoenician + Phönikisch + + + Pali + Pāli + + + Polish + Polnisch + + + Pohnpeian + Ponapeanisch + + + Portuguese + Portugiesisch + + + Prakrit languages + Prākrit + + + Old Provençal (to 1500) + Altokzitanisch (bis 1500) + + + Pushto + Paschtu + + + Quechua + Quechua-Sprache + + + Rajasthani + Rājasthānī + + + Rapanui + Osterinsel-Sprache + + + Rarotongan, Cook Islands Maori + Rarotonganisch + + + Romance languages + Romanische Sprachen + + + Romansh + Rätoromanisch + + + Romany + Romani (Sprache) + + + Romanian, Moldavian + Rumänisch + + + Rundi + Rundi-Sprache + + + Aromanian, Arumanian, Macedo-Romanian + Aromunisch + + + Russian + Russisch + + + Sandawe + Sandawe-Sprache + + + Sango + Sango-Sprache + + + Yakut + Jakutisch + + + South American Indian + Südamerikanische Indianersprachen + + + Salishan languages + Salish-Sprache + + + Samaritan Aramaic + Samaritanisch + + + Sanskrit + Sanskrit + + + Sasak + Sasak + + + Santali + Santālī + + + Sicilian + Sizilianisch + + + Scots + Schottisch + + + Selkup + Selkupisch + + + Semitic languages + Semitische Sprachen + + + Old Irish (to 900) + Altirisch (bis 900) + + + Sign Languages + Zeichensprachen + + + Shan + Schan-Sprache + + + Sidamo + Sidamo-Sprache + + + Sinhalese + Singhalesisch + + + Siouan languages + Sioux-Sprachen + + + Sino-Tibetan languages + Sinotibetische Sprachen + + + Slavic languages + Slawische Sprachen + + + Slovak + Slowakisch + + + Slovenian + Slowenisch + + + Southern Sami + Südsaamisch + + + Northern Sami + Nordsaamisch + + + Sami languages + Saamisch + + + Lule Sami + Lulesaamisch + + + Inari Sami + Inarisaamisch + + + Samoan + Samoanisch + + + Skolt Sami + Skoltsaamisch + + + Shona + Schona-Sprache + + + Sindhi + Sindhi-Sprache + + + Soninke + Soninke-Sprache + + + Sogdian + Sogdisch + + + Somali + Somali + + + Songhai languages + Songhai-Sprache + + + Southern Sotho + Süd-Sotho-Sprache + + + Spanish, Castilian + Spanisch + + + Sardinian + Sardisch + + + Sranan Tongo + Sranantongo + + + Serbian + Serbisch + + + Serer + Serer-Sprache + + + Nilo-Saharan languages + Nilosaharanische Sprachen + + + Swati + Swasi-Sprache + + + Sukuma + Sukuma-Sprache + + + Sundanese + Sundanesisch + + + Susu + Susu + + + Sumerian + Sumerisch + + + Swahili + Swahili + + + Swedish + Schwedisch + + + Classical Syriac + Syrisch + + + Syriac + Neuostaramäisch + + + Tahitian + Tahitisch + + + Tai languages + Thaisprachen + + + Tamil + Tamil + + + Tatar + Tatarisch + + + Telugu + Telugu-Sprache + + + Timne + Temne-Sprache + + + Tereno + Tereno-Sprache + + + Tetum + Tetum-Sprache + + + Tajik + Tadschikisch + + + Tagalog + Tagalog + + + Thai + Thailändisch + + + Tibetan + Tibetisch + + + Tigre + Tigre-Sprache + + + Tigrinya + Tigrinja-Sprache + + + Tiv + Tiv-Sprache + + + Tokelau + Tokelauanisch + + + Klingon + Klingonisch + + + Tlingit + Tlingit-Sprache + + + Tamashek + Tamašeq + + + Tonga (Nyasa) + Tonga (Bantusprache, Sambia) + + + Tonga (Tonga Islands) + Tongaisch + + + Tok Pisin + Neumelanesisch + + + Tsimshian + Tsimshian-Sprache + + + Tswana + Tswana-Sprache + + + Tsonga + Tsonga-Sprache + + + Turkmen + Turkmenisch + + + Tumbuka + Tumbuka-Sprache + + + Tupi languages + Tupi-Sprache + + + Turkish + Türkisch + + + Altaic languages + Altaische Sprachen + + + Tuvalu + Elliceanisch + + + Twi + Twi-Sprache + + + Tuvinian + Tuwinisch + + + Udmurt + Udmurtisch + + + Ugaritic + Ugaritisch + + + Uighur + Uigurisch + + + Ukrainian + Ukrainisch + + + Umbundu + Mbundu-Sprache + + + Undetermined + Nicht zu entscheiden + + + Urdu + Urdu + + + Uzbek + Usbekisch + + + Vai + Vai-Sprache + + + Venda + Venda-Sprache + + + Vietnamese + Vietnamesisch + + + Volapük + Volapük + + + Votic + Wotisch + + + Wakashan languages + Wakash-Sprachen + + + Walamo + Walamo-Sprache + + + Waray + Waray + + + Washo + Washo-Sprache + + + Welsh + Kymrisch + + + Sorbian languages + Sorbisch + + + Walloon + Wallonisch + + + Wolof + Wolof-Sprache + + + Kalmyk, Oirat + Kalmückisch + + + Xhosa + Xhosa-Sprache + + + Yao + Yao-Sprache (Bantusprache) + + + Yapese + Yapesisch + + + Yiddish + Jiddisch + + + Yoruba + Yoruba-Sprache + + + Yupik languages + Ypik-Sprachen + + + Zapotec + Zapotekisch + + + Blissymbolics + Bliss-Symbol + + + Zenaga + Zenaga + + + Zhuang + Zhuang + + + Zande languages + Zande-Sprachen + + + Zulu + Zulu-Sprache + + + Zuni + Zuñi-Sprache + + + No linguistic content + Kein linguistischer Inhalt + + + Zazaki + Zazaki + + +
+
diff --git a/Resources/Private/Data/iso-639-1.xlf b/Resources/Private/Data/iso-639-1.xlf new file mode 100644 index 0000000000..bb99882973 --- /dev/null +++ b/Resources/Private/Data/iso-639-1.xlf @@ -0,0 +1,436 @@ + + + +
+ LFEditor +
+ + + Afar + + + Abkhazian + + + Afrikaans + + + Amharic + + + Arabic + + + Assamese + + + Aymara + + + Azerbaijani + + + Bashkir + + + Byelorussian + + + Bulgarian + + + Bihari + + + Bislama + + + Bengali + + + Tibetan + + + Breton + + + Catalan + + + Corsican + + + Czech + + + Welsh + + + Danish + + + German + + + Dzongkha + + + Greek + + + English + + + Esperanto + + + Spanish + + + Estonian + + + Basque + + + Persian + + + Finnish + + + Fijian + + + Faroese + + + French + + + Frisian + + + Irish + + + Scottish Gaelic + + + Galician + + + Guarani + + + Gujarati + + + Hausa + + + Hebrew + + + Hindi + + + Croatian + + + Hungarian + + + Armenian + + + Interlingua + + + Indonesian + + + Interlingue, Occidental + + + Inupiak + + + Icelandic + + + Italian + + + Inuktitut + + + Hebrew + + + Japanese + + + Yiddish + + + Javanese + + + Javanese + + + Georgian + + + Kazakh + + + Kalaallisut, Greenlandic + + + Khmer + + + Kannada + + + Korean + + + Kashmiri + + + Kurdish + + + Kirghiz, Kyrgyz + + + Latin + + + Lingala + + + Lao + + + Lithuanian + + + Latvian + + + Malagasy + + + Maori + + + Macedonian + + + Malayalam + + + Mongolian + + + Moldavian + + + Marathi + + + Malay + + + Maltese + + + Burmese + + + Nauru + + + Nepali + + + Dutch + + + Norwegian + + + Occitan + + + Oromo + + + Oriya + + + Panjabi + + + Polish + + + Pushto + + + Portuguese + + + Quechua + + + Romansh + + + Rundi + + + Romanian + + + Russian + + + Kinyarwanda + + + Sanskrit + + + Sindhi + + + Sango + + + Serbo-Croatian + + + Sinhalese + + + Slovak + + + Slovenian + + + Samoan + + + Shona + + + Somali + + + Albanian + + + Serbian + + + Swati + + + Southern Sotho + + + Sundanese + + + Swedish + + + Swahili + + + Tamil + + + Telugu + + + Tajik + + + Thai + + + Tigrinya + + + Turkmen + + + Tagalog + + + Tswana + + + Tonga + + + Turkish + + + Tsonga + + + Tatar + + + Twi + + + Uighur + + + Ukrainian + + + Urdu + + + Uzbek + + + Vietnamese + + + Volapük + + + Wolof + + + Xhosa + + + Yiddish + + + Yoruba + + + Zhuang + + + Chinese + + + Zulu + + +
+
diff --git a/Resources/Private/Data/iso-639-1.xml b/Resources/Private/Data/iso-639-1.xml deleted file mode 100644 index a907e485d1..0000000000 --- a/Resources/Private/Data/iso-639-1.xml +++ /dev/null @@ -1,296 +0,0 @@ - - - - module - Language labels for ISO 639-1 codes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Resources/Private/Data/iso-639-2b.xlf b/Resources/Private/Data/iso-639-2b.xlf new file mode 100644 index 0000000000..8c8ea1a640 --- /dev/null +++ b/Resources/Private/Data/iso-639-2b.xlf @@ -0,0 +1,1468 @@ + + + +
+ LFEditor +
+ + + Afar + + + Abkhazian + + + Achinese + + + Acoli + + + Adangme + + + Adyghe, Adygei + + + Afro-Asiatic languages + + + Afrihili + + + Afrikaans + + + Ainu + + + Akan + + + Akkadian + + + Albanian + + + Aleut + + + Algonquian languages + + + Southern Altai + + + Amharic + + + Old English (ca.450-1100) + + + Angika + + + Apache languages + + + Arabic + + + Official/Imperial Aramaic (700-300 BCE) + + + Aragonese + + + Armenian + + + Mapudungun, Mapuche + + + Arapaho + + + Artificial languages + + + Arawak + + + Assamese + + + Asturian, Bable, Leonese, Asturleonese + + + Athapascan languages + + + Australian languages + + + Avaric + + + Avestan + + + Awadhi + + + Aymara + + + Azerbaijani + + + Banda languages + + + Bamileke languages + + + Bashkir + + + Baluchi + + + Bambara + + + Balinese + + + Basque + + + Basa + + + Baltic languages + + + Beja, Bedawiyet + + + Byelorussian + + + Bemba + + + Bengali + + + Berber languages + + + Bhojpuri + + + Bihari languages + + + Bikol + + + Bini, Edo + + + Bislama + + + Siksika + + + Bantu + + + Bosnian + + + Braj + + + Breton + + + Batak languages + + + Buriat + + + Buginese + + + Bulgarian + + + Burmese + + + Blin, Bilin + + + Caddo + + + Central American Indian languages + + + Galibi Carib + + + Catalan, Valencian + + + Caucasian languages + + + Cebuano + + + Celtic languages + + + Chamorro + + + Chibcha + + + Chechen + + + Chagatai + + + Chinese + + + Chuukese + + + Mari + + + Chinook jargon + + + Choctaw + + + Chipewyan, Dene Suline + + + Cherokee + + + Church Slavic, Old Bulgarian + + + Chuvash + + + Cheyenne + + + Chamic languages + + + Coptic + + + Cornish + + + Corsican + + + English-based Creoles and pidgins + + + French-based Creoles and pidgins + + + Portuguese-based Creoles and pidgins + + + Cree + + + Crimean Tatar, Crimean Turkish + + + Creoles and pidgins + + + Kashubian + + + Cushitic languages + + + Czech + + + Dakota + + + Danish + + + Dargwa + + + Land Dayak languages + + + Delaware + + + Slave (Athapascan) + + + Dogrib + + + Dinka + + + Divehi, Dhivehi, Maldivian + + + Dogri + + + Dravidian languages + + + Lower Sorbian + + + Duala + + + Middle Dutch (ca.1050-1350) + + + Dutch + + + Dyula + + + Dzongkha + + + Efik + + + Ancient Egyptian + + + Ekajuk + + + Elamite + + + English + + + Middle English (1100-1500) + + + Esperanto + + + Estonian + + + Ewe + + + Ewondo + + + Fang + + + Faroese + + + Fanti + + + Fijian + + + Filipino, Pilipino + + + Finnish + + + Finno-Ugrian languages + + + Fon + + + French + + + Middle French (ca.1400-1600) + + + Old French (842-ca.1400) + + + Northern Frisian + + + Eastern Frisian + + + Western Frisian + + + Fulah + + + Friulian + + + Ga + + + Gayo + + + Gbaya + + + Germanic languages + + + Georgian + + + German + + + Geez + + + Gilbertese + + + Gaelic, Scottish Gaelic + + + Irish + + + Galician + + + Manx + + + Middle High German (ca.1050-1500) + + + Old High German (ca.750-1050) + + + Gondi + + + Gorontalo + + + Gothic + + + Grebo + + + Ancient Greek (to 1453) + + + Modern Greek (1453-) + + + Guarani + + + Swiss German, Alemannic, Alsatian + + + Gujarati + + + Gwich'in + + + Haida + + + Haitian, Haitian Creole + + + Hausa + + + Hawaiian + + + Hebrew + + + Herero + + + Hiligaynon + + + Himachali languages, Western Pahari languages + + + Hindi + + + Hittite + + + Hmong, Mong + + + Hiri Motu + + + Croatian + + + Upper Sorbian + + + Hungarian + + + Hupa + + + Iban + + + Igbo + + + Icelandic + + + Ido + + + Sichuan Yi, Nuosu + + + Ijo languages + + + Inuktitut + + + Interlingue, Occidental + + + Iloko + + + Interlingua + + + Indic languages + + + Indonesian + + + Indo-European languages + + + Ingush + + + Inupiak + + + Iranian languages + + + Iroquoian languages + + + Italian + + + Javanese + + + Javanese + + + Lojban + + + Japanese + + + Judeo-Persian + + + Judeo-Arabic + + + Kara-Kalpak + + + Kabyle + + + Kachin, Jingpho + + + Kalaallisut, Greenlandic + + + Kamba + + + Kannada + + + Karen languages + + + Kashmiri + + + Kanuri + + + Kawi + + + Kazakh + + + Kabardian + + + Khasi + + + Khoisan languages + + + Khmer + + + Khotanese, Sakan + + + Kikuyu, Gikuyu + + + Kinyarwanda + + + Kirghiz, Kyrgyz + + + Kimbundu + + + Konkani + + + Komi + + + Kongo + + + Korean + + + Kosraean + + + Kpelle + + + Karachay-Balkar + + + Karelian + + + Kru languages + + + Kurukh + + + Kuanyama, Kwanyama + + + Kumyk + + + Kurdish + + + Kutenai + + + Ladino + + + Lahnda + + + Lamba + + + Lao + + + Latin + + + Latvian + + + Lezghian + + + Limburgan, Limburgish + + + Lingala + + + Lithuanian + + + Mongo + + + Lozi + + + Luxembourgish, Letzeburgesch + + + Luba-Lulua + + + Luba-Katanga + + + Ganda + + + Luiseno + + + Lunda + + + Luo (Kenya and Tanzania) + + + Lushai + + + Macedonian + + + Madurese + + + Magahi + + + Marshallese + + + Maithili + + + Makasar + + + Malayalam + + + Mandingo + + + Maori + + + Austronesian languages + + + Marathi + + + Masai + + + Malay + + + Moksha + + + Mandar + + + Mende + + + Middle Irish (900-1200) + + + Mi'kmaq, Micmac + + + Minangkabau + + + Uncoded languages + + + Mon-Khmer languages + + + Malagasy + + + Maltese + + + Manchu + + + Manipuri + + + Manobo languages + + + Mohawk + + + Moldavian + + + Mongolian + + + Mossi + + + Multiple languages + + + Munda languages + + + Creek + + + Mirandese + + + Marwari + + + Mayan languages + + + Erzya + + + Nahuatl languages + + + North American Indian languages + + + Neapolitan + + + Nauru + + + Navajo, Navaho + + + South Ndebele + + + North Ndebele + + + Ndonga + + + Low German, Low Saxon + + + Nepali + + + Newari, Nepal Bhasa + + + Nias + + + Niger-Kordofanian languages + + + Niuean + + + Norwegian Nynorsk + + + Norwegian Bokmål + + + Nogai + + + Old Norse + + + Norwegian + + + N'Ko + + + Pedi, Sepedi, Northern Sotho + + + Nubian languages + + + Classical Newari, Classical Nepal Bhasa + + + Chichewa, Chewa, Nyanja + + + Nyamwezi + + + Nyankole + + + Nyoro + + + Nzima + + + Occitan (post 1500), Provençal + + + Ojibwa + + + Oriya + + + Oromo + + + Osage + + + Ossetian, Ossetic + + + Ottoman Turkish (1500-1928) + + + Otomian languages + + + Papuan languages + + + Pangasinan + + + Pahlavi + + + Pampanga, Kapampangan + + + Panjabi, Punjabi + + + Papiamento + + + Palauan + + + Old Persian (ca.600-400 BCE) + + + Persian + + + Philippine languages + + + Phoenician + + + Pali + + + Polish + + + Pohnpeian + + + Portuguese + + + Prakrit languages + + + Old Provençal (to 1500) + + + Pushto + + + Quechua + + + Rajasthani + + + Rapanui + + + Rarotongan, Cook Islands Maori + + + Romance languages + + + Romansh + + + Romany + + + Romanian, Moldavian + + + Rundi + + + Aromanian, Arumanian, Macedo-Romanian + + + Russian + + + Sandawe + + + Sango + + + Yakut + + + South American Indian + + + Salishan languages + + + Samaritan Aramaic + + + Sanskrit + + + Sasak + + + Santali + + + Sicilian + + + Scots + + + Selkup + + + Semitic languages + + + Old Irish (to 900) + + + Sign Languages + + + Shan + + + Sidamo + + + Sinhalese + + + Siouan languages + + + Sino-Tibetan languages + + + Slavic languages + + + Slovak + + + Slovenian + + + Southern Sami + + + Northern Sami + + + Sami languages + + + Lule Sami + + + Inari Sami + + + Samoan + + + Skolt Sami + + + Shona + + + Sindhi + + + Soninke + + + Sogdian + + + Somali + + + Songhai languages + + + Southern Sotho + + + Spanish, Castilian + + + Sardinian + + + Sranan Tongo + + + Serbian + + + Serer + + + Nilo-Saharan languages + + + Swati + + + Sukuma + + + Sundanese + + + Susu + + + Sumerian + + + Swahili + + + Swedish + + + Classical Syriac + + + Syriac + + + Tahitian + + + Tai languages + + + Tamil + + + Tatar + + + Telugu + + + Timne + + + Tereno + + + Tetum + + + Tajik + + + Tagalog + + + Thai + + + Tibetan + + + Tigre + + + Tigrinya + + + Tiv + + + Tokelau + + + Klingon + + + Tlingit + + + Tamashek + + + Tonga (Nyasa) + + + Tonga (Tonga Islands) + + + Tok Pisin + + + Tsimshian + + + Tswana + + + Tsonga + + + Turkmen + + + Tumbuka + + + Tupi languages + + + Turkish + + + Altaic languages + + + Tuvalu + + + Twi + + + Tuvinian + + + Udmurt + + + Ugaritic + + + Uighur + + + Ukrainian + + + Umbundu + + + Undetermined + + + Urdu + + + Uzbek + + + Vai + + + Venda + + + Vietnamese + + + Volapük + + + Votic + + + Wakashan languages + + + Walamo + + + Waray + + + Washo + + + Welsh + + + Sorbian languages + + + Walloon + + + Wolof + + + Kalmyk, Oirat + + + Xhosa + + + Yao + + + Yapese + + + Yiddish + + + Yoruba + + + Yupik languages + + + Zapotec + + + Blissymbolics + + + Zenaga + + + Zhuang + + + Zande languages + + + Zulu + + + Zuni + + + No linguistic content + + + Zazaki + + +
+
diff --git a/Resources/Private/Data/iso-639-2b.xml b/Resources/Private/Data/iso-639-2b.xml deleted file mode 100644 index 9835c2308b..0000000000 --- a/Resources/Private/Data/iso-639-2b.xml +++ /dev/null @@ -1,984 +0,0 @@ - - - - module - Language labels for ISO 639-2/B codes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Resources/Private/Language/Labels.xml b/Resources/Private/Language/Labels.xml deleted file mode 100644 index 6700fc488e..0000000000 --- a/Resources/Private/Language/Labels.xml +++ /dev/null @@ -1,476 +0,0 @@ - - - - - database - Language labels for extension 'dlf' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Resources/Private/Language/de.locallang.xlf b/Resources/Private/Language/de.locallang.xlf index b39dfe48af..cc91ec2558 100644 --- a/Resources/Private/Language/de.locallang.xlf +++ b/Resources/Private/Language/de.locallang.xlf @@ -197,26 +197,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -481,6 +461,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -489,19 +489,11 @@ - - - - - - - - - + - + diff --git a/Resources/Private/Language/de.locallang_be.xlf b/Resources/Private/Language/de.locallang_be.xlf index 266e7e1039..455238957f 100644 --- a/Resources/Private/Language/de.locallang_be.xlf +++ b/Resources/Private/Language/de.locallang_be.xlf @@ -435,7 +435,11 @@ - + + + + + diff --git a/Resources/Private/Language/de.locallang_labels.xlf b/Resources/Private/Language/de.locallang_labels.xlf new file mode 100644 index 0000000000..0d3adafdad --- /dev/null +++ b/Resources/Private/Language/de.locallang_labels.xlf @@ -0,0 +1,842 @@ + + + +
+ LFEditor +
+ + + Action protocol + Aktionsprotokoll + + + Action protocol + Aktionsprotokoll + + + User ID + User ID + + + Filename + Dateiname + + + Page count + Seitenanzahl + + + Name + Name + + + Creation date + Erstellungsdatum + + + Basket + Warenkorb + + + Basket + Warenkorb + + + Session ID + Session ID + + + Document ID + Dokumenten IDs + + + FE user ID + FE user ID + + + Documents + Dokumente + + + Production Identifier + Production Identifikator + + + Speicherort der METS-Datei / des IIIF-Manifests (URI) + Location of METS file / IIIF manifest (URI) + + + Record Identifier + Datensatz Identifikator + + + OPAC/Local Identifier + OPAC/Lokaler Identifikator + + + Union Catalog/Foreign Identifier + Verbundkatalog/Fremder Identifikator + + + Uniform Resource Name (URN) + Uniform Resource Name (URN) + + + Persistent Uniform Resource Locator (PURL) + Persistent Uniform Resource Locator (PURL) + + + Title + Titel + + + Title (Sorting) + Titel (Sortierung) + + + Author + Autor + + + Year of Publication + Erscheinungsjahr + + + Place of Publication + Erscheinungsort + + + Thumbnail + Vorschaubild + + + Typ of Document + Dokumententyp + + + Part of ... + Übergeordnete Einheit + + + Number of Volume + Bandnummer + + + Number of Volume (Sorting) + Bandnummer (Sortierung) + + + License + Lizenz + + + Terms of Use + Nutzungsbedingungen + + + Restrictions on Access + Zugriffsinformationen + + + Out Of Print Works + Vergriffene Werke + + + Rights Information + Rechteinformation + + + Collections + Sammlungen + + + METS @LABEL + METS @LABEL + + + METS @ORDERLABEL + METS @ORDERLABEL + + + Owner + Besitzer + + + Status + Status + + + default + Standard + + + METS oder IIIF + METS or IIIF + + + METS + METS + + + IIIF + IIIF + + + Titledata + Titeldaten + + + Identifier + Identifier + + + Access + Zugriff + + + Structures + Strukturelemente + + + Toplevel Unit? + Toplevel-Element? + + + Display Label + Anzeigeform + + + Index Name + Index-Bezeichnung + + + OAI-PMH-Mapping + OAI-PMH Mapping + + + Get thumbnail from... + Zeige Vorschaubild von... + + + self + selbst + + + Status + Status + + + default + Standard + + + General + Allgemein + + + Translation + Übersetzung + + + Access + Zugriff + + + Metadata + Metadaten + + + Display Label + Anzeigeform + + + Index Name + Index-Bezeichnung + + + Data Format + Datenformat + + + Default Value + Standardwert + + + TypoScript-Wrap + TypoScript-Wrap + + + Tokenize in Search Index? + Im Suchid in Tokens zerlegen? + + + Store in Search Index? + Im Suchid speichern? + + + Index in Search Index? + Im Suchid indizieren? + + + Field boost + Feldwertigkeit + + + Prepare for sorting? + Sortierbar machen? + + + Prepare for faceting? + Facettierbar machen? + + + Show in titledata/listview? + In Titeldaten/Listenansicht anzeigen? + + + Use for search suggestion? + Für Suchvorschläge verwenden? + + + Status + Status + + + default + Standard + + + General + Allgemein + + + Translation + Übersetzung + + + Access + Zugriff + + + Metadata Format + Metadatenformat + + + Encoding + Datenformat + + + XPath (relativ zu //dmdSec/mdWrap/xmlData/root und mit Namensraum) oder JSONPath (relativ zum JSON-Objekt der Ressource) + XPath (relative to //dmdSec/mdWrap/xmlData/root and with namespace) or JSONPath (relative to resource JSON object) + + + XPath / JSONPath für Sortierfeld (optional) + XPath / JSONPath for sorting (optional) + + + Mandatory field? + Pflichtfeld? + + + General + Allgemein + + + Data Formats + Datenformate + + + Bezeichnung des Formats (z.B. in METS) + Format Name (e.g. in METS) + + + Root-Element + Root Element + + + Namespace URI + Namensraum URI + + + Class Name + Klassenname + + + General + Allgemein + + + Solr Cores + Solr Kerne + + + Display Label + Anzeigeform + + + Solr Core + Solr-Kern + + + General + Allgemein + + + Collections + Sammlungen + + + Display Label + Anzeigeform + + + Index Name + Index-Bezeichnung + + + OAI-PMH Mapping + OAI-PMH-Mapping + + + Define (virtual) collection via Solr Query + (Virtuelle) Kollektion über Solr Anfrage definieren + + + Description + Beschreibung + + + Thumbnail + Vorschaubild + + + Priority + Priorität + + + Documents + Dokumente + + + Owner + Besitzer + + + none + keiner + + + Frontend User + Frontend-Benutzer + + + none + keiner + + + Disallow frontend editing? + Frontend-Bearbeitung verbieten? + + + Status + Status + + + default + Standard + + + General + Allgemein + + + Translation + Übersetzung + + + Access + Zugriff + + + Libraries + Mandanten + + + Name + Name + + + Index Name + Index-Bezeichnung + + + Website + Webseite + + + Contact + Kontakt + + + Logo + Logo + + + Open Archives Interface (OAI) Bezeichnung + Open Archives Interface (OAI) Label + + + Open Archives Interface (OAI) URL + Open Archives Interface (OAI) Base URL + + + Online Public Access Catalog (OPAC) Bezeichnung + Online Public Access Catalog (OPAC) Label + + + Online Public Access Catalog (OPAC) URL + Online Public Access Catalog (OPAC) Base URL + + + Union Catalog Label + Verbundkatalog Bezeichnung + + + Union Catalog Base URL + Verbundkatalog URL + + + General + Allgemein + + + Translation + Übersetzung + + + Catalogs + Kataloge + + + Printer + Drucker + + + Label + Label + + + Network address + Netzwerkadresse + + + Name + Name + + + CLI Befehl (##fileName##) + CLI command(##fileName##) + + + Email + E-Mail + + + Address + Adresse + + + Name + Name + + + Fulltext + Volltext + + + IIIF Annotations + IIIF-Annotationen + + + Fulltext Download + Volltext-Download + + + Image Download + Bild-Download + + + Image Manipulation + Bildbearbeitung + + + PDF-Download + PDF Download + + + Search in Document + Suche im Dokument + + + DLF: Audio Player + DLF: Audioplayer + + + DLF: Basket + DLF: Warenkorb + + + DLF: Calendar + DLF: Kalender + + + DLF: Collection + DLF: Kollektion + + + DLF: List View + DLF: Listenansicht + + + DLF: Metadata + DLF: Metadaten + + + DLF: Navigation + DLF: Navigation + + + DLF: OAI-PMH-Schnittstelle + DLF: OAI-PMH Interface + + + DLF: Page Preview + DLF: Seitenvorschau + + + DLF: Page View + DLF: Seitenansicht + + + DLF: Statistics + DLF: Statistik + + + DLF: Table of Contents + DLF: Inhaltsverzeichnis + + + DLF: Toolbox + DLF: Werkzeugkasten + + + Default metadata namespaces + Standard-Namensräume für Metadaten + + + Enable internal page view proxy?: (default is "FALSE") + Internen Proxy für Werkansicht aktivieren? (Standard ist "FALSE") + + + DLF User-Agent: (Standard ist "Kitodo.Presentation") + DLF User-Agent: (default is "Kitodo.Presentation") + + + Verwende nur absolute Links für Seiten und Ressourcen?: Wird nur in speziellen Multi-Domain-Umgebungen benötigt; erfordert einen voll qualifizierten Einstiegspunkt in der Seitenkonfiguration (Standard ist "FALSE") + Force all links to pages and resources to be absolute?: Only needed for some multi-domain environments; requires a fully qualified Entry Point in Site Configuration (default is "FALSE") + + + Verwende HTTPS for absolute Links?: erfordert einen Einstiegspunkt mit "https://..." in der Seitenkonfiguration (Standard ist "FALSE") + Use HTTPS for absolute links?: requires a valid Entry Point with "https://..." in Site Configuration (default is "FALSE") + + + Eingelesene METS Dateien / IIIF-Manifeste zwischenspeichern: Dies kann die Geschwindigkeit geringfügig verbessern, führt aber zu einer sehr großen "fe_session_data" Tabelle (Standard ist "FALSE") + Cache parsed METS files / IIIF manifests: Caching improves performance a little bit but can result in a very large "fe_session_data" table (default is "FALSE") + + + Neue Kollektionen publizieren?: Sollen neue Kollektionen automatisch in der OAI-PMH-Schnittstelle veröffentlicht werden? (Standard ist "TRUE") + Publish new collections?: Should new collections automatically be published in the OAI-PMH interface? (default is "TRUE") + + + Unhide ided documents?: Should hidden documents be unhidden when re-iding them? (default is "FALSE") + Indexierte Dokumente einblenden?: Sollen ausgeblendete Dokumente bei der erneuten Indexierung wieder eingeblendet werden? (Standard ist "FALSE") + + + Verwende externe APIs zum Abrufen von Metadaten?: (Standard ist "FALSE") + Use external APIs for getting metadata?: (default is "FALSE") + + + Seiten fileGrps: Komma-getrennte Liste der @USE Attributwerte der Seitenansichten nach aufsteigender Größe sortiert (Standard ist "DEFAULT,MAX") + Page fileGrps: comma-separated list of @USE attribute values ordered by increasing size (default is "DEFAULT,MAX") + + + Vorschau fileGrp: Komma-getrennte Liste der @USE Attributwerte der Vorschaubilder nach absteigender Priorität sortiert (Standard ist "THUMBS") + Thumbnail fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "THUMBS") + + + Download fileGrp: Komma-getrennte Liste der @USE Attributwerte der Downloads nach absteigender Priorität sortiert (Standard ist "DOWNLOAD") + Download fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "DOWNLOAD") + + + Volltext fileGrp: Komma-getrennte Liste der @USE Attributwerte der Volltexte nach absteigender Priorität sortiert (Standard ist "FULLTEXT") + Fulltext fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "FULLTEXT") + + + Audio fileGrp: Komma-getrennte Liste der @USE Attributwerte der Audiodateien nach absteigender Priorität sortiert (Standard ist "AUDIO") + Audio fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "AUDIO") + + + IIIF-Annotationen mit Motivation "painting" als Volltext behandeln?: Als Volltext behandelte Annotationen werden im Suchid idiert (Standard ist "FALSE") + Handle IIIF annotations with motivation "painting" as fulltext?: Handling annotations as fulltexts means they are ided (default is "FALSE") + + + Maximale Thumbnail-Breite für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") + Maximum thumbnail width for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Maximale Thumbnail-Höhe für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") + Maximum thumbnail height for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Solr Connection + Solr Verbindung + + + HTTPS verwenden: (Standard ist "FALSE") + Use HTTPS: (default is "FALSE") + + + Solr Server Host: (Standard ist "localhost") + Solr Server Host: (default is "localhost") + + + Solr Server Port: (Standard ist "8983") + Solr Server Port: (default is "8983") + + + Solr Server Pfad: ohne API-Endpunkt "/solr" (Standard ist "/") + Solr Server Path: without API endpoint "/solr" (default is "/") + + + Solr Server Benutzername: (Standard ist "") + Solr Server User: (default is "") + + + Solr Server Kennwort: (Standard ist "") + Solr Server Password: (default is "") + + + Solr Server Timeout: (Standard ist "10") + Solr Server Timeout: (default is "10") + + + Löschen von Solr Kern zulassen?: Soll beim Löschen eines Solr Kerns im TYPO3 Backend auch der entsprechende Index in Apache Solr gelöscht werden? (Standard ist "FALSE") + Allow Solr Core Deletion?: If a Solr Core is deleted in the TYPO3 Backend, should it be deleted in Apache Solr as well? (default is "FALSE") + + + Solr-Schema-Feld "id" : Unique identifier for the document in the id (Standard ist "id") + Solr Schema Field "id" : Unique identifier for the document in the id (default is "id") + + + Solr-Schema-Feld "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (Standard ist "uid") + Solr Schema Field "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (default is "uid") + + + Solr-Schema-Feld "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (Standard ist "pid") + Solr Schema Field "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (default is "pid") + + + Solr-Schema-Feld "page" : Image number where this document starts (Standard ist "page") + Solr Schema Field "page" : Image number where this document starts (default is "page") + + + Solr-Schema-Feld "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "partof") + Solr Schema Field "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (default is "partof") + + + Solr-Schema-Feld "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "root") + Solr Schema Field "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (default is "root") + + + Solr-Schema-Feld "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (Standard ist "sid") + Solr Schema Field "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (default is "sid") + + + Solr-Schema-Feld "toplevel" : Information if it is a top-level document (Standard ist "toplevel") + Solr Schema Field "toplevel" : Information if it is a top-level document (default is "toplevel") + + + Solr-Schema-Feld "type" : Type of document (eg. monograph, chapter, etc.) (Standard ist "type") + Solr Schema Field "type" : Type of document (eg. monograph, chapter, etc.) (default is "type") + + + Solr-Schema-Feld "title" : Title field is mandatory for identifying documents (Standard ist "title") + Solr Schema Field "title" : Title field is mandatory for identifying documents (default is "title") + + + Solr-Schema-Feld "volume" : Volume field is mandatory for identifying documents (Standard ist "volume") + Solr Schema Field "volume" : Volume field is mandatory for identifying documents (default is "volume") + + + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (Standard ist "date") + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (default is "date") + + + Solr-Schema-Feld "thumbnail" : URL of thumbnail image for the document (Standard ist "thumbnail") + Solr Schema Field "thumbnail" : URL of thumbnail image for the document (default is "thumbnail") + + + Solr-Schema-Feld "default" : CatchAll field (Standard ist "default") + Solr Schema Field default" : CatchAll field (default is "default") + + + Solr-Schema-Feld "timestamp" : (Standard ist "timestamp") + Solr Schema Field "timestamp" : (default is "timestamp") + + + Solr-Schema-Feld "autocomplete" : Autocomplete field for search form (Standard ist "autocomplete") + Solr Schema Field "autocomplete" : Autocomplete field for search form (default is "autocomplete") + + + Solr-Schema-Feld "fulltext" : Fulltext field for OCR results (Standard ist "fulltext") + Solr Schema Field "fulltext" : Fulltext field for OCR results (default is "fulltext") + + + Solr-Schema-Feld "record_id" : Record ID of the document (required for OAI_DC output) (Standard ist "record_id") + Solr Schema Field "record_id" : Record ID of the document (required for OAI_DC output) (default is "record_id") + + + Solr-Schema-Feld "purl" : Permanent URL of the document (required for EPICUR output) (Standard ist "purl") + Solr Schema Field "purl" : Permanent URL of the document (required for EPICUR output) (default is "purl") + + + Solr-Schema-Feld "urn" : URN of the Document (required for EPICUR output) (Standard ist "urn") + Solr Schema Field "urn" : URN of the Document (required for EPICUR output) (default is "urn") + + + Solr-Schema-Feld "location" : Location of METS XML (required for METS output) (Standard ist "location") + Solr Schema Field "location" : Location of METS XML (required for METS output) (default is "location") + + + Solr-Schema-Feld "collection" : Associated collection(s) of the document (Standard ist "collection") + Solr Schema Field "collection" : Associated collection(s) of the document (default is "collection") + + + Solr-Schema-Feld "license" : License (should be URI) (Standard ist "license") + Solr Schema Field "license" : License (should be URI) (default is "license") + + + Solr-Schema-Feld "terms" : Term of Use (should be URI) (Standard ist "terms") + Solr Schema Field "terms" : Term of Use (should be URI) (default is "terms") + + + Solr-Schema-Feld "restrictions" : Access Restrictions (should be URI) (Standard ist "restrictions") + Solr Schema Field "restrictions" : Access Restrictions (should be URI) (default is "restrictions") + + + Solr-Schema-Feld "geom" : GeoJSON geometry for spatial search (Standard ist "geom") + Solr Schema Field "geom" : GeoJSON geometry for spatial search (default is "geom") + + +
+
diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf index f36dd45181..1522e5f2c1 100644 --- a/Resources/Private/Language/locallang.xlf +++ b/Resources/Private/Language/locallang.xlf @@ -371,6 +371,12 @@ + + + + + + diff --git a/Resources/Private/Language/locallang_be.xlf b/Resources/Private/Language/locallang_be.xlf index f942d75e98..0b19763e26 100644 --- a/Resources/Private/Language/locallang_be.xlf +++ b/Resources/Private/Language/locallang_be.xlf @@ -89,6 +89,9 @@ + + + diff --git a/Resources/Private/Language/locallang_labels.xlf b/Resources/Private/Language/locallang_labels.xlf new file mode 100644 index 0000000000..89938425c9 --- /dev/null +++ b/Resources/Private/Language/locallang_labels.xlf @@ -0,0 +1,634 @@ + + + +
+ LFEditor +
+ + + Action protocol + + + Action protocol + + + User ID + + + Filename + + + Page count + + + Name + + + Creation date + + + Basket + + + Basket + + + Session ID + + + Document ID + + + FE user ID + + + Documents + + + Production Identifier + + + Location of METS file / IIIF manifest (URI) + + + Record Identifier + + + OPAC/Local Identifier + + + Union Catalog/Foreign Identifier + + + Uniform Resource Name (URN) + + + Persistent Uniform Resource Locator (PURL) + + + Title + + + Title (Sorting) + + + Author + + + Year of Publication + + + Place of Publication + + + Thumbnail + + + Typ of Document + + + Part of ... + + + Number of Volume + + + Number of Volume (Sorting) + + + License + + + Terms of Use + + + Restrictions on Access + + + Out Of Print Works + + + Rights Information + + + Collections + + + METS @LABEL + + + METS @ORDERLABEL + + + Owner + + + Status + + + default + + + METS or IIIF + + + METS + + + IIIF + + + Titledata + + + Identifier + + + Access + + + Structures + + + Toplevel Unit? + + + Display Label + + + Index Name + + + OAI-PMH Mapping + + + Get thumbnail from... + + + self + + + Status + + + default + + + General + + + Translation + + + Access + + + Metadata + + + Display Label + + + Index Name + + + Data Format + + + Default Value + + + TypoScript-Wrap + + + Tokenize in Search Index? + + + Store in Search Index? + + + Index in Search Index? + + + Field boost + + + Prepare for sorting? + + + Prepare for faceting? + + + Show in titledata/listview? + + + Use for search suggestion? + + + Status + + + default + + + General + + + Translation + + + Access + + + Metadata Format + + + Encoding + + + XPath (relative to //dmdSec/mdWrap/xmlData/root and with namespace) or JSONPath (relative to resource JSON object) + + + XPath / JSONPath for sorting (optional) + + + Mandatory field? + + + General + + + Data Formats + + + Format Name (e.g. in METS) + + + Root Element + + + Namespace URI + + + Class Name + + + General + + + Solr Cores + + + Display Label + + + Solr Core + + + General + + + Collections + + + Display Label + + + Index Name + + + Define (virtual) collection via Solr Query + + + OAI-PMH Mapping + + + Description + + + Thumbnail + + + Priority + + + Documents + + + Owner + + + none + + + Frontend User + + + none + + + Disallow frontend editing? + + + Status + + + default + + + General + + + Translation + + + Access + + + Libraries + + + Name + + + Index Name + + + Website + + + Contact + + + Logo + + + Open Archives Interface (OAI) Label + + + Open Archives Interface (OAI) Base URL + + + Online Public Access Catalog (OPAC) Label + + + Online Public Access Catalog (OPAC) Base URL + + + Union Catalog Label + + + Union Catalog Base URL + + + General + + + Translation + + + Catalogs + + + Printer + + + Label + + + Network address + + + Name + + + CLI command(##fileName##) + + + Email + + + Address + + + Name + + + Fulltext + + + IIIF Annotations + + + Fulltext Download + + + Image Download + + + Image Manipulation + + + PDF Download + + + Search in Document + + + DLF: Audio Player + + + DLF: Basket + + + DLF: Calendar + + + DLF: Collection + + + DLF: List View + + + DLF: Metadata + + + DLF: Navigation + + + DLF: OAI-PMH Interface + + + DLF: Page Preview + + + DLF: Page View + + + DLF: Statistics + + + DLF: Table of Contents + + + DLF: Toolbox + + + Default metadata namespaces + + + Enable internal page view proxy?: (default is "FALSE") + + + DLF User-Agent: (default is "Kitodo.Presentation") + + + Force all links to pages and resources to be absolute?: Only needed for some multi-domain environments; requires a fully qualified Entry Point in Site Configuration (default is "FALSE") + + + Use HTTPS for absolute links?: requires a valid Entry Point with "https://..." in Site Configuration (default is "FALSE") + + + Cache parsed METS files / IIIF manifests: Caching improves performance a little bit but can result in a very large "fe_session_data" table (default is "FALSE") + + + Publish new collections?: Should new collections automatically be published in the OAI-PMH interface? (default is "TRUE") + + + Unhide ided documents?: Should hidden documents be unhidden when re-iding them? (default is "FALSE") + + + Use external APIs for getting metadata?: (default is "FALSE") + + + Page fileGrps: comma-separated list of @USE attribute values ordered by increasing size (default is "DEFAULT,MAX") + + + Thumbnail fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "THUMBS") + + + Download fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "DOWNLOAD") + + + Fulltext fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "FULLTEXT") + + + Audio fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "AUDIO") + + + Handle IIIF annotations with motivation "painting" as fulltext?: Handling annotations as fulltexts means they are ided (default is "FALSE") + + + Maximum thumbnail width for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Maximum thumbnail height for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Solr Connection + + + Use HTTPS: (default is "FALSE") + + + Solr Server Host: (default is "localhost") + + + Solr Server Port: (default is "8983") + + + Solr Server Path: without API endpoint "/solr" (default is "/") + + + Solr Server User: (default is "") + + + Solr Server Password: (default is "") + + + Solr Server Timeout: (default is "10") + + + Allow Solr Core Deletion?: If a Solr Core is deleted in the TYPO3 Backend, should it be deleted in Apache Solr as well? (default is "FALSE") + + + Solr Schema Field "id" : Unique identifier for the document in the id (default is "id") + + + Solr Schema Field "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (default is "uid") + + + Solr Schema Field "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (default is "pid") + + + Solr Schema Field "page" : Image number where this document starts (default is "page") + + + Solr Schema Field "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (default is "partof") + + + Solr Schema Field "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (default is "root") + + + Solr Schema Field "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (default is "sid") + + + Solr Schema Field "toplevel" : Information if it is a top-level document (default is "toplevel") + + + Solr Schema Field "type" : Type of document (eg. monograph, chapter, etc.) (default is "type") + + + Solr Schema Field "title" : Title field is mandatory for identifying documents (default is "title") + + + Solr Schema Field "volume" : Volume field is mandatory for identifying documents (default is "volume") + + + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (default is "date") + + + Solr Schema Field "thumbnail" : URL of thumbnail image for the document (default is "thumbnail") + + + Solr Schema Field default" : CatchAll field (default is "default") + + + Solr Schema Field "timestamp" : (default is "timestamp") + + + Solr Schema Field "autocomplete" : Autocomplete field for search form (default is "autocomplete") + + + Solr Schema Field "fulltext" : Fulltext field for OCR results (default is "fulltext") + + + Solr Schema Field "record_id" : Record ID of the document (required for OAI_DC output) (default is "record_id") + + + Solr Schema Field "purl" : Permanent URL of the document (required for EPICUR output) (default is "purl") + + + Solr Schema Field "urn" : URN of the Document (required for EPICUR output) (default is "urn") + + + Solr Schema Field "location" : Location of METS XML (required for METS output) (default is "location") + + + Solr Schema Field "collection" : Associated collection(s) of the document (default is "collection") + + + Solr Schema Field "license" : License (should be URI) (default is "license") + + + Solr Schema Field "terms" : Term of Use (should be URI) (default is "terms") + + + Solr Schema Field "restrictions" : Access Restrictions (should be URI) (default is "restrictions") + + + Solr Schema Field "geom" : GeoJSON geometry for spatial search (default is "geom") + + +
+
diff --git a/Resources/Private/Partials/ListView/Results.html b/Resources/Private/Partials/ListView/Results.html index 2b0b462321..c098b37dcb 100644 --- a/Resources/Private/Partials/ListView/Results.html +++ b/Resources/Private/Partials/ListView/Results.html @@ -13,177 +13,175 @@ xmlns:kitodo="http://typo3.org/ns/Kitodo/Dlf/ViewHelpers" data-namespace-typo3-fluid="true"> - - - -
    - - -
  1. - - - slub_digitalcollections uses the :empty CSS selector to check for missing thumbnail. - The HTML comments make sure there is no whitespace in that case. - -
    - Vorschaubild von {docTitle} -
    -
    -
    -
    {docTitle}
    - - - - - - - - - - - - -

    No metadata for document with uid={document.uid}

    -
    -
    -
    -
    - -
    -
    -
    - - - - - - - -
      - - - - Special output for Newspaper / Ephemera -
    1. - - {child.metsOrderlabel} - -
    2. -
      - -
    3. - -
      - Vorschaubild von {f:if(condition:'{child.title}', then:'{child.title}', else:'[{document.title}]')} -
      -
      -
      -
      {f:if(condition:'{child.title}', then:'{child.title}', else:'[{document.title}]')}
      - - - - - - - - -
      -
      - + + +
        + + +
      1. + + + slub_digitalcollections uses the :empty CSS selector to check for missing thumbnail. + The HTML comments make sure there is no whitespace in that case. + +
        + Vorschaubild von {docTitle} +
        +
        +
        +
        {docTitle}
        + + + + + + + -
        -
        + + + + + +

        No metadata for document with uid={document.uid}

        +
        + +
        +
        + +
        +
      +
      - + -
    4. -
      -
      -
      -
    -
    - - -
      - -
    1. + + + + +
        + + + + Special output for Newspaper / Ephemera +
      1. + pageUid="{settings.targetPidPageView}" + additionalParams="{tx_dlf:{page:'1', double:'0', id:'{child.uid}', pagegrid:'0'}}" + class="" + title="{f:if(condition:'{child.metsOrderlabel}', then:'{child.metsOrderlabel}', else:'[{document.title}]')}"> + {child.metsOrderlabel} + +
      2. +
        + +
      3. +
        - Vorschaubild von {f:if(condition:'{result.title}', then:'{result.title}', else:'[{document.title}]')} - + Vorschaubild von {f:if(condition:'{child.title}', then:'{child.title}', else:'[{document.title}]')} +
        - - -
        -
        {result.title}
        -
        -
        - -
        -
        - -
        +
        +
        {f:if(condition:'{child.title}', then:'{child.title}', else:'[{document.title}]')}
        + + + + + + -
        -
        {result.page}
        - - - - - - - - +
        +
        +
        + +
        -
        - -

        [...] {result.snippet} [...]

        -
        -
        - +
      4. -
        -
      -
      -
    2. -
      -
    + +
    + +
+ + + +
    + +
  1. + +
    + Vorschaubild von {f:if(condition:'{result.title}', then:'{result.title}', else:'[{document.title}]')} +
    +
    + + +
    +
    {result.title}
    +
    +
    + +
    +
    + +
    +
    +
    +
    {result.page}
    + + + + + + + + +
    +
    + +

    [...] {result.snippet} [...]

    +
    +
    +
    + + - +
  2. +
    +
+
+ + + + diff --git a/Resources/Private/Partials/ListView/SortingForm.html b/Resources/Private/Partials/ListView/SortingForm.html index f0396e7407..e3ca28aca5 100644 --- a/Resources/Private/Partials/ListView/SortingForm.html +++ b/Resources/Private/Partials/ListView/SortingForm.html @@ -13,7 +13,7 @@ data-namespace-typo3-fluid="true"> - + @@ -26,7 +26,7 @@

- +
diff --git a/Resources/Private/Partials/Lists/Pagination.html b/Resources/Private/Partials/Lists/Pagination.html new file mode 100644 index 0000000000..5f8fb5ca8e --- /dev/null +++ b/Resources/Private/Partials/Lists/Pagination.html @@ -0,0 +1,53 @@ + +
    + + +
  • + 1 +
  • + +
    + +
  • + 1 +
  • + +
    +
    + +
  • +
    + +
  • + {page} +
  • +
    + +
  • +
    + + + +
  • + {pagination.lastPageNumber} +
  • +
    + + +
  • + {pagination.lastPageNumber} +
  • +
    +
    +
+ + diff --git a/Resources/Private/Templates/Backend/NewTenant/Index.html b/Resources/Private/Templates/Backend/NewTenant/Index.html index 7c28dfb1cd..18514d4678 100644 --- a/Resources/Private/Templates/Backend/NewTenant/Index.html +++ b/Resources/Private/Templates/Backend/NewTenant/Index.html @@ -20,11 +20,11 @@

- + - + @@ -59,7 +59,7 @@

- + diff --git a/Resources/Private/Templates/Navigation/Main.html b/Resources/Private/Templates/Navigation/Main.html index 0250c09f17..5ea745519c 100644 --- a/Resources/Private/Templates/Navigation/Main.html +++ b/Resources/Private/Templates/Navigation/Main.html @@ -25,9 +25,9 @@ -
+
- +
@@ -46,14 +46,17 @@
- - - +
+ + + +
-
+ No pages available, therefore actually no double page view possible +
@@ -79,7 +82,7 @@
- +
@@ -96,7 +99,7 @@
- +
diff --git a/Resources/Private/Templates/PageGrid/Main.html b/Resources/Private/Templates/PageGrid/Main.html index 97f0737a3b..af775a7ac6 100644 --- a/Resources/Private/Templates/PageGrid/Main.html +++ b/Resources/Private/Templates/PageGrid/Main.html @@ -11,35 +11,33 @@ - -
- -
    - -
  1. -
    - - - - {f:translate(key: 'thumbnail')} {f:translate(key: 'page')} {entry.pagination} - - - - - - - - - - - - -
    {entry.pagination}
    -
    -
    -
  2. -
    -
-
+
+
    + +
  1. +
    + + + + {f:translate(key: 'thumbnail')} {f:translate(key: 'page')} {entry.pagination} + + + + + + + + + + + + +
    {entry.pagination}
    +
    +
    +
  2. +
    +
+
diff --git a/Resources/Private/Templates/Search/Main.html b/Resources/Private/Templates/Search/Main.html index 506edffb98..44a06eb674 100644 --- a/Resources/Private/Templates/Search/Main.html +++ b/Resources/Private/Templates/Search/Main.html @@ -38,10 +38,22 @@ - - - - + + + + + + + + + + + + + + + + @@ -87,10 +99,12 @@ - - - - +
+ + + + +
diff --git a/Resources/Private/Templates/Toolbox/Main.html b/Resources/Private/Templates/Toolbox/Main.html index ca3145f232..d0cadc5eb0 100644 --- a/Resources/Private/Templates/Toolbox/Main.html +++ b/Resources/Private/Templates/Toolbox/Main.html @@ -13,7 +13,7 @@ data-namespace-typo3-fluid="true">
    - +
  • @@ -34,7 +34,7 @@ - +
  • - +
  • @@ -75,7 +75,7 @@ - +
  • @@ -97,7 +97,7 @@ - +
  • @@ -119,7 +119,7 @@ - +
  • @@ -156,7 +156,7 @@ - +
  • @@ -164,7 +164,7 @@ - +
    @@ -177,6 +177,7 @@ + diff --git a/Resources/Public/JavaScript/PageView/PageView.js b/Resources/Public/JavaScript/PageView/PageView.js index eb3ec1ef2e..d70e5851cc 100644 --- a/Resources/Public/JavaScript/PageView/PageView.js +++ b/Resources/Public/JavaScript/PageView/PageView.js @@ -443,6 +443,12 @@ dlfViewer.prototype.displayHighlightWord = function(highlightWords = null) { this.highlightWords = highlightWords; } + // exctract highlighWords from URL + if (this.highlightWords === null) { + var urlParams = dlfUtils.getUrlParams(); + this.highlightWords = urlParams['tx_dlf[highlight_word]']; + } + if (!dlfUtils.exists(this.highlightLayer)) { this.highlightLayer = new ol.layer.Vector({ diff --git a/Resources/Public/JavaScript/PageView/SearchInDocument.js b/Resources/Public/JavaScript/PageView/SearchInDocument.js index 806bf84b41..b4df74d4dc 100644 --- a/Resources/Public/JavaScript/PageView/SearchInDocument.js +++ b/Resources/Public/JavaScript/PageView/SearchInDocument.js @@ -122,111 +122,6 @@ function getCurrentQueryParams(baseUrl) { return []; } -/** - * Get all URL query parameters for snippet links. - * All means that it includes together params which were already supplied in the page url and params which are returned as search results. - * - * @param {string} baseUrl - * @param {array} queryParams - * - * @returns {array} array with params in form 'param' => 'value' - */ -function getAllQueryParams(baseUrl, queryParams) { - var params = getCurrentQueryParams(baseUrl); - - var queryParam; - for(var i = 0; i < params.length; i++) { - queryParam = params[i].split('='); - if(queryParams.indexOf(decodeURIComponent(queryParam[0])) === -1) { - queryParams.push(decodeURIComponent(queryParam[0])); - queryParams[decodeURIComponent(queryParam[0])] = queryParam[1]; - } - } - return queryParams; -} - -/** - * Check if the URL is configured as SLUG - * (id is included in main URL, not in parameter). - * // TODO: make it more flexible - * - * @param {array} element - * - * @returns {string} - */ - function isUrlConfiguredAsSlug(element) { - var baseUrl = getBaseUrl(element['uid']).split('?')[0]; - return baseUrl.indexOf(element['uid']) > -1; -} - -/** - * Get needed URL query parameters. - * It returns array of params as objects 'param' => 'value'. It contains exactly 3 params which are taken out of search result. - * - * @param {array} element - * - * @returns {array} array with params in form 'param' => 'value' - */ -function getNeededQueryParams(element) { - var id = $("input[id='tx-dlf-search-in-document-id']").attr('name'); - var highlightWord = $("input[id='tx-dlf-search-in-document-highlight-word']").attr('name'); - var page = $("input[id='tx-dlf-search-in-document-page']").attr('name'); - - var queryParams = []; - - if(id && !isUrlConfiguredAsSlug(element)) { - queryParams.push(id); - queryParams[id] = element['uid']; - } - - if(highlightWord) { - queryParams.push(highlightWord); - queryParams[highlightWord] = encodeURIComponent($("input[id='tx-dlf-search-in-document-query']").val()); - } - - if(page && !isUrlConfiguredAsSlug(element)) { - queryParams.push(page); - queryParams[page] = element['page']; - } - - return queryParams; -} - -/** - * Get snippet link. - * - * @param {array} element - * - * @returns {string} - */ -function getLink(element) { - var baseUrl = getBaseUrl(element['uid']); - - var queryParams = getNeededQueryParams(element); - - if (baseUrl.indexOf('?') > 0) { - queryParams = getAllQueryParams(baseUrl, queryParams); - baseUrl = baseUrl.split('?')[0]; - } - - // replace last element of URL with page - if (isUrlConfiguredAsSlug(element)) { - var url = baseUrl.split('/'); - url.pop(); - url.push(element['page']); - baseUrl = url.join('/'); - } - - var link = baseUrl + '?'; - - // add query params to result link - for(var i = 0; i < queryParams.length; i++) { - link += queryParams[i] + '=' + queryParams[queryParams[i]] + '&'; - } - link = link.slice(0, -1); - return link; -} - /** * Get navigation buttons. * @@ -335,9 +230,10 @@ $(document).ready(function() { $.post( "/", { - eID: "tx_dlf_search_in_document", + middleware: "dlf/search-in-document", q: $( "input[id='tx-dlf-search-in-document-query']" ).val(), uid: $( "input[id='tx-dlf-search-in-document-id']" ).val(), + pid: $( "input[id='tx-dlf-search-in-document-pid']" ).val(), start: $( "input[id='tx-dlf-search-in-document-start']" ).val(), encrypted: $( "input[id='tx-dlf-search-in-document-encrypted']" ).val(), }, @@ -355,7 +251,7 @@ $(document).ready(function() { + $('#tx-dlf-search-in-document-label-page').text() + ' ' + element['page'] + '
    ' + '' - + '' + element['snippet'] + '' + + '' + element['snippet'] + '' + ''; } }); diff --git a/Resources/Public/JavaScript/Search/Suggester.js b/Resources/Public/JavaScript/Search/Suggester.js index d0e4f3b158..385ee8a472 100644 --- a/Resources/Public/JavaScript/Search/Suggester.js +++ b/Resources/Public/JavaScript/Search/Suggester.js @@ -9,37 +9,37 @@ */ $("#tx-dlf-search-query").attr({ - 'autocomplete': "off", - 'role': "textbox", - 'aria-autocomplete': "list", - 'aria-haspopup': "true" + 'autocomplete': "off", + 'role': "textbox", + 'aria-autocomplete': "list", + 'aria-haspopup': "true" }); $( - function() { - // jQuery autocomplete integration - $("#tx-dlf-search-query").autocomplete({ - source(request, response) { - return $.post( - "/", - { - eID: "tx_dlf_search_suggest", - q: encodeURIComponent(request.term.toLowerCase()), - uHash: $("input[name='uHash']").val(), - solrcore: $("input[name='solrcore']").val() - }, - function(data) { - var result = []; - data.forEach(function(element, index) { - element = element.replace(/(\?|!|:|\\)/g, "\\\$1"); - result.push(element); - }); - return response(result); - }, - "json"); - }, - minLength: 3, - appendTo: "#tx-dlf-search-suggest" - }); - } + function () { + // jQuery autocomplete integration + $("#tx-dlf-search-query").autocomplete({ + source(request, response) { + return $.post( + "/", + { + middleware: "dlf/search-suggest", + q: encodeURIComponent(request.term.toLowerCase()), + uHash: $("input[name='uHash']").val(), + solrcore: $("input[name='solrcore']").val() + }, + function (data) { + var result = []; + data.forEach(function (element, index) { + element = element.replace(/(\?|!|:|\\)/g, "\\\$1"); + result.push(element); + }); + return response(result); + }, + "json"); + }, + minLength: 3, + appendTo: "#tx-dlf-search-suggest" + }); + } ); diff --git a/Tests/Fixtures/Common/documents_1.xml b/Tests/Fixtures/Common/documents_1.xml index 7fc261b73a..d718f2d961 100644 --- a/Tests/Fixtures/Common/documents_1.xml +++ b/Tests/Fixtures/Common/documents_1.xml @@ -138,7 +138,6 @@ a:8:{s:5:"label";N;s:10:"index_name";N;s:8:"oai_name";N;s:11:"description";N;s:9:"documents";N;s:5:"owner";N;s:6:"status";N;s:16:"sys_language_uid";N;} 0 - 0 0 @@ -165,7 +164,6 @@ a:8:{s:5:"label";N;s:10:"index_name";N;s:8:"oai_name";N;s:11:"description";N;s:9:"documents";N;s:5:"owner";N;s:6:"status";N;s:16:"sys_language_uid";N;} 0 - 0 0 diff --git a/Tests/Fixtures/Common/documents_fulltext.xml b/Tests/Fixtures/Common/documents_fulltext.xml index bf9835e095..162b097fb6 100644 --- a/Tests/Fixtures/Common/documents_fulltext.xml +++ b/Tests/Fixtures/Common/documents_fulltext.xml @@ -54,7 +54,6 @@ ... 0 - NULL 0 0 @@ -81,7 +80,6 @@ 0 - NULL 0 0 diff --git a/Tests/Fixtures/Common/libraries.xml b/Tests/Fixtures/Common/libraries.xml index f3e3bfe007..3e6fe9594d 100644 --- a/Tests/Fixtures/Common/libraries.xml +++ b/Tests/Fixtures/Common/libraries.xml @@ -10,7 +10,6 @@ 0 0 a:12:{s:5:"label";N;s:10:"index_name";N;s:7:"website";N;s:7:"contact";N;s:5:"image";N;s:9:"oai_label";N;s:8:"oai_base";N;s:10:"opac_label";N;s:9:"opac_base";N;s:11:"union_label";N;s:10:"union_base";N;s:16:"sys_language_uid";N;} - default diff --git a/Tests/Fixtures/Common/metadata.xml b/Tests/Fixtures/Common/metadata.xml index d6d4da4fad..d4f2be8b5f 100644 --- a/Tests/Fixtures/Common/metadata.xml +++ b/Tests/Fixtures/Common/metadata.xml @@ -12,7 +12,6 @@ 0 32 - title 1 @@ -41,7 +40,6 @@ 0 32 - collection 1 diff --git a/Tests/Fixtures/Common/pages.xml b/Tests/Fixtures/Common/pages.xml index 359ef95cef..fe14749f26 100644 --- a/Tests/Fixtures/Common/pages.xml +++ b/Tests/Fixtures/Common/pages.xml @@ -18,16 +18,12 @@ 0 0 0 - 0 a:47:{s:7:"doktype";N;s:5:"title";N;s:4:"slug";N;s:9:"nav_title";N;s:8:"subtitle";N;s:9:"seo_title";N;s:8:"no_index";N;s:9:"no_follow";N;s:14:"canonical_link";N;s:8:"og_title";N;s:14:"og_description";N;s:8:"og_image";N;s:13:"twitter_title";N;s:19:"twitter_description";N;s:13:"twitter_image";N;s:8:"abstract";N;s:8:"keywords";N;s:11:"description";N;s:6:"author";N;s:12:"author_email";N;s:11:"lastUpdated";N;s:6:"layout";N;s:8:"newUntil";N;s:14:"backend_layout";N;s:25:"backend_layout_next_level";N;s:16:"content_from_pid";N;s:6:"target";N;s:13:"cache_timeout";N;s:10:"cache_tags";N;s:11:"is_siteroot";N;s:9:"no_search";N;s:13:"php_tree_stop";N;s:6:"module";N;s:5:"media";N;s:17:"tsconfig_includes";N;s:8:"TSconfig";N;s:8:"l18n_cfg";N;s:6:"hidden";N;s:8:"nav_hide";N;s:9:"starttime";N;s:7:"endtime";N;s:16:"extendToSubpages";N;s:8:"fe_group";N;s:13:"fe_login_mode";N;s:8:"editlock";N;s:10:"categories";N;s:14:"rowDescription";N;} 0 0 0 0 - 0 - 0 - 0 1 0 31 @@ -69,7 +65,6 @@ - 0 0 @@ -91,16 +86,12 @@ 0 0 0 - 0 a:47:{s:7:"doktype";N;s:5:"title";N;s:4:"slug";N;s:9:"nav_title";N;s:8:"subtitle";N;s:9:"seo_title";N;s:8:"no_index";N;s:9:"no_follow";N;s:14:"canonical_link";N;s:8:"og_title";N;s:14:"og_description";N;s:8:"og_image";N;s:13:"twitter_title";N;s:19:"twitter_description";N;s:13:"twitter_image";N;s:8:"abstract";N;s:8:"keywords";N;s:11:"description";N;s:6:"author";N;s:12:"author_email";N;s:11:"lastUpdated";N;s:6:"layout";N;s:8:"newUntil";N;s:14:"backend_layout";N;s:25:"backend_layout_next_level";N;s:16:"content_from_pid";N;s:6:"target";N;s:13:"cache_timeout";N;s:10:"cache_tags";N;s:11:"is_siteroot";N;s:9:"no_search";N;s:13:"php_tree_stop";N;s:6:"module";N;s:5:"media";N;s:17:"tsconfig_includes";N;s:8:"TSconfig";N;s:8:"l18n_cfg";N;s:6:"hidden";N;s:8:"nav_hide";N;s:9:"starttime";N;s:7:"endtime";N;s:16:"extendToSubpages";N;s:8:"fe_group";N;s:13:"fe_login_mode";N;s:8:"editlock";N;s:10:"categories";N;s:14:"rowDescription";N;} 0 0 0 0 - 0 - 0 - 0 1 0 31 @@ -142,7 +133,6 @@ - 0 0 diff --git a/Tests/Fixtures/OaiPmh/pages.xml b/Tests/Fixtures/OaiPmh/pages.xml index d8bedc61fa..f8256066c8 100644 --- a/Tests/Fixtures/OaiPmh/pages.xml +++ b/Tests/Fixtures/OaiPmh/pages.xml @@ -18,16 +18,12 @@ 0 0 0 - 0 a:47:{s:7:"doktype";N;s:5:"title";N;s:4:"slug";N;s:9:"nav_title";N;s:8:"subtitle";N;s:9:"seo_title";N;s:8:"no_index";N;s:9:"no_follow";N;s:14:"canonical_link";N;s:8:"og_title";N;s:14:"og_description";N;s:8:"og_image";N;s:13:"twitter_title";N;s:19:"twitter_description";N;s:13:"twitter_image";N;s:8:"abstract";N;s:8:"keywords";N;s:11:"description";N;s:6:"author";N;s:12:"author_email";N;s:11:"lastUpdated";N;s:6:"layout";N;s:8:"newUntil";N;s:14:"backend_layout";N;s:25:"backend_layout_next_level";N;s:16:"content_from_pid";N;s:6:"target";N;s:13:"cache_timeout";N;s:10:"cache_tags";N;s:11:"is_siteroot";N;s:9:"no_search";N;s:13:"php_tree_stop";N;s:6:"module";N;s:5:"media";N;s:17:"tsconfig_includes";N;s:8:"TSconfig";N;s:8:"l18n_cfg";N;s:6:"hidden";N;s:8:"nav_hide";N;s:9:"starttime";N;s:7:"endtime";N;s:16:"extendToSubpages";N;s:8:"fe_group";N;s:13:"fe_login_mode";N;s:8:"editlock";N;s:10:"categories";N;s:14:"rowDescription";N;} 0 0 0 0 - 0 - 0 - 0 1 0 31 @@ -69,7 +65,6 @@ - 0 0 @@ -90,11 +85,7 @@ 0 0 0 - 0 - 0 - 0 OAI-PMH Template - 1 3 EXT:fluid_styled_content/Configuration/TypoScript/,EXT:dlf/Configuration/TypoScript/Plugins/OaiPmh/,EXT:dlf/Configuration/TypoScript/ @@ -122,16 +113,12 @@ 0 0 0 - 0 0 0 0 0 - 0 - 0 - 0 list
    @@ -233,16 +220,12 @@ 0 0 0 - 0 a:47:{s:7:"doktype";N;s:5:"title";N;s:4:"slug";N;s:9:"nav_title";N;s:8:"subtitle";N;s:9:"seo_title";N;s:8:"no_index";N;s:9:"no_follow";N;s:14:"canonical_link";N;s:8:"og_title";N;s:14:"og_description";N;s:8:"og_image";N;s:13:"twitter_title";N;s:19:"twitter_description";N;s:13:"twitter_image";N;s:8:"abstract";N;s:8:"keywords";N;s:11:"description";N;s:6:"author";N;s:12:"author_email";N;s:11:"lastUpdated";N;s:6:"layout";N;s:8:"newUntil";N;s:14:"backend_layout";N;s:25:"backend_layout_next_level";N;s:16:"content_from_pid";N;s:6:"target";N;s:13:"cache_timeout";N;s:10:"cache_tags";N;s:11:"is_siteroot";N;s:9:"no_search";N;s:13:"php_tree_stop";N;s:6:"module";N;s:5:"media";N;s:17:"tsconfig_includes";N;s:8:"TSconfig";N;s:8:"l18n_cfg";N;s:6:"hidden";N;s:8:"nav_hide";N;s:9:"starttime";N;s:7:"endtime";N;s:16:"extendToSubpages";N;s:8:"fe_group";N;s:13:"fe_login_mode";N;s:8:"editlock";N;s:10:"categories";N;s:14:"rowDescription";N;} 0 0 0 0 - 0 - 0 - 0 1 0 31 @@ -284,7 +267,6 @@ - 0 0 @@ -305,11 +287,7 @@ 0 0 0 - 0 - 0 - 0 OAI-PMH Template (missing storagePid) - 1 3 EXT:fluid_styled_content/Configuration/TypoScript/,EXT:dlf/Configuration/TypoScript/Plugins/OaiPmh/,EXT:dlf/Configuration/TypoScript/ @@ -337,16 +315,12 @@ 0 0 0 - 0 0 0 0 0 - 0 - 0 - 0 list
    diff --git a/Tests/Functional/Api/OaiPmhTest.php b/Tests/Functional/Api/OaiPmhTest.php index bbe9e286c5..2e7f09d997 100644 --- a/Tests/Functional/Api/OaiPmhTest.php +++ b/Tests/Functional/Api/OaiPmhTest.php @@ -4,7 +4,7 @@ use DateTime; use GuzzleHttp\Client as HttpClient; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Domain\Repository\SolrCoreRepository; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; use Phpoaipmh\Endpoint; diff --git a/Tests/Functional/Common/MetsDocumentTest.php b/Tests/Functional/Common/MetsDocumentTest.php index d5147cbf81..2dd222e16a 100644 --- a/Tests/Functional/Common/MetsDocumentTest.php +++ b/Tests/Functional/Common/MetsDocumentTest.php @@ -2,7 +2,7 @@ namespace Kitodo\Dlf\Tests\Functional\Common; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; class MetsDocumentTest extends FunctionalTestCase @@ -18,7 +18,7 @@ public function setUp(): void protected function doc(string $file) { $url = 'http://web:8001/Tests/Fixtures/MetsDocument/' . $file; - $doc = Doc::getInstance($url); + $doc = AbstractDocument::getInstance($url); $this->assertNotNull($doc); return $doc; } diff --git a/Tests/Functional/Common/SolrIndexingTest.php b/Tests/Functional/Common/SolrIndexingTest.php index d1310f23b6..90fda4f8ec 100644 --- a/Tests/Functional/Common/SolrIndexingTest.php +++ b/Tests/Functional/Common/SolrIndexingTest.php @@ -2,10 +2,9 @@ namespace Kitodo\Dlf\Tests\Functional\Common; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Indexer; -use Kitodo\Dlf\Common\Solr; -use Kitodo\Dlf\Domain\Model\Collection; +use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Domain\Model\SolrCore; use Kitodo\Dlf\Domain\Repository\CollectionRepository; use Kitodo\Dlf\Domain\Repository\DocumentRepository; @@ -13,7 +12,6 @@ use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; class SolrIndexingTest extends FunctionalTestCase @@ -75,10 +73,10 @@ public function canIndexAndSearchDocument() $document->setSolrcore($core->model->getUid()); $this->persistenceManager->persistAll(); - $doc = Doc::getInstance($document->getLocation()); - $document->setDoc($doc); + $doc = AbstractDocument::getInstance($document->getLocation()); + $document->setCurrentDocument($doc); - $indexingSuccessful = Indexer::add($document); + $indexingSuccessful = Indexer::add($document, $this->documentRepository); $this->assertTrue($indexingSuccessful); $solrSettings = [ diff --git a/Tests/Functional/FunctionalTestCase.php b/Tests/Functional/FunctionalTestCase.php index 16b2251270..2a7a6523d6 100644 --- a/Tests/Functional/FunctionalTestCase.php +++ b/Tests/Functional/FunctionalTestCase.php @@ -3,7 +3,7 @@ namespace Kitodo\Dlf\Tests\Functional; use GuzzleHttp\Client as HttpClient; -use Kitodo\Dlf\Common\Solr; +use Kitodo\Dlf\Common\Solr\Solr; use Symfony\Component\Yaml\Yaml; use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Utility\ArrayUtility; diff --git a/Tests/Functional/Repository/DocumentRepositoryTest.php b/Tests/Functional/Repository/DocumentRepositoryTest.php index 0e4c1804c8..8d9de065f4 100644 --- a/Tests/Functional/Repository/DocumentRepositoryTest.php +++ b/Tests/Functional/Repository/DocumentRepositoryTest.php @@ -2,7 +2,7 @@ namespace Kitodo\Dlf\Tests\Functional\Repository; -use Kitodo\Dlf\Common\Doc; +use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\MetsDocument; use Kitodo\Dlf\Domain\Repository\DocumentRepository; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; @@ -37,7 +37,7 @@ public function canRetrieveDocument(): void $this->assertNotEmpty($document->getTitle()); $this->assertEquals('Default Library', $document->getOwner()->getLabel()); - $doc = Doc::getInstance($document->getLocation()); + $doc = AbstractDocument::getInstance($document->getLocation()); $this->assertInstanceOf(MetsDocument::class, $doc); } diff --git a/composer.json b/composer.json index 7ac9161dca..ee5a504c40 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "csidirop/presentation", + "name": "ub-mannheim/presentation", "description": "Base plugins, modules, services and API of the Digital Library Framework. It is part of the community-based Kitodo Digitization Suite.", "type": "typo3-cms-extension", "homepage": "https://www.kitodo.org", @@ -38,9 +38,9 @@ "ext-libxml": "*", "ext-openssl": "*", "ext-simplexml": "*", - "typo3/cms-core": "^9.5.31|^10.4.36", - "typo3/cms-extbase": "^9.5.31|^10.4.36", - "typo3/cms-tstemplate": "^9.5.31|^10.4.36", + "typo3/cms-core": "^10.4.36|^11.5.30", + "typo3/cms-extbase": "^10.4.36|^11.5.30", + "typo3/cms-tstemplate": "^10.4.36|^11.5.30", "caseyamcl/phpoaipmh": "^3.3.1", "ubl/php-iiif-prezi-reader": "0.3.0", "solarium/solarium": "^5.2.0", @@ -48,11 +48,11 @@ }, "require-dev": { "spatie/phpunit-watcher": "^1.23.0", - "typo3/cms-backend": "^9.5.31|^10.4.36", - "typo3/cms-fluid": "^9.5.31|^10.4.36", - "typo3/cms-fluid-styled-content": "^9.5.31|^10.4.36", - "typo3/cms-frontend": "^9.5.31|^10.4.36", - "typo3/testing-framework": "^4.15.5|^6.16.7" + "typo3/cms-backend": "^10.4.36|^11.5.30", + "typo3/cms-fluid": "^10.4.36|^11.5.30", + "typo3/cms-fluid-styled-content": "^10.4.36|^11.5.30", + "typo3/cms-frontend": "^10.4.36|^11.5.30", + "typo3/testing-framework": "^6.16.9" }, "replace": { "typo3-ter/dlf": "self.version" diff --git a/composer.lock b/composer.lock index e71a4bb835..7787037669 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,62 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c36f7527b9abe40640d76f1b05efd029", + "content-hash": "2426f16cf72750dd7f8c03649dad6292", "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, { "name": "caseyamcl/phpoaipmh", "version": "v3.3.1", @@ -70,6 +124,115 @@ }, "time": "2023-01-27T17:40:27+00:00" }, + { + "name": "christian-riesen/base32", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/base32.git", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.5.13 || ^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Base32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Riesen", + "email": "chris.riesen@gmail.com", + "homepage": "http://christianriesen.com", + "role": "Developer" + } + ], + "description": "Base32 encoder/decoder according to RFC 4648", + "homepage": "https://github.com/ChristianRiesen/base32", + "keywords": [ + "base32", + "decode", + "encode", + "rfc4648" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/base32/issues", + "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" + }, + "time": "2021-02-26T10:19:33+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + }, + "time": "2023-08-25T16:18:39+00:00" + }, { "name": "doctrine/annotations", "version": "1.14.3", @@ -350,25 +513,29 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -387,9 +554,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/event-manager", @@ -631,27 +798,26 @@ }, { "name": "egulias/email-validator", - "version": "2.1.25", + "version": "3.2.6", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", "shasum": "" }, "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -659,7 +825,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -687,7 +853,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" }, "funding": [ { @@ -695,7 +861,7 @@ "type": "github" } ], - "time": "2020-12-29T14:50:06+00:00" + "time": "2023-06-01T07:04:22+00:00" }, { "name": "enshrined/svg-sanitize", @@ -790,37 +956,47 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.8", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "6.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -873,19 +1049,20 @@ } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -901,38 +1078,37 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:07+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -969,7 +1145,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -985,47 +1161,48 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.9.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", - "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.9-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } @@ -1064,6 +1241,11 @@ "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -1079,7 +1261,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.9.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -1095,7 +1277,7 @@ "type": "tidelift" } ], - "time": "2022-06-20T21:43:03+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "lolli42/finediff", @@ -1164,26 +1346,24 @@ }, { "name": "masterminds/html5", - "version": "2.7.6", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947" + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-dom": "*", - "ext-libxml": "*", "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" }, "type": "library", "extra": { @@ -1227,22 +1407,22 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.7.6" + "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" }, - "time": "2022-08-18T16:18:26+00:00" + "time": "2023-05-10T11:58:31+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -1283,9 +1463,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1399,24 +1579,27 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", @@ -1448,9 +1631,56 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2022-10-14T12:47:21+00:00" + "time": "2023-08-12T11:01:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.24.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1" + }, + "time": "2023-09-18T12:18:02+00:00" }, { "name": "psr/cache", @@ -1601,21 +1831,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1635,7 +1865,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -1647,27 +1877,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1687,7 +1917,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -1702,31 +1932,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1755,27 +1985,27 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/http-server-handler", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1795,7 +2025,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", @@ -1811,28 +2041,27 @@ "server" ], "support": { - "issues": "https://github.com/php-fig/http-server-handler/issues", - "source": "https://github.com/php-fig/http-server-handler/tree/master" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, - "time": "2018-10-30T16:46:14+00:00" + "time": "2023-04-10T20:06:20+00:00" }, { "name": "psr/http-server-middleware", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "type": "library", @@ -1853,7 +2082,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", @@ -1869,9 +2098,9 @@ ], "support": { "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/master" + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, - "time": "2018-10-30T17:12:04+00:00" + "time": "2023-04-11T06:14:47+00:00" }, { "name": "psr/log", @@ -2033,16 +2262,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.19", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "e9147c89fdfdc5d5ef798bb7193f23726ad609f5" + "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e9147c89fdfdc5d5ef798bb7193f23726ad609f5", - "reference": "e9147c89fdfdc5d5ef798bb7193f23726ad609f5", + "url": "https://api.github.com/repos/symfony/cache/zipball/62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", + "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", "shasum": "" }, "require": { @@ -2110,7 +2339,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.19" + "source": "https://github.com/symfony/cache/tree/v5.4.28" }, "funding": [ { @@ -2126,7 +2355,7 @@ "type": "tidelift" } ], - "time": "2023-01-19T09:49:58+00:00" + "time": "2023-08-05T08:32:42+00:00" }, { "name": "symfony/cache-contracts", @@ -2209,16 +2438,16 @@ }, { "name": "symfony/config", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9bd60843443cda9638efdca7c41eb82ed0026179" + "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9bd60843443cda9638efdca7c41eb82ed0026179", - "reference": "9bd60843443cda9638efdca7c41eb82ed0026179", + "url": "https://api.github.com/repos/symfony/config/zipball/8109892f27beed9252bd1f1c1880aeb4ad842650", + "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650", "shasum": "" }, "require": { @@ -2268,7 +2497,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.19" + "source": "https://github.com/symfony/config/tree/v5.4.26" }, "funding": [ { @@ -2284,20 +2513,20 @@ "type": "tidelift" } ], - "time": "2023-01-08T13:23:55+00:00" + "time": "2023-07-19T20:21:11+00:00" }, { "name": "symfony/console", - "version": "v5.4.19", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { @@ -2362,12 +2591,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.19" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -2383,20 +2612,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.20", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8185ed0df129005a26715902f1a53bad0fe67102" + "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8185ed0df129005a26715902f1a53bad0fe67102", - "reference": "8185ed0df129005a26715902f1a53bad0fe67102", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/addc22fed594f9ce04e73ef6a9d3e2416f77192d", + "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d", "shasum": "" }, "require": { @@ -2456,7 +2685,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.20" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.28" }, "funding": [ { @@ -2472,7 +2701,7 @@ "type": "tidelift" } ], - "time": "2023-01-27T11:08:11+00:00" + "time": "2023-08-14T10:47:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2543,16 +2772,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c" + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abf49cc084c087d94b4cb939c3f3672971784e0c", - "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", "shasum": "" }, "require": { @@ -2608,7 +2837,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.19" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" }, "funding": [ { @@ -2624,7 +2853,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-07-06T06:34:20+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2707,16 +2936,16 @@ }, { "name": "symfony/expression-language", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "5db17a4a1c41e2d43d9b84c2eb98a5f63b11c646" + "reference": "501589522b844b8eecf012c133f0404f0eef77ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/5db17a4a1c41e2d43d9b84c2eb98a5f63b11c646", - "reference": "5db17a4a1c41e2d43d9b84c2eb98a5f63b11c646", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/501589522b844b8eecf012c133f0404f0eef77ac", + "reference": "501589522b844b8eecf012c133f0404f0eef77ac", "shasum": "" }, "require": { @@ -2750,7 +2979,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v5.4.19" + "source": "https://github.com/symfony/expression-language/tree/v5.4.21" }, "funding": [ { @@ -2766,20 +2995,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.19", + "version": "v5.4.25", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "shasum": "" }, "require": { @@ -2814,7 +3043,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.19" + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" }, "funding": [ { @@ -2830,20 +3059,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-05-31T13:04:02+00:00" }, { "name": "symfony/finder", - "version": "v5.4.19", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f" + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6071aebf810ad13fe8200c224f36103abb37cf1f", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", "shasum": "" }, "require": { @@ -2877,7 +3106,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.19" + "source": "https://github.com/symfony/finder/tree/v5.4.27" }, "funding": [ { @@ -2893,20 +3122,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-07-31T08:02:31+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.20", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a" + "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0435363362a47c14e9cf50663cb8ffbf491875a", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/365992c83a836dfe635f1e903ccca43ee03d3dd2", + "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2", "shasum": "" }, "require": { @@ -2953,7 +3182,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.20" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.28" }, "funding": [ { @@ -2969,20 +3198,99 @@ "type": "tidelift" } ], - "time": "2023-01-29T11:11:52+00:00" + "time": "2023-08-21T07:23:18+00:00" + }, + { + "name": "symfony/lock", + "version": "v5.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/ed4055b2e03c8893ce2d0042c8f0e0707be8e179", + "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/dbal": "<2.13" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3.0", + "predis/predis": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v5.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-22T08:06:06+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.19", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "66081dc01cfc04fdea08bbd253f44627ec5591dd" + "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/66081dc01cfc04fdea08bbd253f44627ec5591dd", - "reference": "66081dc01cfc04fdea08bbd253f44627ec5591dd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/6330cd465dfd8b7a07515757a1c37069075f7b0b", + "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b", "shasum": "" }, "require": { @@ -3000,7 +3308,7 @@ "symfony/http-kernel": "<4.4" }, "require-dev": { - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/messenger": "^4.4|^5.0|^6.0" }, "type": "library", @@ -3029,7 +3337,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.19" + "source": "https://github.com/symfony/mailer/tree/v5.4.22" }, "funding": [ { @@ -3045,20 +3353,20 @@ "type": "tidelift" } ], - "time": "2023-01-09T05:43:46+00:00" + "time": "2023-03-10T10:15:32+00:00" }, { "name": "symfony/mime", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb" + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a858429a9c704edc53fe057228cf9ca282ba48eb", - "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb", + "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2", + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2", "shasum": "" }, "require": { @@ -3073,7 +3381,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" + "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -3081,7 +3389,7 @@ "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" + "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -3113,7 +3421,76 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.19" + "source": "https://github.com/symfony/mime/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-27T06:29:31+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" }, "funding": [ { @@ -3129,20 +3506,20 @@ "type": "tidelift" } ], - "time": "2023-01-09T05:43:46+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -3157,7 +3534,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3195,7 +3572,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -3211,20 +3588,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -3236,7 +3613,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3276,7 +3653,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -3292,20 +3669,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "a3d9148e2c363588e05abbdd4ee4f971f0a5330c" + "reference": "e46b4da57951a16053cd751f63f4a24292788157" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/a3d9148e2c363588e05abbdd4ee4f971f0a5330c", - "reference": "a3d9148e2c363588e05abbdd4ee4f971f0a5330c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", + "reference": "e46b4da57951a16053cd751f63f4a24292788157", "shasum": "" }, "require": { @@ -3317,7 +3694,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3363,7 +3740,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" }, "funding": [ { @@ -3379,20 +3756,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-03-21T17:27:24+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -3406,7 +3783,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3450,7 +3827,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -3466,20 +3843,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -3491,7 +3868,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3534,7 +3911,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -3550,20 +3927,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -3578,7 +3955,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3617,7 +3994,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -3633,20 +4010,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -3655,7 +4032,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3693,7 +4070,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -3709,20 +4086,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -3731,7 +4108,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3772,7 +4149,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -3788,20 +4165,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -3810,7 +4187,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3855,7 +4232,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -3871,20 +4248,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -3893,7 +4270,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3934,7 +4311,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -3950,20 +4327,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "20fcf370aed6b2b4a2d8170fa23d2d07250e94ab" + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/20fcf370aed6b2b4a2d8170fa23d2d07250e94ab", - "reference": "20fcf370aed6b2b4a2d8170fa23d2d07250e94ab", + "url": "https://api.github.com/repos/symfony/property-access/zipball/0249e46f69e92049a488f39fcf531cb42c50caaa", + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa", "shasum": "" }, "require": { @@ -4011,11 +4388,11 @@ "injection", "object", "property", - "property path", + "property-path", "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.19" + "source": "https://github.com/symfony/property-access/tree/v5.4.26" }, "funding": [ { @@ -4031,20 +4408,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-07-13T15:20:41+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.19", + "version": "v5.4.24", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "8ccf54bce2e2edbface1e99cb5a2560a290c9e2d" + "reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/8ccf54bce2e2edbface1e99cb5a2560a290c9e2d", - "reference": "8ccf54bce2e2edbface1e99cb5a2560a290c9e2d", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d43b85b00699b4484964c297575b5c6f9dc5f6e1", + "reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1", "shasum": "" }, "require": { @@ -4106,7 +4483,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.19" + "source": "https://github.com/symfony/property-info/tree/v5.4.24" }, "funding": [ { @@ -4122,20 +4499,90 @@ "type": "tidelift" } ], - "time": "2023-01-14T11:26:56+00:00" + "time": "2023-05-15T20:11:03+00:00" + }, + { + "name": "symfony/rate-limiter", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/189c8aa18be55c734d56d8ea8b0d1862e9a0e493", + "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/lock": "^5.2|^6.0", + "symfony/options-resolver": "^5.1|^6.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-10T11:10:11+00:00" }, { "name": "symfony/routing", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "df1b28f37c8e78912213c58ef6ab2f2037bbfdc5" + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/df1b28f37c8e78912213c58ef6ab2f2037bbfdc5", - "reference": "df1b28f37c8e78912213c58ef6ab2f2037bbfdc5", + "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", "shasum": "" }, "require": { @@ -4196,7 +4643,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.19" + "source": "https://github.com/symfony/routing/tree/v5.4.26" }, "funding": [ { @@ -4212,7 +4659,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-07-24T13:28:37+00:00" }, { "name": "symfony/service-contracts", @@ -4299,16 +4746,16 @@ }, { "name": "symfony/string", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" + "reference": "1181fe9270e373537475e826873b5867b863883c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", + "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", + "reference": "1181fe9270e373537475e826873b5867b863883c", "shasum": "" }, "require": { @@ -4365,7 +4812,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.19" + "source": "https://github.com/symfony/string/tree/v5.4.26" }, "funding": [ { @@ -4381,20 +4828,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-06-28T12:46:07+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.19", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6" + "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6", - "reference": "2a1d06fcf2b30829d6c01dae8e6e188424d1f8f6", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/11401fe94f960249b3c63a488c63ba73091c1e4a", + "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a", "shasum": "" }, "require": { @@ -4438,7 +4885,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.19" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.26" }, "funding": [ { @@ -4454,20 +4901,20 @@ "type": "tidelift" } ], - "time": "2023-01-12T16:39:29+00:00" + "time": "2023-07-20T07:21:16+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.19", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { @@ -4513,7 +4960,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.19" + "source": "https://github.com/symfony/yaml/tree/v5.4.23" }, "funding": [ { @@ -4529,7 +4976,7 @@ "type": "tidelift" } ], - "time": "2023-01-10T18:51:14+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { "name": "typo3/class-alias-loader", @@ -4595,20 +5042,20 @@ }, { "name": "typo3/cms-cli", - "version": "2.0.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/TYPO3/cms-cli.git", - "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82" + "reference": "d8947732ff5a6dc52829e88cb1c761124475c0e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", - "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", + "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/d8947732ff5a6dc52829e88cb1c761124475c0e8", + "reference": "d8947732ff5a6dc52829e88cb1c761124475c0e8", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.0 || ^8.0" }, "bin": [ "typo3" @@ -4622,9 +5069,9 @@ "homepage": "https://typo3.org", "support": { "issues": "https://github.com/TYPO3/cms-cli/issues", - "source": "https://github.com/TYPO3/cms-cli/tree/master" + "source": "https://github.com/TYPO3/cms-cli/tree/3.1.1" }, - "time": "2018-03-08T20:16:43+00:00" + "time": "2023-08-15T10:14:53+00:00" }, { "name": "typo3/cms-composer-installers", @@ -4703,38 +5150,43 @@ }, { "name": "typo3/cms-core", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/core.git", - "reference": "c269ad1ded5c3634320583b22877e8d1876b1c22" + "reference": "1a14cc907bbd3c96401cb041166dc368f2ebdfb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/c269ad1ded5c3634320583b22877e8d1876b1c22", - "reference": "c269ad1ded5c3634320583b22877e8d1876b1c22", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/1a14cc907bbd3c96401cb041166dc368f2ebdfb4", + "reference": "1a14cc907bbd3c96401cb041166dc368f2ebdfb4", "shasum": "" }, "require": { - "doctrine/annotations": "^1.7", - "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", - "doctrine/instantiator": "^1.1", - "doctrine/lexer": "^1.0", - "egulias/email-validator": "^2.1", + "bacon/bacon-qr-code": "^2.0.4", + "christian-riesen/base32": "^1.6", + "composer-runtime-api": "^2.1", + "doctrine/annotations": "^1.11", + "doctrine/dbal": "^2.13.8", + "doctrine/event-manager": "^1.0.0", + "doctrine/instantiator": "^1.4", + "doctrine/lexer": "^1.2.3", + "egulias/email-validator": "^3.2.1", "enshrined/svg-sanitize": "^0.15.4", + "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-pcre": "*", "ext-pdo": "*", "ext-session": "*", "ext-xml": "*", - "guzzlehttp/guzzle": "^6.5.8", - "guzzlehttp/psr7": "^1.8.5", + "guzzlehttp/guzzle": "^7.7.0", + "guzzlehttp/psr7": "^2.4.3", "lolli42/finediff": "^1.0.1", "masterminds/html5": "^2.7.6", - "nikic/php-parser": "^4.10.4", - "php": "^7.2", - "psr/container": "^1.0", + "nikic/php-parser": "^4.13.2", + "php": "^7.4 || ^8.0", + "psr/container": "^1.1 || ^2.0", "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", @@ -4742,40 +5194,39 @@ "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^1.0", - "symfony/config": "^4.4 || ^5.0", - "symfony/console": "^4.4 || ^5.0", - "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/config": "^5.4", + "symfony/console": "^5.4", + "symfony/dependency-injection": "^5.4", "symfony/event-dispatcher-contracts": "^1.1 || ^2.0", - "symfony/expression-language": "^4.4 || ^5.0", - "symfony/filesystem": "^4.4 || ^5.0", - "symfony/finder": "^4.4 || ^5.0", - "symfony/http-foundation": "^4.4 || ^5.0", - "symfony/mailer": "^4.4 || ^5.0", - "symfony/mime": "^4.4.16 || ^5.1.8", - "symfony/polyfill-intl-icu": "^1.6", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-intl-normalizer": "^1.22", - "symfony/polyfill-mbstring": "^1.16", - "symfony/polyfill-php73": "^1.16", - "symfony/polyfill-php80": "^1.16", + "symfony/expression-language": "^5.4", + "symfony/filesystem": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/mailer": "^5.4", + "symfony/mime": "^5.4", + "symfony/options-resolver": "^5.4", + "symfony/polyfill-intl-icu": "^1.23.0", + "symfony/polyfill-intl-idn": "^1.23.0", + "symfony/polyfill-intl-normalizer": "^1.27", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1", "symfony/polyfill-php81": "^1.23", - "symfony/routing": "^4.4 || ^5.0", - "symfony/yaml": "^4.4 || ^5.0", - "typo3/class-alias-loader": "^1.0", - "typo3/cms-cli": "^2.0", - "typo3/cms-composer-installers": "^2.0 || ^3.0", - "typo3/html-sanitizer": "^2.1.1", + "symfony/rate-limiter": "^5.4.8", + "symfony/routing": "^5.4", + "symfony/yaml": "^5.4", + "typo3/class-alias-loader": "^1.1.4", + "typo3/cms-cli": "^3.1", + "typo3/cms-composer-installers": "^2.0 || ^3.0 || ^4.0", + "typo3/html-sanitizer": "^2.1.3", "typo3/phar-stream-wrapper": "^3.1.7", "typo3/symfony-psr-event-dispatcher-adapter": "^1.0 || ^2.0", - "typo3fluid/fluid": "^2.6.10" + "typo3fluid/fluid": "^2.7.2" }, "conflict": { - "guzzlehttp/guzzle": "6.5.0", "hoa/core": "*", "typo3/cms": "*" }, "provide": { - "psr/http-client-implementation": "1.0", "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, @@ -4784,31 +5235,19 @@ "typo3/cms-saltedpasswords": "*", "typo3/cms-sv": "*" }, - "require-dev": { - "codeception/codeception": "^4.0", - "codeception/module-asserts": "^1.1", - "codeception/module-filesystem": "^1.0", - "codeception/module-webdriver": "^1.0.1", - "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", - "mikey179/vfsstream": "^1.6.11", - "phpspec/prophecy": "^1.14.0", - "phpstan/phpstan": "^0.12.64", - "typo3/cms-styleguide": "~10.0.4", - "typo3/testing-framework": "^6.16.6" - }, "suggest": { "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images", "ext-intl": "TYPO3 with unicode-based filesystems", "ext-mysqli": "", - "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint, and for extensions such as \"rsaauth\"", + "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint", "ext-zip": "", "ext-zlib": "TYPO3 uses zlib for amongst others output compression and un/packing t3x extension files" }, "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -4818,11 +5257,6 @@ "partOfMinimalUsableSystem": true }, "extension-key": "core" - }, - "typo3/class-alias-loader": { - "class-alias-maps": [ - "Migrations/Code/ClassAliasMap.php" - ] } }, "autoload": { @@ -4855,29 +5289,29 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-extbase", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/extbase.git", - "reference": "4120f291b9d32c88a58ba025ffdcf37ebbbbc346" + "reference": "e88222da652c300b0a91ed5054c3d67043b334a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/4120f291b9d32c88a58ba025ffdcf37ebbbbc346", - "reference": "4120f291b9d32c88a58ba025ffdcf37ebbbbc346", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/e88222da652c300b0a91ed5054c3d67043b334a5", + "reference": "e88222da652c300b0a91ed5054c3d67043b334a5", "shasum": "" }, "require": { "phpdocumentor/reflection-docblock": "^5.2", - "phpdocumentor/type-resolver": "^1.3", - "symfony/dependency-injection": "^4.4 || ^5.0", - "symfony/property-access": "^4.4 || ^5.0", - "symfony/property-info": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.36" + "phpdocumentor/type-resolver": "^1.4", + "symfony/dependency-injection": "^5.4", + "symfony/property-access": "^5.4", + "symfony/property-info": "^5.4", + "typo3/cms-core": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -4888,7 +5322,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -4924,24 +5358,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-tstemplate", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/tstemplate.git", - "reference": "7b5cb110d82eb8c6c4139780ae8d138a12d8cf17" + "reference": "3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/7b5cb110d82eb8c6c4139780ae8d138a12d8cf17", - "reference": "7b5cb110d82eb8c6c4139780ae8d138a12d8cf17", + "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6", + "reference": "3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6", "shasum": "" }, "require": { - "typo3/cms-core": "10.4.36" + "typo3/cms-core": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -4949,7 +5383,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -4982,20 +5416,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/html-sanitizer", - "version": "v2.1.1", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/TYPO3/html-sanitizer.git", - "reference": "f8b9c466a08fe4b7bd32b4b8dbde5cf7fbfa9956" + "reference": "a35f220b2336e3f040f91d3de23d19964833643f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/f8b9c466a08fe4b7bd32b4b8dbde5cf7fbfa9956", - "reference": "f8b9c466a08fe4b7bd32b4b8dbde5cf7fbfa9956", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/a35f220b2336e3f040f91d3de23d19964833643f", + "reference": "a35f220b2336e3f040f91d3de23d19964833643f", "shasum": "" }, "require": { @@ -5031,9 +5465,9 @@ "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", "support": { "issues": "https://github.com/TYPO3/html-sanitizer/issues", - "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.1" + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.3" }, - "time": "2022-12-13T08:07:15+00:00" + "time": "2023-07-25T08:47:32+00:00" }, { "name": "typo3/phar-stream-wrapper", @@ -5135,27 +5569,28 @@ }, { "name": "typo3fluid/fluid", - "version": "2.7.2", + "version": "2.7.4", "source": { "type": "git", "url": "https://github.com/TYPO3/Fluid.git", - "reference": "50ee1ee19ee00947c92bcb554bbea4fb5463b468" + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/50ee1ee19ee00947c92bcb554bbea4fb5463b468", - "reference": "50ee1ee19ee00947c92bcb554bbea4fb5463b468", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "ext-json": "*", "ext-mbstring": "*", "friendsofphp/php-cs-fixer": "^3.4", "phpstan/phpstan": "^1.7", "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5.26 || ^9.5" + "phpunit/phpunit": "^8.5.33 || ^9.5.28 || ^10.0.16" }, "suggest": { "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" @@ -5180,7 +5615,7 @@ "issues": "https://github.com/TYPO3/Fluid/issues", "source": "https://github.com/TYPO3/Fluid" }, - "time": "2022-07-28T11:24:11+00:00" + "time": "2023-03-23T12:04:09+00:00" }, { "name": "ubl/php-iiif-prezi-reader", @@ -5505,28 +5940,28 @@ }, { "name": "evenement/evenement", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9 || ^6" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5546,9 +5981,9 @@ ], "support": { "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, - "time": "2017-07-23T21:35:13+00:00" + "time": "2023-08-08T05:53:35+00:00" }, { "name": "jolicode/jolinotif", @@ -5665,16 +6100,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -5712,7 +6147,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -5720,7 +6155,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "phar-io/manifest", @@ -5835,23 +6270,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.24", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -5866,8 +6301,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -5900,7 +6335,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -5908,7 +6344,7 @@ "type": "github" } ], - "time": "2023-01-26T08:26:55+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6153,16 +6589,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.3", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { @@ -6177,7 +6613,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -6195,8 +6631,8 @@ "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -6235,7 +6671,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -6251,37 +6688,35 @@ "type": "tidelift" } ], - "time": "2023-02-04T13:37:15+00:00" + "time": "2023-09-19T05:39:22+00:00" }, { "name": "react/event-loop", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137" + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/187fb56f46d424afb6ec4ad089269c72eec2e137", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "ext-event": "~1.0 for ExtEventLoop", - "ext-pcntl": "For signal handling support when using the StreamSelectLoop", - "ext-uv": "* for ExtUvLoop" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { "psr-4": { - "React\\EventLoop\\": "src" + "React\\EventLoop\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6317,32 +6752,28 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.3.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-03-17T11:10:22+00:00" + "time": "2023-05-05T10:11:24+00:00" }, { "name": "react/stream", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9" + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/7a423506ee1903e89f1e08ec5f0ed430ff784ae9", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", "shasum": "" }, "require": { @@ -6352,12 +6783,12 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src" + "React\\Stream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6399,19 +6830,15 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.2.0" + "source": "https://github.com/reactphp/stream/tree/v1.3.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-07-11T12:37:55+00:00" + "time": "2023-06-16T10:52:11+00:00" }, { "name": "sebastian/cli-parser", @@ -6713,16 +7140,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -6767,7 +7194,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -6775,7 +7202,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -6919,16 +7346,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -6971,7 +7398,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -6979,7 +7406,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -7443,16 +7870,16 @@ }, { "name": "symfony/process", - "version": "v5.4.19", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", "shasum": "" }, "require": { @@ -7485,7 +7912,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.19" + "source": "https://github.com/symfony/process/tree/v5.4.28" }, "funding": [ { @@ -7501,7 +7928,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-08-07T10:36:04+00:00" }, { "name": "theseer/tokenizer", @@ -7555,27 +7982,28 @@ }, { "name": "typo3/cms-backend", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/backend.git", - "reference": "9e9da7277cf48b5d6e5a5dfda6e2034443ca71b4" + "reference": "e45ef6579d1f4e4459c2a79d222a455f06addec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/9e9da7277cf48b5d6e5a5dfda6e2034443ca71b4", - "reference": "9e9da7277cf48b5d6e5a5dfda6e2034443ca71b4", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/e45ef6579d1f4e4459c2a79d222a455f06addec7", + "reference": "e45ef6579d1f4e4459c2a79d222a455f06addec7", "shasum": "" }, "require": { "psr/event-dispatcher": "^1.0", - "typo3/cms-core": "10.4.36", - "typo3/cms-recordlist": "10.4.36" + "typo3/cms-core": "11.5.31", + "typo3/cms-recordlist": "11.5.31" }, "conflict": { "typo3/cms": "*" }, "replace": { + "typo3/cms-about": "*", "typo3/cms-context-help": "*", "typo3/cms-cshmanual": "*", "typo3/cms-func-wizards": "*", @@ -7588,7 +8016,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -7598,11 +8026,6 @@ "partOfMinimalUsableSystem": true }, "extension-key": "backend" - }, - "typo3/class-alias-loader": { - "class-alias-maps": [ - "Migrations/Code/ClassAliasMap.php" - ] } }, "autoload": { @@ -7629,27 +8052,27 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-fluid", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid.git", - "reference": "2996b27f324b742037e3717bfa6f9039598a124d" + "reference": "83e976d4bb5459a906bc0f9beace0dffcf3a4132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/2996b27f324b742037e3717bfa6f9039598a124d", - "reference": "2996b27f324b742037e3717bfa6f9039598a124d", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/83e976d4bb5459a906bc0f9beace0dffcf3a4132", + "reference": "83e976d4bb5459a906bc0f9beace0dffcf3a4132", "shasum": "" }, "require": { - "symfony/dependency-injection": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.36", - "typo3/cms-extbase": "10.4.36", - "typo3fluid/fluid": "^2.6.10" + "symfony/dependency-injection": "^5.4", + "typo3/cms-core": "11.5.31", + "typo3/cms-extbase": "11.5.31", + "typo3fluid/fluid": "^2.7.2" }, "conflict": { "typo3/cms": "*" @@ -7657,10 +8080,11 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { + "serviceProvider": "TYPO3\\CMS\\Fluid\\ServiceProvider", "protected": true, "partOfFactoryDefault": true, "partOfMinimalUsableSystem": true @@ -7688,30 +8112,30 @@ "homepage": "https://typo3.org", "support": { "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/10.4/en-us/", + "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/main/en-us/", "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-fluid-styled-content", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", - "reference": "756be1fe8773f4601a70db8c12a0d304faa39070" + "reference": "01291ea08512db09cbd6070f42040901fbdbb796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/756be1fe8773f4601a70db8c12a0d304faa39070", - "reference": "756be1fe8773f4601a70db8c12a0d304faa39070", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/01291ea08512db09cbd6070f42040901fbdbb796", + "reference": "01291ea08512db09cbd6070f42040901fbdbb796", "shasum": "" }, "require": { - "typo3/cms-core": "10.4.36", - "typo3/cms-fluid": "10.4.36", - "typo3/cms-frontend": "10.4.36" + "typo3/cms-core": "11.5.31", + "typo3/cms-fluid": "11.5.31", + "typo3/cms-frontend": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -7719,7 +8143,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -7748,30 +8172,30 @@ "homepage": "https://typo3.org", "support": { "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org/c/typo3/cms-fluid-styled-content/10.4/en-us", + "docs": "https://docs.typo3.org/c/typo3/cms-fluid-styled-content/main/en-us", "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-frontend", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/frontend.git", - "reference": "d682d300d56f211f12bc38622a4915c4ef4a0ff0" + "reference": "6b3824f3ea2395920167909855fa2a2e0fed705d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/d682d300d56f211f12bc38622a4915c4ef4a0ff0", - "reference": "d682d300d56f211f12bc38622a4915c4ef4a0ff0", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/6b3824f3ea2395920167909855fa2a2e0fed705d", + "reference": "6b3824f3ea2395920167909855fa2a2e0fed705d", "shasum": "" }, "require": { "ext-libxml": "*", - "symfony/polyfill-mbstring": "^1.16", - "typo3/cms-core": "10.4.36" + "symfony/polyfill-mbstring": "^1.23.1", + "typo3/cms-core": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -7782,7 +8206,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -7818,29 +8242,31 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-install", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/install.git", - "reference": "7af143a5ec04f38cc67fd1d9db02b6857ce0c568" + "reference": "7738fd30fb8b7aa539c763ebd2e39642d92093d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/7af143a5ec04f38cc67fd1d9db02b6857ce0c568", - "reference": "7af143a5ec04f38cc67fd1d9db02b6857ce0c568", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/7738fd30fb8b7aa539c763ebd2e39642d92093d4", + "reference": "7738fd30fb8b7aa539c763ebd2e39642d92093d4", "shasum": "" }, "require": { - "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", - "nikic/php-parser": "^4.10.4", - "symfony/finder": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.36", - "typo3/cms-extbase": "10.4.36", - "typo3/cms-fluid": "10.4.36" + "doctrine/dbal": "^2.13.8", + "guzzlehttp/promises": "^1.5.2 || ^2.0", + "nikic/php-parser": "^4.13.2", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "typo3/cms-core": "11.5.31", + "typo3/cms-extbase": "11.5.31", + "typo3/cms-fluid": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -7848,7 +8274,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -7884,24 +8310,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/cms-recordlist", - "version": "v10.4.36", + "version": "v11.5.31", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/recordlist.git", - "reference": "6255a4e3a12ea1c5245b7394a8dbb04e3a06c1be" + "reference": "04c26e11c5128991bac2d4b5f1b704935e6fb89f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/6255a4e3a12ea1c5245b7394a8dbb04e3a06c1be", - "reference": "6255a4e3a12ea1c5245b7394a8dbb04e3a06c1be", + "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/04c26e11c5128991bac2d4b5f1b704935e6fb89f", + "reference": "04c26e11c5128991bac2d4b5f1b704935e6fb89f", "shasum": "" }, "require": { - "typo3/cms-core": "10.4.36" + "typo3/cms-core": "11.5.31" }, "conflict": { "typo3/cms": "*" @@ -7909,7 +8335,7 @@ "type": "typo3-cms-framework", "extra": { "branch-alias": { - "dev-master": "10.4.x-dev" + "dev-master": "11.5.x-dev" }, "typo3/cms": { "Package": { @@ -7944,20 +8370,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-02-07T10:47:38+00:00" + "time": "2023-09-12T06:50:21+00:00" }, { "name": "typo3/testing-framework", - "version": "6.16.7", + "version": "6.16.9", "source": { "type": "git", "url": "https://github.com/TYPO3/testing-framework.git", - "reference": "1bd9e2cfa2ae90f3e69bc1f03f50c615aecd619b" + "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/testing-framework/zipball/1bd9e2cfa2ae90f3e69bc1f03f50c615aecd619b", - "reference": "1bd9e2cfa2ae90f3e69bc1f03f50c615aecd619b", + "url": "https://api.github.com/repos/TYPO3/testing-framework/zipball/62005ddb550f8b1c69c955c8683a8a632a44f482", + "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482", "shasum": "" }, "require": { @@ -8018,9 +8444,9 @@ "support": { "general": "https://typo3.org/support/", "issues": "https://github.com/TYPO3/testing-framework/issues", - "source": "https://github.com/TYPO3/testing-framework/tree/6.16.7" + "source": "https://github.com/TYPO3/testing-framework/tree/6.16.9" }, - "time": "2023-02-09T19:06:13+00:00" + "time": "2023-08-02T16:11:00+00:00" }, { "name": "yosymfony/resource-watcher", @@ -8095,5 +8521,5 @@ "ext-simplexml": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/ext_conf_template.txt b/ext_conf_template.txt index ce144a9592..be2213a9bb 100644 --- a/ext_conf_template.txt +++ b/ext_conf_template.txt @@ -1,141 +1,141 @@ -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.enableInternalProxy +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.enableInternalProxy enableInternalProxy = 0 -# cat=Basic; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.useragent +# cat=Basic; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.useragent useragent = Kitodo.Presentation -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.forceAbsoluteUrl +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.forceAbsoluteUrl forceAbsoluteUrl = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.forceAbsoluteUrlHttps +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.forceAbsoluteUrlHttps forceAbsoluteUrlHttps = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.caching +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.caching caching = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.publishNewCollections +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.publishNewCollections publishNewCollections = 1 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.unhideOnIndex +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.unhideOnIndex unhideOnIndex = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.useExternalApisForMetadata +# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.useExternalApisForMetadata useExternalApisForMetadata = 0 -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fileGrpImages +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpImages fileGrpImages = DEFAULT,MAX -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fileGrpThumbs +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpThumbs fileGrpThumbs = THUMBS -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fileGrpDownload +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpDownload fileGrpDownload = DOWNLOAD -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fileGrpFulltext +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpFulltext fileGrpFulltext = FULLTEXT -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fileGrpAudio +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpAudio fileGrpAudio = AUDIO #//OCR-On-Demand -# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fulltextFolder +# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fulltextFolder fulltextFolder = fileadmin/fulltextFolder -# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fulltextTempFolder +# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fulltextTempFolder fulltextTempFolder = fileadmin/_temp_/ocrTempFolder/fulltext -# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fulltextImagesFolder +# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fulltextImagesFolder fulltextImagesFolder = fileadmin/_temp_/ocrTempFolder/images -# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.fulltextLockFolder +# cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fulltextLockFolder fulltextLockFolder = fileadmin/_temp_/ocrTempFolder/lock -# cat=Fulltext-OCR-general; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrDebug +# cat=Fulltext-OCR-general; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrDebug ocrDebug=0 -# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrEngines +# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrEngines ocrEngines = typo3conf/ext/dlf/Classes/Plugin/Tools/FullTextGenerationScripts/ -# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrEnginesConfig +# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrEnginesConfig ocrEnginesConfig = ocrEngines.json -# cat=Fulltext-OCR-Engines; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->printActiveOCREngines]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrLoadActiveOCREngines +# cat=Fulltext-OCR-Engines; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->printActiveOCREngines]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrLoadActiveOCREngines ocrLoadActiveOCREngines = 0 -# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrEngine +# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrEngine ocrEngine=tesseract-basic -# cat=Fulltext-OCR-Engines; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkOCRDConnection]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrdConnect +# cat=Fulltext-OCR-Engines; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkOCRDConnection]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrdConnect ocrdConnect = 0 -# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrdHost +# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrdHost ocrdHost = -# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrPlaceholder +# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrPlaceholder ocrPlaceholder=1 -# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrPlaceholderText +# cat=Fulltext-OCR-Engines; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrPlaceholderText ocrPlaceholderText=OCR is being prepared, please try to refresh the page -# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrDelay +# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrDelay ocrDelay=2 -# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrThreads +# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrThreads ocrThreads=4 -# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrTimeout +# cat=Fulltext-OCR-Engines; type=int; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrTimeout ocrTimeout=600 -# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrUpdateMets +# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrUpdateMets ocrUpdateMets=0 -# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrIndexMets +# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrIndexMets ocrIndexMets=0 -# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.ocrDwnlTempImage +# cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrDwnlTempImage ocrDwnlTempImage=0 -# cat=IIIF; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.indexAnnotations +# cat=IIIF; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.indexAnnotations indexAnnotations = 0 -# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.iiifThumbnailWidth +# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiifThumbnailWidth iiifThumbnailWidth = 150 -# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.iiifThumbnailHeight +# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiifThumbnailHeight iiifThumbnailHeight = 150 -# cat=Solr; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkSolrConnection]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrConnect +# cat=Solr; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkSolrConnection]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrConnect solrConnect = 0 -# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrHttps +# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrHttps solrHttps = 0 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrHost +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrHost solrHost = localhost -# cat=Solr; type=int[0-65535]; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrPort +# cat=Solr; type=int[0-65535]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPort solrPort = 8983 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrPath +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPath solrPath = / -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrUser +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrUser solrUser = -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrPass +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPass solrPass = -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrTimeout +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrTimeout solrTimeout = 10 -# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrAllowCoreDelete +# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrAllowCoreDelete solrAllowCoreDelete = 0 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldId +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldId solrFieldId = id -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldUid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldUid solrFieldUid = uid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldPid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPid solrFieldPid = pid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldPage +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPage solrFieldPage = page -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldPartof +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPartof solrFieldPartof = partof -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldRoot +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRoot solrFieldRoot = root -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldSid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldSid solrFieldSid = sid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldToplevel +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldToplevel solrFieldToplevel = toplevel -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldType +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldType solrFieldType = type -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldTitle +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTitle solrFieldTitle = title -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldVolume +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldVolume solrFieldVolume = volume -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldDate +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldDate solrFieldDate = date -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldThumbnail +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldThumbnail solrFieldThumbnail = thumbnail -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldDefault +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldDefault solrFieldDefault = default -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldTimestamp +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTimestamp solrFieldTimestamp = timestamp -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldAutocomplete +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldAutocomplete solrFieldAutocomplete = autocomplete -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldFulltext +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldFulltext solrFieldFulltext = fulltext -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldRecordId +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRecordId solrFieldRecordId = record_id -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldPurl +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPurl solrFieldPurl = purl -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldUrn +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldUrn solrFieldUrn = urn -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldLocation +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldLocation solrFieldLocation = location -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldCollection +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldCollection solrFieldCollection = collection -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldLicense +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldLicense solrFieldLicense = license -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldTerms +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTerms solrFieldTerms = terms -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldRestrictions +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRestrictions solrFieldRestrictions = restrictions -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/Labels.xml:config.solrFieldGeom +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldGeom solrFieldGeom = geom diff --git a/ext_localconf.php b/ext_localconf.php index 83090c0319..6079d9b38f 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -66,20 +66,18 @@ $_EXTKEY = 'dlf'; // Register tools for toolbox plugin. $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'] = []; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_fulltexttool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.fulltexttool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_annotationtool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.annotationtool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_fulltextdownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.fulltextdownloadtool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_imagedownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.imagedownloadtool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_imagemanipulationtool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.imagemanipulationtool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_pdfdownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.pdfdownloadtool'; -$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_searchindocumenttool'] = 'LLL:EXT:dlf/Resources/Private/Language/Labels.xml:tx_dlf_toolbox.searchindocumenttool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_fulltexttool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.fulltexttool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_annotationtool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.annotationtool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_fulltextdownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.fulltextdownloadtool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_imagedownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.imagedownloadtool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_imagemanipulationtool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.imagemanipulationtool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_pdfdownloadtool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.pdfdownloadtool'; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'][\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($_EXTKEY) . '_searchindocumenttool'] = 'LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:tx_dlf_toolbox.searchindocumenttool'; // Register hooks. $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = \Kitodo\Dlf\Hooks\DataHandler::class; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = \Kitodo\Dlf\Hooks\DataHandler::class; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Common/MetsDocument.php']['hookClass'][] = \Kitodo\Dlf\Hooks\KitodoProductionHacks::class; // Register AJAX eID handlers. -$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['tx_dlf_search_suggest'] = \Kitodo\Dlf\Eid\SearchSuggest::class . '::main'; -$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['tx_dlf_search_in_document'] = \Kitodo\Dlf\Eid\SearchInDocument::class . '::main'; if ($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['dlf']['enableInternalProxy'] ?? false) { $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['tx_dlf_pageview_proxy'] = \Kitodo\Dlf\Eid\PageViewProxy::class . '::main'; } @@ -126,11 +124,11 @@ 'Kitodo.Dlf', 'Search', [ - Search::class => 'main, search' + \Kitodo\Dlf\Controller\SearchController::class => 'main, search' ], // non-cacheable actions [ - Search::class => 'main, search' + \Kitodo\Dlf\Controller\SearchController::class => 'main, search' ] ); @@ -138,11 +136,11 @@ 'Kitodo.Dlf', 'Feeds', [ - Feeds::class => 'main', + \Kitodo\Dlf\Controller\FeedsController::class => 'main', ], // non-cacheable actions [ - Feeds::class => 'main', + \Kitodo\Dlf\Controller\FeedsController::class => 'main', ] ); @@ -150,11 +148,11 @@ 'Kitodo.Dlf', 'Statistics', [ - Statistics::class => 'main', + \Kitodo\Dlf\Controller\StatisticsController::class => 'main', ], // non-cacheable actions [ - Statistics::class => '', + \Kitodo\Dlf\Controller\StatisticsController::class => '', ] ); @@ -162,11 +160,11 @@ 'Kitodo.Dlf', 'TableOfContents', [ - TableOfContents::class => 'main', + \Kitodo\Dlf\Controller\TableOfContentsController::class => 'main', ], // non-cacheable actions [ - TableOfContents::class => '', + \Kitodo\Dlf\Controller\TableOfContentsController::class => '', ] ); @@ -174,11 +172,11 @@ 'Kitodo.Dlf', 'PageGrid', [ - PageGrid::class => 'main', + \Kitodo\Dlf\Controller\PageGridController::class => 'main', ], // non-cacheable actions [ - PageGrid::class => '', + \Kitodo\Dlf\Controller\PageGridController::class => '', ] ); @@ -186,11 +184,11 @@ 'Kitodo.Dlf', 'Navigation', [ - Navigation::class => 'main, pageSelect', + \Kitodo\Dlf\Controller\NavigationController::class => 'main, pageSelect', ], // non-cacheable actions [ - Navigation::class => 'pageSelect', + \Kitodo\Dlf\Controller\NavigationController::class => 'pageSelect', ] ); @@ -198,11 +196,11 @@ 'Kitodo.Dlf', 'AudioPlayer', [ - AudioPlayer::class => 'main', + \Kitodo\Dlf\Controller\AudioPlayerController::class => 'main', ], // non-cacheable actions [ - AudioPlayer::class => '', + \Kitodo\Dlf\Controller\AudioPlayerController::class => '', ] ); @@ -210,11 +208,11 @@ 'Kitodo.Dlf', 'Calendar', [ - Calendar::class => 'main, years, calendar', + \Kitodo\Dlf\Controller\CalendarController::class => 'main, years, calendar', ], // non-cacheable actions [ - Calendar::class => '', + \Kitodo\Dlf\Controller\CalendarController::class => '', ] ); @@ -222,11 +220,11 @@ 'Kitodo.Dlf', 'PageView', [ - PageView::class => 'main', + \Kitodo\Dlf\Controller\PageViewController::class => 'main', ], // non-cacheable actions [ - PageView::class => '', + \Kitodo\Dlf\Controller\PageViewController::class => '', ] ); @@ -234,11 +232,11 @@ 'Kitodo.Dlf', 'Basket', [ - Basket::class => 'main, add, basket', + \Kitodo\Dlf\Controller\BasketController::class => 'main, add, basket', ], // non-cacheable actions [ - Basket::class => 'main, add, basket', + \Kitodo\Dlf\Controller\BasketController::class => 'main, add, basket', ] ); @@ -246,11 +244,11 @@ 'Kitodo.Dlf', 'Toolbox', [ - Toolbox::class => 'main', + \Kitodo\Dlf\Controller\ToolboxController::class => 'main', ], // non-cacheable actions [ - Toolbox::class => '', + \Kitodo\Dlf\Controller\ToolboxController::class => '', ] ); @@ -258,11 +256,11 @@ 'Kitodo.Dlf', 'OaiPmh', [ - OaiPmh::class => 'main', + \Kitodo\Dlf\Controller\OaiPmhController::class => 'main', ], // non-cacheable actions [ - OaiPmh::class => 'main', + \Kitodo\Dlf\Controller\OaiPmhController::class => 'main', ] ); @@ -270,11 +268,11 @@ 'Kitodo.Dlf', 'ListView', [ - ListView::class => 'main', + \Kitodo\Dlf\Controller\ListViewController::class => 'main', ], // non-cacheable actions [ - ListView::class => 'main', + \Kitodo\Dlf\Controller\ListViewController::class => 'main', ] ); @@ -282,33 +280,33 @@ 'Kitodo.Dlf', 'Collection', [ - Collection::class => 'list, show, showSorted' + \Kitodo\Dlf\Controller\CollectionController::class => 'list, show, showSorted' ], // non-cacheable actions [ - Collection::class => 'showSorted', + \Kitodo\Dlf\Controller\CollectionController::class => 'showSorted', ] ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( 'Kitodo.Dlf', 'Metadata', [ - Metadata::class => 'main', + \Kitodo\Dlf\Controller\MetadataController::class => 'main', ], // non-cacheable actions [ - Metadata::class => '', + \Kitodo\Dlf\Controller\MetadataController::class => '', ] ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( 'Kitodo.Dlf', 'View3D', [ - View3D::class => 'main', + \Kitodo\Dlf\Controller\View3DController::class => 'main', ], // non-cacheable actions [ - View3D::class => '', + \Kitodo\Dlf\Controller\View3DController::class => '', ] ); diff --git a/ext_tables.php b/ext_tables.php index be574948b8..466875742c 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -18,7 +18,7 @@ 'newTenantModule', // Name of the module 'bottom', // Position of the module [// Allowed controller action combinations - Backend\NewTenant::class => 'index,error,addFormat,addMetadata,addSolrCore,addStructure', + \Kitodo\Dlf\Controller\Backend\NewTenantController::class => 'index,error,addFormat,addMetadata,addSolrCore,addStructure', ], [// Additional configuration 'access' => 'admin', diff --git a/ext_typoscript_setup.txt b/ext_typoscript_setup.txt deleted file mode 100644 index 5dbbab678c..0000000000 --- a/ext_typoscript_setup.txt +++ /dev/null @@ -1,71 +0,0 @@ -config.tx_extbase { - persistence { - classes { - Kitodo\Dlf\Domain\Model\ActionLog { - mapping { - tableName = tx_dlf_actionlog - } - } - Kitodo\Dlf\Domain\Model\Basket { - mapping { - tableName = tx_dlf_basket - } - } - Kitodo\Dlf\Domain\Model\Collection { - mapping { - tableName = tx_dlf_collections - } - } - Kitodo\Dlf\Domain\Model\Document { - mapping { - tableName = tx_dlf_documents - } - } - Kitodo\Dlf\Domain\Model\Format { - mapping { - tableName = tx_dlf_formats - } - } - Kitodo\Dlf\Domain\Model\Library { - mapping { - tableName = tx_dlf_libraries - } - } - Kitodo\Dlf\Domain\Model\Mail { - mapping { - tableName = tx_dlf_mail - } - } - Kitodo\Dlf\Domain\Model\Metadata { - mapping { - tableName = tx_dlf_metadata - } - } - Kitodo\Dlf\Domain\Model\MetadataFormat { - mapping { - tableName = tx_dlf_metadataformat - } - } - Kitodo\Dlf\Domain\Model\Printer { - mapping { - tableName = tx_dlf_printer - } - } - Kitodo\Dlf\Domain\Model\SolrCore { - mapping { - tableName = tx_dlf_solrcores - } - } - Kitodo\Dlf\Domain\Model\Structure { - mapping { - tableName = tx_dlf_structures - } - } - Kitodo\Dlf\Domain\Model\Token { - mapping { - tableName = tx_dlf_tokens - } - } - } - } -}