织梦怎么控制网址中Get参数键值,由函数SetParameter()实现

admin2023-01-191262

函数名: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

网友评论