欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

smarty 的大括号 冲突问题

shiping 的头像

// 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的重要默认配置(定界符)。

普通分类: