如何处理JS与smarty标签的冲突,smarty定界符与js冲突的问题
分类:面向对象

在应用smarty的时候,若无修正smarty配置,smarty的定界符是{ },我们常常也许遇到模板页中js不可能正确履行的难题。

smarty的暗中同意标识符是大括号:{},

当输入url地址后网页现身:Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "E:wampwwwcmssystem/templates/index.html" on line 79 "$("#job").load("./system/templates/touch/test.php",{catid:3});" - Unexpected ":", expected one of: "}" , " "' in E:wampwwwcmssystemSmartysyspluginssmarty_internal_templatecompilerbase.php on line 441这么的难题,平常是css和js的{}与smarty定界符冲突引致的。

<?php
/*
一、什么是smarty?

那正是因为smarty引擎把js中{ }之间的剧情也作为smarty语句来管理:

假设大家页面上有JS且定义了函数大概目的,或然有CSS定义了体制,就能现身大括号,

淹无法有七个:

smarty是叁个选拔PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分别,综上可得,
目标正是要使用PHP程序猿同美术工作抽离,使用的技师改动程序的逻辑内容不会影响到油画的页面设计,美术工作重新校正页面不会潜濡默化到程序的程序逻辑,那在三个人协作的门类中显的愈益关键。

动用smarty内置的literal标签,此标签内的数量将会被充作文本管理 如

smary引擎就能够把那么些大括号当作smarty语法来批注,

1.得以把 smarty 的定界符设成 <{ }>

二、smarty优点:

{literal}

很显明,那一个CSS样式属性和JS里的语法,不是smarty的语法,

复制代码 代码如下:

1. 进程:选拔smarty编写的次第可以获得最大速度的增高,那点是相持于其余的模板引擎本事来讲的。

<script language=javascript>

smarty引擎就会报错。

$tpl->left_delimiter = '<{';
$tpl->right_delimiter = '}>';

2. 编写翻译型:选拔smarty编写的主次在运作时要编写翻译成贰个非模板技艺的PHP文件,这几个文件接收了PHP与HTML混合的方法,在下三回访谈模板时将WEB央浼直接转形成那一个文件中,而不再举行模板重新编写翻译(在源程序尚未变动的动静下)

  js内容

 

2.对于js的{}与smarty定界符冲突,能够用smarty的literal管理,能够把JS代码富含在{literal}{/literal}之间就能够了。

3. 缓存技艺:smarty选取的一种缓存本事,它能够将客户最后看到的HTML文件缓存成多个静态的HTML页,当设定smarty的cache属性为true时,在smarty设定的cachetime期内将客户的WEB诉求直接转换来那么些静态的HTML文件中来,这一定于调用多少个静态的HTML文件。

</script>

化解办法一、校勘smart默料定界符,在php中,改进smarty对象的$left_delimiter和$right_delimiter属性。

复制代码 代码如下:

  1. 插件本事:smarty能够自定义插件。插件实际正是某个自定义的函数。

{/literal}

成都百货上千人手不释卷改为<{和}>,也会有人改为<!--{和}-->,那看个人合意了。

<{literal}>
$ (
<span style="white-space:pre"> </span>function (State of Qatar { alert ('培养练习课程'卡塔尔国}
);
<{/literal}>

5. 模板中得以应用if/elseif/else/endif。在模板文件使用判定语句能够极度便于的对模板进行格式重排。

 

$smarty = new Smarty();

error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "E:wampwwwcmssystem/templates/index.html" on...

三、不相符采纳smarty之处:

$smarty->left_delimiter = "<{";

1. 索要实时更新的故事情节。举个例子像股票(stock卡塔尔(قطر‎展现,它须要平常对数据开展更新,这项目标前后相继行使smarty会使模板管理速度变慢。

$smarty->right_delimiter = "}>";

2. 小项目。小项目因为项目轻松而美工与技士兼于一位的种类,使用smarty会丧失php开辟飞快的独特之处。

这么,就能够很好地幸免了冲突难点,不过短处也很刚毅,

四、smarty目录结构及版本
张开smarty的官网,www.smarty.net/download.php。下载斯Matty 3.1.12。有tar.gz和zip分别适用于linux和windows版本。

通用性和可读性。

下载好后Smarty-stable-3.1.12解压缩会得到三个 Smarty-3.1.12 文件夹,里面有四个基本点文件夹demo和libs

你何足为奇了用<{,他习于旧贯用<!--{,还会有人习于旧贯用{{;

demo文件夹为示例文件夹,里面包蕴默许文件夹布局,是大家要开展编写程序代码的基本点文件夹。demo里文书夹的称谓都以smarty暗中同意的目录布局名称,能够透过改smarty对应属性值,再把公文夹名改成大家想要的名目。
libs为smarty代码源文件夹,平时不动。

倘使含有<和>,想一想在HTML标签里面须要接受的景色

/libs/Smarty.class.php   #主文件

<input type="checkbox" <!--{if $checked}--> checked=""<!--{/if}--> />

/libs/sysplugins/  #内部plugin

世家能够把那句放到DW里看看效果。

/libs /plugins/   #外表plugin,可轻易增添

图片 1

/demo/cahce/   #放置缓存文件

 

/demo/configs /   #放置能够载入的安插文件

私家不是很同情改定界符来打消那一个冲突问题。

/demo/templates/   #放置模板文件

作为smarty的开垦者,他们自然懂HTML、CSS、JS的,他们鲜明明白那几个大括号会有冲突的,

/demo/templates_c/    #停放对模板编写翻译后的文书

于是,smarty本人自然会有解决办的,那正是{literal}和{/literal}

能够把解压取得的 斯Matty-3.1.12 文件夹名改成我们想要的体系名,demo也能够改成大家想要的现实存放编码的文本夹的称呼

将不想被smarty解释的HTML用{literal}和{/literal}包起来。

2、调试Smarty-3.1.12

{literal}<script type="text/javascript">function myFun(){ }</script>{/literal}

创造本身的文书,在demo文件夹下创立index.php。
在templates目录中开创模板index.tpl
(大概能够是任何公文文件的扩张名,常用的是tpl,php,html,不建议采纳后两个,因为能够从浏览器直接待上访谈而不安全。能够对apache的httpd.conf进行安装,禁绝直接待上访谈.tpl文件。恐怕将templats目录放在网站文档树之外。)

一旦我们要求将php变量传递给js,能够这么

*/

