Skip to content

Commit

Permalink
[BUGFIX] Use ViewBuilder's TemplatePaths to gain fallback ability (#2224
Browse files Browse the repository at this point in the history
)
  • Loading branch information
NamelessCoder authored Jan 26, 2025
1 parent fa94f05 commit b343492
Show file tree
Hide file tree
Showing 11 changed files with 94 additions and 50 deletions.
10 changes: 1 addition & 9 deletions Classes/Builder/RenderingContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ public function buildRenderingContextFor(
string $extensionIdentity,
string $controllerName,
string $controllerActionName,
string $pluginName,
?string $templatePathAndFilename = null
string $pluginName
): RenderingContextInterface {
$extensionKey = ExtensionNamingUtility::getExtensionKey($extensionIdentity);

Expand Down Expand Up @@ -71,13 +70,6 @@ public function buildRenderingContextFor(
$renderingContext->setControllerName($controllerName);
}

$templatePaths = $renderingContext->getTemplatePaths();
$templatePaths->fillDefaultsByPackageName($extensionKey);

if ($templatePathAndFilename) {
$templatePaths->setTemplatePathAndFilename($templatePathAndFilename);
}

return $renderingContext;
}

Expand Down
18 changes: 14 additions & 4 deletions Classes/Builder/ViewBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,15 @@ public function buildPreviewView(
$extensionIdentity,
$controllerName,
$controllerAction,
$pluginName,
$templatePathAndFilename
$pluginName
);

$templatePaths = $this->buildTemplatePaths($extensionIdentity);
if ($templatePathAndFilename) {
$templatePaths->setTemplatePathAndFilename($templatePathAndFilename);
}
$renderingContext->setTemplatePaths($templatePaths);

/** @var PreviewView $view */
$view = GeneralUtility::makeInstance($viewClassName);
$view->setRenderingContext($renderingContext);
Expand All @@ -63,10 +68,15 @@ public function buildTemplateView(
$extensionIdentity,
$controllerName,
$controllerAction,
$pluginName,
$templatePathAndFilename
$pluginName
);

$templatePaths = $this->buildTemplatePaths($extensionIdentity);
if ($templatePathAndFilename) {
$templatePaths->setTemplatePathAndFilename($templatePathAndFilename);
}
$renderingContext->setTemplatePaths($templatePaths);

/** @var TemplateView $view */
$view = GeneralUtility::makeInstance($viewClassName);
$view->setRenderingContext($renderingContext);
Expand Down
10 changes: 6 additions & 4 deletions Classes/Controller/AbstractFluxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

use FluidTYPO3\Flux\Builder\RenderingContextBuilder;
use FluidTYPO3\Flux\Builder\RequestBuilder;
use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Hooks\HookHandler;
use FluidTYPO3\Flux\Integration\NormalizedData\DataAccessTrait;
use FluidTYPO3\Flux\Integration\Resolver;
Expand All @@ -36,7 +37,6 @@
use TYPO3\CMS\Extbase\Mvc\Request;
use TYPO3\CMS\Extbase\Mvc\Response;
use TYPO3\CMS\Extbase\Mvc\ResponseInterface;
use TYPO3\CMS\Fluid\View\TemplatePaths;
use TYPO3\CMS\Fluid\View\TemplateView;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
Expand Down Expand Up @@ -67,6 +67,7 @@ abstract class AbstractFluxController extends ActionController
protected TypoScriptService $typoScriptService;
protected ProviderResolver $providerResolver;
protected Resolver $resolver;
protected ViewBuilder $viewBuilder;
protected ?ControllerProviderInterface $provider = null;

