设为首页收藏本站

canphp社区

 找回密码
 注册

QQ登录

查看: 6310|回复: 38

第二讲,canphp框架模板操作 [复制链接]

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 18:20:09 |显示全部楼层
为什么要采用模板引擎?采用模板引擎(如smarty)是为了是为了程序员和美工合作?
关于这两个问题,我已经在phpchina论坛上发过帖子讨论了,帖子地址http://bbs.phpchina.com/thread-214051-1-1.html

采用模板引擎,让程序代码和模板代码分离,提高了代码的可读性和可维护性,当代码量比较大的时候,最起码会让自己看得舒服一点,而不像大杂烩一样,全部代码混合在一起,看着就头晕。

canphp框架内置了一套简单高效的模板引擎。canphp框架内置的模板引擎会什么设计得那么简单?那是故意这么设计的,因为现在的php开源系统中几乎每个系统都内置了一套模板引擎,并且都有自己的一套模板标签,为了降低大家的学习成本,所以把内置的模板引擎设计得简单一点,如果需要使用复杂一点的模板引擎,可以通过扩展第三方模板引擎,如smarty来实现。

下面开始讲解canphp内置的模板引擎的操作。

第一步,创建配置文件
  1. <?php
  2. //网站全局配置
  3. //在这里配置你所需的参数(与CanPHP无关)
  4. $config['ver']='1.0.2011.0528';//版本号,2011.0528表示发布日期

  5. //网站全局配置结束

  6. //日志和错误调试配置
  7. $config['DEBUG']=true; //是否开启调试模式,true开启,false关闭
  8. $config['LOG_ON']=true;//是否开启出错信息保存到文件,true开启,false不开启
  9. $config['LOG_PATH']='./data/log/';//出错信息存放的目录,出错信息以天为单位存放,一般不需要修改
  10. $config['ERROR_URL']='';//出错信息重定向页面,为空采用默认的出错页面,一般不需要修改
  11. //日志和错误调试配置结束

  12. //应用配置
  13. //网址配置
  14. $config['URL_REWRITE_ON']=false;//是否开启重写,true开启重写,false关闭重写
  15. $config['URL_MODULE_DEPR']='/';//模块分隔符,一般不需要修改
  16. $config['URL_ACTION_DEPR']='-';//操作分隔符,一般不需要修改
  17. $config['URL_PARAM_DEPR']='-';//参数分隔符,一般不需要修改
  18. $config['URL_HTML_SUFFIX']='.html';//伪静态后缀设置,,例如 .html ,一般不需要修改

  19. //模块配置
  20. $config['MODULE_PATH']='./module/';//模块存放目录,一般不需要修改
  21. $config['MODULE_SUFFIX']='Mod.class.php';//模块后缀,一般不需要修改
  22. $config['MODULE_INIT']='init.php';//初始程序,一般不需要修改
  23. $config['MODULE_DEFAULT']='index';//默认模块,一般不需要修改
  24. $config['MODULE_EMPTY']='empty';//空模块 ,一般不需要修改

  25. //操作配置
  26. $config['ACTION_DEFAULT']='index';//默认操作,一般不需要修改
  27. $config['ACTION_EMPTY']='_empty';//空操作,一般不需要修改

  28. //静态页面缓存
  29. $config['HTML_CACHE_ON']=false;//是否开启静态页面缓存,true开启.false关闭
  30. $config['HTML_CACHE_PATH']='./data/html_cache/';//静态页面缓存目录,一般不需要修改
  31. $config['HTML_CACHE_SUFFIX']='.html';//静态页面缓存后缀,一般不需要修改
  32. $config['HTML_CACHE_RULE']['index']['index']=1000;//缓存时间,单位:秒
  33. /*
  34. 缓存规则如下,可创建多条规则
  35. $config['HTML_CACHE_RULE']['模块名']['操作名']=缓存时间;//单位:秒,可创建多条数据
  36. $config['HTML_CACHE_RULE']['模块名1']['操作名1']=缓存时间;
  37. $config['HTML_CACHE_RULE']['模块名1']['操作名2']=缓存时间;
  38. $config['HTML_CACHE_RULE']['模块名2']['操作名1']=缓存时间;
  39. $config['HTML_CACHE_RULE']['模块名2']['操作名2']=缓存时间;
  40. */
  41. //应用配置结束

  42. //数据库配置
  43. $config['DB_TYPE']='mysql';//数据库类型,一般不需要修改
  44. $config['DB_HOST']='localhost';//数据库主机,一般不需要修改
  45. $config['DB_USER']='root';//数据库用户名
  46. $config['DB_PWD']='123456';//数据库密码
  47. $config['DB_PORT']=3306;//数据库端口,mysql默认是3306,一般不需要修改
  48. $config['DB_NAME']='cp';//数据库名
  49. $config['DB_CHARSET']='utf8';//数据库编码,一般不需要修改
  50. $config['DB_PREFIX']='cp_';//数据库前缀
  51. $config['DB_PCONNECT']=false;//true表示使用永久连接,false表示不适用永久连接,一般不使用永久连接

  52. $config['DB_CACHE_ON']=false;//是否开启数据库缓存,true开启,false不开启
  53. $config['DB_CACHE_PATH']='./data/db_cache/';//数据库查询内容缓存目录,地址相对于入口文件,一般不需要修改
  54. $config['DB_CACHE_TIME']=600;//缓存时间,0不缓存,-1永久缓存
  55. $config['DB_CACHE_CHECK']=false;//是否对缓存进行校验,一般不需要修改
  56. $config['DB_CACHE_FILE']='cachedata';//缓存的数据文件名
  57. $config['DB_CACHE_SIZE']='15M';//预设的缓存大小,最小为10M,最大为1G
  58. $config['DB_CACHE_FLOCK']=true;//是否存在文件锁,设置为false,将模拟文件锁,一般不需要修改
  59. //数据库配置结束

  60. //模板配置
  61. $config['TPL_TEMPLATE_PATH']='./template/';//模板目录,一般不需要修改
  62. $config['TPL_TEMPLATE_SUFFIX']='.php';//模板后缀,一般不需要修改
  63. $config['TPL_CACHE_ON']=true;//是否开启模板缓存,true开启,false不开启
  64. $config['TPL_CACHE_PATH']='./data/tpl_cache/';//模板缓存目录,一般不需要修改
  65. $config['TPL_CACHE_SUFFIX']='.php';//模板缓存后缀,一般不需要修改
  66. //模板配置结束
  67. ?>
