4
4
5
5
use Psr \Container \ContainerInterface ;
6
6
use SMS \FluidComponents \Domain \Model \RequiredSlotPlaceholder ;
7
+ use SMS \FluidComponents \Domain \Model \Component ;
7
8
use SMS \FluidComponents \Domain \Model \Slot ;
8
9
use SMS \FluidComponents \Interfaces \ComponentAware ;
9
10
use SMS \FluidComponents \Interfaces \EscapedParameter ;
10
11
use SMS \FluidComponents \Interfaces \RenderingContextAware ;
11
12
use SMS \FluidComponents \Utility \ComponentArgumentConverter ;
13
+ use SMS \FluidComponents \Service \ComponentDataLoader ;
12
14
use SMS \FluidComponents \Utility \ComponentLoader ;
13
- use SMS \FluidComponents \Utility \ComponentPrefixer \ComponentPrefixerInterface ;
14
- use SMS \FluidComponents \Utility \ComponentPrefixer \GenericComponentPrefixer ;
15
15
use SMS \FluidComponents \Utility \ComponentSettings ;
16
16
use SMS \FluidComponents \ViewHelpers \ComponentViewHelper ;
17
17
use SMS \FluidComponents \ViewHelpers \ContentViewHelper ;
@@ -49,6 +49,13 @@ class ComponentRenderer extends AbstractViewHelper
49
49
*/
50
50
protected $ componentNamespace ;
51
51
52
+ /**
53
+ * Object containing information about the current component
54
+ *
55
+ * @var Component
56
+ */
57
+ protected Component $ component ;
58
+
52
59
/**
53
60
* Cache for component template instance used for rendering
54
61
*
@@ -66,13 +73,6 @@ class ComponentRenderer extends AbstractViewHelper
66
73
*/
67
74
protected static $ componentArgumentDefinitionCache = [];
68
75
69
- /**
70
- * Cache of component prefixer objects
71
- *
72
- * @var array
73
- */
74
- protected static $ componentPrefixerCache = [];
75
-
76
76
/**
77
77
* Components are HTML markup which should not be escaped
78
78
*
@@ -97,6 +97,11 @@ class ComponentRenderer extends AbstractViewHelper
97
97
*/
98
98
protected ComponentSettings $ componentSettings ;
99
99
100
+ /**
101
+ * @var ComponentDataLoader
102
+ */
103
+ protected ComponentDataLoader $ componentDataLoader ;
104
+
100
105
/**
101
106
* @var ComponentArgumentConverter
102
107
*/
@@ -116,11 +121,13 @@ class ComponentRenderer extends AbstractViewHelper
116
121
public function __construct (
117
122
ComponentLoader $ componentLoader ,
118
123
ComponentSettings $ componentSettings ,
124
+ ComponentDataLoader $ componentDataLoader ,
119
125
ComponentArgumentConverter $ componentArgumentConverter ,
120
126
ContainerInterface $ container
121
127
) {
122
128
$ this ->componentLoader = $ componentLoader ;
123
129
$ this ->componentSettings = $ componentSettings ;
130
+ $ this ->componentDataLoader = $ componentDataLoader ;
124
131
$ this ->componentArgumentConverter = $ componentArgumentConverter ;
125
132
$ this ->container = $ container ;
126
133
}
@@ -134,39 +141,20 @@ public function __construct(
134
141
public function setComponentNamespace ($ componentNamespace )
135
142
{
136
143
$ this ->componentNamespace = $ componentNamespace ;
144
+ $ this ->component = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
137
145
return $ this ;
138
146
}
139
147
140
148
/**
141
149
* Returns the namespace of the component the viewhelper renders
142
150
*
143
- * @return void
151
+ * @return string
144
152
*/
145
153
public function getComponentNamespace ()
146
154
{
147
155
return $ this ->componentNamespace ;
148
156
}
149
157
150
- /**
151
- * Returns the component prefix
152
- *
153
- * @return string
154
- */
155
- public function getComponentClass ()
156
- {
157
- return $ this ->getComponentPrefixer ()->prefix ($ this ->componentNamespace );
158
- }
159
-
160
- /**
161
- * Returns the component prefix
162
- *
163
- * @return string
164
- */
165
- public function getComponentPrefix ()
166
- {
167
- return $ this ->getComponentClass () . $ this ->getComponentPrefixer ()->getSeparator ();
168
- }
169
-
170
158
/**
171
159
* Renders the component the viewhelper is responsible for
172
160
* TODO this can probably be improved by using renderComponent() directly
@@ -193,12 +181,11 @@ public function render()
193
181
}
194
182
$ variableContainer = $ renderingContext ->getVariableProvider ();
195
183
184
+ // Load additional data for component
185
+ $ this ->componentDataLoader ->loadData ($ this ->component );
186
+
196
187
// Provide information about component to renderer
197
- $ variableContainer ->add ('component ' , [
198
- 'namespace ' => $ this ->componentNamespace ,
199
- 'class ' => $ this ->getComponentClass (),
200
- 'prefix ' => $ this ->getComponentPrefix (),
201
- ]);
188
+ $ variableContainer ->add ('component ' , $ this ->component );
202
189
$ variableContainer ->add ('settings ' , $ this ->componentSettings );
203
190
204
191
// Provide supplied arguments from component call to renderer
@@ -228,12 +215,10 @@ public function render()
228
215
229
216
// Initialize component rendering template
230
217
if (!isset ($ this ->parsedTemplate )) {
231
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
232
-
233
218
$ this ->parsedTemplate = $ renderingContext ->getTemplateParser ()->getOrParseAndStoreTemplate (
234
- $ this ->getTemplateIdentifier ($ componentFile ),
235
- function () use ( $ componentFile ) {
236
- return file_get_contents ($ componentFile );
219
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () ),
220
+ function () {
221
+ return file_get_contents ($ this -> component -> getFile () );
237
222
}
238
223
);
239
224
}
@@ -459,12 +444,10 @@ protected function initializeComponentParams()
459
444
{
460
445
$ renderingContext = $ this ->getRenderingContext ();
461
446
462
- $ componentFile = $ this ->componentLoader ->findComponent ($ this ->componentNamespace );
463
-
464
447
// Parse component template without using the cache
465
448
$ parsedTemplate = $ renderingContext ->getTemplateParser ()->parse (
466
- file_get_contents ($ componentFile ),
467
- $ this ->getTemplateIdentifier ($ componentFile )
449
+ file_get_contents ($ this -> component -> getFile () ),
450
+ $ this ->getTemplateIdentifier ($ this -> component -> getFile () )
468
451
);
469
452
470
453
// Extract all component viewhelpers
@@ -476,7 +459,7 @@ protected function initializeComponentParams()
476
459
if (count ($ componentNodes ) > 1 ) {
477
460
throw new Exception (sprintf (
478
461
'Only one component per file allowed in: %s ' ,
479
- $ componentFile
462
+ $ this -> component -> getFile ()
480
463
), 1527779393 );
481
464
}
482
465
@@ -607,50 +590,6 @@ protected function getTemplateIdentifier(string $pathAndFilename, string $prefix
607
590
);
608
591
}
609
592
610
- /**
611
- * Returns the prefixer object responsible for the current component namespaces
612
- *
613
- * @return ComponentPrefixerInterface
614
- */
615
- protected function getComponentPrefixer ()
616
- {
617
- if (!isset (self ::$ componentPrefixerCache [$ this ->componentNamespace ])) {
618
- if (isset ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]) &&
619
- is_array ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ])
620
- ) {
621
- arsort ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ]);
622
- foreach ($ GLOBALS ['TYPO3_CONF_VARS ' ]['EXTCONF ' ]['fluid_components ' ]['prefixer ' ] as $ namespace => $ prefixer ) {
623
- $ namespace = ltrim ($ namespace , '\\' );
624
- if (strpos ($ this ->componentNamespace , $ namespace ) === 0 ) {
625
- $ componentPrefixerClass = $ prefixer ;
626
- break ;
627
- }
628
- }
629
- }
630
-
631
- if (empty ($ componentPrefixerClass )) {
632
- $ componentPrefixerClass = GenericComponentPrefixer::class;
633
- }
634
-
635
- if ($ this ->container ->has ($ componentPrefixerClass )) {
636
- $ componentPrefixer = $ this ->container ->get ($ componentPrefixerClass );
637
- } else {
638
- $ componentPrefixer = GeneralUtility::makeInstance ($ componentPrefixerClass );
639
- }
640
-
641
- if (!($ componentPrefixer instanceof ComponentPrefixerInterface)) {
642
- throw new Exception (sprintf (
643
- 'Invalid component prefixer: %s ' ,
644
- $ componentPrefixerClass
645
- ), 1530608357 );
646
- }
647
-
648
- self ::$ componentPrefixerCache [$ this ->componentNamespace ] = $ componentPrefixer ;
649
- }
650
-
651
- return self ::$ componentPrefixerCache [$ this ->componentNamespace ];
652
- }
653
-
654
593
/**
655
594
* @return RenderingContext
656
595
*/
0 commit comments