获得最差或最好的踩踩文章函数GetSortArc()

admin2020-01-131177

这个函数算是比较生僻的了,如果我们个人的话,一般用不到,即使你使用织梦系统的全部功能,也只用到一次就是在踩踩里面,如下图所示。

53KF20200113101428307.png

不过织梦基地地专业研究织梦内容管理系统的,所以,不管这个功能用过几次,织梦基地都学习研究一下,在织梦系统里用过一次,但是,可能在我们在做织梦二次开发的时候就能用到这个函数处理问题的方法,这才是织梦基地去研究每一个函数的原因。

函数名: GetSortArc($atts, $refObj='', $fields=array())

参数:有三个参数,第一个$atts是数组,第二个是$refObj 对象,最后一个$fields 是字段。

返回值:返回一个数组

所在文件:/include/arc.caicai.class.php

代码分析开始:

1.前三行分别处理显示的条数,按照什么排序和排序方式,代码如下:

        $arcrow = (empty($atts['row']) ?  12 : $atts['row']);
        $order = (empty($atts['order']) ? 'scores' : $atts['order'] );
        $orderway = (empty($atts['orderway']) ? 'desc' : $atts['orderway'] );

看到这里对于研究过织梦动态模板的朋友来说,是不是感觉这个函数有点像是一个include/tpllib/里面的动态模板函数的感觉,或者是像模板引擎里面的处理标记的函数似的,正常情况下这个类中是不处理这个的,但是,这踩踩是一个比较特殊的类,特殊在哪里,一是它用的比较少,就是在踩踩中使用,不像动态分页类那样使用广泛,再一个就是这个类处理的方法也与其它的不一样,这使得这个函数看起来“干的活”更多。

2.设置一个查询语句:按照阅读权限大于-1,-1是需要审核的,这个查询就是排除掉要审核的,查询出limit 0,$arcrow 条数据。这里的$arcrow就是上面定义的,也就是在我们的织梦动态模板里面定义的标签属性值,例如{dede:list row=20} 这里$arcrow的值就20。

3.定义一个缓存文件:$cacheFile = DEDEDATA.'/cache/caicai_'.md5($query).'.inc',当我们在会员中心打开踩踩时,在这个缓存文件里面会把相应的查询出来的文件id存储到这个缓存文件里面。这里以md5($query)加密,也就是以md5加密,因为$query里面$atts['order']值在这里是变化的,所以,md5($query)出来的值是不一样的,也就是生成的缓存文件明不一样。

定义一个缓存文件标志:$needCache = false;也就是当需要缓存时,才要缓存,什么时候缓存文件?下面的判断就告诉我们。

4.下面这段代码,其实就是判断什么时候缓存文件,若缓存过了就把缓存标志设置为true 这个代码判断如下:

        //py:www.dedebase.com
        if(file_exists($cacheFile) && filemtime($cacheFile)-time() < $this->arcCacheTime)
        {
            $fp = fopen($cacheFile, 'r');
            $ids = fread($fp, filesize($cacheFile));
            fclose($fp);
            $ids = trim($ids);
            if( !empty($ids) )
            {
                $query = "SELECT arc.*,tp.typedir,tp.typename,
              tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
          FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON tp.id=arc.typeid
          WHERE arc.id in($ids) ORDER BY arc.{$order} $orderway ";
            }
        }
        else
        {
            $needCache = true;
        }

若缓存文件已经存在且缓存文件修改时候要小于当前时间加3600秒,也就是要保证缓存文件是最新的,最旧也不会超过1小时。若符合这个条件,则执行缓存读取操作。

举例说明:当我们打开踩踩文件时,如最上面的图示中所示,程序会在data/cache/文件里面建立三个文件,这三个文件如下图所示。

53KF20200113101557624.png

在这三个文件里面有几行数字,如下所示:

1,2,3,4,5,6,7,8,9,10,11,12

98,74,73,79,75,92,95,97,96,90,78,83

98,74,73,79,75,92,95,97,96,90,78,83

这三行数字,就是我们打开踩踩时,查询出来的id,也就是这三行数字对应着下图中的三个功能。

image.png

这样每当一个功能进行调用函数GetSortArc()时,执行到这个地方时,就会判断一下这个对应的缓存文件是否存在,若符合上面的条件,则把这个缓存文件里面的一串数字读取出来放到$ids里面。然后,判断$ids是不是空,如果不是空,则查询文章id 在$ids里面的文章,也就是重新设置sql语句。

若缓存文件不存在,就设置缓存标志位为true,这样做的目的就是在下面判断是写入缓存用的。

5.$this->dsql->Execute('cai',$query);执行查询,这里面的$query有二种情况,有一种是缓存文件还不存在的情况,若是这种情况,那么,就直接使用第一个$query,查询出模板标签里面定义的row的条件,并且,按照$atts['order']进行排序。若是第二个$query也就是缓存文件存在,直接从这个缓存文件查询对应的id文章。这二个$query的区别是第一个条件范围要大,而第二个则直接从这个缓存文件里查,范围大大缩小。

接下来就通过:while($arr=$this->dsql->GetArray('cai'))来处理查到的结果,例如,文章的标题、文章的图片、文章链接等,然后,组装成二维数据$rsArray里面。

6.写入缓存文件,若是缓存文件不存在且$ids(这个是查出来的文章id构成的数组)的值大于零,那就把这些id拆分成字符串,然后,放入到缓存文件里面。

这样就生成了缓存文件并且放在了/data/cache/ 里面,函数到此结束。

从上面的分析可以看出,这个函数做的就是:通过$atts['order']的值,来查询对应的文章id,并把id缓存到文件夹/data/cache/里面,然后,返回一个二维数组,这样就实现了获得最差或最好的踩踩文章。最后,这一句话是这个函数最精华,也是一种处理问题的方法,我们研究函数的目的就是研究处理问题的方法,为我们以后程序开发或用织梦系统二次开发服务。


网友评论