From e192bc0ff68903d47e025d0293abf2a8e091ab70 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Thu, 20 Mar 2025 14:01:56 +0900 Subject: [PATCH] Add widget directive for Template v2 --- .../parsers/template/TemplateParser_v2.php | 5 ++++- modules/widget/widget.controller.php | 19 +++++++++++++------ .../parsers/TemplateParserV2Test.php | 5 +++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php index 84b010e5d..ff4dd6bde 100644 --- a/common/framework/parsers/template/TemplateParser_v2.php +++ b/common/framework/parsers/template/TemplateParser_v2.php @@ -760,6 +760,7 @@ class TemplateParser_v2 * @dd($var, $var, ...) * @stack('name') * @url(['mid' => $mid, 'act' => $act]) + * @widget('name', $args) * * @param string $content * @return string @@ -773,7 +774,7 @@ class TemplateParser_v2 // Insert JSON, lang codes, and dumps. $parentheses = self::_getRegexpForParentheses(2); - $content = preg_replace_callback('#(?', $args); case 'url': return sprintf('config->context === \'HTML\' ? getUrl(%s) : $this->_v2_escape(getNotEncodedUrl(%s)); ?>', $args, $args); + case 'widget': + return sprintf('execute(%s); ?>', $args); default: return $match[0]; } diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index 9c8275062..ec0244638 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -450,14 +450,21 @@ class WidgetController extends Widget // Save for debug run-time widget $start = microtime(true); - // urldecode the value of args haejum - $object_vars = get_object_vars($args); - if(count($object_vars)) + // Type juggling + if (is_array($args)) { - foreach($object_vars as $key => $val) + $args = (object)$args; + } + + // Apply urldecode for backward compatibility + if ($escaped) + { + foreach (get_object_vars($args) ?: [] as $key => $val) { - if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue; - if($escaped) $args->{$key} = utf8RawUrlDecode($val); + if (!in_array($key, ['body', 'class', 'style', 'document_srl', 'widget', 'widget_sequence', 'widgetstyle', 'widgetbox_content', 'widget_padding_left', 'widget_padding_top', 'widget_padding_bottom', 'widget_padding_right'])) + { + $args->{$key} = utf8RawUrlDecode($val); + } } } diff --git a/tests/unit/framework/parsers/TemplateParserV2Test.php b/tests/unit/framework/parsers/TemplateParserV2Test.php index 75a9e4bb5..ce6e68ab7 100644 --- a/tests/unit/framework/parsers/TemplateParserV2Test.php +++ b/tests/unit/framework/parsers/TemplateParserV2Test.php @@ -1031,6 +1031,11 @@ class TemplateParserV2Test extends \Codeception\Test\Unit $source = "@url('', 'mid', \$mid, 'act', \$act])"; $target = "config->context === 'HTML' ? getUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act]) : \$this->_v2_escape(getNotEncodedUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act])); ?>"; $this->assertEquals($target, $this->_parse($source)); + + // Widget + $source = "@widget('login_info', ['skin' => 'default'])"; + $target = "execute('login_info', ['skin' => 'default']); ?>"; + $this->assertEquals($target, $this->_parse($source)); } public function testComments()