smarty课程---smarty3的安装和使用

一、总结

一句话总结:smarty 是什么,就不多说了,用过php,接触过php的人都对smarty 再熟悉不过了。它是一个很强大的代码分离软件,作为PHP的第三方类库引用到PHP项目中,将PHP代码和HTML完美分开,加速程序员和前端人员协同开发,提高开发速度。

代码分离 php html 前端 后端

多看源代码

1、smarty3如何安装?

类库 引入 new

我们前面说过,smarty是php的一个类库导入到项目中,所以第一步,我们就要引入这个类库。

  1. require './libs/Smarty.class.php';

引入进来之后,那么就要new 一个smarty实例了。

  1. //smarty 3
  2. $smarty = new Smarty;
  3. $smarty->setTemplateDir('./tpl/');
  4. $smarty->setCompileDir('./comp/');

2、thinkphp采用smarty作为模板引擎,给我们什么启示?

原生 使用

smarty里面的一些原生的操作方法,比如变量等等,都是可以在thinkphp中使用的,可以试试

不过一般用不着,现在提供的方法和功能已经可以满足所有了

3、如果css 和js 的{ } 没有换行写,和smarty中的定界符{} 冲突怎么办?

修改 定界符

修改smarty中的定界符

  1. <html>
  2.  
  3. <head>
  4.  
  5. <title><{$title}></title>
  6.  
  7. <style type="text/css">
  8. body {width: 860px;margin: 0px;padding: 0px;}
  9. </style>
  10.  
  11. <script type="text/javascript">
  12. function addStips(){alert(123);}
  13. addStips();
  14. </script>
  15.  
  16. </head>
  17. <body>
  18. {$content}
  19. </body>
  20.  
  21. </html>

我们查看lib/Smarty.class.php 中我们发现定界符的定义

  1. /**
  2. * template left-delimiter
  3. * @var string
  4. */
  5. public $left_delimiter = "{";
  6. /**
  7. * template right-delimiter
  8. * @var string
  9. */
  10. public $right_delimiter = "}";

默认的是{ } 极容易和css 还有js 的大括号冲突,所以我们要修改一下。

  1. $smarty->left_delimiter = '<{';
  2. $smarty->right_delimiter = '}>';

4、控制器分配模板的时候是使用绝对路径还是相对路径?

相对路径

php:admin/admin.php

html:tpl/user/admin.html

所以我们总是理所当然的认为是这样:

  1. require '../init.class.php';
  2. $smarty->assign('title',1111);
  3. $smarty->assign('content',2222);
  4. $smarty->display('../user/addUser.html'); //错的。

其实,是错的,我们只需要记住:这个display永远是相对于init.class.php中设定的tpl的路径,永远是和tpl/目录的。所以不需要手动加../等跳转目录:

  1. require '../init.class.php';
  2. $smarty->assign('title',1111);
  3. $smarty->assign('content',2222);
  4. $smarty->display('user/addUser.html'); //正确

二、1.smarty3的安装和使用

写在前面:

smarty 是什么,就不多说了,用过php,接触过php的人都对smarty 再熟悉不过了。它是一个很强大的代码分离软件,作为PHP的第三方类库引用到PHP项目中,将PHP代码和HTML完美分开,加速程序员和前端人员协同开发,提高开发速度。

1. 下载smarty

smarty 的目前最新版本是3版本。http://www.smarty.net/files/Smarty-3.1.14.zip

下载下来。解压,我们需要是里面的libs 文件夹的内容。复制这个文件夹,到我们的文件的php项目中。

2. 使用smarty

我们前面说过,smarty是php的一个类库导入到项目中,所以第一步,我们就要引入这个类库。

  1. require './libs/Smarty.class.php';

引入进来之后,那么就要new 一个smarty实例了。

  1. //smarty 3
  2. $smarty = new Smarty;
  3. $smarty->setTemplateDir('./tpl/');
  4. $smarty->setCompileDir('./comp/');

对比一下smarty3 和 2 ,我们发现,smarty 3 完全改成php面向对象的方式来处理,我们看一下smarty 2 中是如何定义模板和缓存目录的:

  1. //smarty 2
  2. $smarty = new Smarty(); //建立smarty实例对象$smarty
  3. $smarty->templates("./tpl/"); //设置模板目录
  4. $smarty->templates_c("./comp/"); //设置编译目录

下面是完整的php代码

  1. require './libs/Smarty.class.php';
  2. $smarty = new Smarty;
  3. $smarty->setTemplateDir(ROOT.'tpl/');
  4. $smarty->setCompileDir(ROOT.'comp/');
  5. $title = '这是一个smarty3的标题';
  6. $content = '欢迎使用smarty 3 模版引擎!';
  7. $smarty->assign('title',$title);
  8. $smarty->assign('content',$content);
  9. $smarty->display('index.html');

