5
5
*/
6
6
namespace Magento \Widget \Model ;
7
7
8
+ use Magento \Framework \App \Cache \Type \Config ;
9
+ use Magento \Framework \DataObject ;
10
+ use Magento \Framework \Escaper ;
11
+ use Magento \Framework \Math \Random ;
12
+ use Magento \Framework \View \Asset \Repository ;
13
+ use Magento \Framework \View \Asset \Source ;
14
+ use Magento \Framework \View \FileSystem ;
15
+ use Magento \Widget \Helper \Conditions ;
16
+ use Magento \Widget \Model \Config \Data ;
17
+
8
18
/**
9
19
* Widget model for different purposes
10
20
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
15
25
class Widget
16
26
{
17
27
/**
18
- * @var \Magento\Widget\Model\Config\ Data
28
+ * @var Data
19
29
*/
20
30
protected $ dataStorage ;
21
31
22
32
/**
23
- * @var \Magento\Framework\App\Cache\Type\ Config
33
+ * @var Config
24
34
*/
25
35
protected $ configCacheType ;
26
36
27
37
/**
28
- * @var \Magento\Framework\View\Asset\ Repository
38
+ * @var Repository
29
39
*/
30
40
protected $ assetRepo ;
31
41
32
42
/**
33
- * @var \Magento\Framework\View\Asset\ Source
43
+ * @var Source
34
44
*/
35
45
protected $ assetSource ;
36
46
37
47
/**
38
- * @var \Magento\Framework\View\ FileSystem
48
+ * @var FileSystem
39
49
*/
40
50
protected $ viewFileSystem ;
41
51
42
52
/**
43
- * @var \Magento\Framework\ Escaper
53
+ * @var Escaper
44
54
*/
45
55
protected $ escaper ;
46
56
@@ -50,30 +60,35 @@ class Widget
50
60
protected $ widgetsArray = [];
51
61
52
62
/**
53
- * @var \Magento\Widget\Helper\ Conditions
63
+ * @var Conditions
54
64
*/
55
65
protected $ conditionsHelper ;
56
66
57
67
/**
58
- * @var \Magento\Framework\Math\ Random
68
+ * @var Random
59
69
*/
60
70
private $ mathRandom ;
61
71
62
72
/**
63
- * @param \Magento\Framework\Escaper $escaper
64
- * @param \Magento\Widget\Model\Config\Data $dataStorage
65
- * @param \Magento\Framework\View\Asset\Repository $assetRepo
66
- * @param \Magento\Framework\View\Asset\Source $assetSource
67
- * @param \Magento\Framework\View\FileSystem $viewFileSystem
68
- * @param \Magento\Widget\Helper\Conditions $conditionsHelper
73
+ * @var string[]
74
+ */
75
+ private $ reservedChars = ['} ' , '{ ' ];
76
+
77
+ /**
78
+ * @param Escaper $escaper
79
+ * @param Data $dataStorage
80
+ * @param Repository $assetRepo
81
+ * @param Source $assetSource
82
+ * @param FileSystem $viewFileSystem
83
+ * @param Conditions $conditionsHelper
69
84
*/
70
85
public function __construct (
71
- \ Magento \ Framework \ Escaper $ escaper ,
72
- \ Magento \ Widget \ Model \ Config \ Data $ dataStorage ,
73
- \ Magento \ Framework \ View \ Asset \ Repository $ assetRepo ,
74
- \ Magento \ Framework \ View \ Asset \ Source $ assetSource ,
75
- \ Magento \ Framework \ View \ FileSystem $ viewFileSystem ,
76
- \ Magento \ Widget \ Helper \ Conditions $ conditionsHelper
86
+ Escaper $ escaper ,
87
+ Data $ dataStorage ,
88
+ Repository $ assetRepo ,
89
+ Source $ assetSource ,
90
+ FileSystem $ viewFileSystem ,
91
+ Conditions $ conditionsHelper
77
92
) {
78
93
$ this ->escaper = $ escaper ;
79
94
$ this ->dataStorage = $ dataStorage ;
@@ -110,14 +125,11 @@ public function getWidgetByClassType($type)
110
125
$ widgets = $ this ->getWidgets ();
111
126
/** @var array $widget */
112
127
foreach ($ widgets as $ widget ) {
113
- if (isset ($ widget ['@ ' ])) {
114
- if (isset ($ widget ['@ ' ]['type ' ])) {
115
- if ($ type === $ widget ['@ ' ]['type ' ]) {
116
- return $ widget ;
117
- }
118
- }
128
+ if (isset ($ widget ['@ ' ]['type ' ]) && $ type === $ widget ['@ ' ]['type ' ]) {
129
+ return $ widget ;
119
130
}
120
131
}
132
+
121
133
return null ;
122
134
}
123
135
@@ -131,6 +143,7 @@ public function getWidgetByClassType($type)
131
143
*/
132
144
public function getConfigAsXml ($ type )
133
145
{
146
+ // phpstan:ignore
134
147
return $ this ->getXmlElementByType ($ type );
135
148
}
136
149
@@ -296,42 +309,70 @@ public function getWidgetsArray($filters = [])
296
309
*/
297
310
public function getWidgetDeclaration ($ type , $ params = [], $ asIs = true )
298
311
{
299
- $ directive = '{{widget type=" ' . $ type . '" ' ;
300
312
$ widget = $ this ->getConfigAsObject ($ type );
301
313
314
+ $ params = array_filter ($ params , function ($ value ) {
315
+ return $ value !== null && $ value !== '' ;
316
+ });
317
+
318
+ $ directiveParams = '' ;
302
319
foreach ($ params as $ name => $ value ) {
303
320
// Retrieve default option value if pre-configured
304
- if ($ name == 'conditions ' ) {
305
- $ name = 'conditions_encoded ' ;
306
- $ value = $ this ->conditionsHelper ->encode ($ value );
307
- } elseif (is_array ($ value )) {
308
- $ value = implode (', ' , $ value );
309
- } elseif (trim ($ value ) == '' ) {
310
- $ parameters = $ widget ->getParameters ();
311
- if (isset ($ parameters [$ name ]) && is_object ($ parameters [$ name ])) {
312
- $ value = $ parameters [$ name ]->getValue ();
313
- }
314
- }
315
- if (isset ($ value )) {
316
- $ directive .= sprintf (' %s="%s" ' , $ name , $ this ->escaper ->escapeHtmlAttr ($ value , false ));
317
- }
321
+ $ directiveParams .= $ this ->getDirectiveParam ($ widget , $ name , $ value );
318
322
}
319
323
320
- $ directive .= $ this ->getWidgetPageVarName ($ params );
321
-
322
- $ directive .= '}} ' ;
324
+ $ directive = sprintf ('{{widget type="%s"%s%s}} ' , $ type , $ directiveParams , $ this ->getWidgetPageVarName ($ params ));
323
325
324
326
if ($ asIs ) {
325
327
return $ directive ;
326
328
}
327
329
328
- $ html = sprintf (
330
+ return sprintf (
329
331
'<img id="%s" src="%s" title="%s"> ' ,
330
332
$ this ->idEncode ($ directive ),
331
333
$ this ->getPlaceholderImageUrl ($ type ),
332
334
$ this ->escaper ->escapeUrl ($ directive )
333
335
);
334
- return $ html ;
336
+ }
337
+
338
+ /**
339
+ * Returns directive param with prepared value
340
+ *
341
+ * @param DataObject $widget
342
+ * @param string $name
343
+ * @param string|array $value
344
+ * @return string
345
+ */
346
+ private function getDirectiveParam (DataObject $ widget , string $ name , $ value ): string
347
+ {
348
+ if ($ name === 'conditions ' ) {
349
+ $ name = 'conditions_encoded ' ;
350
+ $ value = $ this ->conditionsHelper ->encode ($ value );
351
+ } elseif (is_array ($ value )) {
352
+ $ value = implode (', ' , $ value );
353
+ } elseif (trim ($ value ) === '' ) {
354
+ $ parameters = $ widget ->getParameters ();
355
+ if (isset ($ parameters [$ name ]) && is_object ($ parameters [$ name ])) {
356
+ $ value = $ parameters [$ name ]->getValue ();
357
+ }
358
+ } else {
359
+ $ value = $ this ->getPreparedValue ($ value );
360
+ }
361
+
362
+ return sprintf (' %s="%s" ' , $ name , $ this ->escaper ->escapeHtmlAttr ($ value , false ));
363
+ }
364
+
365
+ /**
366
+ * Returns encoded value if it contains reserved chars
367
+ *
368
+ * @param string $value
369
+ * @return string
370
+ */
371
+ private function getPreparedValue (string $ value ): string
372
+ {
373
+ $ pattern = sprintf ('/%s/ ' , implode ('| ' , $ this ->reservedChars ));
374
+
375
+ return preg_match ($ pattern , $ value ) ? rawurlencode ($ value ) : $ value ;
335
376
}
336
377
337
378
/**
0 commit comments