diff --git a/Classes/SignalSlot/SitemapSignalSlot.php b/Classes/SignalSlot/SitemapSignalSlot.php new file mode 100644 index 0000000000000000000000000000000000000000..a6ce4eb1048a1665a181b8758ff63a0540375328 --- /dev/null +++ b/Classes/SignalSlot/SitemapSignalSlot.php @@ -0,0 +1,112 @@ +<?php + +namespace SGalinski\SgJobs\SignalSlot; + +/*************************************************************** + * Copyright notice + * + * (c) sgalinski Internet Services (https://www.sgalinski.de) + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; +use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; + +/** + * Signal functions regarding sg_seo sitemap generation + */ +class SitemapSignalSlot { + const PLUGIN_NAME = 'sgjobs_jobapplication'; + + /** + * @var UriBuilder + */ + protected $uriBuilder; + + /** + * Before the sitemap is generated + * + * @param array $pageList + * @throws \TYPO3\CMS\Core\Error\Http\ServiceUnavailableException + */ + public function beforeSitemapGeneration(array &$pageList) { + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + $request = $objectManager->get(\TYPO3\CMS\Extbase\Mvc\Web\Request::class); + $request->setRequestUri(GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL')); + $request->setBaseUri(GeneralUtility::getIndpEnv('TYPO3_SITE_URL')); + + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + $contentObjectRenderer = $objectManager->get(ContentObjectRenderer::class); + + $configurationManager = $objectManager->get(ConfigurationManager::class); + $configurationManager->setContentObject($contentObjectRenderer); + $this->uriBuilder = $objectManager->get(UriBuilder::class); + $this->uriBuilder->injectConfigurationManager($configurationManager); + + // find sites where job detail plugin is added + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $databaseResource = $queryBuilder->select('pid', 'pages') + ->from('tt_content') + ->where( + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('list')), + $queryBuilder->expr()->eq('list_type', $queryBuilder->createNamedParameter(self::PLUGIN_NAME)) + ) + ) + ->execute(); + + $rows = $databaseResource->fetchAll(); + + foreach ($rows as $row) { + $jobs = $this->getJobsByPid($row['pages']); + + foreach ($jobs as $job) { + $url = $this->uriBuilder->reset()->setTargetPageUid($row['pid'])->setArguments( + ['tx_sgjobs_jobapplication' => ['jobId' => $job['uid']]] + )->setCreateAbsoluteUri(TRUE)->buildFrontendUri(); + + $pageList[] = [ + 'url' => $url, + 'title' => '' + ]; + } + } + } + + /** + * Get all jobs stored on specific page ids + * + * @param string $pageList + * @return array|null + */ + private function getJobsByPid($pageList) { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $databaseResource = $queryBuilder->select('*') + ->from('tx_sgjobs_domain_model_job') + ->where($queryBuilder->expr()->in('pid', $queryBuilder->createNamedParameter($pageList))) + ->execute(); + + return $databaseResource->fetchAll(); + } +} diff --git a/ext_localconf.php b/ext_localconf.php index 1d8f94ab7ddc70e576b32695cf5606772cef6355..a801f268b230f80bef451339322d916becb072a5 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -59,3 +59,15 @@ if (TYPO3_MODE === 'BE') { \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScriptSetup(file_get_contents($tsPath . 'setup.ts')); } + +// signal slot for sg_seo integration +/** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */ +$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class +); +$signalSlotDispatcher->connect( + \SGalinski\SgSeo\Generator\PagesSitemapGenerator::class, + 'accessPageList', + \SGalinski\SgJobs\SignalSlot\SitemapSignalSlot::class, + 'beforeSitemapGeneration' +);