织梦二次开发

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 861|回复: 0

[共用功能] 织梦网站栏目管理“预览”功能分析上篇

[复制链接]

1046

主题

1109

帖子

5334

积分

超级版主

Rank: 8Rank: 8

金币
256
贡献
3959
发表于 2015-5-29 11:41:23 | 显示全部楼层 |阅读模式
本帖最后由 dedebase 于 2015-5-29 12:05 编辑

  由于这个功能涉及内容非常多,所以,分为上篇和下篇二个教程来分析。

  网站栏目管理的“预览”如下图所示。
QQ截图20150529093043.png

  可能很多用织梦的朋友对“预览”这个功能不了解,或者很少用到,就拿本人来说这个功能,平常很少用到,因为,我们建立好栏目后一般都是生成一下来看我们建立的栏目,其实,特别是在我们调试模板的时候,这个功能用处就比我们生成栏目来的快,至少少了生成这一步,因为是动态的,不用生成栏目。

  分析这个功能除了这原因之外,还有一个重要的原因是,在做二次开发的时候,我们经常要用到与之相关的预览文件list.php,这个才是我们做这个教程最重要的原因了。

  教程将以文章模型栏目为例子,我们先来看一下,当我们点击“预览”时,打开的栏目及连接。

  点击“网页基础”后面的“预览”,如下图所示。

   2.png

  我们打开了类似的链接:hppt://www.dedebase.com/plus/list.php?tid=1,从这个链接我们就可以看出,当点击“预览”时,我们调用了文件/plus/list.php,并且,传递了一个参数值为1的参数tid。可能有人会问这个链接又是哪里来的?

  其实,这个链接如果按我们正常想的话,应当在某一模板里面,然后,通过一个php文件处理后,通过模板显示出来,但是,这个链接比较特别,因为,他不在模板里面,而是在/include/typeunit.class.admin.php这个类库存文件里面,织梦官方称这个文件为“栏目单元,主要用户管理后台管理处”。

  在文件typeunit.class.admin.php里面有一个ListAllType($channel=0,$nowdir=0),在这个里面有这么一行代码
  1. echo "<a href='{$GLOBALS['cfg_phpurl']}/list.php?tid={$id}' target='_blank'>预览</a>";
复制代码

  如果比对一下上面的链接,我们发现是不是完全一样?是的,上面的那个链接正是这个链接生成的,到此,为止我们知道了上面那个链接是如何来的了。

  书归正传,我们知道了当点击“预览”时,程序会把一个值为1的参数tid传给文件list.php文件,这个值1就是“网页基础”这个栏目的id,知道这些,我们打开文件list.php,分析这个文件,这个才是本教程的重点。

文件list.php是栏目列表/频道动态页,我们一步一步分析。

  1. 引入一个coomon.inc.php文件,一般我们都要引入这个文件的。

  2. 定义二个变量$tid和$channelid 这二个变量的值要么是传递过来的值,例如,本例子中值为1,也就是链接传递过来的参数tid的值1,要么,$tid和$channelid的值为0。对这个二个变量赋值时,用了三元运算符号进行了运算,运算后的值赋分别赋给了这二个变量。

  3.
  1. if($tid==0 && $channelid==0) die(" Request Error! ");
复制代码
  1.     if(isset($TotalResult)) $TotalResult = intval(preg_replace("/[^\d]/", '', $TotalResult));
复制代码

  这二个if进行了判断,第一个条件判断是若栏目id和频道模型id都为零,停止执行程序并显示错误退出。第二个条件判断是如果设置了结果总数,则把总数里面的非数字全部替换为空,并赋值给变量$TotalResult,这个变量又是哪来的呢?其实,这个是分页列表类里面的一个记录条数,比如本例子中的列表页文章总数。

  4.下面又一个条件判断,代码如下

  1. if(!empty($channelid) && empty($tid))
  2. {
  3.     $tinfos = $dsql->GetOne("SELECT tp.id,ch.issystem FROM `#@__arctype` tp LEFT JOIN `#@__channeltype` ch ON ch.id=tp.channeltype WHERE tp.channeltype='$channelid' And tp.reid=0 order by sortrank asc");
  4.    
  5.     if(!is_array($tinfos)) die(" No catalogs in the channel! ");
  6.     $tid = $tinfos['id'];
  7. }
  8. else
  9. {
  10.     $tinfos = $dsql->GetOne("SELECT ch.issystem FROM `#@__arctype` tp LEFT JOIN `#@__channeltype` ch ON ch.id=tp.channeltype WHERE tp.id='$tid' ");
  11. }
复制代码

  这段代码其实就是对链接hppt://www.dedebase.com/plus/list.php?tid=1 问号后面的参数进行处理。分二种情况,一是当栏目id为空,也就是tid为空,而模型id即,channelid不为空时,进行处理。

当栏目id为空,模型id不为空时的处理:

  这是一个联合查询,假设模型id为1,select查询的条件是在栏目表dede_arctype里面,找到模型字段channeltype对应的值为1,并且,channeltype为1的模型对应的上栏目为0,即reid=0, 也就是说,这个查询的意思是:把这个内容模型的第一个顶级栏目作为频道默认栏目。

  这样解释感觉比较难懂,我们不如实验一下,例如:hppt://www.dedebase.com/plus/list.php?channelid=1 我们打开这个链接,如下图所示。
3.png

  大家发现没有?打开这个链接和打开hppt://www.dedebase.com/plus/list.php?tid=1是一样的,为什么?因为,上面咱们讲了,这个联合查询就是当tid为空时,把模型的顶级栏目作为默认栏目,而我们的例子以“网页基础”,而“网页基础”是channelid为1的模型,它对应的默认顶级栏目正是栏目id为1的栏目。故这二个链接对应的结果完全一样。

当栏目id不为空:这时就不管模型是不是空了,因为,栏目id是频道模型下面的子集,所以,如果一个栏目都有id了,说明,管理员在后台建立时,已经选择了对应的模型,所以,只要有栏目这个模型肯定有,这时,我们只需要查询出这个栏目id对应的issystem字段,即栏目对应的模型是不是系统模型即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|织梦二次开发

GMT+8, 2019-9-17 20:51 , Processed in 0.239166 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表