public function __construct(
Expand All @@ -75,14 +76,16 @@ public function __construct(
WorkspacesAwareRecordService $recordService,
TypoScriptService $typoScriptService,
ProviderResolver $providerResolver,
Resolver $resolver
Resolver $resolver,
ViewBuilder $viewBuilder
) {
$this->renderingContextBuilder = $renderingContextBuilder;
$this->requestBuilder = $requestBuilder;
$this->recordService = $recordService;
$this->typoScriptService = $typoScriptService;
$this->providerResolver = $providerResolver;
$this->resolver = $resolver;
$this->viewBuilder = $viewBuilder;

/** @var Arguments $arguments */
$arguments = GeneralUtility::makeInstance(Arguments::class);
Expand Down Expand Up @@ -251,8 +254,7 @@ protected function resolveView(): ViewInterface
$extensionName = ExtensionNamingUtility::getExtensionName($extensionKey);
$controllerActionName = $this->provider->getControllerActionFromRecord($record);

/** @var TemplatePaths $templatePaths */
$templatePaths = GeneralUtility::makeInstance(TemplatePaths::class, $extensionKey);
$templatePaths = $this->viewBuilder->buildTemplatePaths($extensionKey);

/** @var RenderingContextInterface $renderingContext */
$renderingContext = $view->getRenderingContext();
Expand Down
1 change: 0 additions & 1 deletion Classes/Provider/AbstractProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
use TYPO3\CMS\Core\Utility\PathUtility;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
use TYPO3\CMS\Extbase\Reflection\ObjectAccess;
use TYPO3\CMS\Fluid\View\TemplatePaths;
use TYPO3Fluid\Fluid\View\Exception\InvalidTemplateResourceException;
use TYPO3Fluid\Fluid\View\ViewInterface;

Expand Down
26 changes: 8 additions & 18 deletions Classes/Service/PageService.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* LICENSE.md file that was distributed with this source code.
*/

use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Content\TypeDefinition\FluidFileBased\DropInContentTypeDefinition;
use FluidTYPO3\Flux\Core;
use FluidTYPO3\Flux\Enum\ExtensionOption;
Expand All @@ -16,7 +17,6 @@
use FluidTYPO3\Flux\Provider\PageProvider;
use FluidTYPO3\Flux\Proxy\TemplatePathsProxy;
use FluidTYPO3\Flux\Utility\ExtensionConfigurationUtility;
use FluidTYPO3\Flux\Utility\ExtensionNamingUtility;
use FluidTYPO3\Flux\ViewHelpers\FormViewHelper;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
Expand Down Expand Up @@ -45,13 +45,16 @@ class PageService implements SingletonInterface, LoggerAwareInterface

protected WorkspacesAwareRecordService $workspacesAwareRecordService;
protected FrontendInterface $runtimeCache;
protected ViewBuilder $viewBuilder;

public function __construct(
WorkspacesAwareRecordService $recordService,
CacheManager $cacheManager
CacheManager $cacheManager,
ViewBuilder $viewBuilder
) {
$this->workspacesAwareRecordService = $recordService;
$this->runtimeCache = $cacheManager->getCache('runtime');
$this->viewBuilder = $viewBuilder;
}

/**
Expand Down Expand Up @@ -183,13 +186,13 @@ public function getPageConfiguration(?string $extensionName = null): array
];
}
if (null !== $extensionName) {
$templatePaths = $this->createTemplatePaths($extensionName);
$templatePaths = $this->viewBuilder->buildTemplatePaths($extensionName);
return TemplatePathsProxy::toArray($templatePaths);
}
$configurations = [];
$registeredExtensionKeys = Core::getRegisteredProviderExtensionKeys('Page');
foreach ($registeredExtensionKeys as $registeredExtensionKey) {
$templatePaths = $this->createTemplatePaths($registeredExtensionKey);
$templatePaths = $this->viewBuilder->buildTemplatePaths($registeredExtensionKey);
$configurations[$registeredExtensionKey] = TemplatePathsProxy::toArray($templatePaths);
}
if ($plugAndPlayEnabled) {
Expand Down Expand Up @@ -236,7 +239,7 @@ public function getAvailablePageTemplateFiles(): array
continue;
}
$output[$extensionName] = [];
$templatePaths = $this->createTemplatePaths($extensionName);
$templatePaths = $this->viewBuilder->buildTemplatePaths($extensionName);
$finder = Finder::create()->in($templatePaths->getTemplateRootPaths())->name('*.html')->sortByName();
foreach ($finder->files() as $file) {
/** @var \SplFileInfo $file */
Expand Down Expand Up @@ -290,19 +293,6 @@ public function getAvailablePageTemplateFiles(): array
return $output;
}

/**
* @codeCoverageIgnore
*/
protected function createTemplatePaths(string $registeredExtensionKey): TemplatePaths
{
/** @var TemplatePaths $templatePaths */
$templatePaths = GeneralUtility::makeInstance(
TemplatePaths::class,
ExtensionNamingUtility::getExtensionKey($registeredExtensionKey)
);
return $templatePaths;
}

/**
* @codeCoverageIgnore
*/
Expand Down
5 changes: 4 additions & 1 deletion Tests/Fixtures/Classes/DummyPageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use FluidTYPO3\Flux\Builder\RenderingContextBuilder;
use FluidTYPO3\Flux\Builder\RequestBuilder;
use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Controller\PageController;
use FluidTYPO3\Flux\Integration\Resolver;
use FluidTYPO3\Flux\Provider\Interfaces\ControllerProviderInterface;
Expand All @@ -32,14 +33,16 @@ public function __construct()
$typoScriptService = $this->createMock(TypoScriptService::class);
$providerResolver = $this->createMock(ProviderResolver::class);
$resolver = $this->createMock(Resolver::class);
$viewBuilder = $this->createMock(ViewBuilder::class);

parent::__construct(
$renderingContextBuilder,
$requestBuilder,
$recordService,
$typoScriptService,
$providerResolver,
$resolver
$resolver,
$viewBuilder
);
}

