一、什么是smarty?
smarty是一个使用php写出来的模板php模板引擎,它提供了逻辑与外在内容的分离
目的:使用户界面和业务数据的代码分离
smarty 第三方的类库
二、smarty优点:
1. 速度
2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的php文件, 这个文件采用了php与html混合的方式,在下一次访问模板时将web请求直接转换到这个文件中, 而不再进行模板重新编译(在源程序没有改动的情况下)
3. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的html文件缓存成一个静态的html页,
当设定smarty的cache属性为true时, 在smarty设定的cachetime期内将用户的web请求直接转换到这个静态的html文件中来, 这相当于调用一个静态的html文件。
4. 插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。
5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
三、不适合使用smarty的地方:
1. 需要实时更新的内容。
2. 小项目。
smarty的官方网站,www.smarty.net/download.php
注意:在模板文件(html)里面尽量只做输出:直接输出、循环输出、判断输出
四、目录结构
目录中,demo文件夹为示例文件。libs为程序文件。
/libs/smarty.class.php //主文件
/libs/sysplugins/ //内部plugin
/libs /plugins/ //外部plugin,可自由扩充
/demo/cache/ //放置缓存文件
/demo/configs / //放置可以载入的配置文件
/demo/templates/ //放置模板文件
/demo/templates_c/ //放置对模板编译后的文件
五、调试smarty3.0
创建自己的文件,比如index.php。
在templates目录中创建模板index.tpl(几乎可以是任何文本文件的扩展名, 常用的是tpl,php,html,不建议使用后两者,因为可以从浏览器直接访问而不安全。 可以对apache的httpd.conf进行设置,禁止直接访问.tpl文件。或者将templats目录放在网站文档树之外。)
六、语法规则
1.自定义变量
{$name = 'jack'}
{$bool = true}
{$arr = [1,23,43,22]}
{$name}
{$bool}
{$arr[1]}
{$arr.2+1}
{$arr.{2+1}}
2.函数的调用
{time()}
{var_dump($arr)}
{date('Y-m-d')}
3.超全局数组的访问
{*$_GET['id'] 不行的*}
$_GET $_POST $_SESSION $_COOKIE $_FILES $_SERVER...
{$smarty.get.id}
{$smarty.session.name}
4.常量的访问
{$smarty.const.HOST}
5.变量调节器
{$str|strtolower|ucfirst}
冒号后面传的是第二个参数
{$time|xxoo:'Y-m-d'}
6.定义默认值
{$a|default:'这家伙很懒,什么都没留下'}
7.注释
{* smarty用*包含的文字为注释内容 *}
8.忽略解析{}内容
{literal}内容(js/css){/literal}
9.调用分配数据方法
$sm->assign('str',arr);
10.显示模板(利用变量作用域的特性,阻止模板里面访问所有变量)
$sm->display('./view.html');//smarty自己封装的函数display会自动导入模板文件
11.遍历
{foreach $list as $v}
{/foreach}
12.修改定界符
$sm->left_delimiter = '{{';
$sm->right_delimiter = '}}';
13.修改编译目录
$sm->compile_dir = './runtime/view_c';
$sm->setCompileDir('./runtime/view_c'); //用方法设置,等效上一行
14.修改缓存目录
$sm->cache_dir = './runtime/cache';
15.设置模板目录
$sm->template_dir = './view';
$sm->display('./view/1.html'); //设置前
$sm->display('1.html'); //设置后
16.开启缓存
$sm->caching = true;
17.设置缓存有效期(判断有效期:略)
$sm->cache_lifetime = 10;
例子:检测是否有缓存文件
if (!$sm->isCached('1.html')) {
//查数据
$pdo = new PDO('mysql:dbname=shop;charset=utf8', 'root', '123', [3=>1]);
sleep(3);
$stmt = $pdo->query('select * from shop_user');
$arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
//分配数据
$sm->assign('list', $arr);
}
18.smarty的继承extends
1.包含父模板(在子模板)
{extends file="./base.html"}
2.父模板的修改位置用标签包含起来
{block name="title"}Document{/block}
3.在子模板修改
{block name="title"}修改{/block}
4.子模板里面追加父模板里面不存在的块,没用
{block name="xxoo"}内容{/block}
5.在父模块追加内容保留原内容
{$smarty.block.parent}
smarty模板引擎原理(置换型和编译型两种,编译型快)
例:编译型
<?php
/**
* 模拟模板引擎
*/
class Smarty
{
protected $data = []; //在此定义,显示的时候可以访问(数据安全问题)
/**
* 分配数据
* @param string $key 自己取的下标
* @param mixed $val 要分配的数据的值
*/
public function assign($key, $val)
{
//三维数组:如果传的是数组,如果是string是数组
$this->data[$key] = $val;
}
/**
* 用于显示模板
*/
public function display($path)
{
//在包含文件之前,先定义变量
foreach ($this->data as $k=>$v) {
//数组赋值给变量(如果传的是数组数据)
//arr sql
$$k = $v; //可变变量
}
//模板编译
$this->compile($path);
//包含模板
include $path;
}
protected function compile($path)
{
$str = file_get_contents($path);
// var_dump($str);
$pat = '/\{\$(.*?)\}/';
$des = '<?php echo $\\1?>'; //反向引用
$newStr = preg_replace($pat, $des, $str);
// var_dump($newStr);
if (!file_exists('./view_c')) mkdir('./view_c');
$fileName = './view_c/'.md5($path);
file_put_contents($fileName, $newStr);
return $fileName;
}
}
MVC设计模式
模型(Model)-视图(view)-控制(Controller)
目的:将业务处理和显示分类,将其分为模型、视图和控制层
模型层:主要做数据逻辑的处理,返回处理结果
视图层:主要做页面数据显示、用户交互
控制层:类似分发器,将模型和视图匹配在一起,控制层不做如何数据处理。
目录结构:
Common 公共的类
Config 配置文件
Controller 控制层
Ext 扩展类
libs smarty引擎
Model 模型层
Public 公共属性
-css
-img
-js
Runtime 缓存文件
Upload 上传的图片路径
View 视图(html)
index.php 程序入口文件
步骤:
第一步:浏览着 ->调用控制器,对他发出命令
第二步:控制器 ->按指令选取一个合适的模型
第三步:模型 ->按控制器指令取相应数据
第四步:控制器 ->按指令选取相应视图
第五步:视图 ->把第三步取到的数据按用户想要的样子显示出来
单一入口程序:一个web应用程序中,所有的请求都是指向一个脚本文件
作用:主要用于文件的自动加载
好处:访问限制
1.在入口文件定义的常量,整个项目都能用
define('PATH', str_replace('\\', '/', dirname(__FILE__)));
2.将一个普通函数注册为__autoload
spl_autoload_register('autoload');