织梦二次开发

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

织梦后台添加顶级栏目之列出栏目添加表单功能分析

[复制链接]

1046

主题

1109

帖子

5334

积分

超级版主

Rank: 8Rank: 8

金币
256
贡献
3959
发表于 2015-8-13 12:10:43 | 显示全部楼层 |阅读模式
  添加栏目指的是:核心——>网站栏目管理——>添加顶级栏目,如下图所示。

添加顶级栏目

添加顶级栏目


  当点击“添加顶级栏目”按扭后,就会列出如下图所示表单。

添加顶级栏目后

添加顶级栏目后


  本教程就是分析这个功能,如果熟悉的朋友肯定觉得是不是比较简单,就是建立一个文件然后,引入模板搞定,是的,这个功能的实现就是这样做的,但是,具体的里面一些小知识如果不认真去研究,你会发现还不好理解,这也是做这个教程的一个重要原因。

  实现这个功能用到的二个文件分别是:栏目添加文件catalog_add.php 和栏目添加模板文件catalog_add.htm 。

  在我们做织梦二次开发的时候,一般设计一个功能,用到的至少这二个文件,模板文件内容一般就是一个表单,当然,里面也有很多有可能用到的js,jquery等,若有必要还有一些php代码,若是查询类的,则一般用织梦标签来代替php代码。

  若是在模板里面用php代码,那么,一般情况下都是在对应的php文件里面处理好的,这样说有点抽象,一会你就会理解我这里说的。
  虽然,我们设计时先设计模板,再根据模板进行代码编写,但是,在我们去研究这个功能时,我们先要从php代码分析开始或是二个文件一块分析。

  打开这个添加栏目php文件catalog_add.php, 当我们点击“添加顶级栏目”按扭时,实际上是执行的catalog_add.php?listtype=all 也就是把一个参数传递到了这个文件里面,只有这一个参数。知道了这一点我们再分析代码。

代码分析开始:

  1. 引入配置文件,这是必须的,只要是操作后台一般都引入这个文件;引入栏目连接类文件typelink.class.php ,因为,添加栏目,肯定要用到这个类中的相关功能。

  2. 处理参数,正常情况下应当只处理listtype这个参数,但是,这个文件里面处理了比较多的变量,如下图所示。
3.png
  为什么处理这么多东西?这是因为,不仅在打开“添加顶级栏目”按扭时要处理一些基本的东西,当填写完表单,点击“确定”后,也要使用一些基本设置,所以,这里我们会看到很多初始化设置。也就是说这个文件catalog_add.php多次使用,所以,在我们设计这个php文件时,把共公的变量或分共要处理的内容放到最前面,不要放在具体的if条件里面,这样就不用重复设置多次,减少代码冗余。

  在上面的代码里面把默认的模型id设置为1,也就是文章模型,模型识别id为article,当然也是文章模型识别id。

  处理$id 若为空置为0,否则,强制转换成整数,上级栏目id也是这样的处理方法,为什么要用intval($id)来处理的,当然,添加顶级栏目这个$id为0,不用处理,但是,当添加子栏目时,这个就要这样处理,如果我们传递的参数不是一个整数,这时就会出错,所以,这里强制转换成整数。

  3. 当$id=0并且$reid=0时,指的是添加顶级栏目,这时就是检查一下你有没有权限添加顶级栏目,代码为:CheckPurview('t_New');

  检测权限是非常重要的,假设我们设定的一个发布员,他没有添加栏目的权限,如果不检查,那么,有可能使系统处理危险之中,一个成熟的系统,必须做这个处理。

  当上面$id或$reid任何一个存在值时,表示添加子栏目,当然也要检测一下有没有添加子栏目权限,代码为:
  1. CheckPurview('t_AccNew');
复制代码
再检查这个用户有没有操作某个栏目的权限,代码为:CheckCatalog($checkID, '你无权在本栏目下创建子类!');

  4. 查询模型表里面的数据,并组装成数组,这也是为模板catalog_add.htm 里面调用数组作准备,代码为:

  1. $dsql->SetQuery("SELECT id,typename,nid FROM `#@__channeltype` WHERE id<>-1 AND isshow=1 ORDER BY id");
  2. $dsql->Execute();
  3. while($row=$dsql->GetObject())
  4. {
  5.     $channelArray[$row->id]['typename'] = $row->typename;
  6.     $channelArray[$row->id]['nid'] = $row->nid;
  7.     if($row->id==$channelid)
  8.     {
  9.         $nid = $row->nid;
  10.     }
  11. }
复制代码

  这段代码查询除了“专题”以外的所有模型id、模型名称和模型识别id 。查询出来后,组装成一个数组$channelArray,这个数组存储的是类似
  1. array(1=>array('typename'=>'普通文章','nid'=>'article'),2=>array('typename'=>'图片集','nid'=>'image'))
