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,8 +143,7 @@ public function getWidgetByClassType($type)
131
143
*/
132
144
public function getConfigAsXml ($ type )
133
145
{
134
- // phpstan:ignore
135
- return $ this ->getXmlElementByType ($ type );
146
+ return $ this ->getWidgetByClassType ($ type );
136
147
}
137
148
138
149
/**
@@ -294,48 +305,71 @@ public function getWidgetsArray($filters = [])
294
305
* @param array $params Pre-configured Widget Params
295
306
* @param bool $asIs Return result as widget directive(true) or as placeholder image(false)
296
307
* @return string Widget directive ready to parse
297
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
298
308
*/
299
309
public function getWidgetDeclaration ($ type , $ params = [], $ asIs = true )
300
310
{
301
- $ directive = '{{widget type=" ' . $ type . '" ' ;
302
311
$ widget = $ this ->getConfigAsObject ($ type );
303
312
313
+ $ directiveParams = '' ;
304
314
foreach ($ params as $ name => $ value ) {
305
315
// Retrieve default option value if pre-configured
306
- if ($ name == 'conditions ' ) {
307
- $ name = 'conditions_encoded ' ;
308
- $ value = $ this ->conditionsHelper ->encode ($ value );
309
- } elseif ($ this ->isTextType ($ widget , $ name )) {
310
- $ value = $ this ->encodeReservedChars ($ value );
311
- } elseif (is_array ($ value )) {
312
- $ value = implode (', ' , $ value );
313
- } elseif (trim ($ value ) == '' ) {
314
- $ parameters = $ widget ->getParameters ();
315
- if (isset ($ parameters [$ name ]) && is_object ($ parameters [$ name ])) {
316
- $ value = $ parameters [$ name ]->getValue ();
317
- }
318
- }
319
- if (isset ($ value )) {
320
- $ directive .= sprintf (' %s="%s" ' , $ name , $ this ->escaper ->escapeHtmlAttr ($ value , false ));
321
- }
316
+ $ directiveParams .= $ this ->getDirectiveParam ($ widget , $ name , $ value );
322
317
}
323
318
324
- $ directive .= $ this ->getWidgetPageVarName ($ params );
325
-
326
- $ directive .= '}} ' ;
319
+ $ directive = sprintf ('{{widget type="%s"%s%s}} ' , $ type , $ directiveParams , $ this ->getWidgetPageVarName ($ params ));
327
320
328
321
if ($ asIs ) {
329
322
return $ directive ;
330
323
}
331
324
332
- $ html = sprintf (
325
+ return sprintf (
333
326
'<img id="%s" src="%s" title="%s"> ' ,
334
327
$ this ->idEncode ($ directive ),
335
328
$ this ->getPlaceholderImageUrl ($ type ),
336
329
$ this ->escaper ->escapeUrl ($ directive )
337
330
);
338
- return $ html ;
331
+ }
332
+
333
+ /**
334
+ * Returns directive param with prepared value
335
+ *
336
+ * @param DataObject $widget
337
+ * @param string $name
338
+ * @param string|array $value
339
+ * @return string
340
+ */
341
+ private function getDirectiveParam (DataObject $ widget , string $ name , $ value ): string
342
+ {
343
+ if ($ name === 'conditions ' ) {
344
+ $ name = 'conditions_encoded ' ;
345
+ $ value = $ this ->conditionsHelper ->encode ($ value );
346
+ } elseif (is_array ($ value )) {
347
+ $ value = implode (', ' , $ value );
348
+ } elseif (trim ($ value ) === '' ) {
349
+ $ parameters = $ widget ->getParameters ();
350
+ if (isset ($ parameters [$ name ]) && is_object ($ parameters [$ name ])) {
351
+ $ value = $ parameters [$ name ]->getValue ();
352
+ }
353
+ } else {
354
+ $ value = $ this ->getPreparedValue ($ value );
355
+ }
356
+
357
+ return $ value !== null
358
+ ? sprintf (' %s="%s" ' , $ name , $ this ->escaper ->escapeHtmlAttr ($ value , false ))
359
+ : '' ;
360
+ }
361
+
362
+ /**
363
+ * Returns encoded value if it contains reserved chars
364
+ *
365
+ * @param string $value
366
+ * @return string
367
+ */
368
+ private function getPreparedValue (string $ value ): string
369
+ {
370
+ $ pattern = sprintf ('/%s/ ' , implode ('| ' , $ this ->reservedChars ));
371
+
372
+ return preg_match ($ pattern , $ value ) ? rawurlencode ($ value ) : $ value ;
339
373
}
340
374
341
375
/**
@@ -460,65 +494,4 @@ protected function sortParameters($firstElement, $secondElement)
460
494
$ bOrder = (int )$ secondElement ->getData ('sort_order ' );
461
495
return $ aOrder < $ bOrder ? -1 : ($ aOrder > $ bOrder ? 1 : 0 );
462
496
}
463
-
464
- /**
465
- * Encode reserved chars
466
- *
467
- * @param string $string
468
- * @return string|string[]
469
- */
470
- private function encodeReservedChars ($ string )
471
- {
472
- $ map = [
473
- '{ ' => urlencode ('{ ' ),
474
- '} ' => urlencode ('} ' )
475
- ];
476
-
477
- return str_replace (
478
- array_keys ($ map ),
479
- array_values ($ map ),
480
- $ string
481
- );
482
- }
483
-
484
- /**
485
- * Decode reserved chars
486
- *
487
- * @param string $string
488
- * @return array
489
- */
490
- public function decodeReservedChars ($ string )
491
- {
492
- $ map = [
493
- '{ ' => urlencode ('{ ' ),
494
- '} ' => urlencode ('} ' )
495
- ];
496
-
497
- return str_replace (
498
- array_values ($ map ),
499
- array_keys ($ map ),
500
- $ string
501
- );
502
- }
503
-
504
- /**
505
- * Is text type Widget parameter
506
- *
507
- * @param \Magento\Framework\DataObject $widget
508
- * @param string $name
509
- * @return bool
510
- */
511
- private function isTextType ($ widget , $ name )
512
- {
513
- $ parameters = $ widget ->getParameters ();
514
-
515
- if (isset ($ parameters [$ name ]) && is_object ($ parameters [$ name ])) {
516
- $ type = $ parameters [$ name ]->getType ();
517
- if ($ type == 'text ' ) {
518
- return true ;
519
- }
520
- }
521
-
522
- return false ;
523
- }
524
497
}
0 commit comments