hu60t

2013-12-09 02:08:33 -0500
hu60t手册
一、概述
    不知道你是否有过这样的经历:要做一个WAP网站,可能不仅需要做WAP1.1(wml、简版),还要做WAP2.0(xhtml、彩版)。
    由于xhtml与wml有很大的不同,特别是表单完全不兼容,所以你可能需要在写完wml模板后还要写另一份模板来实现xhtml。如果你没有进行模板分离,情况会更糟糕:你不得不因此写两个不同的php!
    是否有一种方法,可以让我们只写一次代码就同时实现wml和xhtml的显示呢?我曾经尝试过自定义一些标记(它们就像论坛使用的UBB),使用两组不同的正则表达式进行替换使它们分别成为xhtml和wml,于是就出现了hu60wap程序,直到hu60wap5。在hu60wap5中我写了一个form类,实现了xhtml/wml表单的完美兼容。
    但是我逐渐发现,这种把php和UBB代码混合在一起的方式是很不方便的----想要修改排版太麻烦了,特别是像我一样使用手机开发的人。我急需一种视图与逻辑分离的开发方式,但同时也要具有hu60wap5那样只写一次就同时实现wml和xhtml的显示的优点。于是,hu60t诞生了。
------

    hu60t的主体是Smarty3模板引擎,我利用它的插件机制添加了很多方便WAP开发的标记,比如xhtml/wml兼容的表单、div、span等等,只要写一个模板就可以同时输出xhtml和wml。但与此同时,它也允许你为特定的xhtml和wml定制页面。
    hu60t还拥有方便的路由功能,你可以使用形如m.php/bbs.tz.10086.xhtml这样的地址来传递参数,不再需要使用传统的tz.php?tzid=10086,方便搜索引擎优化,也减少打字。
    hu60t实现了xhtml/wml自适应,如果浏览器不支持其中一种,它会自动使用另一种进行输出,而且可以在xhtml/wml间无缝切换。同时,使用插件机制还可以加入更多的页面类型,比如加入电脑版、触屏版等,虽然你可能因此要多写几个模板文件。
    
    所以,还等什么呢,赶快用hu60t进行你的wap程序开发吧!
二、安装与配置
    把下载到的压缩包解压到网站空间的任何一个目录,就完成安装了。赶快在浏览器中输入“http://你的域名/你安装的目录/”看看吧。
    如果你看到了“欢迎使用hu60t网站开发环境”,并且能正常显示里面的例子模板,就可以使用本框架继续工作了。
    如果不正常,你需要检查解压是否完整,或者你的PHP环境是否正常。
    hu60t必须在PHP5中运行,我测试过Windows下的php5.2.17和php5.4.0都能正常运行它。
    如果你确实发现了某些BUG使它在其他版本的PHP5中不正常,请发邮件到hu60@139.com联系我,或者在hu60.cn论坛发贴反馈。

------

    下面让我们来看看hu60t都有哪些目录和文件,下面的列表是hu60t的根目录,+代表那是一个目录,-代表那是一个文件。
    
+class
+config
+func
+page
+sub
+temp
-config.inc.php
-index.php
-license.txt
-m.php    
现在来介绍下每个目录的用途:
    class 用于存放类文件。hu60t使用了PHP5的自动加载(autoload)规则,存放在里面的类文件可以自动被加载,后面会讲到。
    config 用于存放配置文件。通常把php的配置文件存放在这里。至于smarty的配置文件,存放在page目录更方便一些。
    
    func 这里放函数和函数库。
    page 应用的php(程序)、tpl(模板)和conf(Smarty配置)就存在在该目录。不过一般不直接放在该目录下,而是建一个子目录存放。
    sub 这里存放一些会被调用的php代码段,比如用于批量加载配置文件的等。
    temp 临时文件夹。它的子目录tplc是smarty编译文件夹,pagecache是smarty缓存文件夹(如果你启用缓存的话)。
    config.inc.php  主配置文件。任何php包含它之后就可使用hu60t的常量、模板引擎和自动加载等特性。
    index.php  首页,跳转到m.php/index.index.$bid
    license.txt  hu60t的许可证,它规定了你在使用、传播、修改和重新发布hu60t时需要注意什么。hu60t是一个自由软件,但允许并入专有软件中,只要该专有软件不是一个网站开发框架。
    m.txt  所有应用的入口,为应用提供统一的“伪静态”式路由。路由规则是下节的内容。
