dedecms源码分析之文章列表arclist_lib.php
这个文件负责显示文章的列表。
包括GetArclistCache(),lib_arclist(),lib_arclistDone(),lib_GetAutoChannelID(),list_sort_by()五个函数。
这五个函数的调用关系是
lib_arclist()->lib_GetAutoChannelID ;
lib_arclist()->lib_arclistDone();
lib_GetAutoChannelID ->GetArclistCache ();
lib_GetAutoChannelID ->list_sort_by();
整个文件中 lib_arclistDone()函数体的代码最多最复杂,看起来很复杂,因为里面有很多的if语句。
lib_arclist()函数最先被调用,代码比较少,主要是做一些基本参数的判断和取值,为下面被调用的lib_arclistDone函数的形参列表做准备。这个函数里面有一个地方应该比较重要,可以决定什么时候调用什么模板。下面是代码。
if(trim($ctag->GetInnerText()) != '')
$innertext = $ctag->GetInnerText();
else if($tagname=='imglist')
$innertext = GetSysTemplets('part_imglist.htm');
else if($tagname=='imginfolist')
$innertext = GetSysTemplets('part_imginfolist.htm');
else
$innertext = GetSysTemplets("part_arclist.htm");
GetSysTemplets()函数是其他地方的函数,通过它可以获得相应的模板。这里只需知道它的功能,不去研究它怎么来的和具体怎么实现的。
需要的参数准备就绪以后,就开始调用lib_arclistDone函数了,lib_arclistDone函数做了绝大部分工作,最重要的是根据传进来的参数构成sql语句,然后使用dedesqli的 SetQuery,Execute方法从数据库里面取数据,然后根据调用的模板返回文章列表的字符串。这个文件也只有这个函数需要解释的。
回到lib_arclist()调用lib_arclistDone()的地方。
lib_arclistDone
(
$refObj, $ctag, $typeid, $ctag->GetAtt('row'), $ctag->GetAtt('col'), $titlelen, $infolen,
$ctag->GetAtt('imgwidth'), $ctag->GetAtt('imgheight'), $listtype, $orderby,
$ctag->GetAtt('keyword'), $innertext, $envs['aid'], $ctag->GetAtt('idlist'), $channelid,
$ctag->GetAtt('limit'), $flag,$ctag->GetAtt('orderway'), $ctag->GetAtt('subday'), $ctag->GetAtt('noflag'),
$tagid,$pagesize,$isweight
);
看到了吧,如此之多的参数,每个参数的具体含义我就不说了,源码注释里面有。
lib_arclistDone函数对这些参数进行了处理,比如$titlelen = AttDef($titlelen,30)是将标题限制在30 以内;$innertext = trim($innertext)是将显示文章列表的字符串去掉首尾空白。
接下来是设定sql语句的查询条件和排序方式。
此处省略若干字,实在没什么好讲的。我们直接看查询数据库的sql语句是什么样子
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
$addfieldsSql
FROM `$maintable` arc LEFT JOIN `jcode_arctype` tp on arc.typeid=tp.id
$addfieldsSqlJoin
$orwhere $ordersql $limitsql";
其中maintable在这里一般是archives这个表
然后执行这个sql语句:
$dsql->SetQuery($query);
$dsql->Execute('al');
到了lib_arclistDone的最后一个步骤了,就是讲文章列表结果保存在$artlist里面,我们只是研究代码的大概执行过程,所以这里只抓住一条主线,那就是一般文章列表的显示过程,artlist变量的赋值分为很多种情况,包括是否页数大于0的情况,分两栏显示的情况等,一般情况下,直接跳到for($i=0; $i<$line; $i++)这个大循环里面。
找到
$liststr = $dtp2->GetResult();
$artlist .= $liststr."\r\n";
GetResult()返回一篇文章的信息,具体内容跟你采用的模板有关。
到这一步,lib_arclistDone函数就基本结束了,后面的都是跟缓存什么的有关的。
包括GetArclistCache(),lib_arclist(),lib_arclistDone(),lib_GetAutoChannelID(),list_sort_by()五个函数。
这五个函数的调用关系是
lib_arclist()->lib_GetAutoChannelID ;
lib_arclist()->lib_arclistDone();
lib_GetAutoChannelID ->GetArclistCache ();
lib_GetAutoChannelID ->list_sort_by();
整个文件中 lib_arclistDone()函数体的代码最多最复杂,看起来很复杂,因为里面有很多的if语句。
lib_arclist()函数最先被调用,代码比较少,主要是做一些基本参数的判断和取值,为下面被调用的lib_arclistDone函数的形参列表做准备。这个函数里面有一个地方应该比较重要,可以决定什么时候调用什么模板。下面是代码。
if(trim($ctag->GetInnerText()) != '')
$innertext = $ctag->GetInnerText();
else if($tagname=='imglist')
$innertext = GetSysTemplets('part_imglist.htm');
else if($tagname=='imginfolist')
$innertext = GetSysTemplets('part_imginfolist.htm');
else
$innertext = GetSysTemplets("part_arclist.htm");
GetSysTemplets()函数是其他地方的函数,通过它可以获得相应的模板。这里只需知道它的功能,不去研究它怎么来的和具体怎么实现的。
需要的参数准备就绪以后,就开始调用lib_arclistDone函数了,lib_arclistDone函数做了绝大部分工作,最重要的是根据传进来的参数构成sql语句,然后使用dedesqli的 SetQuery,Execute方法从数据库里面取数据,然后根据调用的模板返回文章列表的字符串。这个文件也只有这个函数需要解释的。
回到lib_arclist()调用lib_arclistDone()的地方。
lib_arclistDone
(
$refObj, $ctag, $typeid, $ctag->GetAtt('row'), $ctag->GetAtt('col'), $titlelen, $infolen,
$ctag->GetAtt('imgwidth'), $ctag->GetAtt('imgheight'), $listtype, $orderby,
$ctag->GetAtt('keyword'), $innertext, $envs['aid'], $ctag->GetAtt('idlist'), $channelid,
$ctag->GetAtt('limit'), $flag,$ctag->GetAtt('orderway'), $ctag->GetAtt('subday'), $ctag->GetAtt('noflag'),
$tagid,$pagesize,$isweight
);
看到了吧,如此之多的参数,每个参数的具体含义我就不说了,源码注释里面有。
lib_arclistDone函数对这些参数进行了处理,比如$titlelen = AttDef($titlelen,30)是将标题限制在30 以内;$innertext = trim($innertext)是将显示文章列表的字符串去掉首尾空白。
接下来是设定sql语句的查询条件和排序方式。
此处省略若干字,实在没什么好讲的。我们直接看查询数据库的sql语句是什么样子
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
$addfieldsSql
FROM `$maintable` arc LEFT JOIN `jcode_arctype` tp on arc.typeid=tp.id
$addfieldsSqlJoin
$orwhere $ordersql $limitsql";
其中maintable在这里一般是archives这个表
然后执行这个sql语句:
$dsql->SetQuery($query);
$dsql->Execute('al');
到了lib_arclistDone的最后一个步骤了,就是讲文章列表结果保存在$artlist里面,我们只是研究代码的大概执行过程,所以这里只抓住一条主线,那就是一般文章列表的显示过程,artlist变量的赋值分为很多种情况,包括是否页数大于0的情况,分两栏显示的情况等,一般情况下,直接跳到for($i=0; $i<$line; $i++)这个大循环里面。
找到
$liststr = $dtp2->GetResult();
$artlist .= $liststr."\r\n";
GetResult()返回一篇文章的信息,具体内容跟你采用的模板有关。
到这一步,lib_arclistDone函数就基本结束了,后面的都是跟缓存什么的有关的。
下一篇:dede问答平台开发笔记
免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。
来源:网友投稿 关注:
时间:2018-03-21 09:11
☉首先声明,只要是我们的vip会员所有源码均可以免费下载,不做任何限制(了解更多)
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品织梦源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站织梦程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ进行交流。
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品织梦源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站织梦程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ进行交流。
相关织梦教程:
- 最好最实用的二次开发教程(dedeCMS,ecshop为例)
- Dede二次开发程序详解(dede学习必备一)
- dedecms制作Html+Css代码运行框jQuery版
- 织梦CMS二次开发列表AJAX按条件排序
- 织梦CMS二次开发不同栏目调用不同的模板教程
- dedecms 实现友情链接在首页、内页分别显示
- 如何加快dedecms 内容生成速度方法
- 如何使用DEDEcms/织梦制作复合筛选或联动筛选图解
- DEDECMS批量导入excel数据到后台文章系统的开发教程
- DEDECMS JSON数据生成 DEDECMS JSON接口制作
- 织梦DedeCMS禁止调用隐藏栏目下文章的开发方法
- dede地区联动搜索 彻底解决办法
常用程序开发
- 织梦Dedecms的channelartlist标签支持当前栏目高亮方
- DEDE5.6,DEDE5.7实现同时调用一级、二级、三级栏目
- 如何使用DEDEcms/织梦制作复合筛选或联动筛选图解
- dedecms 调用指定栏目,指定作者,指定自定义字段
- 织梦dedecms5.7标签tags静态化生成HTML方法
- dedecms 自定义表单分页+模版显示
- dedecms 二次开发调用当前作者文档的标签
- 织梦arclist标签实现分页的方法
- 织梦首页列表实现分页的两种方法
- DEDECMS会员空间调用收藏
- 在文章页直接调用dede织梦自定义字段图片地址
- 织梦dedecms首页列表页ajax点击下拉加载更多文章瀑布