周梦康 发表于 2016-09-04 1692 次浏览 标签 : OneThink

代码里可以搜到推荐位初始化是通过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里面也是使用的按位与。

在文章数很大的情况下,相比这种方式不是太高效。

评论列表