Expand Down
7 changes: 7 additions & 0 deletions Tests/Fixtures/Classes/DummyPageService.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php
namespace FluidTYPO3\Flux\Tests\Fixtures\Classes;

use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Service\PageService;
use FluidTYPO3\Flux\Service\WorkspacesAwareRecordService;
use PHPUnit\Framework\MockObject\Generator;
Expand All @@ -12,6 +13,7 @@ public function __construct()
{
$this->workspacesAwareRecordService = $this->createMock(WorkspacesAwareRecordService::class);
$this->runtimeCache = $this->createMock(FrontendInterface::class);
$this->viewBuilder = $this->createMock(ViewBuilder::class);
}

public function setWorkspacesAwareRecordService(WorkspacesAwareRecordService $workspacesAwareRecordService): void
Expand All @@ -24,6 +26,11 @@ public function setRuntimeCache(FrontendInterface $runtimeCache): void
$this->runtimeCache = $runtimeCache;
}

public function setViewBuilder(ViewBuilder $viewBuilder): void
{
$this->viewBuilder = $viewBuilder;
}

private function createMock(string $className): object
{
return (new Generator())->getMock($className, [], [], '', false);
Expand Down
15 changes: 13 additions & 2 deletions Tests/Unit/Builder/ViewBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use FluidTYPO3\Flux\Integration\PreviewView;
use FluidTYPO3\Flux\Tests\Unit\AbstractTestCase;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Fluid\View\TemplatePaths;
use TYPO3\CMS\Fluid\View\TemplateView;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;

Expand All @@ -37,7 +38,12 @@ public function testBuildTemplateView(): void
$view = $this->getMockBuilder(TemplateView::class)->disableOriginalConstructor()->getMock();
GeneralUtility::addInstance(TemplateView::class, $view);

$subject = new ViewBuilder($this->renderingContextBuilder);
$subject = $this->getMockBuilder(ViewBuilder::class)
->onlyMethods(['buildTemplatePaths'])
->setConstructorArgs([$this->renderingContextBuilder])
->getMock();
$subject->method('buildTemplatePaths')->willReturn(new TemplatePaths());

$view = $subject->buildTemplateView('FluidTYPO3.Flux', 'Default', 'default', 'defaut');
self::assertInstanceOf(TemplateView::class, $view);
}
Expand All @@ -47,7 +53,12 @@ public function testBuildPreviewView(): void
$view = $this->getMockBuilder(PreviewView::class)->disableOriginalConstructor()->getMock();
GeneralUtility::addInstance(PreviewView::class, $view);

