2
2
3
3
namespace SMS \FluidComponents \Fluid \ViewHelper ;
4
4
5
+ use Psr \Container \ContainerInterface ;
5
6
use SMS \FluidComponents \Interfaces \ComponentAware ;
6
7
use SMS \FluidComponents \Utility \ComponentArgumentConverter ;
7
8
use SMS \FluidComponents \Utility \ComponentLoader ;
10
11
use SMS \FluidComponents \Utility \ComponentSettings ;
11
12
use SMS \FluidComponents \ViewHelpers \ComponentViewHelper ;
12
13
use SMS \FluidComponents \ViewHelpers \ParamViewHelper ;
14
+ use TYPO3 \CMS \Core \Configuration \Features ;
13
15
use TYPO3 \CMS \Core \Utility \GeneralUtility ;
14
16
use TYPO3 \CMS \Extbase \Object \ObjectManager ;
15
17
use TYPO3 \CMS \Fluid \Core \Rendering \RenderingContext ;
18
+ use TYPO3 \CMS \Fluid \Core \Rendering \RenderingContextFactory ;
16
19
use TYPO3Fluid \Fluid \Core \Compiler \TemplateCompiler ;
17
20
use TYPO3Fluid \Fluid \Core \Parser \SyntaxTree \BooleanNode ;
18
21
use TYPO3Fluid \Fluid \Core \Parser \SyntaxTree \EscapingNode ;
22
25
use TYPO3Fluid \Fluid \Core \ViewHelper \AbstractViewHelper ;
23
26
use TYPO3Fluid \Fluid \Core \ViewHelper \ArgumentDefinition ;
24
27
use TYPO3Fluid \Fluid \Core \ViewHelper \Exception ;
25
- use TYPO3 \CMS \Core \Configuration \Features ;
26
28
27
29
class ComponentRenderer extends AbstractViewHelper
28
30
{
@@ -78,6 +80,44 @@ class ComponentRenderer extends AbstractViewHelper
78
80
*/
79
81
protected $ escapeChildren = false ;
80
82
83
+ /**
84
+ * @var ComponentLoader
85
+ */
86
+ protected ComponentLoader $ componentLoader ;
87
+
88
+ /**
89
+ * @var ComponentSettings
90
+ */
91
+ protected ComponentSettings $ componentSettings ;
92
+
93
+ /**
94
+ * @var ComponentArgumentConverter
95
+ */
96
+ protected ComponentArgumentConverter $ componentArgumentConverter ;
97
+
98
+ /**
99
+ * @var ContainerInterface
100
+ */
101
+ protected ContainerInterface $ container ;
102
+
103
+ /**
104
+ * @param ComponentLoader $componentLoader
105
+ * @param ComponentSettings $componentSettings
106
+ * @param ComponentArgumentConverter $componentArgumentConverter
107
+ * @param ContainerInterface $container
108
+ */
109
+ public function __construct (
110
+ ComponentLoader $ componentLoader ,
111
+ ComponentSettings $ componentSettings ,
112
+ ComponentArgumentConverter $ componentArgumentConverter ,
113
+ ContainerInterface $ container
114
+ ) {
115
+ $ this ->componentLoader = $ componentLoader ;
116
+ $ this ->componentSettings = $ componentSettings ;
117
+ $ this ->componentArgumentConverter = $ componentArgumentConverter ;
118
+ $ this ->container = $ container ;
119
+ }
120
+
81
121
/**
82
122
* Sets the namespace of the component the viewhelper should render
83
123
*
@@ -129,7 +169,7 @@ public function getComponentPrefix()
129
169
public function render ()
130
170
{
131
171
// Create a new rendering context for the component file
132
- $ renderingContext = GeneralUtility:: makeInstance (RenderingContext::class );
172
+ $ renderingContext = $ this -> getRenderingContext ( );
133
173
if ($ this ->renderingContext ->getControllerContext ()) {
134
174
$ renderingContext ->setControllerContext ($ this ->renderingContext ->getControllerContext ());
135
175
}
@@ -147,14 +187,13 @@ public function render()
147
187
'class ' => $ this ->getComponentClass (),
148
188
'prefix ' => $ this ->getComponentPrefix (),
149
189
]);
150
- $ variableContainer ->add ('settings ' , $ this ->getComponentSettings () );
190
+ $ variableContainer ->add ('settings ' , $ this ->componentSettings );
151
191
152
192
// Provide supplied arguments from component call to renderer
153
- $ componentArgumentConverter = $ this ->getComponentArgumentConverter ();
154
193
foreach ($ this ->arguments as $ name => $ argument ) {
155
194
$ argumentType = $ this ->argumentDefinitions [$ name ]->getType ();
156
195
157
- $ argument = $ componentArgumentConverter ->convertValueToType ($ argument , $ argumentType );
196
+ $ argument = $ this -> componentArgumentConverter ->convertValueToType ($ argument , $ argumentType );
158
197
159
198
// Provide component namespace to certain data structures
160
199
if ($ argument instanceof ComponentAware) {
@@ -171,8 +210,7 @@ public function render()
171
210
172
211
// Initialize component rendering template
173
212
if (!isset ($ this ->parsedTemplate )) {
174
- $ componentLoader = $ this ->getComponentLoader ();
175
- $ componentFile = $ componentLoader ->findComponent ($ this ->componentNamespace );
213
+ $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
176
214
177
215
$ this ->parsedTemplate = $ renderingContext ->getTemplateParser ()->getOrParseAndStoreTemplate (
178
216
$ this ->getTemplateIdentifier ($ componentFile ),
@@ -314,7 +352,6 @@ public function validateAdditionalArguments(array $arguments)
314
352
*/
315
353
public function validateArguments ()
316
354
{
317
- $ componentArgumentConverter = $ this ->getComponentArgumentConverter ();
318
355
$ argumentDefinitions = $ this ->prepareArguments ();
319
356
foreach ($ argumentDefinitions as $ argumentName => $ registeredArgument ) {
320
357
if ($ this ->hasArgument ($ argumentName )) {
@@ -324,7 +361,7 @@ public function validateArguments()
324
361
if ($ value !== $ defaultValue && $ type !== 'mixed ' ) {
325
362
$ givenType = is_object ($ value ) ? get_class ($ value ) : gettype ($ value );
326
363
if (!$ this ->isValidType ($ type , $ value )
327
- && !$ componentArgumentConverter ->canTypeBeConvertedToType ($ givenType , $ type )
364
+ && !$ this -> componentArgumentConverter ->canTypeBeConvertedToType ($ givenType , $ type )
328
365
) {
329
366
throw new \InvalidArgumentException (
330
367
'The argument " ' . $ argumentName . '" was registered with type " ' . $ type . '", but is of type " ' .
@@ -344,10 +381,9 @@ public function validateArguments()
344
381
*/
345
382
protected function initializeComponentParams ()
346
383
{
347
- $ renderingContext = GeneralUtility:: makeInstance (RenderingContext::class );
384
+ $ renderingContext = $ this -> getRenderingContext ( );
348
385
349
- $ componentLoader = $ this ->getComponentLoader ();
350
- $ componentFile = $ componentLoader ->findComponent ($ this ->componentNamespace );
386
+ $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
351
387
352
388
// Parse component template without using the cache
353
389
$ parsedTemplate = $ renderingContext ->getTemplateParser ()->parse (
@@ -376,7 +412,6 @@ protected function initializeComponentParams()
376
412
);
377
413
378
414
// Register argument definitions from parameter viewhelpers
379
- $ componentArgumentConverter = $ this ->getComponentArgumentConverter ();
380
415
foreach ($ paramNodes as $ paramNode ) {
381
416
$ param = [];
382
417
foreach ($ paramNode ->getArguments () as $ argumentName => $ argumentNode ) {
@@ -399,15 +434,15 @@ protected function initializeComponentParams()
399
434
}
400
435
401
436
// Resolve type aliases
402
- $ param ['type ' ] = $ componentArgumentConverter ->resolveTypeAlias ($ param ['type ' ]);
437
+ $ param ['type ' ] = $ this -> componentArgumentConverter ->resolveTypeAlias ($ param ['type ' ]);
403
438
404
439
// Enforce boolean node, see implementation in ViewHelperNode::rewriteBooleanNodesInArgumentsObjectTree()
405
440
if ($ param ['type ' ] === 'boolean ' || $ param ['type ' ] === 'bool ' ) {
406
441
$ param ['default ' ] = BooleanNode::convertToBoolean ($ param ['default ' ], $ renderingContext );
407
442
// Make sure that default value for object parameters is either a valid object or null
408
443
} elseif (class_exists ($ param ['type ' ]) &&
409
444
!$ param ['default ' ] instanceof $ param ['type ' ] &&
410
- !$ componentArgumentConverter ->canTypeBeConvertedToType (gettype ($ param ['default ' ]), $ param ['type ' ])
445
+ !$ this -> componentArgumentConverter ->canTypeBeConvertedToType (gettype ($ param ['default ' ]), $ param ['type ' ])
411
446
) {
412
447
$ param ['default ' ] = null ;
413
448
}
@@ -489,7 +524,11 @@ protected function getComponentPrefixer()
489
524
$ componentPrefixerClass = GenericComponentPrefixer::class;
490
525
}
491
526
492
- $ componentPrefixer = GeneralUtility::makeInstance ($ componentPrefixerClass );
527
+ if ($ this ->container ->has ($ componentPrefixerClass )) {
528
+ $ componentPrefixer = $ this ->container ->get ($ componentPrefixerClass );
529
+ } else {
530
+ $ componentPrefixer = GeneralUtility::makeInstance ($ componentPrefixerClass );
531
+ }
493
532
494
533
if (!($ componentPrefixer instanceof ComponentPrefixerInterface)) {
495
534
throw new Exception (sprintf (
@@ -505,27 +544,15 @@ protected function getComponentPrefixer()
505
544
}
506
545
507
546
/**
508
- * @return ComponentLoader
509
- */
510
- protected function getComponentLoader (): ComponentLoader
511
- {
512
- return GeneralUtility::makeInstance (ComponentLoader::class);
513
- }
514
-
515
- /**
516
- * @return ComponentSettings
517
- */
518
- protected function getComponentSettings (): ComponentSettings
519
- {
520
- return GeneralUtility::makeInstance (ComponentSettings::class);
521
- }
522
-
523
- /**
524
- * @return ComponentArgumentConverter
547
+ * @return RenderingContext
525
548
*/
526
- protected function getComponentArgumentConverter (): ComponentArgumentConverter
549
+ protected function getRenderingContext (): RenderingContext
527
550
{
528
- return GeneralUtility::makeInstance (ComponentArgumentConverter::class);
551
+ if ($ this ->container ->has (RenderingContextFactory::class)) {
552
+ return $ this ->container ->get (RenderingContextFactory::class)->create ();
553
+ } else {
554
+ return GeneralUtility::makeInstance (RenderingContext::class);
555
+ }
529
556
}
530
557
531
558
/**
0 commit comments