3
3
namespace SMS \FluidComponents \Fluid \ViewHelper ;
4
4
5
5
use Psr \Container \ContainerInterface ;
6
+ use SMS \FluidComponents \Domain \Model \Component ;
6
7
use SMS \FluidComponents \Domain \Model \Slot ;
7
8
use SMS \FluidComponents \Interfaces \ComponentAware ;
8
9
use SMS \FluidComponents \Interfaces \EscapedParameter ;
9
10
use SMS \FluidComponents \Interfaces \RenderingContextAware ;
10
11
use SMS \FluidComponents \Utility \ComponentArgumentConverter ;
12
+ use SMS \FluidComponents \Service \ComponentDataLoader ;
11
13
use SMS \FluidComponents \Utility \ComponentLoader ;
12
- use SMS \FluidComponents \Utility \ComponentPrefixer \ComponentPrefixerInterface ;
13
- use SMS \FluidComponents \Utility \ComponentPrefixer \GenericComponentPrefixer ;
14
14
use SMS \FluidComponents \Utility \ComponentSettings ;
15
15
use SMS \FluidComponents \ViewHelpers \ComponentViewHelper ;
16
16
use SMS \FluidComponents \ViewHelpers \ParamViewHelper ;
@@ -45,6 +45,13 @@ class ComponentRenderer extends AbstractViewHelper
45
45
*/
46
46
protected $ componentNamespace ;
47
47
48
+ /**
49
+ * Object containing information about the current component
50
+ *
51
+ * @var Component
52
+ */
53
+ protected Component $ component ;
54
+
48
55
/**
49
56
* Cache for component template instance used for rendering
50
57
*
@@ -62,13 +69,6 @@ class ComponentRenderer extends AbstractViewHelper
62
69
*/
63
70
protected static $ componentArgumentDefinitionCache = [];
64
71
65
- /**
66
- * Cache of component prefixer objects
67
- *
68
- * @var array
69
- */
70
- protected static $ componentPrefixerCache = [];
71
-
72
72
/**
73
73
* Components are HTML markup which should not be escaped
74
74
*
@@ -93,6 +93,11 @@ class ComponentRenderer extends AbstractViewHelper
93
93
*/
94
94
protected ComponentSettings $ componentSettings ;
95
95
96
+ /**
97
+ * @var ComponentDataLoader
98
+ */
99
+ protected ComponentDataLoader $ componentDataLoader ;
100
+
96
101
/**
97
102
* @var ComponentArgumentConverter
98
103
*/
@@ -112,11 +117,13 @@ class ComponentRenderer extends AbstractViewHelper
112
117
public function __construct (
113
118
ComponentLoader $ componentLoader ,
114
119
ComponentSettings $ componentSettings ,
120
+ ComponentDataLoader $ componentDataLoader ,
115
121
ComponentArgumentConverter $ componentArgumentConverter ,
116
122
ContainerInterface $ container
117
123
) {
118
124
$ this ->componentLoader = $ componentLoader ;
119
125
$ this ->componentSettings = $ componentSettings ;
126
+ $ this ->componentDataLoader = $ componentDataLoader ;
120
127
$ this ->componentArgumentConverter = $ componentArgumentConverter ;
121
128
$ this ->container = $ container ;
122
129
}
@@ -130,39 +137,20 @@ public function __construct(
130
137
public function setComponentNamespace ($ componentNamespace )
131
138
{
132
139
$ this ->componentNamespace = $ componentNamespace ;
140
+ $ this ->component = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
133
141
return $ this ;
134
142
}
135
143
136
144
/**
137
145
* Returns the namespace of the component the viewhelper renders
138
146
*
139
- * @return void
147
+ * @return string
140
148
*/
141
149
public function getComponentNamespace ()
142
150
{
143
151
return $ this ->componentNamespace ;
144
152
}
145
153
146
- /**
147
- * Returns the component prefix
148
- *
149
- * @return string
150
- */
151
- public function getComponentClass ()
152
- {
153
- return $ this ->getComponentPrefixer ()->prefix ($ this ->componentNamespace );
154
- }
155
-
156
- /**
157
- * Returns the component prefix
158
- *
159
- * @return string
160
- */
161
- public function getComponentPrefix ()
162
- {
163
- return $ this ->getComponentClass () . $ this ->getComponentPrefixer ()->getSeparator ();
164
- }
165
-
166
154
/**
167
155
* Renders the component the viewhelper is responsible for
168
156
* TODO this can probably be improved by using renderComponent() directly
@@ -189,12 +177,11 @@ public function render()
189
177
}
190
178
$ variableContainer = $ renderingContext ->getVariableProvider ();
191
179
180
+ // Load additional data for component
181
+ $ this ->componentDataLoader ->loadData ($ this ->component );
182
+
192
183
// Provide information about component to renderer
193
- $ variableContainer ->add ('component ' , [
194
- 'namespace ' => $ this ->componentNamespace ,
195
- 'class ' => $ this ->getComponentClass (),
196
- 'prefix ' => $ this ->getComponentPrefix (),
197
- ]);
184
+ $ variableContainer ->add ('component ' , $ this ->component );
198
185
$ variableContainer ->add ('settings ' , $ this ->componentSettings );
199
186
200
187
// Provide component content to renderer
@@ -223,12 +210,10 @@ public function render()
223
210
224
211
// Initialize component rendering template
225
212
if (!isset ($ this ->parsedTemplate )) {
226
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
227
-
228
213
$ this ->parsedTemplate = $ renderingContext ->getTemplateParser ()->getOrParseAndStoreTemplate (
229
- $ this ->getTemplateIdentifier ($ componentFile ),
230
- function () use ( $ componentFile ) {
231
- return file_get_contents ($ componentFile );
214
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () ),
215
+ function () {
216
+ return file_get_contents ($ this -> component -> getFile () );
232
217
}
233
218
);
234
219
}
@@ -397,12 +382,10 @@ protected function initializeComponentParams()
397
382
{
398
383
$ renderingContext = $ this ->getRenderingContext ();
399
384
400
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
401
-
402
385
// Parse component template without using the cache
403
386
$ parsedTemplate = $ renderingContext ->getTemplateParser ()->parse (
404
- file_get_contents ($ componentFile ),
405
- $ this ->getTemplateIdentifier ($ componentFile )
387
+ file_get_contents ($ this -> component -> getFile () ),
388
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () )
406
389
);
407
390
408
391
// Extract all component viewhelpers
@@ -414,7 +397,7 @@ protected function initializeComponentParams()
414
397
if (count ($ componentNodes ) > 1 ) {
415
398
throw new Exception (sprintf (
416
399
'Only one component per file allowed in: %s ' ,
417
- $ componentFile
400
+ $ this -> component -> getFile ()
418
401
), 1527779393 );
419
402
}
420
403
@@ -515,50 +498,6 @@ protected function getTemplateIdentifier(string $pathAndFilename, string $prefix
515
498
);
516
499
}
517
500
518
- /**
519
- * Returns the prefixer object responsible for the current component namespaces
520
- *
521
- * @return ComponentPrefixerInterface
522
- */
523
- protected function getComponentPrefixer ()
524
- {
525
- if (!isset (self ::$ componentPrefixerCache [$ this ->componentNamespace ])) {
526
- if (isset ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]) &&
527
- is_array ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ])
528
- ) {
529
- arsort ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]);
530
- foreach ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ] as $ namespace => $ prefixer ) {
531
- $ namespace = ltrim ($ namespace , '\\' );
532
- if (strpos ($ this ->componentNamespace , $ namespace ) === 0 ) {
533
- $ componentPrefixerClass = $ prefixer ;
534
- break ;
535
- }
536
- }
537
- }
538
-
539
- if (empty ($ componentPrefixerClass )) {
540
- $ componentPrefixerClass = GenericComponentPrefixer::class;
541
- }
542
-
543
- if ($ this ->container ->has ($ componentPrefixerClass )) {
544
- $ componentPrefixer = $ this ->container ->get ($ componentPrefixerClass );
545
- } else {
546
- $ componentPrefixer = GeneralUtility::makeInstance ($ componentPrefixerClass );
547
- }
548
-
549
- if (!($ componentPrefixer instanceof ComponentPrefixerInterface)) {
550
- throw new Exception (sprintf (
551
- 'Invalid component prefixer: %s ' ,
552
- $ componentPrefixerClass
553
- ), 1530608357 );
554
- }
555
-
556
- self ::$ componentPrefixerCache [$ this ->componentNamespace ] = $ componentPrefixer ;
557
- }
558
-
559
- return self ::$ componentPrefixerCache [$ this ->componentNamespace ];
560
- }
561
-
562
501
/**
563
502
* @return RenderingContext
564
503
*/
0 commit comments