spPager中静态页面的问题

#1 fengyu44

当前页为倒数第二页(即17页)时,模板输出前,$pager的输出为:

Array
(
    [total_count] => 176
    [page_size] => 10
    [total_page] => 18
    [first_page] => 1
    [prev_page] => 16
    [next_page] => 18
    [last_page] => 18
    [current_page] => 17
    [all_pages] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
            [10] => 11
            [11] => 12
            [12] => 13
            [13] => 14
            [14] => 15
            [15] => 16
            [16] => 17
            [17] => 18
        )

)

模板中:
下一页 |
尾页

生成的静态页面中:
下一页的链接和1-18页的链接都是静态页面链接,可尾页的链接是动态的。

非常奇怪的是:
改为:
下一页 |
尾页
则尾页的链接就是静态的了,可关键是,此时 $pager.next_page 和 $pager.last_page 的值是相同的啊(都是18)

为何会如此呢?困惑很久了。

2010-04-25 23:48:08

#2 jake

同样继续生成尾页就好。

2010-04-26 08:58:58

#3 fengyu44

回复 2 jake


这是什么意思啊?

尾页在缓存链接文件中已经存在,尾页的静态页面也已经生成,但在前面页面(1-17页中)的尾页链接还是动态的。

就算再次生成一次(此时尾页的静态页已经存在),可在其他页面中,该尾页的链接还是动态的

2010-04-26 09:16:14

#4 jake

不明白你的问题是什么?

不过一般来说,做页码的时候,如果当前是最后一页,那么下一页和尾页都不会显示。正如当然是第一页,上一页和第一页也不会显示一样。这里首页要做个判断。

2010-04-26 09:24:53

#5 fengyu44

test.php


class test extends spController
{
        function index(){
                $o = spClass("test");
                $this->tvs = $o->spPager($this->spArgs('p', 1), 10)->findAll();
                $this->pager = $o->spPager()->getPager();
                $this->display("test.html");
        }
       
        function alist(){
                $urls = array();
                $o = spClass("test");
                $total = $o->findCount();
                $perpage = 10;
                $pagenum = ceil($total/$perpage);
                for($i = 1;$i <= $pagenum;$i++){
                        $urls[] = array(
                                array('test','index',array('p'=>$i))
                        );
                }
                spClass("spHtml")->makeAll($urls);
        }
}

test.html:

<{if $pager}>
共有<{$pager.total_count}>条,<{$pager.total_page}>页(每页<{$pager.page_size}>条):

<{if $pager.current_page != $pager.first_page}>
首页 |
上一页 |
<{/if}>

<{foreach from=$pager.all_pages item=thepage}>
        <{if $thepage - $pager.current_page >= -7 && $thepage - $pager.current_page <= 7}>
            <{if $thepage != $pager.current_page}>
                <{$thepage}>
            <{else}>
                <{$thepage}>
            <{/if}>
    <{/if}>
<{/foreach}>

<{if $pager.current_page != $pager.last_page}>
|
下一页 |
尾页
<{/if}>
<{/if}>

访问 index.php?c=test&a=alist
在生成的任一静态页面中(非尾页),可见只有尾页的链接是动态的?

麻烦版主了,不妨试一试,问题就清楚了。

2010-04-26 09:44:06

#6 jake

不是很明白,如果是spHtml函数出了问题,请把问题贴出来,我会在speedphp 3内修改,谢谢。

2010-04-26 12:12:54

#7 fengyu44

怎么说呢,最好就是麻烦版主把我上面的 test.php 放到自己的controller 目录下,并修改$o = spClass("test")为自己已定义的至少有11条数据的数据表,再把test.html 放到 tpl目录下,然后在浏览器输入http://域名/index.php?c=test&a=alist

再访问 http://域名/index.php?c=test&a=index  ,可以看到刚生出的页面中,只有尾页的链接是动态的。
如:

共有5389条,6页(每页1000条):


               1
                        2
                        3
                        4
                        5
                        6
         
|
下一页 |
尾页


test.rar

2010-04-26 12:40:46

#8 jake

问题找到了,的确是spHtml的问题,正在解决中。。。

2010-04-26 14:38:43

#9 fengyu44

那就好,我就怕是我自己程序的问题。

麻烦版主解决后能再回个帖,谢谢!

2010-04-26 14:42:19

#10 jake

呵呵,问题主要出现在PHP函数serialize本身会区分参数类型,而楼主你的代码中,两次使用p的参数的类型不一样导致的。

你可以这样处理,在test.php文件alist内,加上红色代码:
                for($i = 1;$i <= $pagenum;$i++){
                        $urls[] = array(
                                array('test','index',array('p'=>(string)$i))
                        );
                }
然后再删除缓存和静态文件,重新生成即可

2010-04-26 15:13:01

#11 fengyu44

根据版主的解决方式,重新生成后,所有的链接都是动态的了。

2010-04-26 15:44:13

#12 fengyu44

呵呵,问题主要出现在PHP函数serialize本身会区分参数类型,而楼主你的代码中,两次使用p的参数的类型不一 ...
jake 发表于 2010-4-26 15:13
这好像不是问题的关键吧,同样的定义,为何只有尾页的链接是动态呢?

2010-04-26 15:54:28

#13 jake

加上(string)是不行,序列化类型问题,我还是继续研究研究吧,抱歉了。。。

这是问题的原因,因为生成页面的时候,p是int,但是在页码的位置,last_page是string

2010-04-26 16:04:43

#14 fengyu44

呵呵,我还是不明白。
页码位置:
下一页 |
尾页

一个是 $pager.next_page,一个是 $pager.last_page ,其它都一样啊,难道这里 next_page 是int,last_page 是string ?

2010-04-26 16:22:25

#15 jake

呵呵,我还是不明白。
页码位置:
下一页 |
尾页

一个是 $pager.next_page,一个是 $pager.last_page ,其 ...
fengyu44 发表于 2010-4-26 16:22
呵呵,你猜对了。spPager返回的几个页码,的确是不同类型的。不过这个不是主要问题,主要问题是spHtml内的serialize函数。

2010-04-26 16:24:46

#16 fengyu44

查了 spModel.php 中:
$total_page = ceil( $total_count / $pageSize );
"next_page"   => ( ( $page == $total_page ) ? $total_page : ($page + 1)),
"last_page"   => $total_page,

两者应该都是int,尝试着强制类型转化: "last_page"   => (int)$total_page,
重新生成,所有页面都是静态的了,问题解决!

2010-04-26 16:26:05

#17 jake

呵呵,已经直接解决了,是用json_encode替代serialize函数,你目前可以打开spView.php文件,把全部的“serialize”替换成“json_encode”就可以。

这个改动也会在speedphp 3中加入,谢谢楼主!

2010-04-26 16:59:03