<script type="text/javascript">var chk = "{$checked}";{literal}function myFun(){ }{/literal}</script>

//index.php代码
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//在调用的沙盘模拟经营里能够透过{$name}来输出name的值zhang,{}为此地的smarty分界符
$smarty->assign('name','zhang');
//调用模板tpl文件里无法试行PHP语句块
$smarty->display('templates/index.tpl');

 

/*
index.tpl页面内容

{literal}和{/literal}使用的职责,无需强求在HTML里的“配成对岗位”,即能够那样:

<html>
<body>

<header><script type="text/javascript">var chk = "{$checked}";{literal}function myFun(){ }</script></header><body>{/literal}

<span>你好, {$name}</span>

来源: <>

</body>
</html>
*/

 

/*
斯马特y编写翻译时的管理进程是源php文件->模板文件(或然调用七个或频仍)->源php文件。。。
也正是说不影响原php文件的别样管理和输出。所以smarty模板文件能够是完好的html,也足以是内部一部分。

源于为知笔记(Wiz卡塔尔国

smarty管理进度
smarty将php源文件,首先编写翻译成人中学间文件(也是php),若是启用缓存,再依赖编写翻译文件生成缓存文件(也是php),须要缓存的一对全部是硬编码。
后来的历次访谈都会拜候编写翻译文件(即便编译文件已经存在),贰遍编译数十次调用(能够是单文件的反复,也能够是多文件的一再),假诺启用缓存且有缓存文件同风还未过期,则直接访谈缓存文件,跳过编写翻译文件。
编写翻译文件一经生成,就不会被自动更新,除非模板文件可能配置文件改善。源php文件订正是不会迷惑重新编译的。一旦编写翻译文件再度生成,缓存文件也必定重新生成。
*/

