Smarty模板引擎和MVC设计模式

Smarty模板引擎

一、什么是smarty?

smarty是一个使用php写出来的模板php模板引擎,它提供了逻辑与外在内容的分离

目的:使用户界面和业务数据的代码分离

smarty 第三方的类库

二、smarty优点:

   1. 速度

2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的php文件, 这个文件采用了phphtml混合的方式,在下一次访问模板时将web请求直接转换到这个文件中, 而不再进行模板重新编译(在源程序没有改动的情况下)

3. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的html文件缓存成一个静态的html页,

当设定smartycache属性为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,不建议使用后两者,因为可以从浏览器直接访问而不安全。 可以对apachehttpd.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');

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值