三、路由规则
1. $PAGE变量
    $PAGE是一个关联数组,保存了hu60t中所有和页面有关的参数,它的成员如下:
  cid  pid  bid  sid
  ext  extid
  path_info  path_info_arr
  mime  gzip
  query_string
    现在来看看这些成员到底是什么:
  cid是class id的简写,是页面的分类。它对应着page目录下页面文件所在的子目录。比如你要写一个论坛的首页,你可以规定它的cid是bbs。然后你打开page目录,建立一个名为bbs的子目录,然后把所有论坛相关php和模板都放在里面即可。
  pid可以理解为page id或php id,它是页面(php文件)的文件名。
  bid可以理解为browser id(其实这是我刚想出来的。在确定它叫bid之时我自己也不知道它的英文全称是什么),它表示页面的类型。目前它的值只能是xhtml或wml,可以通过插件机制扩展。
  sid是可选的。它用来方便WAP应用实现用户登陆信息的传递。一般通过Cookie传递sid,但是当用户浏览器不支持Cookie时,hu60t也提供了一种方便的方式可以在URL中传递sid,后面会提到。
  mime即页面的MIME类型,如果你不知道它是什么,你应该百度一下。
  gzip是页面的gzip压缩开关,当它为true时,表示允许gzip压缩(但具体是否压缩取决于config配置和浏览器是否支持)。
  query_string和$_SERVER[QUERY_STRING]是一样的,区别是,它会在$_SERVER[QUERY_STRING]不为空时在其前面加一个问号(?)。它存在的目的是为了方便输出当前页的相对路径。
  剩下的四个参数在下一小节讲。

------

2. URL解析
    hu60t的URL是怎样的呢?通过访问测试页你应该看到了两种:
(在这里省略了URL中m.php前面的内容,完整的是http://域名/安装目录/m.php/…)
  m.php/index.index.xhtml(首页)
  m.php/test.index.form.xhtml(表单测试页)
    可以看出,hu60t使用PATH_INFO来传递参数,并且用.来分隔多个参数。那么每个参数分别代表什么呢?来看看地址解析的表达式:
  m.php/[sid/]cid.pid[.ext1][.ext2]…[.ext n].bid[/path_info]
  (方括号里面的部分是可选的)
    可以看出,hu60t把m.php/后面的PATH_INFO分成了好几部分,用/分开。
    在地址解析时,先考察第一部分,如果它里面不含点(.),就认为它是sid,保存在$PAGE['sid']里。如果它含点(.),则认为它是第二部分,并从$_GET、$_POST或$_COOKIE中查找hu60_sid或sid,如果找到,把它设为sid,否则sid为空。
    然后处理第二部分,它是由点(.)分隔的多个参数。hu60t把第一个参数设为cid,第二个是pid,最后一个是bid。而中间如果还有更多的参数,则把它们放在$PAGE['ext']和$PAGE['extid']里。两者的区别是ext是一个数组,而extid是字符串(并且在非空时总是以点结尾。它存在的目的也是为了方便输出相对URL)
    最后,如果还有第三、四、五或者更多部分,则把它们放在$PAGE['path_info']和$PAGE['path_info_arr']里,前者是字符串,后者是以/分割得到的数组。
    不知道你看晕了没,反正我是写晕了,我们还是举一些例子吧。
    
m.php/foobarboo
  (sid=foobarboo,cid和pid都为默认值index,bid取默认值xhtml)
  
m.php/foo.bar.boo
  (cid=foo,pid=bar,bid=boo)
  
m.php/test.index.form.xhtml
  (cid=test,pid=index,bid=xhtml,$PAGE['ext'][0]='form')
m.php/foo/bar.boo.wml/a/b.c/d
  (sid=foo,cid=bar,pid=boo,bid=wml,path_info='/a/b.c/d',path_info_arr=array('a','b.c','d')

------

    为了安全,cid和pid的取值都有限制,它们只能取A-Za-z0-9和下划线(_)与减号(-),并且大写会转换为小写。因此,你的目录名和文件名也要遵守该规则。

------

3.内容协商
    地址解析完后,hu60t会自动判断$PAGE['bid']是否有效。如果无效,或者浏览器不支持这种类型,就会自动尝试换一种合适的类型(同时会自动修改$PAGE['bid'])。
    同时,该过程会自动设置合适的$PAGE['mime']

------

4. php文件定位
    hu60t现在终于要include你的php文件了。(hu60t只会加载你的php,不能直接加载模板。加载模板要在你的php中进行。)不过在此之前,它要先确定你的php文件在哪里。
举例:m.php/test.aa.wml
    首先,它检查page/test/aa.wml.php是否存在,如果存在,则加载它。
    如果不存在,它检查page/test/aa.php是否存在,如果存在,则加载它。
    否则,它检查page/error/no_page.wml.php是否存在,如果存在,则加载它。
    否则,它只能加载page/error/no_page.php。如果还是不存在,你将得到一个空白页。
    
    这样曲折的加载过程有什么意义呢?很显然,它给了你更多自由,你可以自行决定对不同的bid使用一个还是两个php。比如,大多数页面可以使用page/cid/pid.php。但如果某个页面的xhtml和wml的逻辑不同,你也可以分别写page/cid/pid.xhtml.php和pid.wml.php。
四、使用模板引擎
   现在,回到我们在上一节举的例子,你已经建立了page/test/aa.php,然后该怎么做呢?像平常一样echo标记?当然不是。
    在hu60t中,php的作用是完成应用的逻辑过程,比如读取数据库等操作。而页面的显示,应该交给模板引擎解决。
    第一步,初始化模板引擎:
<?php
hu60::start();
/*
    现在Smarty模板引擎就被初始化了,它的变量名是 $tpl
    接下来,设置一些变量给模板引擎,以便在模板中显示:
*/
$tpl->assign('aa','这是aa');
$tpl->assign('bb','这是bb');
$tpl->assign(array('cc'=>10086,'dd'=>10010,'ee'=>10000));
/*
最后一步:显示模板
*/
$tpl->display('tpl:aa_test');
?>

------

    现在,访问m.php/test.aa.xhtml看看吧。
    什么,提示“该页未找到”?当然啦,模板文件还没有建立嘛。
    那好,我现在就去建立一个模板。可是它的文件名应该是什么?
    所以,这就涉及了模板文件定位的问题,这又是一个相当复杂的规则。

------

2. 模板文件定位
    先来看模板路径的表达式。和先前一样,[]里的部分可省
  tpl:[cid.]name[.bid]
    这里的cid与bid和php文件定位里的含义一样。
    name是模板文件的名称,只要不含点(.)就行。但建议只用小写字母、数字、下划线和减号。
    如果cid和bid省略,则用当前页面的cid和bid代替。例,tpl:aa_test,在m.php/test.a.xhtml下就相当于tpl:test.aa_test.xhtml,在m.php/test.aa.wml下就相当于tpl:test.aa_test.wml
    可以同时省略cid和bid(写成tpl:aa_test),或者只省略bid(写成tpl:test.aa_test),但是不能只省略cid。如果你写tpl:aa_test.wml,hu60t会认为aa_test是cid,wml是name。
    
    得到cid、name和bid之后,就可以定位tpl文件了。
    hu60t会首先查找page/cid/name.bid.tpl
    如果不存在,查找page/cid/name.tpl
    如果不存在,查找page/error/no_tpl.bid.tpl
    如果不存在,查找page/error/no_tpl.tpl
    
    是不是和php文件定位很相似呢?
    在本例中,你可以只建立一个模板文件(page/test/aa_test.tpl),使用hu60t的扩展标记实现wml/xhtml兼容。
    你也可以写两个模板,一个page/test/aa_test.wml.tpl,一个aa_test.xhtml.tpl。当访问m.php/test.aa.wml和m.php/test.aa.xhtml时,hu60t会自动选择对应的模板调用(在你没有通过tpl:cid.name.bid指定bid的情况下)
    所以一般情况下,我们都不指定bid。调用当前目录的tpl用 $tpl->display('tpl:name'); 调用其他cid下的模板用 $tpl->display('tpl:cid.name');
    
    嗯,就是这样。下一节将谈怎样写一个wml/xhtml兼容的模板。
五、编写xhtml/wml兼容模板
    在学习本节之前,建议先大概看看smarty3中文手册,对smarty3的模板语法有些了解。
    但没了解也没关系,看完本节再学也行。
    这是一个smarty3.1.4手册

------

1. hu60t的模板默认分隔符是,如果不方便,你可以在php中自行修改(同时修改hu60t自带的模板)
2.开始创作
    目标文件是page/test/aa_test.tpl

------

{include file="tpl:comm.head" title="这是一个测试页面"}
    这句载入了hu60t已经写好的xhtml或wml头文件,file属性指定了文件的位置,title属性指定了要显示的标题。
    除了title之外,还有其他的属性可以被使用:
    url  指定要自动跳转的url,如 url="http://wap.baidu.com/" 
    time  指定自动跳转的时间,单位秒,如 time=5
    如果要使跳转生效,time属性必须存在(可以time=0,表示立即跳转),而url属性却是可选的。如果url不存在,就自动刷新本页。
    自动跳转在xhtml和wml中都能正常工作。
    不需要对url进行编码。比如a.php?c=d&e=f,不需要把&改成&amp; 因为tpl:comm.head在输出时会自动编码它们。
    
    css  指定一个用于输出css的模板。默认的css="tpl:comm.css.xhtml"。你可以修改该模板,或者通过该属性重新指定一个css模板。
    注意:由于模板分隔符是 { }  ,所以css不能这样写:
  a{color:#fff}
    它们会被认为是模板标记而导致出错。应该这样写:
  a { color:#fff }
   或
  a {
     color:#fff;
    }
    保证大括号中间有空白,就不会出问题了。
    (很显然,该属性只在xhtml下生效。)
    
    base  当base属性不存在或base=false时,输出的头部可能包含额外的标记(比如xhtml头部会埋一个id=top的锚链接)。当base=true时,则只输出基本的头部。
    
    写给第一次用模板的童鞋:除了file属性外,其他属性都是tpl:comm.head自定义的(你可以打开该模板看看),如果换一个模板再用相同的属性,可能完全没用。不要误以为每个模板都有这些属性。
    
    
{div class="bk1"}
这是一个块。
{/div}
    它和<div></div>标记是一模一样的,可以使用div标记的任何属性。而且它有一个特别的属性wml用来规定在wml版输出什么(默认是<p></p>)
例:{div class="bk2" wml="--a--"}b{/div wml="--c--"}
    在xhtml版,看到一个块里面只有b。在wml版,看到--a--b--c--
    结束标记也能有属性?是有点奇怪。但你会发现它的用处的,特别是不想在wml中产生多余换行时,用{/div wml=""}{div wml="<br/>"}(用一个换行代替原来的</p><p>)是一个好办法。    
    
{span style="color:#ff0000;" wml="<b>"}在xhtml版是红色的,在wml版是加粗的。{/span wml="</b>"}
    
    这是<span></span>标记的替代品,它默认在wml下不输出任何东西(“1.0.20120511第二次打包”以前的版本会输出<br/>)。可以使用wml属性指定wml下输出什么。
    
    
下面有一条线?{hr}谁说的?明明是上面有一条线。
    
    {hr}就是<hr/>的替代标记,它可以使用<hr/>原有的各种属性。同时,可以用wml属性规定在wml下输出什么(默认是<br/>--------<br/>)。
    
    
{$aa}<br/>
{$bb}<br/>
{$cc}<br/>
{$dd}<br/>
本页网址是http://{$smarty.server.HTTP_HOST}{$smarty.server.REQUEST_URI|code}
  输出变量
{hu60::getmyurl()|code}
  调用函数
    更多的模板语法就不介绍了,看smarty3文档去。

    
    
{include file="tpl:comm.foot"}
    
    输出wml/xhtml尾。有一个属性base,如果base=true,则不会输出底部的“[WAP1.0版]”等额外的内容。

------

    下一节的内容是“xhtml/wml兼容表单”

------

    补充!我居然把它忘记了。
2. {isbid}标记
    {isbid}{/isbid}标记内的内容只有在bid符合当前
$PAGE[bid]时才编译到模板中。具体使用时,bid用xhtml或wml代替。
    
{isxhtml}aa{/isxhtml}
{iswml}bb{/iswml}
    
    如果你通过插件机制添加了更多的bid,比如加入了xml,你还可以使用{isxml}{/isxml}。
    {isbid}标记不支持嵌套,否则会出问题,请特别注意!
    {isbid}标记是通过smarty的预过滤器实现的,所以你可以把它用在任何地方,包括模板标记中:
    
{include file="tpl:comm.{isxhtml}aa{/isxhtml}{iswml}bb{/iswml}"}
    
    当你更换了模板定位符时(比如改成了<{ }>),isbid的定位符也会同步更改(需要使用<{isbid}>…<{/isbid}>)。
六、xhtml/wml兼容表单
0. 加载配置文件
    这是前面一节漏掉的内容:在模板中加载配置文件使用
{load_conf file="conf:test.aa_bb"}
    conf:[cid.]name[.bid]的规则和tpl:…的一样。
    配置文件的后缀是.conf
  

------

1. 概述
    这个表单的设计是以xhtml的form表单为基础的,在wml下则使用<anchor>等功能相似的标记来模拟。
    xhtml中不同form内的标记name可以相同,但wml不行。所以hu60t会自动修改wml下重名的name,但仍然以原来的name提交。所以可以放心使用。并且,name="aa[]"这样的name也会得到正确的处理,保证wml下能正常使用。
    不需要对属性值进行html实体编码,在wml中也不需要把$替换成$$,hu60t会替你完成。
    为了兼容性,hu60t放弃了在wml下不支持的单选框,而复选框在wml下则用<select>模拟。
    

------

2. {form}
  
{form method="get" action="http://wap.baidu.com/s"}
……
{/form}
  
    就像平常使用<form>标记一样用{form}就可以了。不过{form}的属性只有以下几个:
  method  表单提交的类型,get或post
  action  表单提交的地址。
  file  表单是否用于上传文件。如果用于上传文件,必须设置为file=true,默认是false。
  enctype  表单的数据类型。它事实上只是对file属性的模拟,为了更像<form>。所以只支持(原封不动地打上去)enctype="application/x-www-form-application"(使file=false)或enctype="multipart/form-data"(使file=true)。其他表达方式都会使file=true。
    
    {form}的其他属性都会被忽略。没有name或id属性,所以要用CSS控制显示的话可以在它外面套一层{div}

------

3. {input}
  {input type="text" name="s" value="输入关键字"}
  {input type="submit" value="百度一下"}
  
    就像平常使用<input>标记一样。不过还是有些不同。来看看{input}有哪些属性:
    type  是input的类型,默认是text(“默认”表示当type属性不存在时,hu60t自动把它设置为type="text")。还可以是submit(提交按钮)、checkbox(复选框)、hidden(隐藏域)、file(文件上传控件)、password(密码输入框)、textarea(多行输入框。在hu60t中,textarea与input合并了)。
    
  name  是input的名字(提交后在$_GET、$_POST或$_FILES里的键)
  value  是input的值,在type=hidden、textarea、text、password、checkbox、submit时有效。
  size  是input的宽度,如size=10
    如果type=textarea,则size=array(50,30)这样可以同时设置宽度和高度。
    其他情况下如果size是一个数组,则取$size[0]作为input的宽度。
    对submit和hidden无效。
    
  
  
  wml(在v1.0.20120512以前,这个属性的名字是wmlnotice)  只对type=file有效。wml不支持文件上传控件,这个属性用来设置在wml输出什么。默认是什么也不输出。
  cols rows  它们分别是textarea的宽和高。rows只对type=textarea有效,但cols对text和password来说等效于size。
  
  checked  规定复选框是否默认选中。只对type=checkbox有效,取值true或false。

------

4. {select}
    {select}标记的用法和<select>不同。
    
例:{select name="aa" value=["b","c","d","e","f"]}
    它的全部属性如下:
  name  就是name
  value  是一个数组或关联数组。如果是关联数组,那么key将作为显示,而value作为提交给服务器的值。
    例:{select name="x" value=["一"=>1,"二"=>2,"三"=>3,"四"=>4]}(这是smarty3表示关联数组的方式)
    将显示 一 二 三 四,而$_REQUEST['x']收到1 2 3 4
  (20120512第二次打包 更新)
    本次更新重写了{select}。
  value  一个数组,是选择列表框发给服务器的值。
  output  一个数组,是选择列表框显示的内容,与value一一对应。如果省略了它,那么会把value显示出来。
  option  一个关联数组。如果不设置value、output,设置了它,那么它的键将成为output,值将成为value。因为很难理解,所以不建议使用该属性。
    selected  一个字符串或一个数组,包含了被选中的值(value)。
  multiple  是否多选,true或false。


------

    终于纠结地结束了,不知道你看明白了没。
    下一节的内容还没想好。
番外、函数类方法列表
0. 如何在smarty里使用函数、类方法?
    smarty3可以直接调用php的函数和类方法,如:
  {date("Y-m-d H:i:s")}
    这将直接输出date()函数的值。
    类的静态方法也一样,比如调用hu60类的getmyurl()静态方法:
    {hu60::getmyurl()}

------

1. xhtml/wml自适应的变量调节器
    smarty中用来在输出之前格式化字符串的“函数”被称为变量调节器,它的介绍见此处smarty2模板手册(除了这条,你也可以看看其他条目。虽然有些内容过期了,但还是很详细的。英汉对照。)
    
    hu60t中定义了一个名为code的变量调节器,它可以帮你进行html实体编码、换行转换、wml的$转成$$。
  
  参数1:把换行符(\r\n、\r或\n)转换为什么。取值有:
    true或1(转成&#13;&#10;),在html属性值里需要用这种转换。
    2(转换为<br/>)。
    其他值(转换为指定的字符串)。
    默认值是false。
    
  参数2  是否不把空格转换为&nbsp;
    false  会把空格转成&nbsp;
    true  不把空格转成&nbsp;
  
    使用例子:
  <a href="{hu60::getmyurl()|code}">刷新本页</a>
  例2:php:
$tpl->assign('lrc',"当天际传来第一道曙光\n振翅飞翔  充满力量\n阴霾终究会沐浴阳光\n我们在  海风中  歌唱");
tpl:
无换行:{$lrc|code}<br/>
正常:{$lrc|code:2}<br/>
只有一个空格:{$lrclcode:2:true}
(注:html/wml把没有转换为&nbsp;的多个空格当一个空格处理,所以只有一个空格)

------

2. 变量调节器cut
  hu60t还定义了一个用于分割utf-8字符串的调节器cut,在下文介绍str::cut()时会详解。

------

  
3. class hu60

    以下是hu60类的静态方法(采用php手册的参数类型、返回值说明方式):

------
  string getmyurl(array $page=array())
    取得当前页面的相对路径。
    例:当前页面是m.php/a.b.wml?d=e&f=g,hu60::getmyurl()将返回a.b.wml?d=e&f=g
    可选的参数$page是一个关联数组,包含了想要替代的$PAGE中的键值。
    例:上例改成hu60::getmyurl(array('bid'=>'xhtml')),将返回a.b.xhtml?d=e&f=g

------

  string load_page(string $cid, string $pid, string $bid)
    返回指定cid、pid、bid的php的路径。
    它会使用hu60t的php定位规则,依次查找page/$cid/$pid.$bid.php、page/$cid/$pid.php、page/error/no_page.$bid.php、page/error/no_page.php。
    它不会返回失败,因为如果被加载的文件不存在,它返回page/error/no_page.php,即使这个文件不存在也一样。
    用法举例:include hu60::load_page('a','b',$PAGE['bid']);

------

  void gz_start(integer $gzip=PAGE_GZIP)

    该方法尝试开启页面的gzip压缩,可选的参数是gzip压缩级别(1~9启用gzip。0或false不启用gzip,但启用输出缓冲区,具体可以看一下class/hu60.php)。
    如果浏览器或服务器不支持,或者服务器禁用gzencode(),gzip压缩不会被开启,但仍然会开启输出缓冲(ob_start)
    该方法没有返回值。调用后可以通过$PAGE['gzip']判断gzip压缩是否开启。
    如果参数留空(例 hu60::gz_start()),gzip压缩级由配置文件config/system.php中的PAGE_GZIP决定

------

  void gz_stop(void)
    关闭gzip压缩,清空并关闭输出缓冲。在此之前的输出都不会被显示。

------
  object tpl(boolean $new=false)
    此方法返回一个smarty类的实例,并且已经被hu60t配置好。
    如果$new=false,多次调用得到的是同一个实例。如果$new=true,每次调用都会产生一个新的实例。
    hu60::tpl()在模板内预设了两个引用变量,$page和$user,分别是全局变量$PAGE和$USER的引用。在下一节“开发规范”中将提到$USER。因为是引用,所以在模板中对$page和$user的修改也会使$PAGE和$USER的值改变。
    hu60::tpl()在模板内预设了三个常用变量:$cid、$pid、$bid,方便在模板中输出本页或目标页的URL。(采用值传递,修改它们不会影响到$PAGE数组中相同的值)
------

  void start(boolean $nogzip=false, boolean $notpl=false)
    这个函数初始化hu60t的环境,应该在每个页面php开始时被调用。
    它可以自动调用hu60::gz_start()和hu60::tpl(),你不需要再去调用。被建立的模板引擎实例是全局变量$tpl。
    通过两个参数可以不让hu60::start开启gzip或初始化模板引擎。
    
  例:page/test/a.php
<?php
hu60::start();
$tpl->display('tpl:a');

------

  
  boolean reg_page_bid(string $bid, string $func=null)
  
    注册新的页面类型(bid)。
    $bid是必须是一个只含a-z0-9下划线(_)或减号(-)的字符串。
    $func是一个用来判断浏览器是否支持该bid的函数,具体怎样写见另一节“添加新的页面类型”。
    如果$func=null或未指定$func,则认为$func="hu60_page_$bid",并尝试自动加载FUNC_DIR."/hu60.page.$bid.php"来载入该函数。
    返回值:
        bid已注册或成功注册均返回true
        失败返回false
  
  例:hu60::reg_page_bid('html'); //将自动加载func/hu60.page.html.php并检查是否存在函数hu60_page_html(),如存在,则注册成功,返回true;否则返回false。
    一般在sub/regbid.php集中注册bid。

------

  boolean get_page_mime(void)
    依次调用已注册的bid的回调函数,直到找到一个适合当前浏览器的bid。自动调整$PAGE['bid'],并设置$PAGE['mime']。
    如果通过回调函数找到了合适的mime,返回true。否则,将使用默认的bid和mime(在config/system.php设置),并返回false
    你在页面php中不需要调用该函数,m.php已调用它设置好了$PAGE['bid']和$PAGE['mime']。
«Newer      Older»
Comment:
Name:

Back to home

Subscribe | Register | Login | N