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
@@ -184,12 +172,11 @@ public function render()
184
172
}
185
173
$ variableContainer = $ renderingContext ->getVariableProvider ();
186
174
175
+ // Load additional data for component
176
+ $ this ->componentDataLoader ->loadData ($ this ->component );
177
+
187
178
// Provide information about component to renderer
188
- $ variableContainer ->add ('component ' , [
189
- 'namespace ' => $ this ->componentNamespace ,
190
- 'class ' => $ this ->getComponentClass (),
191
- 'prefix ' => $ this ->getComponentPrefix (),
192
- ]);
179
+ $ variableContainer ->add ('component ' , $ this ->component );
193
180
$ variableContainer ->add ('settings ' , $ this ->componentSettings );
194
181
195
182
// Provide component content to renderer
@@ -218,12 +205,10 @@ public function render()
218
205
219
206
// Initialize component rendering template
220
207
if (!isset ($ this ->parsedTemplate )) {
221
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
222
-
223
208
$ this ->parsedTemplate = $ renderingContext ->getTemplateParser ()->getOrParseAndStoreTemplate (
224
- $ this ->getTemplateIdentifier ($ componentFile ),
225
- function () use ( $ componentFile ) {
226
- return file_get_contents ($ componentFile );
209
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () ),
210
+ function () {
211
+ return file_get_contents ($ this -> component -> getFile () );
227
212
}
228
213
);
229
214
}
@@ -392,12 +377,10 @@ protected function initializeComponentParams()
392
377
{
393
378
$ renderingContext = $ this ->getRenderingContext ();
394
379
395
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
396
-
397
380
// Parse component template without using the cache
398
381
$ parsedTemplate = $ renderingContext ->getTemplateParser ()->parse (
399
- file_get_contents ($ componentFile ),
400
- $ this ->getTemplateIdentifier ($ componentFile )
382
+ file_get_contents ($ this -> component -> getFile () ),
383
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () )
401
384
);
402
385
403
386
// Extract all component viewhelpers
@@ -409,7 +392,7 @@ protected function initializeComponentParams()
409
392
if (count ($ componentNodes ) > 1 ) {
410
393
throw new Exception (sprintf (
411
394
'Only one component per file allowed in: %s ' ,
412
- $ componentFile
395
+ $ this -> component -> getFile ()
413
396
), 1527779393 );
414
397
}
415
398
@@ -510,50 +493,6 @@ protected function getTemplateIdentifier(string $pathAndFilename, string $prefix
510
493
);
511
494
}
512
495
513
- /**
514
- * Returns the prefixer object responsible for the current component namespaces
515
- *
516
- * @return ComponentPrefixerInterface
517
- */
518
- protected function getComponentPrefixer ()
519
- {
520
- if (!isset (self ::$ componentPrefixerCache [$ this ->componentNamespace ])) {
521
- if (isset ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]) &&
522
- is_array ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ])
523
- ) {
524
- arsort ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]);
525
- foreach ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ] as $ namespace => $ prefixer ) {
526
- $ namespace = ltrim ($ namespace , '\\' );
527
- if (strpos ($ this ->componentNamespace , $ namespace ) === 0 ) {
528
- $ componentPrefixerClass = $ prefixer ;
529
- break ;
530
- }
531
- }
532
- }
533
-
534
- if (empty ($ componentPrefixerClass )) {
535
- $ componentPrefixerClass = GenericComponentPrefixer::class;
536
- }
537
-
538
- if ($ this ->container ->has ($ componentPrefixerClass )) {
539
- $ componentPrefixer = $ this ->container ->get ($ componentPrefixerClass );
540
- } else {
541
- $ componentPrefixer = GeneralUtility::makeInstance ($ componentPrefixerClass );
542
- }
543
-
544
- if (!($ componentPrefixer instanceof ComponentPrefixerInterface)) {
545
- throw new Exception (sprintf (
546
- 'Invalid component prefixer: %s ' ,
547
- $ componentPrefixerClass
548
- ), 1530608357 );
549
- }
550
-
551
- self ::$ componentPrefixerCache [$ this ->componentNamespace ] = $ componentPrefixer ;
552
- }
553
-
554
- return self ::$ componentPrefixerCache [$ this ->componentNamespace ];
555
- }
556
-
557
496
/**
558
497
* @return RenderingContext
559
498
*/
0 commit comments