CFcodes.com ColdFusion知识库

利用分隔符对单篇文章信息进行分页操作
网站名称:远方网
网站地址:http://www.likefar.com
完成时间:2007-12

我在:利用分隔符对单篇文章信息进行分页操作 编写的 PageList 分隔符分页函数在单独使用的时候应该不会出现什么问题,但是如果在SimpleCms中配合分页函数/lib/pagelink.cfm 或是/lib/pagelink_nomal.cfm及/lib/bbs_pagelink.cfm 就会出现问题。问题的原因分为很多种:

1、和普通的分页/lib/pagelink.cfm 或是/lib/pagelink_nomal.cfm进行结合操作的时候,因为分页函数里带有变量名称PageList与分隔符函数中的PageList函数名称相冲突,所以我们只需要将分隔符PageList函数名称改为PageLists即可。

2、和利用ses地址方式的/lib/bbs_pagelink.cfm进行配合时会出现分隔符函数无法获取到相应的URL地址,因此无法实现地址重组,所以需要将函数中地址部分重新考虑。所以,将整个函数改写如下:

<cfscript>
function GetPages(s,sep){
pos = 1;
begin_pos = ArrayNew(1);
end_pos = ArrayNew(1);
while(pos gte 1){
pos = FindNoCase(sep,s,pos);
if(pos gte 1){
ArrayAppend(end_pos,pos -1);
pos = len(sep) + pos;
ArrayAppend(begin_pos,pos);
}
}
ArrayAppend(end_pos, len(s));
ArrayPrepend(begin_pos,"1");
return end_pos;begin_pos;
}
function PageLists(s){
if (ArrayLen(arguments) eq 1){
sep = '[pages]';
}else{
sep = arguments[2];
}
GetPages(s,sep);
PageLink = "";
pageargu = "";
nopageargu = "";
if( isdefined("argu") ){
for(i = 1;i LTE listlen(argu,'-');i = i+1)
{
if(listfirst(listgetat(argu,i,"-")) neq "cpage"){
nopageargu = listappend( nopageargu, (listfirst(listgetat(argu,i,"-")) & "," & listlast(listgetat(argu,i,"-"))) , "-" );
}
}
}
if(listlen(nopageargu,"-") neq 0){
p = "-cpage,";
}else{
p = "cpage,";
}
pageargu = script_name & "/argu/" & nopageargu;
for(i = 1;i lte arraylen(end_pos);i = i + 1){
PageLink = PageLink & "<a href=" & pageargu & "-cpage," & i & ">第" & i & "页</a>&nbsp;&nbsp;&nbsp;";
}
if(arraylen(end_pos) gt 1){
return PageLink;
}else{
return null;
}
}
function GetContent(str){
if(isdefined("cpage")){ cpage = cpage;}else{cpage = 1;}
if(cpage gt arraylen(end_pos) or cpage lt 1){
writeoutput("wrong page argu,please input right page argu,click 
 <a href=" & script_name & ">here</a> to back" );
}else{
bpos = begin_pos[cpage];
epos = end_pos[cpage];
writeoutput(mid(str,bpos,(epos-bpos+1)));
}
}
</cfscript>

对于长文章分页我们通常会有一些解决方案,比如按行分页,但是按行分页不好排,你是10个字一行呢还是50个字一行?800*600屏幕是10个字的,1024*800是15个字的,你是固定死的几个字一行呢还是咋的?

按分段也是不太好的,有些段长,有些段短,你是每页固定几段的话,那么就要有些页长有些页短了,而且每个分页的意思连接也有可能有问题。如果按字数也是不好的,简单的说是操作上没办法控制。控制字数是按源码进行控制的,如果你只有文字还无所谓,但你的源码里包括超链接,图片等内容,你的文字分隔就会有问题了。

好些的方案是可以利用分隔符号进行文章分隔。

下面我就将利用分隔符进行分页的程序发布如下:
 

<cfscript>
function GetPages(s,sep){
pos = 1;
begin_pos = ArrayNew(1);
end_pos = ArrayNew(1);
while(pos gte 1){
pos = FindNoCase(sep,s,pos);
if(pos gte 1){
ArrayAppend(end_pos,pos -1);
pos = len(sep) + pos;
ArrayAppend(begin_pos,pos);
}
}
ArrayAppend(end_pos, len(s));
ArrayPrepend(begin_pos,"1");
return end_pos;begin_pos;
}
function PageList(s){
if (ArrayLen(arguments) eq 1){
sep = '[pages]';
}else{
sep = arguments[2];
}
GetPages(s,sep);
PageLink = "";
if(Len(QUERY_STRING) GT 0){
if(FindNoCase("cpage", query_string)){
isQueryString = true;
QueryString = ListDeleteAt(Query_string,ListContainsNoCase(query_string,"cpage","&"),"&");
if(Len(QueryString) EQ 0){
isQueryString = false;
}
}else{
isQueryString = true;
QueryString = query_string;
}
}else{
isQueryString = false;
QueryString = query_string;
}
for(i = 1;i lte arraylen(end_pos);i = i + 1){
if(isQueryString IS true){
itPage = i & "&" & QueryString;
}else{
itPage = i;
}
PageLink = PageLink & "<a href=" & script_name & "?cpage=" & itPage & ">第" & i & "页</a>&nbsp;&nbsp;&nbsp;";
}
if(arraylen(end_pos) gt 1){
return PageLink;
}else{
return null;
}
}
function GetContent(str){
if(isdefined("url.cpage")){ url.cpage = url.cpage;}else{url.cpage = 1;}
if(url.cpage gt arraylen(end_pos) or url.cpage lt 1){
writeoutput("wrong page argu,please input right page argu,click 
 <a href=" & script_name & ">here</a> to back" );
}else{
bpos = begin_pos[url.cpage];
epos = end_pos[url.cpage];
writeoutput(mid(str,bpos,(epos-bpos+1)));
}
}
</cfscript>
CFCodes.com的关闭经历了蛮长的一段时间,在此期间,我也感觉很无奈。

不过现在CFCodes.com再次恢复了,不过我挑选了最简单的UI来操作,反正都是技术性内容,也无所谓好看与否了,你说是吧,呵呵。

希望以后能与更多人进行CF方面的不断交流。