Skip to content
Snippets Groups Projects
Commit 3977280b authored by Xavier Perseguers's avatar Xavier Perseguers Committed by Markus Klein
Browse files

[BUGFIX] Add missing frontend context check when fetching view configuration

Check for Frontend context has been omitted during refactoring and will
have side effects in Backend in view configuration is overridden in
Frontend context.

Change-Id: I752baed15f0be6be59fcc37f12103f0a70caa427
Resolves: #81677
Related: #81340
Releases: master, 8.7
Reviewed-on: https://review.typo3.org/53309


Tested-by: default avatarTYPO3com <no-reply@typo3.com>
Reviewed-by: default avatarAlexander Grein <alexander.grein@gmail.com>
Tested-by: default avatarAlexander Grein <alexander.grein@gmail.com>
Reviewed-by: default avatarMarkus Klein <markus.klein@typo3.org>
Tested-by: default avatarMarkus Klein <markus.klein@typo3.org>
parent 500ec804
No related branches found
No related tags found
No related merge requests found
......@@ -110,7 +110,7 @@ class TemplatePaths extends \TYPO3Fluid\Fluid\View\TemplatePaths
$signature = str_replace('_', '', $extensionKey);
if ($this->isBackendMode() && isset($this->typoScript['module']['tx_' . $signature]['view'])) {
$configuredPaths = (array)$this->typoScript['module']['tx_' . $signature]['view'];
} elseif (isset($this->typoScript['plugin']['tx_' . $signature]['view'])) {
} elseif ($this->isFrontendMode() && isset($this->typoScript['plugin']['tx_' . $signature]['view'])) {
$configuredPaths = (array)$this->typoScript['plugin']['tx_' . $signature]['view'];
}
}
......@@ -228,6 +228,14 @@ class TemplatePaths extends \TYPO3Fluid\Fluid\View\TemplatePaths
return TYPO3_MODE === 'BE';
}
/**
* @return bool
*/
protected function isFrontendMode()
{
return TYPO3_MODE === 'FE';
}
/**
* @return VariableFrontend
*/
......
......@@ -104,7 +104,7 @@ class TemplatePathsTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
/**
* @test
*/
public function getContextSpecificViewConfigurationSortsTypoScriptConfiguredPathsCorrectly()
public function getContextSpecificViewConfigurationSortsTypoScriptConfiguredPathsCorrectlyInFrontendMode()
{
$configurationManager = $this->getMockBuilder(ConfigurationManagerInterface::class)->getMockForAbstractClass();
$configurationManager->expects($this->once())->method('getConfiguration')->willReturn([
......@@ -133,11 +133,12 @@ class TemplatePathsTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
$cache = $this->getMockBuilder(VariableFrontend::class)->setMethods(['get', 'set'])->disableOriginalConstructor()->getMock();
$cache->expects($this->once())->method('get')->willReturn(false);
$cache->expects($this->once())->method('set');
$subject = $this->getMockBuilder(TemplatePaths::class)->setMethods(['getConfigurationManager', 'getExtensionPrivateResourcesPath', 'getRuntimeCache', 'isBackendMode'])->getMock();
$subject = $this->getMockBuilder(TemplatePaths::class)->setMethods(['getConfigurationManager', 'getExtensionPrivateResourcesPath', 'getRuntimeCache', 'isBackendMode', 'isFrontendMode'])->getMock();
$subject->expects($this->once())->method('getExtensionPrivateResourcesPath')->with('test')->willReturn('test/');
$subject->expects($this->once())->method('getConfigurationManager')->willReturn($configurationManager);
$subject->expects($this->once())->method('getRuntimeCache')->willReturn($cache);
$subject->expects($this->once())->method('isBackendMode')->willReturn(false);
$subject->expects($this->once())->method('isFrontendMode')->willReturn(true);
$result = $this->callInaccessibleMethod($subject, 'getContextSpecificViewConfiguration', 'test');
$this->assertSame([
'templateRootPaths' => [
......@@ -160,4 +161,117 @@ class TemplatePathsTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
]
], $result);
}
/**
* @test
*/
public function getContextSpecificViewConfigurationSortsTypoScriptConfiguredPathsCorrectlyInBackendMode()
{
$configurationManager = $this->getMockBuilder(ConfigurationManagerInterface::class)->getMockForAbstractClass();
$configurationManager->expects($this->once())->method('getConfiguration')->willReturn([
'module.' => [
'tx_test.' => [
'view.' => [
'templateRootPaths.' => [
'30' => 'third',
'10' => 'first',
'20' => 'second'
],
'partialRootPaths.' => [
'20' => '2',
'30' => '3',
'10' => '1'
],
'layoutRootPaths.' => [
'130' => '3.',
'10' => '1.',
'120' => '2.'
],
]
]
]
]);
$cache = $this->getMockBuilder(VariableFrontend::class)->setMethods(['get', 'set'])->disableOriginalConstructor()->getMock();
$cache->expects($this->once())->method('get')->willReturn(false);
$cache->expects($this->once())->method('set');
$subject = $this->getMockBuilder(TemplatePaths::class)->setMethods(['getConfigurationManager', 'getExtensionPrivateResourcesPath', 'getRuntimeCache', 'isBackendMode', 'isFrontendMode'])->getMock();
$subject->expects($this->once())->method('getExtensionPrivateResourcesPath')->with('test')->willReturn('test/');
$subject->expects($this->once())->method('getConfigurationManager')->willReturn($configurationManager);
$subject->expects($this->once())->method('getRuntimeCache')->willReturn($cache);
$subject->expects($this->once())->method('isBackendMode')->willReturn(true);
$subject->expects($this->never())->method('isFrontendMode');
$result = $this->callInaccessibleMethod($subject, 'getContextSpecificViewConfiguration', 'test');
$this->assertSame([
'templateRootPaths' => [
'test/Templates/',
'first',
'second',
'third'
],
'partialRootPaths' => [
'test/Partials/',
'1',
'2',
'3'
],
'layoutRootPaths' => [
'test/Layouts/',
'1.',
'2.',
'3.'
]
], $result);
}
/**
* @test
*/
public function getContextSpecificViewConfigurationDoesNotResolveFromTypoScriptAndDoesNotSortInUnspecifiedMode()
{
$configurationManager = $this->getMockBuilder(ConfigurationManagerInterface::class)->getMockForAbstractClass();
$configurationManager->expects($this->once())->method('getConfiguration')->willReturn([
'plugin.' => [
'tx_test.' => [
'view.' => [
'templateRootPaths.' => [
'30' => 'third',
'10' => 'first',
'20' => 'second'
],
'partialRootPaths.' => [
'20' => '2',
'30' => '3',
'10' => '1'
],
'layoutRootPaths.' => [
'130' => '3.',
'10' => '1.',
'120' => '2.'
],
]
]
]
]);
$cache = $this->getMockBuilder(VariableFrontend::class)->setMethods(['get', 'set'])->disableOriginalConstructor()->getMock();
$cache->expects($this->once())->method('get')->willReturn(false);
$cache->expects($this->never())->method('set');
$subject = $this->getMockBuilder(TemplatePaths::class)->setMethods(['getConfigurationManager', 'getExtensionPrivateResourcesPath', 'getRuntimeCache', 'isBackendMode', 'isFrontendMode'])->getMock();
$subject->expects($this->once())->method('getExtensionPrivateResourcesPath')->with('test')->willReturn('test/');
$subject->expects($this->once())->method('getConfigurationManager')->willReturn($configurationManager);
$subject->expects($this->once())->method('getRuntimeCache')->willReturn($cache);
$subject->expects($this->once())->method('isBackendMode')->willReturn(false);
$subject->expects($this->once())->method('isFrontendMode')->willReturn(false);
$result = $this->callInaccessibleMethod($subject, 'getContextSpecificViewConfiguration', 'test');
$this->assertSame([
'templateRootPaths' => [
'test/Templates/'
],
'partialRootPaths' => [
'test/Partials/'
],
'layoutRootPaths' => [
'test/Layouts/'
]
], $result);
}
}
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