欢迎各位兄弟 发布技术文章
这里的技术是共享的
// javascript 或者 html 注释里也不能含有 左括号 右括号 box.add({ldelim "url":"图片地址","title":"悬浮标题","href":"链接地址" {rdelim})
smarty 的大括号 冲突问题
{ldelim} 来替换{
{rdelim} 来替换}
或者在有{和}的外面加上如相的标签
{literal}
{/literal}
使用 Smarty 模板的时候,通常都是用 ‘{‘ 和 ‘}’ 作为定界符(delimiter)。
有时,我们需要在 html 代码里输出大括号,如果在模板里直接写出来,会被 Smarty 的解析器认为是定界符,然后会报错:
Smarty error : syntax error: unrecognized tag
无法识别的标签!
如何解决呢?有 2 种办法:
1:内置变量
ldelim, rdelim
ldelim and rdelim are used for displaying the literal delimiter, in our case “{” or “}”. The template engine always tries to interpret delimiters, so this is the way around that.
ldelim 和 rdelim 用于输出分隔符,也就是大括号 ‘{‘ 和 ‘}’。如果只是输出很少的几个大括号,请使用此方法。
2: 文本转义
我们经常会在 html 里写 javascript 函数,就不可避免地写大量的大括号,这个时候上面的解决方法就不适用了,Smarty 提供了一个转义一段代码的标签:{literal}…{/literal}
{literal}
{/literal}
这样,就可以在里面随意写各种符号,不必担心 Smarty 引擎会错误解析了!
避免Smarty与CSS语法冲突
熟悉CSS的人很快就会发现Smarty和CSS的语法存在冲突,因为二者都需要使用大括号{}。如果简单地将CSS标记嵌入到HTML文档首部,将导致"不可识别标记"错误:
<html>
<head>
<title>{$title}</title>
<styletypestyletype="text/css">
p{
margin::2px
}
</style>
</head>
...
不要担心,因为我们有3种解决方案。
一、使用link标记从另一个文件中提取样式信息:
<html>
<head>
<title>{$title}</title>
<linkrellinkrel="stylesheet"type="text/css"href="default.css"/>
</head>
...
二、使用Smarty的literal标记将样式表信息包围起来
这些标记告诉Smarty不要解析该标记内的任何内容:
<html>
<head>
<title>{$title}</title>
{literal}
<styletypestyletype="text/css">
p{
margin::2px
}
</style>
{/literal}
</head>
...
三、修改Smarty的默认定界符
可以通过设置center_delimiter和center_delimiter属性来做到这一点:
<?php
require("Smarty.class.php");
$smarty=newSmarty;
$smarty->left_delimiter='';
$smarty->right_delimiter='';
...
?>
虽然3种解决方案都能解决问题,但其中第一种可能是最方便的,因为将CSS放在单独的文件中是一种常见的实践做法。此外,这种解决方案不需要修改Smarty的重要默认配置(定界符)。