首页 > 其他 > 网站日记>正文

帝国sms结合项函数的优化

提示: 阅读权限:公开  

帝国cms官方的结合项函数,不太严谨,导致url地址参数重复,不美观,甚至会被恶意篡改


网上有朋友给出了优化方案,思路是先按照帝国官方插件的思路走,最后统一处理重复的参数。


我这里给出另外一种方法,思路是生成url的时候就过滤掉重复。这样也方便后续的伪静态处理。


代码如下:

//显示结合项筛选选项
function user_ShowFieldandChange($ecms=0){
	global $public_r;

	//------- 函数参数设置开始 -----

	//要显示的结合项字段列表,多个字段用半角逗号“,”隔开
	$fieldandvar='myarea,sex,age';

	//字段显示选项设置,多项用双“#”号隔开,格式:选项说明|==|内容1,值1##内容2,值2
	$fieldandval=array();
	$fieldandval['myarea']='<b>地区:</b>|==|不限,##东城,东城区##朝阳,朝阳区##崇文,崇文区##宣武,宣武区##海淀,海淀区##丰台,丰台区';
	$fieldandval['sex']='<b>性别:</b>|==|不限,##男,男##女,女##人妖,人妖';
	$fieldandval['age']='<b>年龄:</b>|==|不限,##1-10,1__10##11-20,11__20##21-30,21__30##31-40,31__40##41-50,41__50##50岁以上,51__200';

	//正常链接样式
	$fieldandcss='fieldandcss';

	//已选的选项链接样式
	$changefieldandcss='changefieldandcss';

	//字段与字段的显示间隔符,格式:开始显示字符|结束显示字符
	$fieldexp='<table><tr><td>|</td></tr></table>';

	//选项与选项的显示间隔符,格式:开始显示字符|结束显示字符
	$valexp='| ';

	//------- 函数参数设置结束 -----


	$userfunecmsver=function_exists('ehtmlspecialchars')?1:0;
	//附加参数
	$urlcs='ph=1';
	$mid=(int)$_GET['mid'];
	if($mid)
	{
		$urlcs.='&mid='.$mid;
	}
	if($_GET['classid'])
	{
		$classid=RepPostVar($_GET['classid']);
		$urlcs.='&classid='.$classid;
	}
	else
	{
		if(!$_GET['mid']&&!$_GET['ttid']&&!$_GET['ztid'])
		{
			$classid=intval($GLOBALS['navclassid']);
			$urlcs.='&classid='.$classid;
		}
	}
	if($_GET['ttid'])
	{
		$ttid=RepPostVar($_GET['ttid']);
		$urlcs.='&ttid='.$ttid;
	}
	if($_GET['ztid'])
	{
		$ztid=RepPostVar($_GET['ztid']);
		$urlcs.='&ztid='.$ztid;
	}
	if($_GET['firsttitle'])
	{
		$firsttitle=(int)$_GET['firsttitle'];
		$urlcs.='&firsttitle='.$firsttitle;
	}
	if($_GET['isgood'])
	{
		$isgood=(int)$_GET['isgood'];
		$urlcs.='&isgood='.$isgood;
	}
	if($_GET['endtime'])
	{
		$starttime=RepPostVar($_GET['starttime']);
		$endtime=RepPostVar($_GET['endtime']);
		$urlcs.='&starttime='.$starttime.'&endtime='.$endtime;
	}
	$line=(int)$_GET['line'];
	if($line)
	{
		$urlcs.='&line='.$line;
	}
	$tempid=(int)$_GET['tempid'];
	if($tempid)
	{
		$urlcs.='&tempid='.$tempid;
	}
	if($_GET['orderby'])
	{
		$orderby=RepPostVar($_GET['orderby']);
		$myorder=(int)$_GET['myorder'];
		$urlcs.='&orderby='.$orderby.'&myorder='.$myorder;
	}
	//间隔字符
	$fieldexpr=explode('|',$fieldexp);
	$valexpr=explode('|',$valexp);
	//输出选项
	$fr=explode(',',$fieldandvar);
	$fcount=count($fr);
	$allstr='';
	$urladd=$urlcs;
    	foreach($fr as $field){
		if($_GET[$field])
		{
			$getval=$userfunecmsver==1?ehtmlspecialchars($_GET[$field],ENT_QUOTES):htmlspecialchars($_GET[$field],ENT_QUOTES);
			$urladd.='&'.$field.'='.urlencode($getval);
		}
	}
        
	foreach($fr as $field)
	{
		
		//选项链接
		$getval='';
		if($_GET[$field])
		{
			$getval=$userfunecmsver==1?ehtmlspecialchars($_GET[$field],ENT_QUOTES):htmlspecialchars($_GET[$field],ENT_QUOTES);
			
		}
                $myurladd=preg_replace('/&'.$field.'=[^&]+/i','',$urladd);
		//选项说明
		$vsayr=explode('|==|',$fieldandval[$field]);
		//选项内容
		$valallstr='';
		$vr=explode('##',$vsayr[1]);
		$vcount=count($vr);
		for($vi=0;$vi<$vcount;$vi++)
		{
			$vtr=explode(',',$vr[$vi]);
			if($getval==$vtr[1])
			{
				$css=$changefieldandcss;
			}
			else
			{
				$css=$fieldandcss;
			}
			$valallstr.=$valexpr[0].'<a href="'.$public_r['newsurl'].'e/action/ListInfo.php?'.$myurladd.'&'.$field.'='.urlencode($vtr[1]).'" class="'.$css.'">'.$vtr[0].'</a>'.$valexpr[1];
		}
		$allstr.=$fieldexpr[0].$vsayr[0].$valallstr.$fieldexpr[1];
	}
	
	return $allstr;
}

如何懒得添加css的话,可以处理下下$allstr,动态添加css,代码片段如下:

$allstr=<<<jhc
	<script>
	function loadCssCode(code){var style = document.createElement('style');
	     style.type = 'text/css';    
	     style.rel = 'stylesheet';    
	     try{        //for Chrome Firefox Opera Safari        
	     style .appendChild(document.createTextNode(code));
	     }catch(ex){        //for IE        
	     style.styleSheet.cssText = code;    }    
	     var head = document.getElementsByTagName('head')[0];    
	     head.appendChild(style);}loadCssCode('.fieldandcss{} .changefieldandcss{background:#4598D2;color:#fff;}');
	</script>
	$allstr
jhc;
	return $allstr;


上一篇:【帝国cms插件】批量添加标题索引字母

下一篇:帝国cms远程保存图片的优化--处理无协议图片地址

tags: 插件 帝国

返回首页

相关

热门

站内直通车

[!--temp.bottomnav--]
返回顶部