//Smarty允许有三种奇特的编写翻译设置存在:
//1、 任曾几何时候都不自行重新编写翻译(上线阶段卡塔尔:独有未有该公文的编写翻译文件时才转移,模板文件也许配备文件的更动,不会抓住重新编写翻译。
$smarty->setCompile_check(falseState of Qatar;//暗许为true,false表示其他时候都不在文件发出变动的情形下转移编写翻译文件,除了无编写翻译文件。
$smarty->getCompile_check(卡塔尔国;//取妥帖前编写翻译检查的安装
//2、任什么日期候都重复编译(调试阶段卡塔尔:任曾几何时候都再也编译。
$smarty->setForce_compile(true卡塔尔国;//暗许为false,true表示每回都重复编写翻译(启用缓存的话,每一回都再也缓存)
$smarty->getForce_compile(卡塔尔(قطر‎;//获得当前威迫编写翻译的安装

//开启缓存
$smarty->setCaching(true);
$smarty->getCaching(卡塔尔(قطر‎;//获取当前缓存状态,暗中认可是false关闭的
$smarty->setcache_lifetime(60卡塔尔(قطر‎;//设置缓存时间单位秒
//{*模版文件*}
//{nocache}
//{$name}
//{/nocache}
//{*一经打开缓存的话放在nocache标签内的变量不会缓存,每趟读取PHP源文件的值*}

/*
smarty分界符
在模板文件中,区分普通html代码和smarty代码靠的是分界符。暗中同意是 {} ,但大概会与js和css相冲突。能够扩充校勘。
在3.0中模板标签将不帮忙空格,如{ $abc }在斯Matty第22中学得以识其他,不过3.0里头就拾叁分了,必得那样{$abc},那样是为了能够越来越好的支撑javascript和css。
*/
$smarty->left_delimiter = "{";   //左分界符,2.0质量,3.0沿用
$smarty->right_delimiter = "}";
/*
毗邻符就也正是PHP的echo,分界符中的值都将出口,除非赋值等操作
smarty tpl文件中分界符中四个**里面包车型客车源委为注释内容如
tpl文件:
{*那是模板注释内容*}
*/

//设置缓存目录路线,不设私下认可"cache"
$smarty->setCacheDir("cache");
//获取缓存目录路线
$smarty->getCacheDir();

//设置配置目录路线,不设暗许"configs"
$smarty->setConfigDir("configs");
//增添配置目录路线,全部门路将会以数组格局保留,调用文件时就要颇负路径中找出
$smarty->addConfigDir("configs/test");
//获取配置目录路线的数组
$smarty->getConfigDir();

//设置插件目录路线,不设暗中认可"plugins"
$smarty->setPluginsDir("plugins");
//增加插件目录路线,全数渠道将会以数组方式保留,调用文件时就要具备路径中追寻,plugins文件夹里放的就是足以在前台或后台按差别规则调用的函数的仓库储存文件,文件名及函数名的命名按区别调用准绳有不一致写法必要
$smarty->addPluginsDir("plugins/test");
//获取插件目录路线的数组
$smarty->getPluginsDir();

//设置模板目录路线,不设默许"templates"
$smarty->setTemplateDir("templates");
//加多模板目录路线,全体路子将会以数组方式保留,调用文件时将要具有路径中搜索
$smarty->addTemplateDir("templates/test");
//获取模板目录路线的数组
$smarty->getTemplateDir();

//设置编译目录路线,不设默许"templates_c"
$smarty->setCompileDir("templates_c");
//获取编写翻译目录路径
$smarty->getCompileDir();
/*
笔者们能够建不一致的php源文件文件夹,把编写的php文件按一定的分类放在不一致的文件夹中。
接下来在种种文件夹中都创造贰个自定义的config文件,在config文件中成立三个新的$smarty = new 斯Matty 对象
接下来把具有分裂的文本夹的php文件的缓存,配置文件,插件,模版,编写翻译目录都设置到同一个缓存,配置文件,插件,模版,编写翻译目录
让该公文夹下全体PHP源文件都引用该配置文件就能够获得相通配置
*/

//模版变量
$arr = array(array("zhang","li"),'a'=>array("liu","wang"),array("ming","yi"));
$smarty->assign("testArr", $arr);
//设置模版变量,为就要调用的模版提供变量,在接下去调用的模板中得以因而{$testArr}恐怕{$testArr['a'][0]}可能{$testArr.a.0}来会见具体某数组成分
//在模板中得以平素通过 {$testArr = "testValue" scope="global"} 来订正传过来的沙盘模拟经营变量的值(即便不设有则在模板中开创并安装该模版变量),scope属性是注明模板变量使用范围的可以写
//在模板中校订或创设成其余数组 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其余相同PHP中创建数组格局
//php源文件可通过 $smarty->getTemplateVars("testArr"卡塔尔(قطر‎获取钦命模版变量,如要获取模板中退换或创办的模板变量,在模板中成立或转移其值时必需抬高scope属性并把值设置为scope="global"或scope="parent"

class A{
    function aa($nam){
        echo $nam;
    }
}
$smarty->assign("obj", new A);
//设置的模板变量是指标时在模板页可以如下那样调用,给模版传类对象时也是传址
//{$obj->aa('my name is y')}

//斯Matty能够分辨嵌入在双引号中的模版变量,只要此变量只含有数字、字母、下划线。但平日只帮忙能直接转变到字符串的模版变量
$smarty->assign("testStr", "this is testStr");
//模板中可通过{"$testStr OK !"}来访问

/*
tpl模板包罗模板
模板文件:
{include file="header.tpl"}
header.tpl内容:
<span>那是顶端内容!!,欢迎你,{$name}</span>

模板蕴涵模板也足以是那样格式
{include file="header.tpl" testVar="那是最上端内容!!!"}
header.tpl则能够透过{$testVar}使用调用页包蕴时传出的模板变量
header.tpl内容:
<span>{$testVar},欢迎你,{$name}</span><hr />
*/

/*
能够预先规定一密密层层的变量与值的相应,并放在配置文件中,在运用时载入。
布署文件私下认可放在configs文件夹中,能够自定义改正文件夹名。
*/

/*
#模板test.conf文件:
#键对应的值能够不要引号括起来
title = Welcome to Smarty!!
cutoff_size = 40

[china]
language = chinese

[england]
language = english

#[china],[england]为标签,未设置标签的键值为大局的假设调用该配置文件就能够在模板中应用,设置了标签的键值独有在调用配置文件时钦命了对应标签才足以利用
#在PHP源文件调用配置文件语句$smarty->configLoad('test.conf', $sections = 'england'卡塔尔(قطر‎;该语句上面调用的沙盘模拟经营才得以应用该配置文件,通过$sections属性钦赐使用哪个标签下的键和值
#$sections参数能够不写,暗中认可值为null,$smarty->configLoad('test.conf'卡塔尔(قطر‎则只行使全局的键值,而无法动用标签下的键值
#在模板下通过{config_load file="test.conf" section="china" scope="global"}语句调用配置文件
#section属性能够不写,默许是null,scope属性必需写{config_load file="test.conf" scope="global"}
#section属性可赋三种值
#local 唯有当前模板能够动用该配置文件
#parent 唯有当前模板引进该配置文件语句后含有的沙盘模拟经营中,或在php源文件中smarty对象调用该配置文件后调用的模版中能够行使该配置文件中的键值
#global 测验效果和parent相近
#在模板中通过{#language#}来使用键值,也足以经过{$smarty.config.language}来做客安顿文件键值
#PHP源文件中得以应用$smarty->getConfigVars('language'State of Qatar或$smarty->getConfigVariable('language'卡塔尔(قطر‎来博取键值,$smarty->getConfigVars('language'卡塔尔国获取的还大概是数组
*/

/*
tpl文件中常用函数
tpl文件:
<!--将capture标签括起的页面展现内容存在capture钦点的testCapture中 -->
<!--当达到钦点条件时可经过 {$smarty.capture.testCapture} 将内容输出出来 -->
{capture name="testCapture"}
{include file="f1.tpl"}
{/capture}

{if true}
{$smarty.capture.testCapture}
{/if}

{if $name == "wang"}

Welcome wang.

{elseif $name == "zhang"}

Welcome zhang.

{else}

Welcome, whatever you are.

{/if}
{*操作符能够是 ==,>= 等也得以是 eq,ne等*}

{for $x=0; $x<count($testArr); $x++}
{$x}
{/for}
{*for循环,类似PHP代码*}

{$x=0}
{while $x<count($testArr)}
{$x++}
{/while}
{*While循环,也类似PHP代码。*}

<!--name和key属性可不写-->
{foreach name="testForeach" from=$testArr key=arId item=arVal}
{$arId}对应的值为:{$arVal}
<br>
{$smarty.foreach.testForeach.index}   <!--(循环之中使用)显示当前轮回的目录,假设数组为空,重回-1-->

{$smarty.foreach.testForeach.iteration}    <!--(循环之中使用)突显当前的循环次数-->

{$smarty.foreach.testForeach.first} <!--(循环之中使用)假如为率先次巡回,再次来到true-->

{$smarty.foreach.testForeach.last} <!--(循环之中选用)借使为终极一回巡回,重返true-->

{$smarty.foreach.testForeach.total} <!-(循环内外界使用)突显循环的总次数-->
<br>
{foreachelse}  <!--$testArr数组变量未有值时(0个成分)奉行。-->
$testArr is null
{/foreach}

{*也得以如下两类别PHP格式*}
{foreach $testArr as $n}
{$n}
{/foreach}

{foreach $testArr as $key=>$n}
{$key}
{/foreach}

{$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]}
{section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true}

{$smarty.section.testSection.index}- <!--当前轮回到的数组的键值-->
{$sectionArr[testSection]}- <!--当前轮回到的数组的要素值-->
{$smarty.section.testSection.iteration}-<!--当前section循环的次数,从1计起-->
<br/>

{sectionelse}
$sectionArr is null
{/section}
<!--section循环适用于纯int型键值的数组-->
<!--给loop赋一个要循环的数组,start内定从数组内定键值开端循环,step钦定数组下一次循环的键值与此番循环键值之差,max内定循环最大次数,show钦定是或不是循环false的话平素跳到实行sectionelse-->
<!--Section的放到变量与foreach 相符-->

*/

/*
tpl模板文件:
{literal}

<script type="text/javascript">
function a(){
    alert("this is script");
}
a();
</script>

{/literal}
{*
literal 标签区域内的数目将被看作网页html文本管理,那时模板将忽视且不分析其里面包车型客车全部字符新闻。
该个性用于体现有超大希望含有大括号等字符新闻的 js、css 。当这么些消息处于 {literal}{/literal} 标签中时,模板引擎将不深入分析它们,而直白展现。
*}

*/

//PHP文件:
//$smarty->setDebugging(trueState of Qatar;//对持续调用的沙盘模拟经营进行调整。
//$smarty->getDebugging(卡塔尔;//得到当前是还是不是开展调节和测量检验,私下认可false
//或在须要调理的模版中写入{debug}

/*
模板文件:

smarty3.0帮忙了模版世襲系统,比方
f1.tpl:
<html>
<body>

{block name='top'} f1.header<br />{/block}
{block name='middle'} f1.middle<br />{/block}
{block name='buttom'} f1.buttom<br />{/block}

</body>
</html>

f2.tpl:
{extends file="f1.tpl"}
{block name='top'} f2.header<br />{/block}
{block name='other'} it can`t be show <br />{/block}
{*
一旦f2.tpl中向来不block标签,或f2.tpl中绝非和f1.tpl中千人一面命名的block标签,则f2.tpl完全引进呈现f1.tpl中有所内容满含block标签的剧情,而f2.tpl中有着剧情将忽视
借使f2.tpl中有和f1.tpl中同名block标签,则在f2.tpl展现时f2.tpl中block标签内容将覆盖f1.tpl中同名block标签的剧情,在f2.tpl页面展现时,内容仍将按f1.tpl安装的格式地方显得,f2.tpl别的具备文件富含未同名的block标签及其内容都将被忽视,不出示。
block标签的从头到尾的经过只会覆盖父模版中同名block标签的源委,或在子模版中展现,在本页面中一旦未有调用父模版或父模版中从不要覆盖的同名block标签,block标签内容在本页面中不出示
这种持续扶持多文本,多种世袭,意味着可以Infiniti的一连下去
*}

{fetch file="" assign="testAssign"}
{$testAssign}
{fetch file="
{*fetch可以援用外界http,ftp的页面,如内定assign的值则把援用的剧情存在内定名的变量中,不然在哪有fetch在哪展现*}
*/

//php页面:
//调用模版也能够运用此方法,在输出前做一些甩卖
//$output = $smarty->fetch("index.tpl");
//do something with $output here对将在输出的故事情节开展拍卖
//echo $output;//然后将模板输出

/*
模板中提交表单
<form name="input" action="file.php" method="post">
action属性能够一贯写要提交到的php文件名,也许不写空action=""则交由到调用该模板的php文件中
*/

//连接数据库
mysql_connect("localhost","root","root");
mysql_select_db("test");
$smarty->assign('webDir',$_SERVER['DOCUMENT_ROOT']);//$_SERVER['DOCUMENT_ROOT']为当前项目文件夹的相对路线
//配置JQuery的src路线最好写相对路线或写要运维文件能找到该JQuery的相对路线因为要编写翻译成编写翻译文件,而编写翻译后的文件和原路线情况不等同
?>
<script type="text/javascript" src=";

本文由10bet手机官网发布于面向对象,转载请注明出处:如何处理JS与smarty标签的冲突,smarty定界符与js冲突的问题

上一篇:PHP调用MYSQL存储过程实例,php怎么运行存储过程 下一篇:没有了
猜你喜欢
热门排行
精彩图文