复制代码


注意:这是canphp框架的基本配置,以后的项目都可以使用这个配置文件,可以按照自己的需求,稍微修改一下配置即可。

第二步,创建入口文件
  1. <?php
  2. @date_default_timezone_set('PRC');//定义时区,校正时间为北京时间

  3. //定义CanPHP框架目录
  4. define('CP_PATH',dirname(__FILE__).'/CanPHP/');//注意目录后面加“/”

  5. require(dirname(__FILE__).'/config.php');//加载配置文件
  6. require(CP_PATH.'core/cpApp.class.php');//加载应用控制类

  7. $app=new cpApp($config);//实例化应用控制类

  8. $app->run();//执行项目

  9. ?>
复制代码


以后,所有的项目,都可以使用这个入口文件。

第三步,创建公共模块

可以在公共模块的构造函数中实例化模板引擎,这样在其他模块中需要使用模板引擎的时候,只需继承公共模块即可,不需要再次实例化了。
在module目录中创建commonMod.class.php文件
公共模块代码
  1. <?php
  2. //公共模块
  3. class commonMod
  4. {
  5. public $model;//数据库模型对象
  6. public $tpl;//模板对象
  7. public $config;//全局配置
  8. static $global;//静态变量,用来实现单例模式
  9. public function __construct()
  10. {
  11. global $config;
  12. $this->config=$config;//配置

  13. //数据库模型初始化
  14. if(!isset(self::$global['model']))
  15. {
  16. self::$global['model']=new cpModel($this->config);//实例化数据库模型类
  17. }
  18. $this->model=self::$global['model'];//数据库模型对象

  19. //模板初始化
  20. if(!isset(self::$global['tpl']))
  21. {
  22. self::$global['tpl']=new cpTemplate($this->config);//实例化模板类
  23. }
  24. $this->tpl=self::$global['tpl'];//模板类对象
  25. }
  26. //模板变量解析
  27. protected function assign($name, $value)
  28. {
  29. return $this->tpl->assign($name, $value);
  30. }
  31. //模板输出
  32. protected function display($tpl='')
  33. {
  34. return $this->tpl->display($tpl);
  35. }

  36. //直接跳转
  37. protected function redirect($url)
  38. {
  39. header('location:'.$url,false,301);
  40. exit;
  41. }

  42. //出错之后跳转,后退到前一页
  43. protected function error($msg)
  44. {
  45. header("Content-type: text/html; charset=utf-8");
  46. $msg="alert('$msg');";
  47. echo "<script>$msg history.go(-1);</script>";
  48. exit;
  49. }

  50. /*
  51. 功能:分页
  52. $url,基准网址,若为空,将会自动获取,不建议设置为空
  53. $total,信息总条数
  54. $perpage,每页显示行数
  55. $pagebarnum,分页栏每页显示的页数
  56. $mode,显示风格,参数可为整数1,2,3,4任意一个
  57. */
  58. protected function page($url,$total,$perpage=10,$pagebarnum=5,$mode=1)
  59. {
  60. $page=new page();
  61. return $page->show($url,$total,$perpage,$pagebarnum,$mode);
  62. }
  63. }
  64. ?>
