改过主题的人都知道在typecho中,Widget_Contents_Post_Recent可以很方便的调用侧边栏一定数量的博客最新文章列表,用pageSize控制列表的记录的数目,而且有三种书写方式。

<?php 
    $this->widget('Widget_Contents_Post_Recent','pageSize=10')->parse('<li><a href="{permalink}"><span>{year}/{month}/{day}</span>{title}</a></li>'); 
?>

<?php 
    $this->widget('Widget_Contents_Post_Recent','pageSize=10')->to($recent);
    if($recent->have()): //判断是否有记录
    while($recent->next()):
?>
<li><a href="<?php $recent->permalink();?>"><?php $recent->title();?></a></li>
<?php endwhile; endif;?>

<?php 
    $recent = $this->widget('Widget_Contents_Post_Recent','pageSize=10');
    if($recent->have()):
    while($recent->next()):
?>       
<li><a href="<?php $recent->permalink();?>"><?php $recent->title();?></a></li>
<?php endwhile; endif;?>


以上这些,都是被转载烂了的调用了,但这个调用实际上并不是很实用,以前为了实现侧边栏的丰富多彩,我搜索过很多资料,也看过很多主题作者写的代码,发现他们都是千篇一律地自己写数据库查询。

其实最好的查询方式,typecho已经告诉我们了,根本不用自己去想,我们可以搜索typecho var文件夹里的代码,例如上面查询就是位于 var/Widget/Contents/Post/Recent.php,通过查看代码:

class Widget_Contents_Post_Recent extends Widget_Abstract_Contents
{
    /**
     * 执行函数
     *
     * @access public
     * @return void
     */
    public function execute()
    {
        $this->parameter->setDefault(array('pageSize' => $this->options->postsListSize));

        $this->db->fetchAll($this->select()
        ->where('table.contents.status = ?', 'publish')
        ->where('table.contents.created < ?', $this->options->time)
        ->where('table.contents.type = ?', 'post')
        ->order('table.contents.created', Typecho_Db::SORT_DESC)
        ->limit($this->parameter->pageSize), array($this, 'push'));
    }
}

我们可以看到,这里他只定义了一个pagesSize的变量,而其它都是固定的查询,所以我们要改变他的查询方式只需要修改其它的固定查询即可,我们也不必动系统文件,只需要把这段代码复制粘贴到当前主题functions.php并改个名字就好。

例如:

class Widget_Contents_Post_sort extends Widget_Abstract_Contents
{
    public function execute()
    {
        $this->parameter->setDefault(array('pageSize' => $this->options->postsListSize, 'sort' => 'table.contents.created'));
        $this->db->fetchAll($this->select()
        ->where('table.contents.status = ?', 'publish')
        ->where('table.contents.created < ?', $this->options->time)
        ->where('table.contents.type = ?', 'post')
        ->order($this->parameter->sort, Typecho_Db::SORT_DESC)
        ->limit($this->parameter->pageSize), array($this, 'push'));
    }
}

这里我修改了他的排序,可以丰富的侧边栏
例如:
最近修改的文章排序:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=modified')

最多评论文章排序:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=commentsNum')

随机显示文章:$this->widget('Widget_Contents_Post_sort','pageSize=10&sort=RAND()')

使用方式就是开始我介绍的typecho默认的三种调用方法,只需要把$this->widget('Widget_Contents_Post_Recent','pageSize=10')换成我这个即可。

p.s. 这只是小试牛刀,var下还有很多强大的查询。