代码里可以搜到推荐位初始化是通过config
表里的DOCUMENT_POSITION
来初始化的,有三个位置
1:列表推荐 2:频道推荐 4:首页推荐
可以继续添加推荐位
http://localhost:8080/index.php?s=/Admin/Config/edit/id/11.html
以2进制递增,下一个就是8,为什么呢?
通过下面的代码可知,是通过位运算来确定,所以是二进制递增。
function check_document_position($pos = 0, $contain = 0){ if(empty($pos) || empty($contain)){ return false; } //将两个参数进行按位与运算,不为0则表示$contain属于$pos $res = $pos & $contain; if($res !== 0){ return true; }else{ return false; } }
如何取出推荐位的数据呢?
D('Document')->position(4,null,10);
// path Application/Home/Model/DocumentModel.class.php /** * 获取推荐位数据列表 * @param int $pos 推荐位 1-列表推荐,2-频道页推荐,4-首页推荐 * @param int $category 分类ID * @param int $limit 列表行数 * @param bool $filed 查询字段 * @return array 数据列表 */ public function position($pos, $category = null, $limit = null, $field = true){ $map = $this->listMap($category, 1, $pos); /* 设置列表数量 */ is_numeric($limit) && $this->limit($limit); /* 读取数据 */ return $this->field($field)->where($map)->select(); }
private function listMap($category, $status = 1, $pos = null){ /* 设置状态 */ $map = array('status' => $status, 'pid' => 0); /* 设置分类 */ if(!is_null($category)){ if(is_numeric($category)){ $map['category_id'] = $category; } else { $map['category_id'] = array('in', str2arr($category)); } } $map['create_time'] = array('lt', NOW_TIME); $map['_string'] = 'deadline = 0 OR deadline > ' . NOW_TIME; /* 设置推荐位 */ if(is_numeric($pos)){ $map[] = "position & {$pos} = {$pos}"; } return $map; }
也就是说在sql里面也是使用的按位与。
在文章数很大的情况下,相比这种方式不是太高效。