复制代码





注意:虽然在公共模块中实例化了模型类,但是并没有真正连接数据库,只有执行数据库操作,且缓存没有过期,才会连接数据库。

以后,所有的项目,都可以使用这个公共模块,大家可以在这个基础之上增加一些公共的方法。方便其他模块调用。

这三步,对于使用cp框架开发的所有项目都通用,下一讲的数据库操作,将不再重复。

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 18:26:10 |显示全部楼层
模板赋值与模板输出
在module目录下面创建indexMod.class.php文件(index模块),(此时,module必需要包含公共模块commonMod.class.php)
index模块代码
  1. <?php
  2. class indexMod extends commonMod
  3. {
  4. public function index()
  5. {
  6. $this->display();//输出模板
  7. }

  8. public function hello()
  9. {
  10. $hello="hello world";
  11. $this->assign('hello',$hello);//模板赋值
  12. $this->display();//输出模板
  13. }

  14. public function abc()
  15. {
  16. //字符串
  17. $title="欢迎学习canphp框架模板引擎";

  18. //数组
  19. $info['name']="单骑";
  20. $info['email']="404352772@qq.com";

  21. $this->assign('title',$title);
  22. $this->assign('info',$info);
  23. $this->display();//输出模板
  24. }
  25. }
  26. ?>
复制代码

在template目录下创建index目录,
在template/index/目录下面创建三个目录index.php hello.php abc.php
template/index/index.php代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>canphp模板输出</title>
  6. </head>

  7. <body>
  8. 您好!这是使用cp框架输出的模板
  9. </body>
  10. </html>
复制代码


template/index/hello.php代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>canphp模板输出</title>
  6. </head>

  7. <body>
  8. 您好!这是使用cp框架输出的模板
  9. {$hello}
  10. </body>
  11. </html>
复制代码