$subject = new ViewBuilder($this->renderingContextBuilder);
$subject = $this->getMockBuilder(ViewBuilder::class)
->onlyMethods(['buildTemplatePaths'])
->setConstructorArgs([$this->renderingContextBuilder])
->getMock();
$subject->method('buildTemplatePaths')->willReturn(new TemplatePaths());

$view = $subject->buildPreviewView('FluidTYPO3.Flux', 'Default', 'default', 'default');
self::assertInstanceOf(PreviewView::class, $view);
}
Expand Down
9 changes: 9 additions & 0 deletions Tests/Unit/Controller/AbstractFluxControllerTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use FluidTYPO3\Flux\Builder\RenderingContextBuilder;
use FluidTYPO3\Flux\Builder\RequestBuilder;
use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Controller\AbstractFluxController;
use FluidTYPO3\Flux\Controller\ContentController;
use FluidTYPO3\Flux\Core;
Expand Down Expand Up @@ -71,6 +72,8 @@ abstract class AbstractFluxControllerTestCase extends AbstractTestCase

protected Resolver $resolver;

protected ViewBuilder $viewBuilder;

protected function setUp(): void
{
$renderingContext = new RenderingContext();
Expand Down Expand Up @@ -102,6 +105,11 @@ protected function setUp(): void

$this->resolver = new Resolver();

$this->viewBuilder = $this->getMockBuilder(ViewBuilder::class)
->onlyMethods(['buildTemplatePaths'])
->disableOriginalConstructor()
->getMock();

parent::setUp();
}

Expand All @@ -114,6 +122,7 @@ protected function getConstructorArguments(): array
$this->typoScriptService,
$this->providerResolver,
$this->resolver,
$this->viewBuilder,
];
}

Expand Down
5 changes: 5 additions & 0 deletions Tests/Unit/Integration/NormalizedData/DataAccessTraitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use FluidTYPO3\Flux\Builder\RenderingContextBuilder;
use FluidTYPO3\Flux\Builder\RequestBuilder;
use FluidTYPO3\Flux\Builder\ViewBuilder;
use FluidTYPO3\Flux\Form;
use FluidTYPO3\Flux\Form\Transformation\FormDataTransformer;
use FluidTYPO3\Flux\Integration\NormalizedData\Converter\InlineRecordDataConverter;
Expand Down Expand Up @@ -51,6 +52,7 @@ class DataAccessTraitTest extends AbstractTestCase
protected TypoScriptService $typoScriptService;
protected ProviderResolver $providerResolver;
protected Resolver $resolver;
protected ViewBuilder $viewBuilder;

protected function setUp(): void
{
Expand Down Expand Up @@ -84,6 +86,8 @@ protected function setUp(): void

$this->resolver = new Resolver();

$this->viewBuilder = $this->getMockBuilder(ViewBuilder::class)->disableOriginalConstructor()->getMock();

$GLOBALS['TYPO3_REQUEST'] = $this->getMockBuilder(ServerRequestInterface::class)->getMockForAbstractClass();

parent::setUp();
Expand All @@ -104,6 +108,7 @@ protected function getControllerConstructorArguments(): array
$this->typoScriptService,
$this->providerResolver,
$this->resolver,
$this->viewBuilder,
];
}

Expand Down
Loading

0 comments on commit b343492

Please sign in to comment.