织梦预处理函数PreLoad()

admin2023-01-181039

函数作用:对config参数及get参数等进行预处理
所在文件:include/dedetemplate.class.php
这里说的预处理指的预先处理,相对于显示而言,预先处理。因为,都已经获取列表页数据和获取分页导航列表了,所以,这里指在显示以前进行预先处理,这个我们可以通过分页类里面的显示数据代码:    

    //显示数据
    function Display()
    {
        $this->PreLoad();

        //在PHP4中,对象引用必须放在display之前,放在其它位置中无效
        $this->tpl->SetObject($this);
        $this->tpl->Display();
    }

通过这段代码我们就知道,其实,这段代码也不难。
分析代码:
1.处理页码pageno和总共记录数$totalresult,若页码为空或不是数据则把页码设置为1,若总的记录数为空或不是数字则把记录数设置为0。
2.有时候我们会在模板里面通过{dede:config name="pagesize" value="20" /} 来设置每页显示的大小,这个函数的作用之一就是处理这个config设置的参数。所在,在这里处理一下这个config参数,因为,config参数存在在了$this->tpCfgs数组里面。
为了证明我们配置的参数存放在$this->tpCfgs里面我们做个实验如下:
我在content_list.htm模板文件里面加入如下标签:{dede:config name="www.dedebase.com" value="织梦基地" /},这样就会在data/tplcache/文件夹里面生成缓存文件index_fd491768bbe8b2f208d6e5d8_config.inc。如下图所示。

我们打开里面的内容如下所示:

<?php
$this->tpCfgs['www.dedebase.com']="织梦基地";
?>

这就说明我们通过config配置参数后,都存放到了$this->tpCfgs数组里面了。
如何写入缓存文件的?这个是通过模板引擎里面的WriteCache($ctype='all')这个函数写入的如下图所示。

走的远了,回到本教程分析的函数来。
判断一下是不是已经设置了$this->tpl->tpCfgs['pagesize']),当然,上面我们是以把变量设置为www.dedebase.com,因为是举个例子,所以,正常应当设置标签是:{dede:config name="pagesize" value="20" /},这里面随便设置,因为是分页,就用这个分析标签来做示例吧。
若设置了这个标签的pagesize就把这个作为每页显示的大小,从这里我们可以得出如下结论:
若在模板中设置了{dede:config name="pagesize" value="10" /}这个标签,也就是设置了pagesize大小,跟在这个织梦模板对应的php文件里面设置了pagesize大小,在分页类里面设置了pagesize大小,那个优先级最高?
与模板最近的优先级最高,也就是在模板设置的pagesize最终决定每页显示多少条记录。
我们做个实验:
因为在分页类里面默认的pagesize=25,所以,我们在content_list.php里面设置pagesize=20,看看是显示20条还是显示25条。
效果如下图所示:

360截图20200110210135005.jpg

从图中我们得知道,显示的是20条,这就说明是content_list.php会覆盖掉分页类默认的25。
现在我们在模板content_list.htm里面加入{dede:config name="pagesize" value="10" /}这个标签。也就是pagesize=10,我们再看一下效果如下图所示。

360截图20200110210135005.jpg

显示10条这说明config配置的优先级最高,也就是在织梦模板里面的config配置优先级最高。
这就是为什么函数PreLoad()预先处理要放在显示的前面进行了。
接着分析PreLoad()这个函数,这时我们得到了$this-pageSize,然后,用总记录数$this->totalResult除以$this-pageSize得到的值,向上取整,就是总共页数,这也是分页里面的最核心的代码之一。
若$this->totalResult==0,即,没有取出记录,那么,我们就重新取出记录,这个条件里面的代码看上去比较复杂似的,但实际上就是比较简单,就是把设置的sql语句里面的select替换成SELECT COUNT(*) AS dd FROM,把排序,替换为空后,查询总的符合$this->sourceSql里面条件的记录总数。然后,拼接一下$this->sourceSql。否则,另外拼接这个sql语句。

网友评论