template/index/abc.php代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>canphp模板输出</title>
  6. </head>

  7. <body>
  8. {$title}<br />
  9. 我的名字:{$info['name']}<br />
  10. 我的邮箱:{$info['email']}
  11. </body>
  12. </html>
复制代码

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 19:03:23 |显示全部楼层
http://127.0.0.1/mycp/
输出结果:
您好!这是使用cp框架输出的模板


http://127.0.0.1/mycp/index.php/index/hello
输出结果:
您好!这是使用cp框架输出的模板 hello world


http://127.0.0.1/mycp/index.php/index/abc
输出结果:
欢迎学习canphp框架模板引擎
我的名字:单骑
我的邮箱:404352772@qq.com

总结:   1、模板赋值     
$this->assign($name, $value);  

/*     

  如:$tpl->assign('name', $name);     
  $tpl->assign('user', $user);     
  $value可以是字符串,数组等任何类型   

*/
     
2、模板显示            
$this->display($tpl);     
$this->display();   
/*   
  如:$this->display('index/index');加载template/index/index.html模板         
  $this->display('index');加载template/index.html模板         
  $this->display();//不加参数,等价于$tpl->display(当前模块名/当前操作);     
*/

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 19:10:48 |显示全部楼层
cp只有两个标签{$变量名}和{include file="模板名"}  模板包含标签,if判断和for循环用原生的php代码实现。cp的模板引擎主要是实现了程序代码和模板代码的分离。更强大的模板标签功能,用户可自己定义,cp默认不提供。

学习到这里,大家可以看一下canphp开发手册的模板操作那一章节。
下一讲,讲解数据库操作。

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 19:10:58 |显示全部楼层
cp只有两个标签{$变量名}和{include file="模板名"}  模板包含标签,if判断和for循环用原生的php代码实现。cp的模板引擎主要是实现了程序代码和模板代码的分离。更强大的模板标签功能,用户可自己定义,cp默认不提供。

学习到这里,大家可以看一下canphp开发手册的模板操作那一章节。
下一讲,讲解数据库操作。

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 19:13:09 |显示全部楼层
注意,以上所有编码,请采用utf-8编码

使用道具 举报

Rank: 1

发表于 2011-5-28 21:08:17 |显示全部楼层
难得这是传说中的沙发!这个好像有点懂。

使用道具 举报

Rank: 1

发表于 2011-5-28 22:17:06 |显示全部楼层
先顶再看,强烈支持,等了两天了,煎熬啊。

这个帖子没加亮,建议加亮置顶

楼主要持续更新啊,期待
学会php在此一举了

使用道具 举报

Rank: 1

发表于 2011-5-28 23:05:22 |显示全部楼层
有点小疑问可能没写清楚,
第一段代码是在根目录创建config.php粘贴进去吧。(问题:这个config文件是最全面的吗???所有配置都有了??可以减少但不需要再增加了?)
第二段代码是根目录创建index.php粘贴进去吧。
应该没啥疑问。

第三段代码是commonMod.class.php文件,疑问来了,
第四段代码是做什么用的????粘贴到什么文件的哪里这段:
  1. //数据库模型初始化
  2. if(!isset(self::$global['model']))
  3. {
  4. self::$global['model']=new cpModel($this->config);//实例化数据库模型类
  5. }
  6. $this->model=self::$global['model'];//数据库模型对象

  7. //模板初始化
  8. if(!isset(self::$global['tpl']))
  9. {
  10. self::$global['tpl']=new cpTemplate($this->config);//实例化模板类
  11. }
  12. $this->tpl=self::$global['tpl'];//模板类对象
复制代码
我哪儿也没粘贴直接运行也是结果也是正确的,这段代码是做什么用的?

使用道具 举报

Rank: 1

