专注于WEB技术的IT博客

ThinkPHP文章相关阅读功能的实现方法

时间:2013-01-06分类: Thinkphp浏览:6001
分享到:

我们在网上阅读文章时,当阅读完一篇感兴趣的文章时,还不够尽兴,还想阅读一些相关的文章,在文章的末尾往下看,就会发现相关阅读列出和本次阅读的文章相关的篇章,我们点击又可以阅读了,节省了搜索时间。在注重用户体验的设计方面来说,相关阅读功能肯定是少不了的。


实现相关阅读的方法很多,这里是根据相同标签的方法去列出相关的文章,其原理是文章的标签如果相同,那么它们的标签的ID也会相同,因此列出一篇文章的相关文章其实就是列出和其标签相同的文章。


好了,进入正题吧。准备两张关联的表wb_tagged和wb_news,具体数据如下:

-- ---------------------------- 
-- Table structure for `wb_tagged` 
-- ---------------------------- 
DROP TABLE IF EXISTS `wb_tagged`; 
CREATE TABLE `wb_tagged` ( 
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  `recordId` int(11) unsigned NOT NULL, 
  `tagId` int(11) NOT NULL, 
  `module` varchar(25) NOT NULL, 
  PRIMARY KEY (`id`), 
  KEY `module` (`module`) 
) ENGINE=MyISAM  CHARSET=utf8; 
   
-- ---------------------------- 
-- Table structure for `wb_news` 
-- ---------------------------- 
DROP TABLE IF EXISTS `wb_news`; 
CREATE TABLE `wb_news` ( 
  `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
  `title` varchar(80) NOT NULL DEFAULT '', 
  `status` tinyint(1) NOT NULL DEFAULT '0', 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  CHARSET=utf8;

注:wb_news表的ID关联wb_tagged表的recordId

接下来定义上面两张表的视图模型RelaNewsView,代码如下:

<?php 
class RelaNewsViewModel extends ViewModel { 
   
    public $viewFields = array( 
   
        'News'=>array('id','title','status'),//根据需求筛选news表的字段 
   
        'Tagged'=>array('tagId','recordId','_on'=>'Tagged.recordId=News.id'), 
      ); 
} 
?>

上面模型代码中,news和tagged的关联点是“_on'=>'Tagged.recordId=News.id'”,这是一个查询条件,在模型定义好后,在后面的查询语句中就不用再重复写这个条件了。
视图模型定义好,下面是相关阅读的查询语句方法,当然你可以使用sql语句来查询,这里我喜欢用ThinkPHP的视图模型来实现。

/* 
    *相关阅读 
    *$ModelName:模型名称 
    *$rid:文章ID 
    *$ViewName 视图模型名称 
    */
    public function relaread($ModelName, $rid, $ViewName) { 
   
         $tagId=M('Tagged')->field('tagId')->where(array ( 
            'module' => $ModelName, 
            'recordId' => trim($rid
        )))->getField('tagId');  //获取标签tagId  
           
        if ($relalist !== false) { 
   
            $map['tagId'] = $tagId; 
            $map['status'] = 1; 
            $map['id'] = array (//过滤本篇文章在相关文章列表列出 
                'neq', 
                $rid
            ); 
            $map['recordId'] = array ( 
                'neq', 
                $rid
            ); 
            $relalist = D($ViewName)->where($map)->order('id desc')->select();//相关阅读查询语句 
   
            return $relalist;//返回相关文章列表 
   
        } 
    } 
//最后,我们调用使分配到模板read.html 
    public function read($ModelName) {             
        if (empty ($_GET['id'])) $this->error404(); 
           
        $relalist=$this->relaread('News',$_GET['id'],'RelaNewsView')//在这里调用上面的relaread函数 
           
               $this->assign('relalist',$relalist );  
               }



        


猜你喜欢
ThinkPHP自定义模板标签详解
wblog3.1.3_2升级说明
ThinkPHP普通分组下Widget的使用
如何让ThinkPHP的模板引擎达到最佳效率
WBlog博客前台独立栏目页的实现方法
WB3.1.2_2版本使用说明
封装ThinkPHP的一个文件上传方法
ThinkPHP3.1.2整合UCenter详解(四)
ThinkPHP3.1.2整合UCenter详解(三)
ThinkPHP3.1.2整合UCenter详解(二)
标签 : thinkphp
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/66.html,谢谢。
  • 评论
  • 赞助本站