iwind的专栏

iwind - 匆匆人生中,你做了几件令自己骄傲的事呢?

章节ID:ccterran
21979次访问,排名4899好友1人,关注者1
ccterran的文章
原创 23 篇
翻译 0 篇
转载 0 篇
评论 8 篇
iwind的公告
本blog皆为iwind原创或翻译,转载时最好写上出处。

我的日记

我的其它常用名:ccterran,month,coldwind

最近评论
fftaks:Wow gold
vanxining:很不错。
mark:语言通俗简明。good!
study:谢谢你。我在你这里学了好多东西。解决了我很多疑问!
谢谢!
寻梦人:非常不错.正愁资料呢,谢谢
文章分类
收藏
    相册
    PHP人
    IWIND(RSS)
    PHP艺术
    个人日记
    PEAR中文
    我的日记(RSS)
    技术资源
    ADODB
    PEAR
    PHP.NET
    SF.NET
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 PHPLIB Template入门系列 - 4 模板嵌套收藏

    新一篇: PHP_字符串操作入门教程

    在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量.

    以前你或许用require,include(require_once,include_once)引进一个公用的页面头部,确实方便而有效,现在我们用Template模板类也可以实现了,并且可以很方便的把一个页面随意插入另一个模板的任意地方.如果你想也把要插进的页面做成含有变量的模板的话,那么你会发现模板类会把这个工作处理的很好.

    template目录下新建三个文件third.html,header.html,footer.html.内容分为如下
    third.html
    <!-- 这是页面头部 -->
    {header}
    <BODY>
    下面是一个列表
    <UL>
    <!-- BEGIN list -->
    <li>{username} 的成绩是 {score}
    <!-- END list -->
    </UL>
    <!-- 这是页面脚部 -->
    {footer}
    </BODY>
    </HTML>

    header.html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> {title} </TITLE>
    </HEAD>

    footer.html
    <P>author &copy; iwind

    你也看到了,我们前几节的例子中都是用
    $tpl->set_file("main", "模板文件名");
    来加载模板文件的。只所以命名为"main",是因为我们想给它一个意义:主模板。这里的third.html就可以称之为“主模板”,而欲嵌入主模板third.html{header}变量所在位置的模板文件header.html,则可以称为"子模板".同样footer.html也是一个"子模板",我们想把它放到主模板里的{footer}位置.一个主模板内可以随意嵌入不限内容,尺寸大小,格式等的任何多个子模板.

    下面我们开始我们的PHP程序.

    先是创建一个类的实例对象
    //包含进模板类 template.inc
    require "inc/template.inc";

    //创建一个实例
    $tpl = new Template("template");

    //读进三个模板文件的内容,分别给变量"main", "my_header", "my_footer"
    $tpl->set_file("main", "third.html");
    $tpl->set_file("my_header", "header.html");
    $tpl->set_file("my_footer", "footer.html");

    //执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer
    $tpl
    ->parse("header", "my_header");
    $tpl->parse("footer", "my_footer");

    //然后完成主模板内变量的替换,并输出主模板分析后的内容
    $tpl
    ->parse("mains", "main");

    //输出
    $tpl->p("mains");

    于是,我们便可以通过查看源文件确信header.html,footer.html两个子模板文件的内容已经被加进主模板里了.

    <!-- 这是页面头部 -->
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> </TITLE>
    </HEAD>
    <BODY>
    下面是一个列表
    <UL>
    <!-- BEGIN list -->
    <li> 的成绩是
    <!-- END list -->
    </UL>
    <!-- 这是页面脚部 -->
    <P>author &copy; iwind
    </BODY>
    </HTML>

    你会发现,所有的变量都没了,包括我们未赋值的{title},{username},{score}.这是因为我们在创建对象时,第二个参数未设置,而自动采用了"remove"
    $tpl = new Template("template");

    $tpl = new Template("template", "remove");
    的效果是一样的.

    如果我们想给这些变量也赋值,那么方法和单个模板里变量的分析方法是一样的.
    //读模板内容进变量
    $tpl->set_file("main", "third.html");
    $tpl->set_file("my_header", "header.html");
    $tpl->set_file("my_footer", "footer.html");

    //设置子模板header.html里的变量title的值
    $tpl->set_var("title", "这个是网页标题");

    //以下分析主模板里的块的内容
    //设置块
    $tpl->set_block("main", "list", "lists");
    $array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
    foreach (
    $array as $username=>$score)
    {
        
    $tpl->set_var("username", $username);
        
    $tpl->set_var("score", $score);
        
    $tpl->parse("lists", "list", true);
    }

    所有程序为
    <?php
    //包含进模板类 template.inc
    require "inc/template.inc";

    //创建一个实例
    $tpl = new Template("template");

    //将整个文件读进来
    $tpl->set_file("main", "third.html");
    $tpl->set_file("my_header", "header.html");
    $tpl->set_file("my_footer", "footer.html");

    //设置header.html里的变量title的值
    $tpl->set_var("title", "这个是网页标题");

    //设置块
    $tpl->set_block("main", "list", "lists");
    $array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
    foreach (
    $array as $username=>$score)
    {
    $tpl->set_var("username", $username);
    $tpl->set_var("score", $score);
    $tpl->parse("lists", "list", true);
    }

    //执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer
    $tpl->parse("header", "my_header");
    $tpl->parse("footer", "my_footer");

    //完成主模板内变量的替换
    $tpl->parse("mains", "main");

    //输出
    $tpl->p("mains");

    ?>

    输出的结果为
    <!-- 这是页面头部 -->
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> 这个是网页标题 </TITLE>
    </HEAD>
    <BODY>
    下面是一个列表
    <UL>

    <li>张三 的成绩是 82
    <li>李四 的成绩是 90
    <li>王二 的成绩是 60
    <li>麻子 的成绩是 77
    </UL>
    <!-- 这是页面脚部 -->
    <P>author &copy; iwind
    </BODY>
    </HTML>

    一切都是我们所期望的.

    在这个程序里,我们用
    $tpl->set_block("main", "list", "lists");
    加载一个块.其实它的第一个参数为该块所在父变量,如果这个块在header.html里,那么恐怕要这样写了
    $tpl->set_block("my_header", "list", "lists");
    但分析方法还是一样的.

    从以往和这节中的例子,我们可以看出来,定义一个模板变量{var}值的方法是用
    $tpl->set_var("var_name", "var_value");
    但把一个变量的值给另一个变量就需要用parse.
    $tpl->parse("target_name", "from_name", true);
    或者
    $tpl->parse("target_name", "from_name", false);
    使用parse就先执行from_name大变量的模板变量的替换,然后再把所得结果赋给target_name.

    一个变量{varname}无论在模板的何处(块里面,子模板里),定义的方法都是一样的.

    子模板里还可以嵌入新的子模板,称之为"多重嵌套",分析的方法都是一样的,只是一般用不到.块也可以多重嵌套,而且非常有用,使得模板可以设计的可以很清晰,这就是我们下一节的内容了.


    发表于 @ 2005年01月11日 21:36:00|评论(loading...)|编辑

    旧一篇: PHPLIB Template入门系列 - 3 块的应用

    评论

    #baibai  发表于2005-02-13 12:21:00  IP: 218.90.58.*
    我是菜鸟看了你这一系列的教程学到不少谢谢!请尽快继续
    #mark 发表于2005-09-10 12:05:00  IP: 211.100.21.*
    语言通俗简明。good!
    #fftaks 发表于2008-06-30 09:09:29  IP: 58.17.145.*
    Wow gold
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © iwind