Skip to content
Snippets Groups Projects
Commit 7e61c6ed authored by Kevin Ditscheid's avatar Kevin Ditscheid
Browse files

[TASK] Replace the old signal slot for sitemap generation

parent b604b8af
No related branches found
No related tags found
1 merge request!23Feature upgrade to typo3 10
<?php
namespace SGalinski\SgJobs\Event\Listener;
use SGalinski\SgJobs\Service\SitemapService;
use SGalinski\SgSeo\Events\AccessPageListEvent;
use TYPO3\CMS\Core\Utility\ArrayUtility;
/**
* Class AccessPageListEventListener
*
* @package SGalinski\SgJobs\Event\Listener
*/
class AccessPageListEventListener {
/**
* @var SitemapService
*/
protected $sitemapService;
/**
* AccessPageListEventListener constructor.
*
* @param SitemapService $sitemapService
*/
public function __construct(SitemapService $sitemapService) {
$this->sitemapService = $sitemapService;
}
/**
* @param AccessPageListEvent $event
*/
public function __invoke(AccessPageListEvent $event) {
$pageList = $event->getPageList();
$additionalPageList = $this->sitemapService->generatePagesList($event->getSysLanguageUid());
ArrayUtility::mergeRecursiveWithOverrule($pageList, $additionalPageList);
$event->setPageList($pageList);
}
}
<?php
namespace SGalinski\SgJobs\Service;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\Languagevisibility\Exception\TableNotSupportedException;
use TYPO3\Languagevisibility\Service\FrontendServices;
/**
* Class SitemapService
*
* @package SGalinski\SgJobs\Service
*/
class SitemapService {
/**
* The plugin name
*/
public const PLUGIN_NAME = 'sgjobs_jobapplication';
/**
* Generate a pageList array for the sitemap generation
*
* @param int $sysLanguageUid
* @return array
*/
public function generatePagesList(int $sysLanguageUid): array {
$pageList = [];
// find sites where job detail plugin is added
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tt_content');
$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)
),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('sys_language_uid', -1),
$queryBuilder->expr()->eq(
'sys_language_uid',
$queryBuilder->createNamedParameter($sysLanguageUid, Connection::PARAM_INT)
)
)
)
)
->execute();
$rows = $databaseResource->fetchAll();
foreach ($rows as $row) {
$jobs = $this->getJobsByPid($row['pages'], $sysLanguageUid);
foreach ($jobs as $job) {
$url = $GLOBALS['TSFE']->cObj->typoLink_URL(
[
'parameter' => $row['pid'],
'linkAccessRestrictedPages' => 1,
'forceAbsoluteUrl' => 1,
'additionalParams' => GeneralUtility::implodeArrayForUrl(
NULL, ['tx_sgjobs_jobapplication[jobId]' => $job['uid']]
),
]
);
$pageList[] = [
'url' => htmlspecialchars($url),
'title' => ''
];
}
}
return $pageList;
}
/**
* Get all jobs stored on specific page ids
*
* @param string $pageList
* @param int $sysLanguageUid
* @return array|null
*/
private function getJobsByPid(string $pageList, int $sysLanguageUid): ?array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_sgjobs_domain_model_job');
$databaseResource = $queryBuilder->select('*')
->from('tx_sgjobs_domain_model_job')
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->in('pid', $queryBuilder->createNamedParameter($pageList)),
$queryBuilder->expr()->in('sys_language_uid', '-1,0')
)
)
->execute();
$visibleRows = [];
$rows = $databaseResource->fetchAll();
$pageRepository = GeneralUtility::makeInstance(PageRepository::class);
$isLanguageVisibilityLoaded = ExtensionManagementUtility::isLoaded('languagevisibility');
foreach ($rows as $row) {
$table = 'tx_sgjobs_domain_model_job';
// get languagevisibility uid that is available (check for the correct uid to fall back to)
if ($isLanguageVisibilityLoaded) {
try {
$element = FrontendServices::getElement($row, $table);
} catch(TableNotSupportedException $exception) {
continue;
}
$languageId = FrontendServices::getOverlayLanguageIdForElement($element, $sysLanguageUid);
if ($languageId === FALSE) {
continue;
}
} else {
$languageId = $sysLanguageUid;
}
if ($languageId > 0) {
$row = $pageRepository->getRecordOverlay($table, $row, $languageId);
}
$visibleRows[] = $row;
}
return $visibleRows;
}
}
......@@ -26,18 +26,14 @@ namespace SGalinski\SgJobs\SignalSlot;
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use SGalinski\SgJobs\Service\SitemapService;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use \TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\Languagevisibility\Service\FrontendServices;
/**
* Signal functions regarding sg_seo sitemap generation
*/
class SitemapSignalSlot {
public const PLUGIN_NAME = 'sgjobs_jobapplication';
/**
* Before the sitemap is generated
*
......@@ -46,100 +42,7 @@ class SitemapSignalSlot {
* @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
*/
public function beforeSitemapGeneration(array &$pageList, int $sysLanguageUid): void {
// find sites where job detail plugin is added
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tt_content');
$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)
),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('sys_language_uid', -1),
$queryBuilder->expr()->eq(
'sys_language_uid',
$queryBuilder->createNamedParameter($sysLanguageUid, \PDO::PARAM_INT)
)
)
)
)
->execute();
$rows = $databaseResource->fetchAll();
foreach ($rows as $row) {
$jobs = $this->getJobsByPid($row['pages'], $sysLanguageUid);
foreach ($jobs as $job) {
$url = $GLOBALS['TSFE']->cObj->typoLink_URL(
[
'parameter' => $row['pid'],
'linkAccessRestrictedPages' => 1,
'forceAbsoluteUrl' => 1,
'additionalParams' => GeneralUtility::implodeArrayForUrl(
NULL, ['tx_sgjobs_jobapplication[jobId]' => $job['uid']]
),
]
);
$pageList[] = [
'url' => htmlspecialchars($url),
'title' => ''
];
}
}
}
/**
* Get all jobs stored on specific page ids
*
* @param string $pageList
* @param int $sysLanguageUid
* @return array|null
* @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
* @throws \Exception
*/
private function getJobsByPid(string $pageList, int $sysLanguageUid): ?array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_sgjobs_domain_model_job');
$databaseResource = $queryBuilder->select('*')
->from('tx_sgjobs_domain_model_job')
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->in('pid', $queryBuilder->createNamedParameter($pageList)),
$queryBuilder->expr()->in('sys_language_uid', '-1,0')
)
)
->execute();
$visibleRows = [];
$rows = $databaseResource->fetchAll();
$pageRepository = GeneralUtility::makeInstance(PageRepository::class);
$isLanguageVisibilityLoaded = ExtensionManagementUtility::isLoaded('languagevisibility');
foreach ($rows as $row) {
$table = 'tx_sgjobs_domain_model_job';
// get languagevisibility uid that is available (check for the correct uid to fall back to)
if ($isLanguageVisibilityLoaded) {
$element = FrontendServices::getElement($row, $table);
$languageId = FrontendServices::getOverlayLanguageIdForElement($element, $sysLanguageUid);
if ($languageId === FALSE) {
continue;
}
} else {
$languageId = $sysLanguageUid;
}
if ($languageId > 0) {
$row = $pageRepository->getRecordOverlay($table, $row, $languageId);
}
$visibleRows[] = $row;
}
return $visibleRows;
$additionalPageList = GeneralUtility::makeInstance(SitemapService::class)->generatePagesList($sysLanguageUid);
ArrayUtility::mergeRecursiveWithOverrule($pageList, $additionalPageList);
}
}
services:
SGalinski\SgJobs\Event\Listener\AccessPageListEventListener:
tags:
- name: event.listener
identifier: 'accessPageListEvent'
event: SGalinski\SgSeo\Events\AccessPageListEvent
......@@ -85,17 +85,19 @@ call_user_func(
// register mail templates
$GLOBALS['sg_mail'][$extKey]['ApplicationMail'] = 'EXT:' . $extKey . '/Configuration/SgMail/ApplicationMail.php';
// 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'
);
if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '10.4.0', '<')) {
// 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'
);
}
// Register the upgrade wizard
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][\SGalinski\SgJobs\Updates\DepartmentUpdateWizard::IDENTIFIER]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment