当我们在织梦dedecms 后台建立栏目后,在这个栏目下面点击“添加文档”,会列出一个界面(实际上是一个表单),然后添加内容,点击保存,文章(这里以文章模型为例子,其它的模型功能实现类似)就发布了,今天就分析这一系列功能织梦是如何实现的。 用到的文件:catalog_do.php,content_list.php,content_list.htm,article_add.php,article_add.htm,article_add.php,article_add.htm 用到的数据库表:dede_channeltype,dede_arctype 看似简单,我们用鼠标点二次,就可以发布一篇文章,其实,用到的知识非常多,有php知识、数据库知识、javalscript(包括jquery框架)、css、html等知识,虽然,简单的二个鼠标操作,但是用到了几乎所有的网站建设的知识,如果我们把这个流程分析透彻,那么,对织梦dedecms 特别是二次开发,会有很大帮助,而且可举一反三,虽然,这次分析的是一个文章模型,但大同小异,下面就让我们开始分析吧。 添加栏目后(我提前添加了一些文章,作为备用)会进入到如下图所示。 这个界面用到的模板是content_list.htm,界面对应的程序是content_list.php,因为今天我们分析“添加文档”功能,所以,content_list.php这个文件今天用不到,但是这个引入的模板文件content_list.htm我们要用到,我们打开这个模板文件,大约在22行,找到如下这样一段代码<input type='button' class="coolbg np" onClick="location='catalog_do.php?channelid={dede:global.channelid/}&cid={dede:global.cid/}&dopost=addArchives';" value='添加文档' />,我们重点看这段代码里面这一段catalog_do.php?channelid={dede:global.channelid/}&cid={dede:global.cid/}&dopost=addArchives,这一段里面的catalog_do.php文件是重点,这个php文件,是通过后面的条件,来 判断添加的文档是哪个模型,哪个栏目,并在catalog.do.php程序文件里面调用出相应的发布表单。 我们打开catalog_do.php这个文件,找到下面的段代码,如图所示。 找到if($dopost=="addArchives"),这个判断,里面的$dopost=="addArchives"与上面的catalog_do.php?channelid={dede:global.channelid/}&cid={dede:global.cid/}&dopost=addArchives最后那个条件dopost=addArchives,是不是相对应?是的,正是通过这个条件,跟这个判断,使catalog_do.php文件和content_list.htm模板文件关联起来,这是重点,也是织梦二次开发重点知识,不仅是织梦,其它cms也是这样应用的。 接下来,我们详细看一下增加文档这个函数function addArchives(),通过条件dopost=addArchives,我们进入到catalog_do.php文件后,程序就找到了函数function addArchives(),然后,程序判断如果是模型没有指定并且栏目也没有指定(这种情况是有的,如我们在后台左边菜单导航里面的“我发布的文档”,程序就是没有指定模型id和栏目id)时,点“添加文档”后,通过这段代码header("location:article_add.php"),调用调用默认文章调用发布表单;接下来假设模型id不空时,程序会通过查询数据库表dede_channeltype,查出一条记录并赋给变量$row,再通过这个段代码$gurl = $row["addcon"],取出对应的addcon的值赋给$gurl,这样我们可以通过重新定位功能代码header("location:{$gurl}?channelid={$channelid}&cid={$cid}"),来达到和前面的header("location:article_add.php")这句的功能,只不过在这次后面加上了二个条件而已。 我们看一下数据库表dede_channeltype里面对应的字段addcon就是添加文章、图片集,分类信息,软件等的添加处理程序,由此我们不难发现,只要我们把addcon的值取出来,再通过header定位功能,就可以实现当我们点击“添加文档”时,转到对应的内容的添加界面。 第三个判断,当模型id和栏目id都存在时,这次,只用数据库表dede_channeltype这个是不行的,因为,这个表里面没有字段cid,这个字段在数据库表dede_arctype这个里面,现在问题是我们要取到addcon的值,但表dede_arctype这里面又没有,而这个表又用到,怎么办呢?只能把这二个表用select 里面的左拼接查询出来,这个也简单。就是用的这句查询功能SELECT ch.addcon FROM `dede_arctype` tp LEFT JOIN `dede_channeltype` ch ON ch.id=tp.channeltype WHERE tp.id='$cid' ,如果有兴趣的可以研究一下。学过数据库的这个一看就明白,这样我们又把第三种情况对应的addcon值也查询出来的。这样对应的发布表单也调出来了。 接下来我们进入了“发布文章”界面(这里以第三种情况,即有模型id也有栏目id为例子),如下图所示。 这个界面是php程序article_add.php,调用模板article_add.htm的界面,这个界面在前面的教程中我们已经讲了,就是一个表单,我们打开模板article_add.htm,打到表单,前面三行代码如下: <form name="form1" action="article_add.php" enctype="multipart/form-data" method="post" onSubmit="return checkSubmit()"> <input type="hidden" name="channelid" value="<?php echo $channelid?>" /> <input type="hidden" name="dopost" value="save" /> 这三行代码是重点,首页第一行,我们不难看出只要我们点保存后,我们添加文章内容就会被传到article_add.php文件里,然后,这个文件里面的程序会把收到的数据,通过sql语句insert into插入到数据库,并保存,这一流程我们 在“织梦DEDECMS 后台添加顶级栏目详解”教程里面已经讲解了,这里不作多赘述。 第二行代码就是传递给article_add.php程序后,对应的条件,这个条件是在我们点击“添加文档”后自动从文件catalog_add.php获取的。最后一行是一个条件dopost=save,当我们提交后,表单数据会通过这个,寻找文件article_add.php里面对应的条件if($dopost=='save'),如果这个条件成立,就说明用户已经点击保存提交了,接下来就是把数据插入到数据库里面,保存到主表和保存到附加表。 接下来,程序就是对提交的数据生成html文档了,也就是我们打开网站看到的一篇篇文章,生成HTML功能我们会有专题,这里不作多讲解。 下面是对本次教程,一个简单的图示,帮助大家理解。 (责任编辑:最模板) |