PEAR-像Google一样的分页功能(2)
第二篇PHP/PEAR
Pager套件像Google一样的分页功能
►spacesBeforeSeparator与spacesAfterSeparator设定项
这两个设定项目也是与分隔符号有关,spacesBeforeSeparator是设定分隔符号前需要有几个“空白”,SpcesAfterSeparator是设定分隔符后需要有几个空白。这两个设定项可拉大或缩小分隔的距离,让开发者随心所欲的调整分隔的宽度。设定值的型态都必须大于0的正整数,代表前后空白的数目。
范例文件名为example9-10.php,程序代码与范例文件example9-9.php唯一的不同在于$params数组中新增了两个设定,程序代码如下:
范例中假设了在分隔图案的前与后都增加了两个空白,执行结果如下图:
可以发现分隔图案与页码间的距离被拉开了,至于多少个空白才是最适当的,这就由读者自己做判断了。
►firstPagePre、firstPageText、firstPagePost与lastPagePre、lastPageText、lastPagePost设定项
先说明一下,这六个设定项目只可以用在Sliding模式的情况下,且设定值都需为字符串。
在sliding模式下,页数检索的最前方会出现第1页页码的超级链接,最后方会出现最后一页页码的超级链接。若开发者希望以不同形式来表现这两者的话。可以加入这六个选项来达到目的。
例如,若笔者希望执行的结果如下图:
第l页页码的超级链接改为{第1 页}文字型态的超级链接,最后页页码的超连结改为[ [最末页] ]文字型态的超连结。
程序代码中$params数组应该加入以下设定。范例文件名为eample9-11.php:
● 第1个设定项firstPagePre代表的是最前方文字左边外围的字符串,笔者范例是使用“{”符号放在文字的左方。
● 第2个设定项firstPageText代表的是最前方的字符串,笔者范例使用“第1页”这个字符串。
● 第3个设定项firstPagePost代表的是最前方文字右边外围的字符串,笔者范例是使用“}”符号放在文字的右方。
● 第4个设定项1astPagePre代表的是最后方文字左边外围的字符串,笔者范例是使用“[[”符号放在文字的左方。
● 第5个设定项lastPageText代表的是最后方的字符串,笔者范例使用“最末页”这个字符串。
● 第6个设定项lastPagePost代表的是最后方文字右边外围的字符串,笔者范例是使用“]]”符号放在文字的右方。
这六个设定项目同样可以用图片来取代文字,假设笔者建立了四个图片文件,第1个图片名为left.gif,如图:
第2个图片名first.gif为,如图:
第3个图片名为right.gif为,如图:
第4个图片名为last.gif为,如图:
范例文件名为example9-12.php,四张图都放在范例文件相同路径下,与上一个范例档example9-11.php唯一的不同在于六个设定项改为:
也就是使用四个图档作为显示的内容,执行结果如下图:
是不是觉得很有趣呢? 这些设定可以让分页依照设计者独特的巧思来加
以改变,让分页与众不同。
►showAllText设定项
这个设定项需搭配Pager物件的getPerPageSelectBox ( )方法来使用,因此,这个设定项留待下一单元中介绍到getPerPageSelect( )方法时再来一并做说明。
►linkClass设定项
上面几个范例虽然可以更改许多分页的细部外观,可是视觉上仍稍嫌单调,若能套用CSS来改变页数搜索中超连结文字的字体,颜色,大小,将会使画面看起来更好看,这个设定项就是用来让超级链接套上CSS。
假设,笔者修改example9-1.php,在网页最上方加入了一段CSS,内容是建立了一个名为1ink的class,并希望“页数搜索”后面的超级链接能套用此CSS的class,来改变分页的外观。范例文件名为example9-14.php,程序代码如下:
第1行到第9行包在刁中间的设定就是所谓的CSS,其中定义了一个名为1illk的class(请注意,1ink前需要有一个“.”)。
第4行定义了这个class的文字大小为12像素,第5行定义了文字颜色为#663366,第6行定义了文字的背景色为 CCCCCC。
接下来的内容与范例文件example9-1.php完全一样,只有$params数组中多了一项设定,位于第22行。
这个设定项定义了页数搜索后面所有的超级链接文字都必须套用link这个class,套用的结果如下图:
所有超级链接文字都变成了紫色(##663366), 背景色变成了淡灰色(#CCCCCC),有超级链接的数字,数字大小都变成12像素,是不是感觉很炫啊? 但请注意,这个页码没有超级链接,所以不会套用CSS的设定。
►curPageLinkClassName设定项
上一个设定项定义了超级链接的文字可套用哪一个CSS的Class。套用后的结果,虽然不错,但美中不足的是,被导点选的页码因为没有超级链接,因此没有套用到CSS,相对于其它页码就显得文字较大,较为突兀。
这个设定项就是用来修正这个问题,就是说,这个设定项也可指定一个CSS的class来让被点选的页码套用。
假设笔者在范例文件example9-14.php中新增一个CSS的class名为content,这个class同样需放在之间,程序代码如下:
它定义了文字字体为新细明体,文字大小与link相同为12像素,文字颜色为橘色#FF6600。
另外,在$params数组中多加了一列设定,如下:
定义了被点选的页码文字需套用content这个CSS的class,执行结果如下图,笔者将范例文件转存成example9-15.php:
被点选的页码3变成了与众不同的橘色了。请注意,CSS的class名称当作设定值,需要使用字符串的型态。
►clearfVoid设定项
这个设定项的值需为布尔值,也就是设定值不是true,就是false,默认值是true意思是若数据项数少于一页,网页底下的“页数搜索”后面将不会出现页码。如下图:
若开发者希望全部资料不满一页时,页码搜索后面仍然出现1这归页码,只需将这个设定项放入$params数组中并设为false就可以了,程序代码如下:
范例文件为example9-16.php。执行结果如下图:
页数检索后面多了一个1,不会什么数字都没有,感觉有点空空洞洞的。
1-6 Pager物件的方法
Pager套件的使用方法,除了开发者可以更改设定项数组的值以外,当用new关键词建立一个Pager对象后,Pager物件也提供了许多的方法可以供开发者利用,底下笔者介绍比较常用的11个方法,这11个方法可弥补设定项的不足之处。
►getCurrentPageID方法
这个方法可传回目前所在页面的页码,回传值是个正整数。例如,浏览者正在阅读第3页,这个方法会传回正整数3。
►getNextPageID方法
这个方法可以传回目前页面后一页的页码,回传值是个正整数。例如,浏览者正在阅读第3页,这个方法会传回正整数4。若浏览者正阅读最后一页,这个方法会传回false。
►getPreviousPageID方法
这个方法可以传回目前页面前一页的页码,回传值是个正整数。例如,浏览者正在阅读第3页,这个方法会传回正整数2。若浏览者正阅读第l页,这个方法会传回false。
►numItems方法
这个方法可以传回Pager物件中所含数据的总项数,回传值是个正整数。列如,若数据的总项数是120项数据,这个方法会传回正整数120。
►numPages方法
这个方法可以传回Pager物件中的总页数,回传值是个正整数。例如,若数据总共被分为20页,这个方法会传回正整数20 。
►isFirstPage方法
这个方法可以侦测目前页面是否为第1页,回传值是个布尔值,若是第1页则传回true,其余传回false。
►isLastPage()
这个方法可以侦测目前页面是否为最后一页,回传值是个布尔值,若是最后一页则传回true,其余传回false。
►isLastPageComplete方法
这个方法可以侦测最后一页的数据项数是否刚好符合设定的每页数据项数,回传值是个布尔值,简单的讲,若每 需要显示5项数据,而最后一页刚好就是5项数据则传回true,其余传回false。
以上8个方法,笔者用一个范例文件example9-17.php来做说明,假设笔者共有105项数据,每页希望显示5项,换算成页数,应该会有21页,且最后一页刚好就是5项数据,另外,网页最下面的页码搜索希望每次出现10个页码。程序码如下:
这个范例文件第1行到第30行与example9-1.php完全相同,分页采用Jumping模式,并设定每页显示5项数据,每次出现10个页码。重点是从第32行到第40行,分别使用先前介绍的8种Pager物件的方法,将分页的讯息显示出来。
第1次加载网页的执行结果如下图:
读者可发现最下方「目前页码」为l,也就是使用者进入的画面是第1页。「下页页码」是2,「前页页码」没有显示,因为没有比1更少的页码了。「是第1页吗?」答案应该是传回true,这里要说明的是对PHP而言,若数据型态为布尔值,则1与true是相同意思的,所以图中的1并不是第1页.而是true的意思。「是最末页吗?」没有显示任何值,对PHP而言,若数据型态为布尔值I,则false与0或空值是相同意思的,所以此处是false的意思。「最未页刚好5项吗?」,侦测的结果同样是布尔值,出现1代表为true。
最下面一行再分别用numPages()方法侦测出总页数为21页,与numltems()方法侦测出总数据笔数为105笔。
若笔者点选第5页,结果如何呢?
与上图不同的地方在于「目前页码」变成5,「下页页码」变成6,「前页页码」变成4,「是第1页吗?」与」是最末页吗?」都传回false,其余皆相同。
若笔者点选最后一页,结果如下图:
与上图不同的地方在于「目前页码」变成21,「下页页码」变成没有值,因为第21页已经是最后一页了,「前页页码」变成20,「是第1页吗?」传回false,「是最末页吗?」传回true,其余相同。
GetLinks方法
这个方法在范例example9-1.php 中笔者就已经使用过,利用这个方法只要两行程序代码.就可以得到完整分页功能的超级链接。
用法是先执行getLinks()方法来取得由页码的超级链接与<>等超级链接的HTML标签所组成的数组。
比较特殊的是,当这个数组的key为“all”时,value将会是所有页码与<>超级链接所合成的的HTML标签。请回头复习一下范例exampie9-1.php的第27行与第28行:
第28行这一行所产生的HTML标签,可经由网页的原始码看到:
是不是很方便,一行程序代码就可以产生这么多的HTML标签,建立好所有分页的超级链接,节省了许多开发者撰写程序码的麻烦。
►getPageData方法
这个方法在范例example9-1.php中也使用过了,目的是用来抓取某页码的数据内容,并组成一个数组。例如,当浏览者点选页码5这个超级链接时,页码5内的所有数据都被抓取,并组成一个数组,如程序代码的第14行:
接着再用foreach循环,将数组中的所有数据,一笔一笔地数据显示出来,如程序代码的第19行到第23行:
第19行的foreach循环,会从$data 数组中每次抽取一笔数据,放入$data变数中,而$data也是一个?樾吞?谋涫?琸ey是由0开始起算的正整数,value是按顺序对应到字段的值,例如$data[1]代表该项数据录第2个字段的值。
►getPerPageSeclectBox方法
这个方法会提供一个Select组件,供使用者选择每页要显示的数据项数,也就是说,假设开发者原本设定每页显示5项数据,有了这个工具,使用者可以用select组件来更改为每一页显示l0项或20项数据。笔者直接使用范例文件exlmple9-13.php来说明,方便读者了解,程码如下:
先来看看执行的结果画面吧:
网页底下多了一个选单可让浏览者选择一页要显示几项资料,选好后按下送出钮就可以更改每页显示的项数了,若选择全部,则所有数据会全部放在一个网页中。
要让分页具有这种功能,首先,需要在设定项的数组中加入这一行
程序代码第13行的这个设定项目,在上个单元介绍常用的设定项时,笔者省略没有介绍,因为它必须搭配getPerPageSelectBox( )方法才有意义。
这个设定项主要的功能是设定选单中可以让浏览者选择显示所有资料于一页中的选项文字。例如,笔者若将showAllText这个设定项目设为“全部”这个字串,选单的最后一个选项就会出现“全部”这两个字,使用者若选择这个选项,所有数据将会全部显示于一个网页中。 除了这个设定外,接下来还必须建立一个表单,表单内至少要有Select组件与submit元件。程序代码从第34行到38行。
第34行是运用pager对象的getPerPageSelect()方法建立select组件的HTML标签,并放入$selectBox变数中。这个方法可以使用4个参数,第l个参数是起始直,也就是选单中第1个选项的数字;第2个参数是最末值,也就是选单中最后一个选项的数字;第3个参数是每个选项间相隔多少数;第4个参数是选单是否提供所有数据于一页的选项,若设为true,选单最后会出现showAllText设定项的文字,选择这个选项可以一页显示所有数据。
以笔者的范例而言,建立起来的选单会由10开始始,50结束,每个选项相隔20,并且是供所有数据显示于一页的选项,让浏览者点选。若这个方法没有设任何参数,则预设的起始值是5,最末值是30,每个选项值相隔5,也没有提供所有数据于一页让浏览者点选,所以说也没必要设showAllText这个设定项了,因为根本不会出现这个选项。
第35行用echo的方法显示表单的HTML标签,其中action的值为空,代表按下submit钮后数据的后端处理仍由表单所在的网页来进行。第36行会将$selectBox变数的内容显现出来,显现出来的原始码如下:
上值的原始码全部放在$SelectBox变量中,也就是说,$SelectBox变量内容是所有select组件的HTML标签。
第37行是建立submit组件,并将按钮上的文字设为“送出”。第38行是表单结束的HTML标签。
OK!大功告成了。细心的读者可能发现到了,除了以上程序代码外,这个范例档与example9-1.Php的程序代码都完全一样。
▓1-7一个纲页多个分工
同一个网页中可放人多个分页,是一个非常酷的功能,若开发者自行撰写PHP程序,难度会相当高,但对pager套件而言很简单就可以做到了。
需注意的地方只有四个,第1,先制造出多个pager物件,每个pager物件用不同的变数名称;第2,设定项数组的变数名称每个Pager物件须不同;第3,每倒Pager物件须有不同urlVar设定项;第4,放置不同分页数据的变数名称也要不同。这样就可以做到一个网页多个分页了。
为了举例给读者了解,笔者在范例的schoolnews数据库中,新建立一个名为anothernews的数据表,假设这个数据表的架构与范例news数据表完全一样。并将example9-1.php的程序代码全部复制一份放在原程序代码的下方,两段程式码中间加入一条水平线加以分隔(< hr >),经由稍微的修改就可以做出两个数据表的分页了。
范例文件名为example9-18.php,程序代码如下:
程序代码虽然看起来很多,但若加以区别的话,第4行到第36行是第1个分页第38行到第71行是第2个分页。
第1个分页中与范例文件example9-1.php较为不同的地方为第8行将原本设定项数组的$params变量名称改为$params1,并在第13行加入一个urlVar设定,改变预设的urlVar变量名称为pageID_1。
第15行建立第l个pager物件时,参数要改用$paramsl,并将建立的物件放$pager1变量中,第16行用物件的getPageData()方法将所抓取的数据数组放入$datasl的变数中。
第21行到第25行利用foreach 回圈将每项数据显示出来就完成了第1个分页,请注意,变数名称不可弄错。
最后要注意一下第29行,用pager物件的getLinks()方法得到所有分页超连结的HTML标签后,放入的变量名称也改为$links1了。
第2段的分页与第1段分页要修改的地方都一样,只是将变量名称后的“1”改为“2”藉以区别而已。
如第43行将设定项数组的变量名称改为$ params2,第48行将urlVar变数名称改为$pageID_2.
第50行建立另一个新的pager物件,并以$params2作为参数,产生的新物件放入$pager2变量中,接下来,若有使用pager物件的方法,物件名称要改用$pager2喔,如第51行同样使用getPageData()方法将每页所含的数据数组放入$datas2变数中。
用foreach循环,将第2个分页的$datas2 阵列中的数据一项项的抓出,并显示出来。请见第56行到第60行。
最俊也请不要忘getLinks()方法所得到的分页超级链接的HTML标签,要放入变数$links2中。请见第65行。
执行结果如下图:
出现了,两个不同的分页。若笔者分点选第l个分页的第5页与第2个分页的第2页,可看出网址列后面会出现一段字符串:
代表Pager套件会自动产生两个变数,而且这个网页会用两个不同的urlVar变数来控制两个分页,两个分页系统不会 因为同在一个网页而发生错乱。
▓1-8结论
这个套件介绍到此可以告一个段落了,除了少数几个较少用到的方法与设定项外,常用的设定项与Pager物件的方法,笔者几乎都有用范例文件加以说明。
最后有一点要注意的,就是若读者使用的是PHP5,在建立pager物件时,不可以使用new的方式了,如下程序代码:
请改用Pager类别的factory的方法来建立pager物件,也就是说上一行的程序码,请以底下这一行的程序代码来取代;
否则会发生错误喔,这是因为PHP5 与PH4的物件导向设计上有些不同,套件开发者只好另行用factory方法来取代new关键词来建立新物件。
全文完