网友要求写一个随机获取一篇文章的功能接口。
这对于我而言实在太简单了。。。
废话不多说,直接上教程。
写教程之前,还是要跟大家说一下二次开发的流程:
1 选择一种二次开发的方法( 控制器覆盖 or 控制器方法钩子 【插件开发之控制器方法覆盖 | 极致CMS帮助文档】)
这次我就选用【控制器方法钩子】的方式二开。
2 熟悉功能所需要的技巧
查询数据库,随机获取一条数据的方法,支持多种查询,相关的表有哪些
下面上手来做:
1 在app/home/plugins/下面创建一个文件HomeController.php
写入下面代码:
namespace app\home\plugins;
use frphp\extend\Page;
use app\home\c\CommonController;
class HomeController extends CommonController
{
public function getRandData(){
}
}
2 写相关的功能
随机获取一条内容:
$one = M('article')->find('isshow=1','rand()');
//或者 $one = M()->findSql(' select * from jz_article where isshow=1 order by rand() limit 1');根据栏目随机获取一条内容:
$tid = 1;//这里设置栏目ID
$biaoshi = $this->classtypedata[$tid]['molds'];//获取模型标识-表名称
$one = M($biaoshi)->find('isshow=1 and tid='.$tid,'rand()');随机获取 N 条内容:
$tid = 1;//这里设置栏目ID
$num = 2;//这里设置条数
$biaoshi = $this->classtypedata[$tid]['molds'];
$lists = M($biaoshi)->findAll('isshow=1 and tid='.$tid,'rand()',null,$num);根据推荐字段jzattr查询内容
$tid = 1;//这里设置栏目ID $num = 2;//这里设置条数 $jzattr = 1;//推荐属性:1置顶2热点3推荐 $biaoshi = $this->classtypedata[$tid]['molds']; //表中存储的数据如:,1, 或者 ,1,3, 那么查询的时候就要使用like来查询 $sql = "isshow=1 and tid=".$tid." and jzattr like '%,1,%' ";//注意使用双引号 $lists = M($biaoshi)->findAll($sql,'rand()',null,$num);
结合上面的内容,我们写道方法里面:
public function getRandData(){
$tid = $this->frparam('tid');//这里设置栏目ID
$num = $this->frparam('num');//这里设置条数
$jzattr = $this->frparam('attr');//推荐属性:1置顶2热点3推荐
//这里需要对每个参数进行判断,如果有参数则进行处理,如果没有则给一个默认或者不筛选
$sql = " isshow=1 ";//必须显示的才输出
if($tid){
$sql .= " and tid=".$tid;
$biaoshi = $this->classtypedata[$tid]['molds'];
}else{
$biaoshi = 'article';
}
if($jzattr){
$sql .= " and jzattr like '%".$jzattr."%' ";
}
// 给默认值1条
if(!$num){
$num = 1;
}
$lists = M($biaoshi)->findAll($sql,'rand()',null,$num);
JsonReturn(['code'=>0,'data'=>$lists,'msg'=>'success']);
}ok,完成。
请求链接为:
http://域名/home/getRandData?tid=1
http://域名/home/getRandData?tid=1&num=2
http://域名/home/getRandData?tid=1&num=2&attr=1

总结:还是挺简单的,主要还是看基础吧,懂一点数据库知识。
后续:有人可能会疑惑,为什么我顶级栏目id传进去,没法输出子栏目的数据?因为查询的时候没用查询子栏目,所以这里需要处理一下。
//$sql .= " and tid=".$tid;
//获取当前栏目和子栏目的数据,对这个数据陌生的,可以参考:classtypedata数据格式 | 极致CMS帮助文档
$ids = $this->classtypedata[$tid]['children']['ids'];
$sql .= " and tid in(".implode(',',$ids).")";如何限制显示字段?
$lists = M($biaoshi)->findAll($sql,'rand()','id,title,keywords,body,hits',$num);