复制代码
这样的二维数组,这里只写出一部分来,正常是织梦系统里面的所有模型。

  当查询出来的模型id跟默认的$channelid相等时,就把查询出来的模型识别id赋给$nid,这里为什么要这样处理?因为,在模板中要使用。

  代码一直到这里是公共部分,当们点击“添加顶级栏目”时,此时,$dopost为空,所以,程序一下了跳到最下面的从if($dopost=='')开始执行这里面的代码,代码如下。
4.png
  实际上这段代码里面又分为二部分,一部分是公共部分:

  1.     $channelid = 1;
  2.     $issend = 1;
  3.     $corank = 0;
  4.     $reid = 0;
  5.     $topid = 0;
  6.     $typedir = '';
  7.     $moresite = 0;
  8. $moresite = empty($myrow['moresite']) ? 0 : $myrow['moresite'];
复制代码
第二部分就是当$id>0时,这部分代码,实际这个条件若成立,则表示是添加子栏目,所以,添加顶级栏目实例上是进不了这个条件里面的。好了,到此,当点击“添加顶级栏目”按扭后,php文件处理好了模板里面要使用的相关代码了,现在让我们再去分析一下添加栏目模板catalog_add.htm吧。

  5.打开这个模板文件,找到下面二行代码:

  1.   <input type="hidden" name="reid" id="reid" value="<?php echo $id; ?>" />
  2.   <input type='hidden' name='topid' id='topid' value='<?php echo $topid; ?>' />
复制代码
当程序执行到这二行代码后,就会把相对的php代码解析成对应的值,因为$id和$topid的值都为0,所以,这二个input里面的值value的值都为0 。这个我们在教程一开始就解释了,传到catalog_add.php里面的参数只有一个listtype=all,$id为0而这个$topid是在if($dopost=='')代码里面设置的为0,这二点非常重要。

  因为,只有顶级栏目才能绑定域名设置多站点支持,所以,只有当$id>0,才添加隐藏域,这个有点不好理解。

  因为,顶级栏目有绑定域名文件本和支持多站点单按扭,但是,添加子栏目时,并没有这个,所以,当$id>0也就要添加子栏目,所以,这里要添加下面三个隐藏域。代码如下:
5.png
  6. 是否支持投稿,代码如下:

  1.                 <input type='radio' name='issend' value='0' class='np' <?php if($issend==0) echo " checked='checked' ";?> />
  2.               不支持&nbsp;
  3.               <input type='radio' name='issend' value='1' class='np' <?php if($issend==1) echo " checked='checked' ";?> />
  4.               支持
复制代码
这里面的判断比较有意思,刚开始一看感觉像是哪里有问题,其实,是没有理解,if($issend==0)时,显示为选中,当if($issend==0)时,显示为选中,这里面其实是通过一个变量$issend来判断选中哪个,因为,$issend只有一个值,必然只有一个选中,这也正好符合单选按扭特点,一次只能选中一个,这是一个小技巧,以后在织梦模板里我们也可以做类似的功能。

  7. 内容模型的遍历,代码如下:

  1.            <select name="channeltype" id="channeltype" style="width:200px" onChange="ParTemplet(this)">
  2.             <?php
  3.             foreach($channelArray as $k=>$arr)
  4.             {
  5.                 if($k==$channelid) {
  6.                     $nid = $arr['nid'];
  7.                     echo "    <option value='{$k}' selected>{$arr['typename']}|{$arr['nid']}</option>\r\n";
  8.               }
  9.               else
  10.               {
  11.                     echo "    <option value='{$k}'>{$arr['typename']}|{$arr['nid']}</option>\r\n";
  12.           }
  13.             }
  14.             ?>
  15.               </select>
复制代码
看这个foreach里面$channelArray 这个数组,这正是在catalog_add.php文件里面组装成的数组,看在这里就用到了吧。

  当$k==$channelid时,里面的$k为模型id,而$channelid 就是默认设置的模型id,也就是1,所以,为什么我们建立顶级栏目时,内容模型自动显示为文章模型而不是其它模型,就是这里起作用。而当我们添加子栏目时,这时$id就大于0,根据这个id查询栏目表#@__arctype里面的channeltype字段,也就是$channelid的值,同样是这段代码,若$k==$channelid时,内容模型显示的是这个id对应的模型,也是这个道理。

  浏览权限的处理跟这个类似,if($corank==$row->rank)时,当前选择是选中,这里面$corank=0,这是在php文件里面设置的,这说明当有开放浏览栏目时,为选中状态。模板里面其它的php代码都比较简单,这里就不用多解释了。

总之:模板里面的php代码,都是通过对应的php文件处理好,再在模板里面调用,但是,这也不完全是这样,模板里面完全可以去操作其它php代码,这也是正确的。但是,能在php文件里面操作的请不要在模板里面,这是基本原则,要不又回到了原来的html与php混编的年代了。
回复

使用道具 举报

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

本版积分规则

QQ|织梦二次开发

GMT+8, 2019-10-18 02:08 , Processed in 0.250808 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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