html 代码:

  1. <html>
  2. <head>
  3. <title><{$title}></title>
  4. </head>
  5. <body>
  6. <{$content}>
  7. </body>
  8. </html>

允许之后是可以正常运行的。

3. smarty 的优化

在第2点中的基本设置,smarty 已经可以正常使用,但是,我们在使用中会发现几个问题:

比如在index.html中有如下代码:

  1. <html>
  2. <head>
  3. <title><{$title}></title>
  4. <style type="text/css">
  5. body {width: 860px;margin: 0px;padding: 0px;}
  6. </style>
  7. <script type="text/javascript">
  8. function addStips(){alert(123);}
  9. addStips();
  10. </script>
  11. </head>
  12. <body>
  13. {$content}
  14. </body>
  15. </html>
  1.  
  1.  

我们运行代码的时候发现报错了:

  1. Fatal error: Uncaught exception 'SmartyCompilerException' with message
  2. 'Syntax Error in template "D:\wamp\www\yangyi\2smarty3\tpl\index.html" on line 8
  3. "body {width: 860px;margin: 0px;padding: 0px;}" - Unexpected ": ", expected one of: "}" , " " ,
  4. ATTR' in D:\wamp\www\yangyi\2smarty3\libs\sysplugins\smarty_internal_templatecompilerbase.php on line 667

我们仔细发现,原来css 和js 的{ } 没有换行写,和smarty中的定界符{} 冲突了,然后当作变量解析了,所以出错。那如何修改这个问题呢。那就只有修改smarty的定界符了。

我们查看lib/Smarty.class.php 中我们发现定界符的定义

  1. /**
  2. * template left-delimiter
  3. * @var string
  4. */
  5. public $left_delimiter = "{";
  6. /**
  7. * template right-delimiter
  8. * @var string
  9. */
  10. public $right_delimiter = "}";

默认的是{ } 极容易和css 还有js 的大括号冲突,所以我们要修改一下。

  1. $smarty->left_delimiter = '<{';
  2. $smarty->right_delimiter = '}>';

接下来把html改一下:

  1. <html>
  2. <head>
  3. <title><{$title}></title>
  4. <style type="text/css">
  5. body {width: 860px;margin: 0px;padding: 0px;}
  6. </style>
  7. <script type="text/javascript">
  8. function addStips(){alert(123);}
  9. addStips();
  10. </script>
  11. </head>
  12. <body>
  13. <{$content}>
  14. </body>
  15. </html>

这样就可以共存了,不要报错误。

4.smarty 的优化-配置文件导入

我们在项目过程中,是一定会有多个php文件,也可能有前台和后台,那么我们就要在每个php文件开头都这样来一次:

  1. require './libs/Smarty.class.php';
  2. $smarty = new Smarty;
  3. $smarty->setTemplateDir(ROOT.'tpl/');
  4. $smarty->setCompileDir(ROOT.'comp/');
  5. $smarty->left_delimiter = '<{';
  6. $smarty->right_delimiter = '}>';

这样带来的一个问题是很麻烦,代码冗余度也太高了,所以我们可以写在一个公共文件里面init.class.php,哪个文件需要smarty,引用进来不就可以了嘛:

  1. //init.class.php
  2. require ROOT.'libs/Smarty.class.php';
  3. $smarty = new Smarty;
  4. $smarty->setTemplateDir('tpl/');
  5. $smarty->setCompileDir('comp/');
  6. $smarty->left_delimiter = '<{';
  7. $smarty->right_delimiter = '}>';

那么在inde.php中我们就可以这样引用了:

  1. require './init.class.php';
  2. $title = '这是一个smarty3的标题';
  3. $content = '欢迎使用smarty 3 模版引擎!';
  4. $smarty->assign('title',$title);
  5. $smarty->assign('content',$content);
  6. $smarty->display('index.html');

5. smarty 的优化-分级目录如何导入

上面写在一个配置文件中之后,我们使用起来就很方便了,但是现在又出现另外一个问题,就是多目录了,比如有一个admin/admin.php 中也需要smarty ,那么引入进来之后,却发现报错了,说找不到smarty.class.php

所以,我们必须在init.class.php中导入smarty时候目录用绝对路径就可以了:

  1. $root = str_replace('\\', '/', __FILE__);
  2. define('ROOT', dirname($root).'/');
  3. require ROOT.'libs/Smarty.class.php';
  4. $smarty = new Smarty;
  5. $smarty->setTemplateDir(ROOT.'tpl/');
  6. $smarty->setCompileDir(ROOT.'comp/');
  7. $smarty->left_delimiter = '<{';
  8. $smarty->right_delimiter = '}>';

