From 837dd07c8068eab49f381bcd15c8d7e854522909 Mon Sep 17 00:00:00 2001
From: Stefan Galinski <stefan@sgalinski.de>
Date: Tue, 29 Oct 2019 21:37:42 +0100
Subject: [PATCH] [BUGFIX] Language Visibility not respected inside the sitemap
 generation

---
 Classes/SignalSlot/SitemapSignalSlot.php | 43 +++++++++++++++++++-----
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/Classes/SignalSlot/SitemapSignalSlot.php b/Classes/SignalSlot/SitemapSignalSlot.php
index 6b259c50..fcb7185d 100644
--- a/Classes/SignalSlot/SitemapSignalSlot.php
+++ b/Classes/SignalSlot/SitemapSignalSlot.php
@@ -27,7 +27,10 @@ namespace SGalinski\SgJobs\SignalSlot;
  ***************************************************************/
 
 use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Frontend\Page\PageRepository;
+use TYPO3\Languagevisibility\Service\FrontendServices;
 
 /**
  * Signal functions regarding sg_seo sitemap generation
@@ -40,6 +43,7 @@ class SitemapSignalSlot {
 	 *
 	 * @param array $pageList
 	 * @param int $sysLanguageUid
+	 * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
 	 */
 	public function beforeSitemapGeneration(array &$pageList, int $sysLanguageUid): void {
 		// find sites where job detail plugin is added
@@ -95,26 +99,47 @@ class SitemapSignalSlot {
 	 * @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('pages');
+			->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()->orX(
-						$queryBuilder->expr()->eq('sys_language_uid', -1),
-						$queryBuilder->expr()->eq(
-							'sys_language_uid',
-							$queryBuilder->createNamedParameter($sysLanguageUid, \PDO::PARAM_INT)
-						)
-					)
+					$queryBuilder->expr()->in('sys_language_uid', '-1,0')
 				)
 			)
 			->execute();
 
-		return $databaseResource->fetchAll();
+		$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['uid'], $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;
 	}
 }
-- 
GitLab