织梦怎么控制网址中Get参数键值,由函数SetParameter()实现
函数名:SetParameter($key,$value)
功能:设置网址的Get参数键值
所在文件:动态分页类文件datalistcp.class.php
源代码:
function SetParameter($key,$value) { $this->getValues[$key] = $value; }
本帖最后由 dedebase 于 2016-9-13 08:14 编辑
函数名:SetParameter($key,$value)
功能:设置网址的Get参数键值
所在文件:动态分页类文件datalistcp.class.php
源代码:
function SetParameter($key,$value)
{
$this->getValues[$key] = $value;
}
复制代码
这函数代码其实,非常简单,但是,这个函数的功能确非常强大,而且,不好理解,基于这二点,我就以实例来分析一下这个功能的作用。
我们知道表单form的提交方法分为二种,一种是post,一种是get。一般我们都用post,但是,有时候就要用get方式了,例如,如下图所示的搜索功能(这个搜索功能是点击“我发布的文档”后,在最下面的搜索功能),就要用到get方式。
get方式是在浏览器中传递参数,类似:http://www.xxx.com/dede/content_list.php?mid=1,如下图所示。
这个就是点击“我发布的文档”时,显示的内容,在这个content_list.php后面跟着一个问号?,有一个参数mid=1。这就是get参数值值形式。
第一幅图中的“搜索功能”对应的html代码(在模板文件content_list.htm里面)如下所示:
<!-- 搜索表单 --> <form name='form3' action='content_list.php' method='get'> <input type='hidden' name='dopost' value='listArchives' /> <table width='98%' border='0' cellpadding='1' cellspacing='1' bgcolor='#cfcfcf' align="center" style="margin-top:8px"> <tr bgcolor='#EEF4EA'> <td background='images/wbg.gif' align='center'> <table border='0' cellpadding='0' cellspacing='0' height="32"> <tr> <td width='160'> <select name='cid' style='width:150px'> <option value='0'>选择栏目...</option> {dede:global.optionarr /} </select> </td > <td nowrap> 关键字: </td> <td width='130'> <input type='text' name='keyword' value='{dede:global.keyword/}' style='width:120px' /> </td> <td width='90'> <select name='orderby' style='width:80px'> <option value='id'>排序...</option> <option value='pubdate'>更新时间</option> <option value='sortrank'>置顶权值</option> <option value='click'>点击量</option> <option value='scores'>评论积分</option> <option value='lastpost'>最后评论</option> </select> </td> <td width='90'> <select name='flag' style='width:80px'> <option value=''>属性...</option> {dede:global.flagsArr /} </select> </td> <td> <input name="imageField" type="image" src="images/button_search.gif" width="60" height="22" border="0" class="np" /> </td> </tr> </table> </td> </tr> </table> </form>
当我们选择搜索条件后,点击搜索,如果我们不设置SetParameter($key,$value)时,就搜索不到任何内容。为什么,因为,当我们设置好搜索的内容,然后,点击提交后,表单会把这个表单里面的name变量值,提交到action里面的网址,若,没有设置SetParameter($key,$value)则表示,没有把name值提交给content_list.php,这样无论是关键词和搜索条件,都没有传到文件content_list.php里面,连参数和关键词都没有传到这个文件里面,谈何处理数据,更不会查询到东西。
当我们把参数设置为类似content_list.php?参数=参数值&参数=参数值 url时,程序才会根据这些参数和参数值来查询数据库,这些参数和参数值就是查询条件,也就是上面表单的属性,排序,关键词等(注意:当点击“我发布的文档”后,这些标签例如{dede:global.flasArr/}会调用对应的值)。
知道这个原理,我们只需要把conctent_list.php后面加上参数即可。
如何加上这些参数?
方法有二种:一是直接像上面加上参数,但是这个方法不够灵活,例如,conctent_list.php?orderby=pubdate&flag=a&keyword=dedecms,这样只能查询排序按时间的,flag为a,关键词为dedecms的内容了。但是不要忘记了,上面的搜索无论关键词和排序,还是flag参数值,都是变化的,即,关键词可以搜索dedecms也可以搜索其它的关键词,排序不仅仅按发布时间pubdate,还可以按id,置顶等功能。如果按这种固定方式完全实现不了查询不同的条件的内容。
第二种方法:也是本教程讲的用到的SetParameter($key,$value),通过这个函数可以实现用户想搜索什么条件就按什么条件搜索,而不是像第一种一样固定不变。
这个函数是如何实现的呢?这个我们要分析一下底层代码,在分析代码前我们想一想,当用户选择条件搜索时,就要动态的加到content_list.php文件后面,作为参数,然后,传到这个文件里面,然后,经过处理后,再在模板中显示,大体思路是这样的。
现在我们分析一下是不是这样实现的,打开动态分页类文件datalistcp.class.php,找到类中的函数GetPageList(),在这个函数中大约在302行,有这样的几行代码:
if(count($this->getValues)>0) { foreach($this->getValues as $key=>$value) { $value = urlencode($value); $geturl .= "$key=$value"."&"; $hidenform .= "<input type='hidden' name='$key' value='$value' />\n"; } }
判断一下我们通过函数SetParameter($key,$value)设置的数组$this->getValues为空吗?若不为空则遍历这里面的值,举例:在content_list.php织梦设置了如下参数及其值,代码如下:
$dlist->SetParameter('dopost', 'listArchives'); $dlist->SetParameter('keyword', $keyword); if(!empty($mid)) $dlist->SetParameter('mid', $mid); $dlist->SetParameter('cid', $cid); $dlist->SetParameter('flag', $flag); $dlist->SetParameter('orderby', $orderby); $dlist->SetParameter('arcrank', $arcrank); $dlist->SetParameter('channelid', $channelid); $dlist->SetParameter('f', $f);
这样数组$this->getValues=array('dopost'=>'listArchives','keyword'=>"dedecms",'cid'=>'2',...),通过上面的foreach,变量$hidenform的值就是一个如下字符串:
<input type='hidden' name='dopost' value='listArchives' /> <input type='hidden' name='keyword' value='dedecms' /> <input type='hidden' name='cid' value='2' /> <input type='hidden' name='flag' value='a' /> ......
分析到这里我们就可以想到,只要把变量$hidenform加到表单form里面就可以了,因为,form用的是get方法传参。
再向下找代码,找到代码:
$plist .=" <form name='pagelist' action='".$this->GetCurUrl()."' style='float:left;' class='pagelistform'>$hidenform"; retrun $plist;
打到这二行代码,不难发现,原来$hidenform加到了表单后面了,并且返回$plist变量,再追踪一下函数GetPageList(),如果模板引擎把这个函数编译一下,是不是就可以实现把上面的隐藏域加到表单上面了?是的,也就是说这个函
数肯定是在模板引擎文件dedetemplate.class.php里面,果然,在这个文件里找到如下代码:
else if( $tagname=='pagelist' ) { //生成属性数组 foreach($cTag->cAtt->items as $k=>$v) { $v = $this->TrimAtts($v); $rsvalue .= '$atts[\''.$k.'\'] = \''.str_replace("'","\\'",$v)."';\r\n"; } $rsvalue = '<'.'?php'."\r\n".'$atts = array();'."\r\n".$rsvalue; $rsvalue .= ' echo $this->refObj->GetPageList($atts,$this->refObj,$fields); '."\r\n".'?'.">\r\n"; $cTag->tagValue = $rsvalue; }
正是这个调用,解决了动态添加参数到文件content_list.php,这里用到的很多的知识,不具体分析了,我们做织梦二次开发,了解到这里就差不多了,当然,如果你能把这些代码一个一个的分析明白更好。
光分析原理不行,我还要测试一下是不是跟我们分析的一样。
假设我搜索的条件是:栏目id为“3”,关键词为“css”,排序按“更新时间”,属性按“推荐”,如下图所示。
我们打开站长工具,抓取一下搜索的信息,如下图所示。
当我点击“搜索”时,抓取的网址为:http://localhost/dede/content_list.php?dopost=listArchives&cid=3&keyword=css&orderby=pubdate&flag=c&imageField.x=40&imageField.y=9
请大家看一下content_list.php后面的参数是不是正是我们搜索时的条件?正是我们查询表单时的条件。这样就实现织梦把参数动态加到content_list.php后面,来查询内容,同时,也通过SetParameter($key,$value)函数实现了同一个文件和同一个模板处理查询和搜索二个功能,关于查询和搜索功能使用同一个模板请看教程:http://www.dedebase.com/thread-167-1-1.html