发表于 2011-5-28 23:11:08 |显示全部楼层
cp只有两个标签{$变量名}和{include file="模板名"}  模板包含标签,if判断和for循环用原生的php代码实现。 ...
单骑闯天下 发表于 2011-5-28 19:10



    教程的三个模板案例只讲了{$变量名}的例子,没有讲{include file="模板名"}的例子,可否举一两个include例子讲解下,三克油

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-28 23:55:17 |显示全部楼层
回复 9# dongzide


   
  1. //数据库模型初始化
  2. if(!isset(self::$global['model']))
  3. {
  4. self::$global['model']=new cpModel($this->config);//实例化数据库模型类
  5. }
  6. $this->model=self::$global['model'];//数据库模型对象

  7. //模板初始化
  8. if(!isset(self::$global['tpl']))
  9. {
  10. self::$global['tpl']=new cpTemplate($this->config);//实例化模板类
  11. }
  12. $this->tpl=self::$global['tpl'];//模板类对象
复制代码

这段代码是从公共模块中拿出来单独讲解的,为了防止误会,被删除了,为什么要通过这种方式去实例化,目的是为了避免多次实例化影响效率。
“看手册来配置第一段代码是在根目录创建config.php粘贴进去吧。(问题:这个config文件是最全面的吗???所有配置都有了??可以减少但不需要再增加了?)”
这个配置是比较全面的了,要具体的发邮件和权限控制的,

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-5-29 00:14:29 |显示全部楼层
回复 10# dongzide


    {include file="模板名"}一般是用来包含公共头部和公共底部的,如果被包含的模板中,含有变量,需要自己在方法中完成赋值。如果开启了模板缓存,修改了被包含的模板后,需要手动删除缓存。到在实际应用中用到的时候,再讲解。

使用道具 举报

Rank: 1

发表于 2011-5-29 00:32:13 |显示全部楼层
太给力了。。顶一下
个人CP博客:http://www.vipinit.com

使用道具 举报

Rank: 1

发表于 2011-5-29 11:45:09 |显示全部楼层
{include file="模板名"}一般是用来包含公共头部和公共底部的,如果被包含的模板中,含有变量,需要自己在方法中完成赋值。如果开启了模板缓存,修改了被包含的模板后,需要手动删除缓存。到在实际应用中用到的时候,再讲解。


感觉手动删除好烦,帝国缓存更新够麻烦的了,所以想找个轻点的cp,以来也学点“屁爱吃屁”,手动删除有时会忘了,找不原因急的嗷嗷叫。{include file="模板名"}应该更强大。

使用道具 举报

Rank: 1

发表于 2011-6-11 12:55:43 |显示全部楼层
为什么我的不显示啊,看源文件是正常的。网页就是显示不出来。

使用道具 举报

Rank: 1

发表于 2011-6-12 21:36:55 |显示全部楼层
回复 1# 单骑闯天下

创建完commonMod.class.php后,我好奇,就在浏览器中访问了common模块,结果出现下面错误:Fatal error: Cannot access empty property in E:\www\mycp\module\commonMod.class.php on line 24
24行属于构造函数的。结果加了一个_empty方法就好了。

虽然我明知道这个可能会出错,但是我还是觉得canphp框架还是对这种错误处理一下的好。

使用道具 举报

Rank: 1

发表于 2011-6-12 23:51:42 |显示全部楼层
回复 15# jinbo

这个问题,可能是网页编码问题

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-6-15 09:23:25 |显示全部楼层
回复 16# sywee


    属性定义私有或保护类型,通过浏览器将访问不到。

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-7-4 20:59:06 |显示全部楼层
呵呵 当中有一个讲错了..应该是在template目录下面建的后缀名应该是html。不是php..

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2011-7-4 23:33:41 |显示全部楼层
回复 19# admin5


    这个没有讲错,模板后缀可以在配置文件中自己定义的,$config['TPL_TEMPLATE_SUFFIX']='.php';//模板后缀,一般不需要修改
模板后缀默认是.html

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|canphp框架社区 ( 皖ICP备10014930号-3 )  

GMT+8, 2012-5-20 01:01

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部