Newer
Older
Fabian Galinski
committed
<?php
namespace SGalinski\SgNews\Xclass;
/***************************************************************
* 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 2 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\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
Fabian Galinski
committed
use TYPO3\CMS\Extbase\Persistence\Generic\Qom;
use TYPO3\Languagevisibility\Service\FrontendServices;
Fabian Galinski
committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
* Xclass for the TYPO3 db backend, which handles, that the l18n_cfg parameters are used for pages in Extbase.
*/
class Typo3DbBackend extends \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbBackend {
/**
* Performs workspace and language overlay on the given row array. The language and workspace id is automatically
* detected (depending on FE or BE context). You can also explicitly set the language/workspace id.
*
* @param Qom\SourceInterface $source The source (selector od join)
* @param array $rows
* @param \TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface $querySettings The TYPO3 CMS specific query settings
* @param null|int $workspaceUid
* @return array
*/
protected function doLanguageAndWorkspaceOverlay(Qom\SourceInterface $source, array $rows, \TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface $querySettings, $workspaceUid = null)
{
if ($source instanceof Qom\SelectorInterface) {
$tableName = $source->getSelectorName();
} elseif ($source instanceof Qom\JoinInterface) {
$tableName = $source->getRight()->getSelectorName();
} else {
// No proper source, so we do not have a table name here
// we cannot do an overlay and return the original rows instead.
return $rows;
}
$pageRepository = $this->getPageRepository();
if (is_object($GLOBALS['TSFE'])) {
if ($workspaceUid !== null) {
$pageRepository->versioningWorkspaceId = $workspaceUid;
}
} else {
if ($workspaceUid === null) {
$workspaceUid = $GLOBALS['BE_USER']->workspace;
}
$pageRepository->versioningWorkspaceId = $workspaceUid;
}
// Fetches the move-placeholder in case it is supported
// by the table and if there's only one row in the result set
// (applying this to all rows does not work, since the sorting
// order would be destroyed and possible limits not met anymore)
if (!empty($pageRepository->versioningWorkspaceId)
&& BackendUtility::isTableWorkspaceEnabled($tableName)
&& count($rows) === 1
) {
$movePlaceholder = $this->databaseHandle->exec_SELECTgetSingleRow(
$tableName . '.*',
$tableName,
't3ver_state=3 AND t3ver_wsid=' . $pageRepository->versioningWorkspaceId
. ' AND t3ver_move_id=' . $rows[0]['uid']
);
if (!empty($movePlaceholder)) {
$rows = array($movePlaceholder);
}
}
$isLanguagevisibilityLoaded = ExtensionManagementUtility::isLoaded('languagevisibility');
Fabian Galinski
committed
$overlaidRows = array();
foreach ($rows as $row) {
// If current row is a translation select its parent
if (isset($tableName) && isset($GLOBALS['TCA'][$tableName])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])
&& !isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerTable'])
) {
if (isset($row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']])
&& $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] > 0
) {
$row = $this->databaseHandle->exec_SELECTgetSingleRow(
$tableName . '.*',
$tableName,
$tableName . '.uid=' . (int)$row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] .
' AND ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=0'
);
}
}
$pageRepository->versionOL($tableName, $row, true);
if ($tableName == 'pages') {
// Start of the patch
// Applies the language visibility logic.
if ($isLanguagevisibilityLoaded && is_object($GLOBALS['TSFE'])) {
$sysLanguageUid = $GLOBALS['TSFE']->sys_language_uid;
if (!FrontendServices::checkVisiblityForElement((int) $row['uid'], $tableName, $sysLanguageUid)) {
// Page not visible
continue;
}
}
// End of the patch
Fabian Galinski
committed
$row = $pageRepository->getPageOverlay($row, $querySettings->getLanguageUid());
if ($row === null || !is_array($row)) {
continue;
}
Fabian Galinski
committed
$l18nConfiguration = $row['l18n_cfg'];
if ($l18nConfiguration > 0) {
if (is_object($GLOBALS['TSFE'])) {
$sysLanguageUid = $GLOBALS['TSFE']->sys_language_uid;
if ($sysLanguageUid > 0) {
// Request the overlay record for the sys_language_uid:
$pageOverlay = $pageRepository->getPageOverlay($row['uid'], $sysLanguageUid);
if (empty($pageOverlay) &&
\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfNotTranslated($l18nConfiguration)
) {
// Page is not available in default language.
continue;
}
}
if (!$sysLanguageUid &&
\TYPO3\CMS\Core\Utility\GeneralUtility::hideIfDefaultLanguage($l18nConfiguration)
) {
// Page is not available in default language.
continue;
}
}
}
Fabian Galinski
committed
} elseif (isset($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])
&& $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] !== ''
&& !isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerTable'])
) {
if (in_array($row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']], array(-1, 0))) {
$overlayMode = $querySettings->getLanguageOverlayMode();
if ($overlayMode !== 'hideNonTranslated' || preg_match('/sys_file_.*/is', $tableName)) {
$overlayMode = $querySettings->getLanguageMode() === 'strict' ? 'hideNonTranslated' : '';
}
$row = $pageRepository->getRecordOverlay($tableName, $row, $querySettings->getLanguageUid(), $overlayMode);
}
}
if ($row !== null && is_array($row)) {
$overlaidRows[] = $row;
}
}
return $overlaidRows;
}
}
?>