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 - } - } - } - } -}