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);
}
}