解决Typecho下多个Widget的pageSize问题

in Tutorials with 15 comments

最近在开发Pinghsu主题,遇到了一个比较刺手的问题,就是调用Widget的Widget_Contents_Post_Recent时,如果一个页面下两次调用了这个,其pageSize参数值默认取这两次中的最大。

目前网上搜索是没有这个问题的解决方法,所以只能自己想,无所谓了,就自己想。

下面我讲一下我是怎么解决的。

那就写一个function函数去调用···

解决过程

在主题里的function.php页创建一个新的函数,叫getRecentPosts,如下

function getRecentPosts(){
}

给这个函数带两个参数,一个是用来传入当前对象,我们先叫obj如下

function getRecentPosts($obj){
}

好了,开始连接数据库并获取最近10篇文章的cid,如下

$db = Typecho_Db::get();
$rows = $db->fetchAll($db->select('cid')
   ->from('table.contents')
   ->where('type = ? AND status = ?', 'post', 'publish')
   ->order('created', Typecho_Db::SORT_DESC)
   ->limit(10));

获取到文章的cid之后,就好办了,套个循环,逐个去做解析,如下

foreach($rows as $row){
    $cid = $row['cid'];
    $apost = $obj->widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);
    $output = '<li><a href="'.$apost->permalink .'">'. $apost->title .'</a></li>';
    echo $output;
}

然后整理一下,最终如下

function getRecentPosts($obj){
    $db = Typecho_Db::get();
    $rows = $db->fetchAll($db->select('cid')
       ->from('table.contents')
       ->where('type = ? AND status = ?', 'post', 'publish')
       ->order('created', Typecho_Db::SORT_DESC)
       ->limit(10));
    foreach($rows as $row){
        $cid = $row['cid'];
        $apost = $obj->widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);
        $output = '<li><a href="'.$apost->permalink .'">'. $apost->title .'</a></li>';
        echo $output;
    }
}

然后在我们需要的地方加入一段代码就可以执行了,如下

<?php getRecentPosts($this); ?>

优化函数

感觉这样用起来不方便,我们再加一个pageSize参数用来控制最近文章的数目,修改如下

function getRecentPosts($obj,$pageSize){

    省略···

    ->limit($pageSize));

    省略···

}

好了,水了那么多,最终的代码是这样的,如下

function getRecentPosts($obj,$pageSize){
    $db = Typecho_Db::get();
    $rows = $db->fetchAll($db->select('cid')
       ->from('table.contents')
       ->where('type = ? AND status = ?', 'post', 'publish')
       ->order('created', Typecho_Db::SORT_DESC)
       ->limit($pageSize));
    foreach($rows as $row){
        $cid = $row['cid'];
        $apost = $obj->widget('Widget_Archive@post_'.$cid, 'type=post', 'cid='.$cid);
        $output = '<li><a href="'.$apost->permalink .'">'. $apost->title .'</a></li>';
        echo $output;
    }
}

用法和上面的几乎一样,只是多了个参数,如下

<?php getRecentPosts($this,10); ?>

测试

好像没什么好测,在有Widget_Contents_Post_Recent的页面下调用这个函数,不再发生pageSize的取最大值的问题了。

至此,问题已经解决。

如果遇到其他多个WidgetpageSize的问题,这篇教程应该可以帮到你。

Responses
  1. 很久没过来了,新主题很不错

    Reply
    1. @benzBrake

      谢谢,欢迎访问😄

      Reply
  2. lonelypers

    主题狠漂亮

    Reply
    1. @lonelypers

      谢谢,😜 😜

      Reply
  3. 可以给我用你现在博客所用的?太喜欢了;需要可以赞助

    Reply
    1. @timez

      你还是等等吧,好几个功能还未加上,logo自定义什么的都还未做。

      Reply
  4. 不放便说,写在这里了http://timez.me/index.php/archives/12/

    Reply
    1. @timez

      你等我搞掂了新主题,开源了,你再用我新主题就可以。

      Reply
  5. 页面会不会太白了~看久了眼睛累

    Reply
    1. Chakhsu
      @拾叁

      解决了,你看一下如何。

      Reply
      1. @Chakhsu

        博主 还有一个问题,算是Bug吧,手机端展开菜单后无法关闭菜单

        Reply
        1. @拾叁

          这个,其实整个header都是css实现的,关于这个问题我还在查找方法,如果实在不行可能就直接用js实现了。😕

          Reply
  6. 主题好看,装完首页文章xian浮图怎么实现xian浮

    Reply
    1. @timez

      浮现什么?

      Reply