-
-
Save htuscher/a374f7526440ba987c19 to your computer and use it in GitHub Desktop.
<?php | |
/** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */ | |
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher'); | |
$signalSlotDispatcher->connect( | |
'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Backend', | |
'beforeGettingObjectData', | |
'Onedrop\\Common\\Service\\ExtbaseForceLanguage', | |
'forceLanguageForQueries' | |
); |
<?php | |
namespace Onedrop\Common\Service; | |
/*************************************************************** | |
* Copyright notice | |
* | |
* (c) 2015 Hans Höchtl <[email protected]> | |
* 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. | |
* A copy is found in the textfile GPL.txt and important notices to the license | |
* from the author is found in LICENSE.txt distributed with these scripts. | |
* | |
* | |
* 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\SingletonInterface; | |
use TYPO3\CMS\Core\Utility\GeneralUtility; | |
use TYPO3\CMS\Extbase\Object\ObjectManager; | |
use TYPO3\CMS\Extbase\Persistence\Generic\Session; | |
use TYPO3\CMS\Extbase\Persistence\QueryInterface; | |
class ExtbaseForceLanguage implements SingletonInterface | |
{ | |
protected $overrideLanguage = FALSE; | |
protected $languageUid = 0; | |
protected $languageMode = NULL; | |
protected $languageOverlayMode = FALSE; | |
/** | |
* This method is registered on the Signal beforeGettingObjectData of the Extbase Generic Backend | |
* to override the returned model language | |
* | |
* @param QueryInterface $query | |
* @return QueryInterface | |
*/ | |
public function forceLanguageForQueries(QueryInterface $query) { | |
if (!$this->overrideLanguage) { | |
return [$query]; | |
} | |
$querySettings = $query->getQuerySettings(); | |
$querySettings->setLanguageUid($this->languageUid); | |
$querySettings->setLanguageMode($this->languageMode); | |
$querySettings->setLanguageOverlayMode($this->languageOverlayMode); | |
$query->setQuerySettings($querySettings); | |
return [$query]; | |
} | |
/** | |
* @return boolean | |
*/ | |
public function isOverrideLanguage() | |
{ | |
return $this->overrideLanguage; | |
} | |
/** | |
* When changing the override language, we clear the persistence session of extbase, | |
* otherwise the non translated objects would be returned (cache). | |
* | |
* @param boolean $overrideLanguage | |
* @return void | |
*/ | |
public function setOverrideLanguage($overrideLanguage) | |
{ | |
$this->overrideLanguage = $overrideLanguage; | |
/** @var ObjectManager $objectManager */ | |
$objectManager = GeneralUtility::makeInstance(ObjectManager::class); | |
/** @var Session $persistenceSession */ | |
$persistenceSession = $objectManager->get(Session::class); | |
$persistenceSession->destroy(); | |
} | |
/** | |
* @return int | |
*/ | |
public function getLanguageUid() | |
{ | |
return $this->languageUid; | |
} | |
/** | |
* @param int $languageUid | |
* @return void | |
*/ | |
public function setLanguageUid($languageUid) | |
{ | |
$this->languageUid = $languageUid; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getLanguageMode() | |
{ | |
return $this->languageMode; | |
} | |
/** | |
* @param mixed $languageMode | |
* @return void | |
*/ | |
public function setLanguageMode($languageMode) | |
{ | |
$this->languageMode = $languageMode; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function getLanguageOverlayMode() | |
{ | |
return $this->languageOverlayMode; | |
} | |
/** | |
* @param mixed $languageOverlayMode | |
* @return void | |
*/ | |
public function setLanguageOverlayMode($languageOverlayMode) | |
{ | |
$this->languageOverlayMode = $languageOverlayMode; | |
} | |
} |
<?php | |
namespace Onedrop\Common\Controller; | |
/*************************************************************** | |
* Copyright notice | |
* | |
* (c) 2015 Hans Höchtl <[email protected]>, Onedrop Solutions | |
* 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. | |
* A copy is found in the textfile GPL.txt and important notices to the license | |
* from the author is found in LICENSE.txt distributed with these scripts. | |
* | |
* | |
* 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\Resource\ResourceFactory; | |
use TYPO3\CMS\Core\Utility\GeneralUtility; | |
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; | |
/** | |
* Class SomeController | |
* | |
* @package Onedrop\Common\Controller | |
*/ | |
class SomeController extends ActionController | |
{ | |
/** | |
* @var \Onedrop\Common\Domain\Repository\SomeRepository | |
* @inject | |
*/ | |
protected $someRepository; | |
/** | |
* @var \Onedrop\Common\Service\ExtbaseForceLanguage | |
* @inject | |
*/ | |
protected $extbaseForceLanguageService; | |
public function someAction($langUid = 0) { | |
$this->extbaseForceLanguageService->setOverrideLanguage(true); | |
$this->extbaseForceLanguageService->setLanguageUid($langUid); | |
$extbaseRecordWithOverlayDifferentThanFeLanguage = $this->someRepository->findByUid(1); | |
$this->extbaseForceLanguageService->setOverrideLanguage(false); | |
} | |
} |
So great!!
you saved my day! Thx a lot!
Even in 2021 this saved me a lot of time, thank you!
Does it works with nested objects? Are they also retrieved in forced language of parent object (lazy loading with ObjectStorage)?
I have used your solution directly in a repository function but the nested objects are still in standard language:
public function findByUidAndLanguage($uid, $languageUid=0)
{
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
/** @var Session $persistenceSession */
$persistenceSession = $objectManager->get(Session::class);
$persistenceSession->destroy();
$query = $this->persistenceManager->createQueryForType(Description::class);
$query->getQuerySettings()->setRespectSysLanguage(false);
$query->getQuerySettings()->setRespectStoragePage(false);
$query->getQuerySettings()->setLanguageUid($languageUid);
$query->getQuerySettings()->setLanguageOverlayMode(false);
$query->getQuerySettings()->setLanguageMode('content_fallback');
$query->matching($query->equals('uid', $uid));
$object = $query->execute()->getFirst();
$test = $object->getNestedObject(); // <-- They are not in language of object !! :-(
}
I have found the mistake myself. Al sub/nested objects will be retrieved forced in language which are loaded between setOverrideLanguage(true) and setOverrideLanguage(false). My single function does not work!
Thanks for the code. It works great on a single showbyUid but I can't get it working on a listview. I have mixed language records and in the list query it simply does not work :(
I had to add a small, really really dirty hack, to make it work in an importer that is started by a command controller: