麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
smarty实例教程〔转〕3
悬赏分:20 - 2007年08月22日

========================================== example7.php ========================================== <?php /********************************************* * * 文件名: example7.php * 作 用: 显示实例程序2 * * 作 者: 大师兄 * Email: teacherli@163.com * *********************************************/ include_once("./comm/Smarty.class.php"); $smarty = new Smarty(); //建立smarty实例对象$smarty $smarty->template_dir = "./templates";//设置模板目录 $smarty->compile_dir = "./templates_c"; //设置编译目录 $smarty->cache_dir = "./cache"; //设置缓存目录 $smarty->cache_lifetime = 0; $smarty->caching = true; $smarty->left_delimiter = "<{"; $smarty->right_delimiter = "}>"; $array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻"); $array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻"); $array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻"); $array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻"); $array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻"); $array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻"); $smarty->assign("News", $array); //编译并显示位于./templates下的index.tpl模板 $smarty->display("example7.tpl"); ?> ================================================= example7.php 输出文件 ================================================= foreach使用的例子 这里将输出一个数组:
新闻编号:1
新闻内容:第1条新闻


新闻编号:2
新闻内容:第2条新闻

新闻编号:3
新闻内容:第3条新闻

新闻编号:4
新闻内容:第4条新闻

新闻编号:5
新闻内容:第5条新闻

新闻编号:6
新闻内容:第6条新闻

这里的{section}块的对于变量的命名方式感觉有些别扭,不过没关系,你只要记住模板变量使用: $loopName[name].var这种模式就行了,loopName为loop处赋予的变量名,[name]为name处赋予的字符串,.后为为你要在程序数组中设定要与值相对应的下标名称就行了。 好了,smarty学习指南---程序设计篇就写到这里,对于一般的应用,这些知识已经够用了,其它的一些高级技巧大家请参看手册中的例子,下一节将讲讲Smarty在实际应用中的例子,将分别以php内置的mysql语句,phplib中的DB类,来分别讲一下各个类库在同一个例子中的实现。 ==================================================================================================== Smarty例程学习(原创)----实例篇(一、使用php内置mysql语句) Smarty实例教程 ----实例篇(一、使用PHP内置MYSQL函数) 从本节开始我们来学习一下如果把Smarty应用到实际的例子中. 为了演示说明,我将以前写的一个站点作为实例来讲来下.先说明一下, 我本人的美术功底不是很强,所以设计出来的页面不太好看,大家就对付着看吧 在看本文之前,可以先看看indexbak.htm与newsbak.htm,它们是我们生成后的例图。 一、 首先来说明一下我们将要使用到的数据库,下面我先将数据库源文件给大家例出来: ====================================================================== CREATE DATABASE News; USE News; /**************************** * * 表 名: tb_news_ch * 用 途: 国内新闻表 * ****************************/ CREATE TABLE tb_news_ch ( iNewsID interger(11) primary key auto_increment, vcNewsTitle varchar(50) not null, ltNewsContent longtext not null ); /**************************** * * 表 名: tb_news_in * 用 途: 国际新闻表 * ****************************/ CREATE TABLE tb_news_in ( iNewsID interger(11) primary key auto_increment, vcNewsTitle varchar(50) not null, ltNewsContent longtext not null ); /**************************** * * 表 名: tb_news_mu * 用 途: 娱乐新闻表 * ****************************/ CREATE TABLE tb_news_mu ( iNewsID interger(11) primary key auto_increment, vcNewsTitle varchar(50) not null, ltNewsContent longtext not null ); ====================================================================== 我这里简单的将数据库说明一下. 第一个问题: 大家可以看到,其实3个数据表的字段名都一样,那么为什么不把它们合并成一个数据表呢,答案很简单:效率,在开发的时候我们可能感觉不出有什么可提高效率的地方,不过大家想想,当这个网站运行一段时间后,它的新闻数据量就会变的很大,而且考虑到如果将来网站做大后可能将各个类型分离出来形成类似china.xxx.com, international.xxx.com, music.xxx.com,将每一栏目独立分出去物理上做成一个单独的站点,到那时如果新闻还是合起来放置的话就会造成数据库瓶颈,所以针对当前的站点,我认为还是分开的比较合理. 第二个问题: 有人可能问了,你在字段前加的i, vc,lt干什么用?这里是按照字段类型来命名的, 这也是一种良好风格的体现,将类型前缀放在变量前,使用用户不用看字段定义就可以知道字段是什么类型,这是从微软的匈牙利命名法中参考过来的,在数据库设计时,我先将每种类型定义成1--3个字母,然后在每个字段前加相应的代码来代表它的类型.像上边,我将各个数据库字段类型定义为: integer i varchar vc longtext lt char c .... 在使用的时候,你可以往每个数据表中输入5条数据记录以备我们在调试实例时使用. 二、示例站点目录结构: PHP代码:-------------------------------------------------------------------------------- +Web (站点根目录) | |----+comm (Smarty相关文档目录) | | | |----+plugins (Smarty插件目录) | |-----Config_File.class.php (Smarty配置文件) | |-----Smarty.class.php (Smarty类主文件) | |-----Smarty_Compiler.class.php (Smarty编译类文件) | |----+cache (Smarty缓存目录,*nix下保证读写权限) | |----+templates (站点模板文件存放目录) | | | |----header.tpl(页面页头模板文件) | |----index.tpl(站点首页模板文件) | |----foot.tpl(页面页脚模板文件) | |----news.tpl (新闻页模板文件) | | |----+templates_c (模板文件编译后存放目录,*nix下保证读写权限) | |----+css (站点CSS文件目录) | |----+image (站点图片目录) | |----+media (站点Flash动画存放目录) | |----indexbak.htm (首页原始效果图) | |----newsbak,htm (新闻页原始效果图) | |----index.php (Smarty首页程序文件) | |----news.php (Smarty新闻显示文件) | |----例程说明.txt (目录说明) | |----数据库建立文件.txt (数据库的建立文档) 详细情况请大家下载实例后对照结构图。 -------------------------------------------------------------------------------- 三、模板中的实例片段: 1. index.tpl: index.tpl是站点首页的模板类,打开它的源文件后我们可以首先看到这么二句: ================================================== 1. <{*下面这一句为本页面的页面头*}> 2. <{include file="header.tpl"}> ================================================== 第 1 句大家都知道了,是模板注释 第 2 句表示在当前位置要包含另一个文件,什么文件呢,header.tpl,这里的这个header.tpl是页面的标准页头文件,把它单独拿出来是为将这一部分独立出来,以便在在其它页面进行重用,习惯上要把页头文件写在一个table中,但因为我的实例是早已做好的,所以有些不符合规范。 再来看最后一句: ================================================= 3. <{include file="foot.tpl"}> ================================================= 不用说大家都明白了,就是包含一个页脚文件。 再看看国内新闻部分的模板代码: =================================================
<{section name=loop loop=$News_CH}>
  • <{$News_CH[loop].NewsTitle}> <{/section}>
  • ================================================= 大家关键看<{section}>与<{/section}>,它们之外的那一部分是为了更好的理解代码的意思而列出来的。能看明白吗?这里将以前讲过的内容复习一遍:定义了一个section循环模板块,名字叫loop, 要循环的是$News_CH这个数组,以处将为当前的新闻产生一个链接,地址为news.php?type=1&id=xxx,这里的xxx是从数据库里提取的iNewsID,指的是要在新闻显示页里显示编号为id的新闻。$News_CH[loop].NewsTitle这种表示形式来看的懂吧?看不懂的话看看上一节讲过的《Smarty实例教学 ---程序设计》部分中的<{section}>语法。 也许大家对<{}>感觉有点陌生,这里的<{}>为模板语句定义块,在前2节我们都使用{},但因为这里是具体的应用,所以就不取{}了,使用大家习惯的<{}>来表示,当然这在.php文件中要设置的。 再看国际新闻与娱乐新闻的代码: 国际新闻: ================================================
    <{section name=loop loop=$News_IN}>
  • <{$News_IN[loop].NewsTitle}> <{/section}>
  • ================================================ 娱乐新闻: ================================================
    <{section name=loop loop=$News_MU}>
  • <{$News_MU[loop].NewsTitle}> <{/section}>
  • ================================================ 有没有看出有什么不同? loop部分不同,loop指的是要循环的数组,这里要注意的,不可将多个section的loop指定为同一个值,那样的话Smarty进行分析模板的时候就会将两个具有相同名字的section同时分析,生成两个一样的记录。 看到这里,有人就会产生疑问:循环块我已经有了,我怎么才能就它在当前位置只显示我们想要的记录数呢?这个问题简单,我们对Smarty的section循环块的循环次数控制是在.php文件中控制要替换这个循环块的数组来决定的,在设计模板时我们不用考虑。 其次,我们再来看看news.tpl: 1. 看这一句: <{$NewsTitle}> ----天骄信息网 将要显示的新闻页的标题显示为新闻标题 + "----天骄信息网" 2. 新闻标题:
    <{$NewsTitle}>
    这里又设置了一个模板变量$NewsTitle,意思说要.php将$NewsTitle(包括标题栏)替换为数据库中当前新闻的标题。 3. 新闻内容:

    <{$NewsContext}>

    这一句也容易,在当前位置显示新闻内容。 当然,这里只是简单的将新闻列出来了,在实际应用时你还可以把文章出处,发表时间,作者,相关新闻一起列出来,这里就不作多的讨论了. 三、程序部分: 1. 大家先来看看index.php的源文件,然后我们再来慢慢分析它的作用:

    提问者:wtf005   08-22 09:09
    答复
    我也来回答:
    不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

    为防止灌水,您需要计算一道数学题: 答案:
    71 + 24 = ? 请将计算结果填在上面

     
    []
    ©2007 PhpRes.COM