diff --git a/library/think/Template.php b/library/think/Template.php index ffc263b9..82f5c83b 100644 --- a/library/think/Template.php +++ b/library/think/Template.php @@ -383,6 +383,9 @@ class Template $parseStr = $this->parseTemplateName($file); // 替换变量 foreach ($array as $k => $v) { + if (0 == strpos($v, '$')) { + $v = ltrim($this->config['tpl_begin'], '\\') . $v . ltrim($this->config['tpl_end'], '\\'); + } $parseStr = str_replace('[' . $k . ']', $v, $parseStr); } // 再次对包含文件进行模板分析 @@ -455,10 +458,12 @@ class Template $regex = $this->getRegex($restore ? 'restoreliteral' : 'literal'); if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) { if (!$restore) { + $count = count($this->literal); // 替换literal标签 foreach ($matches as $i => $match) { $this->literal[] = substr($match[0], strlen($match[1]), -strlen($match[2])); - $content = str_replace($match[0], "", $content); + $content = str_replace($match[0], "", $content); + $count++; } } else { // 还原literal标签 @@ -821,14 +826,14 @@ class Template if (isset($vars[2])) { $parseStr = '$_COOKIE[\'' . $vars[1] . '\'][\'' . $vars[2] . '\']'; } else { - $parseStr = '\\think\\cookie::get(\'' . $vars[1] . '\')'; + $parseStr = '\\think\\Cookie::get(\'' . $vars[1] . '\')'; } break; case 'SESSION': if (isset($vars[2])) { $parseStr = '$_SESSION[\'' . $vars[1] . '\'][\'' . $vars[2] . '\']'; } else { - $parseStr = '\\think\\session::get(\'' . $vars[1] . '\')'; + $parseStr = '\\think\\Session::get(\'' . $vars[1] . '\')'; } break; case 'ENV': @@ -841,13 +846,13 @@ class Template $parseStr = strtoupper($vars[1]); break; case 'LANG': - $parseStr = '\\think\\lang::get(\'' . $vars[1] . '\')'; + $parseStr = '\\think\\Lang::get(\'' . $vars[1] . '\')'; break; case 'CONFIG': if (isset($vars[2])) { $vars[1] .= '.' . $vars[2]; } - $parseStr = '\\think\\config::get(\'' . $vars[1] . '\')'; + $parseStr = '\\think\\Config::get(\'' . $vars[1] . '\')'; break; default: break; @@ -862,10 +867,10 @@ class Template $parseStr = 'THINK_VERSION'; break; case 'LDELIM': - $parseStr = $this->config['tpl_begin']; + $parseStr = '\'' . ltrim($this->config['tpl_begin'], '\\') . '\''; break; case 'RDELIM': - $parseStr = $this->config['tpl_end']; + $parseStr = '\'' . ltrim($this->config['tpl_end'], '\\') . '\''; break; default: if (defined($vars[0])) { diff --git a/library/think/template/TagLib.php b/library/think/template/TagLib.php index be02d6a0..ad410fb4 100644 --- a/library/think/template/TagLib.php +++ b/library/think/template/TagLib.php @@ -136,12 +136,12 @@ class TagLib // 标签替换 从后向前 foreach ($nodes as $pos => $node) { // 对应的标签名 - $name = $tags[1][$node['name']]; + $name = $node['name']; // 解析标签属性 $attrs = $this->parseAttr($node['begin'][0], $name); $method = '_' . $name; // 读取标签库中对应的标签内容 replace[0]用来替换标签头,replace[1]用来替换标签尾 - $replace = explode($break, $this->$method($attrs, $break, $node['name'])); + $replace = explode($break, $this->$method($attrs, $break)); if (count($replace) > 1) { while ($beginArray) { $begin = end($beginArray); @@ -171,13 +171,13 @@ class TagLib // 自闭合标签 if (!empty($tags[0])) { $regex = $this->getRegex(array_keys($tags[0]), 0); - $self = &$this; - $content = preg_replace_callback($regex, function ($matches) use (&$tags, &$self) { - $name = $tags[0][$matches[1]]; + $content = preg_replace_callback($regex, function ($matches) use (&$tags) { + // 对应的标签名 + $name = $matches[1]; // 解析标签属性 - $attrs = $self->parseAttr($matches[0], $name); + $attrs = $this->parseAttr($matches[0], $name); $method = '_' . $name; - return $self->$method($attrs, '', $matches[1]); + return $this->$method($attrs, ''); }, $content); } return; diff --git a/tests/thinkphp/library/think/extend.html b/tests/thinkphp/library/think/extend.html new file mode 100644 index 00000000..194fbbf9 --- /dev/null +++ b/tests/thinkphp/library/think/extend.html @@ -0,0 +1,11 @@ +{layout name="layout" replace="[__REPLACE__]" /} +
+ {include file="include" name="$info.name" value="$info.value" /} +{block name="main"} + main +{/block} +{literal} + {$name} +{/literal} + +
\ No newline at end of file diff --git a/tests/thinkphp/library/think/include.html b/tests/thinkphp/library/think/include.html new file mode 100644 index 00000000..ac622e75 --- /dev/null +++ b/tests/thinkphp/library/think/include.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/thinkphp/library/think/layout.html b/tests/thinkphp/library/think/layout.html new file mode 100644 index 00000000..a5b75729 --- /dev/null +++ b/tests/thinkphp/library/think/layout.html @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/tests/thinkphp/library/think/templateTest.php b/tests/thinkphp/library/think/templateTest.php index 86240afc..53b2b629 100644 --- a/tests/thinkphp/library/think/templateTest.php +++ b/tests/thinkphp/library/think/templateTest.php @@ -32,7 +32,7 @@ EOF; EOF; $template->parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = <<parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); } @@ -159,7 +159,7 @@ EOF; EOF; $template->parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = << @@ -169,7 +169,7 @@ EOF; EOF; $template->parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); $content = << @@ -179,86 +179,93 @@ EOF; EOF; $template->parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); } public function testTag() { - $template = new Template(); + $config['tpl_path'] = dirname(__FILE__) . '/'; + $config['tpl_suffix'] = '.html'; + $template = new Template($config); $content = << -one - -two - -default - + EOF; $template->parse($content); - $this->assertEquals($content, $data); + $this->assertEquals($data, $content); + } + + public function testThinkVar() + { + $config['tpl_begin'] = '{'; + $config['tpl_end'] = '}'; + $template = new Template($config); + + $_SERVER['SERVER_NAME'] = 'server_name'; + $_GET['action'] = 'action'; + $_POST['action'] = 'action'; + \think\Cookie::set('action', ['name' => 'name']); + \think\Session::set('action', ['name' => 'name']); + define('SITE_NAME', 'site_name'); $content = << +{\$Think.GET.action}
+{\$Think.POST.action}
+{\$Think.COOKIE.action}
+{\$Think.COOKIE.action.name}
+{\$Think.SESSION.action}
+{\$Think.SESSION.action.name}
+{\$Think.ENV.OS}
+{\$Think.REQUEST.action}
+{\$Think.CONST.SITE_NAME}
+{\$Think.LANG.action}
+{\$Think.CONFIG.action.name}
+{\$Think.NOW}
+{\$Think.VERSION}
+{\$Think.LDELIM}
+{\$Think.RDELIM}
+{\$Think.SITE_NAME} EOF; $data = << - -a - - -b - - -default - +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EOF; $template->parse($content); - $this->assertEquals($content, $data); - - $content = <<\$val} - -{/foreach} -EOF; - $data = <<\$val): ?> - - -EOF; - $template->parse($content); - $this->assertEquals($content, $data); - - $content = <<\$val): ?> - - -EOF; - $template->parse($content); - $this->assertEquals($content, $data); - + $this->assertEquals($data, $content); } }