这样,这个init.class.php 文件就可以被任意项目中的目录引用,都不会报错了。

6.smarty 的优化-display()的路径

我们经常发现一些人在用display的时候,总是写不对,总是相对于当前的php文件来设定目录:

php:admin/admin.php

html:tpl/user/admin.html

所以我们总是理所当然的认为是这样:

  1. require '../init.class.php';
  2. $smarty->assign('title',1111);
  3. $smarty->assign('content',2222);
  4. $smarty->display('../user/addUser.html'); //错的。

其实,是错的,我们只需要记住:这个display永远是相对于init.class.php中设定的tpl的路径,永远是和tpl/目录的。所以不需要手动加../等跳转目录:

  1. require '../init.class.php';
  2. $smarty->assign('title',1111);
  3. $smarty->assign('content',2222);
  4. $smarty->display('user/addUser.html'); //正确

7.总结

多看源代码,比如,我们忘记了如何设定模板和缓存模板,忘记了设定左定界符和右定界符符合写。那么就可以打来Smarty.class.php 搜一下,多看看这个文件。就好办了。

参考:1.smarty3的安装和使用 - think2me - CSDN博客
https://blog.csdn.net/think2me/article/details/9320985

 

smarty课程---smarty3的安装和使用的更多相关文章

  1. Linux课程---9、安装RPM包(RPM的全称是什么)

    Linux课程---9.安装RPM包(RPM的全称是什么) 一.总结 一句话总结: redhat package management 1.在Packages中查找和php相关的文件如何查找? ls ...

  2. smarty课程---smarty的处理过程是怎样的

    smarty课程---smarty的处理过程是怎样的 一.总结 一句话总结:编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译 1. smarty将php源文件,首先编译 ...

  3. smarty课程---最最最简单的smarty例子

    smarty课程---最最最简单的smarty例子 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个 ...

  4. php 模板框架之smarty 的下载和安装

    Smarty 官网: http://www.smarty.net/ Smarty 下载: https://github.com/smarty-php/smarty/releases/tag/v3.1. ...

  5. PHP smarty模版引擎基本安装

    环境:  PHP5.2 以上版本 先去官网下载smarty模版引擎的库文件到你的电脑或服务器上 smarty官方网站库文件下载地址: https://www.smarty.net/download 下 ...

  6. Android课程---Android Studio安装及使用

    2013年Google I/O 大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA 开发环境,旨在取代Eclipse和ADT(And ...

  7. 吴超老师课程--Flume的安装和介绍

    常用的分布式日志收集系统

  8. 吴超老师课程--Sqoop的安装和介绍

    SQOOP是用于对数据进行导入导出的.    (1)把MySQL.Oracle等数据库中的数据导入到HDFS.Hive.HBase中    (2)把HDFS.Hive.HBase中的数据导出到MySQ ...

  9. python入门课程 第二章 安装Python

    2-1 选择python版本首先python2.7和python3是不可以通用的目前丰富的类库都支持python2.7,所以选用Python2.7    选择python2.7版本2-2 window ...

随机推荐

  1. Intermediate Python for Data Science learning 3 - Customization

    Customization from:https://campus.datacamp.com/courses/intermediate-python-for-data-science/matplotl ...

  2. Python 为什么要用yield

    可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?我们先抛开 generator,以一个常见的编程题目来展示 yield 的概 ...

  3. linux常用命令:Linux 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  4. Linux系统故障排查和修复技巧

    本文转自:http://os.51cto.com/art/201304/388384.htm 我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式.GR ...

  5. 音响理论基础入门:Gain(增益)

    谈到放大器就必须先了解增益:一个小的信号Level(电平)经过放大电路成为大的信号Level ,也就是说由小变大之间的差异就叫增益,也叫放大率,反过来的叫衰减率.在音响系统内,一般以信号源的输入电平决 ...

  6. linux 添加 swap

    1)在linux下,首先,查看内存和swap大小: [root@rhel6 usr]# free -m              total       used       free     sha ...

  7. 20145122《Java程序设计》第七周学习总结

    教材学习内容总结 1.在只有Lambda表达式的情况下,参数的类型必须写出来. 2.Lambda表达式本身是中性的,同样的Lambda表达式可用来表示不同目标类型的对象操作. 3.Lambda表达式只 ...

  8. Educational Codeforces Round 21 Problem D(Codeforces 808D)

    Vasya has an array a consisting of positive integer numbers. Vasya wants to divide this array into t ...

  9. bzoj 2038 A-小Z的袜子[hose] - 莫队算法

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  10. Python3基础 os.path.basename 处理路径字符串,返回文件的名字

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...