织梦cms利用weight排序无效的解决方法

 更新时间:2016年11月25日 17:38  点击:2394
dedecms5.7针对weight排序是有bug的,下面我来一步步告诉大家如何解决weight无效的解决办法,具体请参考下面。

涉及的文件是includetaglibarclist.lib.php文件:

第570行左右:

 代码如下 复制代码
if ( $isweight==’y’ )

这一行代码简直是废柴,$orderWeight = list_sort_by($orderWeight, ‘weight’, ‘asc’);  对结果进行排序。

这个是有问题的,因为在得到这个$orderWeight之前,检索文档表的语句为:

 代码如下 复制代码

SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,

tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id WHERE arc.typeid IN (29) AND

arc.arcrank > -1 ORDER BY arc.sortrank DESC

很明显了吧,我们在写标签的时候,写的是

 代码如下 复制代码

{dede:arclist orderby=’weight’ typeid=’29′ isweight=’y’

limit=’4,1′ titlelen=’100′ infolen=’100′ }

,本意是数据按照weight进行排序,二处理程序是按照

sortrank 检索的数据库,指定 isweight=’y’ 仅仅是起到了将检索出的数据集再根据weight排序。

 
所以处理办法非常简单:在该程序文件330行处,增加一行按照weight排序的处理语句:

 代码如下 复制代码

else if($orderby ==

‘weight’) $ordersql = ” order by arc.weight asc”;

我们再分离一个让list标签支持weight排序

 代码如下 复制代码

{dede:list pagesize='10' titlelen='50' orderby='weight'} •[field:textlink/]<br/> {/dede:list}

办法:

1、打开文件arc.listview.class.php

2、查找“else if($orderby=="lastpost") {” 语句,大概在609行,在此行前面按下回车健,插入如下语句:

 代码如下 复制代码

else if($orderby=="weight") {     $ordersql = " order by arc.weight $orderWay"; }

3、继续查找“if(ereg('hot|click|lastpost',$orderby))”语句,修改为:

 代码如下 复制代码

if(ereg('hot|click|weight|lastpost',$orderby))

修改完成后,保存,如果目标里面已经使用了weight排序,生成一下,就可以看到,文档列表已经安装weight排序

4、模板调用

 代码如下 复制代码

{dede:arclist row='10' titlelen='50' orderby='weight'} •[field:textlink/]<br/> {/dede:arclist}

最简单的办法利用php自带的函数用array_flip实现去重效果,另一个方法是使用php的array_flip函数来间接的实现去重效果

array_flip是反转数组键和值的函数,他有个特性就是如果数组中有二个值是一样的,那么反转后会保留最后一个键和

值.利用这个特性我们用他来间接的实现数组的去重.

 代码如下 复制代码

<?php
$arr = array("a"=>"a1","b"=>'b1',"c"=>"a2","d"=>"a1");
$arr1 = array_flip($arr);
print_r($arr1);//先反转一次,去掉重复值,输出Array ( [a1] => d [b1] => b [a2] => c )
$arr2 = array_flip($arr);
print_r($arr2);//再反转回来,得到去重后的数组,输出Array ( [a1] => d [b1] => b [a2] => c )
$arr3 = array_unique($arr);
print_r($arr3);//利用php的array_unique函数去重,输出Array ( [a] => a1 [b] => b1 [c] => a2 )
?>

用户自定义函数操作

 代码如下 复制代码

<?php
function assoc_unique($arr, $key) {
 $tmp_arr = array();
 foreach($arr as $k => $v) {
  if(in_array($v[$key], $tmp_arr)) {
   unset($arr[$k]);
  } else {
   $tmp_arr[] = $v[$key];
  }
 }
 sort($arr);
 return $arr;
}

$aa = array(
 array('id' => 123, 'name' => '淡淡清香弥漫世界'),
 array('id' => 123, 'name' => '螃蟹'),
 array('id' => 124, 'name' => '前端开发者'),
 array('id' => 125, 'name' => '螃蟹'),
 array('id' => 126, 'name' => 'HTML5研究者')
);
$key = 'name';
assoc_unique(&$aa, $key);
print_r($aa);
?>

在php中如果我们不作任何设置一般情况下利用date输出时间是会有误差的,而且很大。

问题:echo date('o-m-j H:i');

 代码如下 复制代码

〈?php
         echo date(’Y-m-d H:i:s’);
  ?〉


输出当前时间:2008-10-12 02:32:17
怪了,实际时间是:2008-10-12 10:32:17

输出结果与本地时间相差8小时。
原因:时区未正确设置。
两种解决方法:

1.加入date_default_timezone_set('Asia/Shanghai');
2. 修改php.ini

[Date]

; Defines the default timezone used by the date functions
date.timezone = PRC 注:PRC为中化人民共和国

如果没有修改php.ini的权限,那么应该在调用date()方法之前加上

 代码如下 复制代码
date_default_timezone_set(‘PRC’);
下面我来总结一下php utf8编码上传中文文件名出现乱码解决办法,有碰这类问题的朋友可参考参考。
 代码如下 复制代码

<?php 
if(isset($_FILES['file'])){ 
$upload='upload/'.$_FILES['file']['name']; 

if(is_uploaded_file($_FILES['file']['tmp_name'])){ 

//iconv函数解决上传文件中文名乱码的问题,但是不提倡文件名是中文的,特别是unix/linux环境下 ,当你要输出的时候,又要给变回来,iconv('gb2312',UTF-8',$upload)

if(!move_uploaded_file($_FILES['file']['tmp_name'],iconv('UTF-8','gb2312',$upload))){ 

echo 'failed'; 

}else{ 
echo 'success'; 



else{ 
echo 'failed'; 


?> 

/******关于iconv函数的应用:string iconv ( string in_charset, string out_charset, string str )
* in_charset:传入的文件的格式

* out_charset:输出的文件的格式

* str:文件路径

*****/

如果ASCii码大于0xa0就是半个汉字;了解substr()、mb_substr()、ord()。 现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自己的。

最简的就是利用

例子 1

 代码如下 复制代码

<?php
echo substr("Hello world!",6);
?>输出:

world!

例子 2
<?php
echo substr("Hello world!",6,5);
?>

英文的话没有问题,但是中文就出问题了,下面我们使用mb_substr函数处理。

/**
*—————————————————————————————————————–
*PHP有一个mbstring扩展库可以用(有朋友面试PHP的时候还被问到过这个问题哦),但是  *
一般的服务器都没打开php_mbstring.dll,需要在
*php.ini里把php_mbstring.dll打开,如果没有权限的话就只有联系你的ISP了。
*因为mb_string的效率高一些,所以我们先检查一下mb_string是否可以用:
*—————————————————————————————————————–
*/

 代码如下 复制代码

if(function_exists(‘mb_string’))
{
mb_substr($string,$start,$length,$encoding);
//other codes here
}
else mysubstr($string,$start,$length);// 调用自己的函数
?>

首先定义自己的函数

 代码如下 复制代码

<?php
/**
*———————————-
*首先定义自己的函数:
*———————————-
*/
function mysubstr($string, $start, $length)
{
if(strlen($string)>$length)
{
$str=”;
$len=$start+$length;
for($i=$start;$i<$len;$i++)
{
if(ord(substr($string,$i,1))>0xa0)
{
$str.=substr($string,$i,2);
$i++;
}
else{ $str.=substr($string,$i,1);}
}
return $str.’…’;
}
else{ return $string;}
}

 

还有一个问题要注意,使用这种方法的时候,你的<head>标签对里的charset只有设成中文的编码才可以,如GBK,GB2312。

下面自己常用的一个中英文字符截取函数

自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单

 代码如下 复制代码

<?php 
function  substr_cn($string_input,$start,$length)
{
    /* 功能:
     * 此算法用于截取中文字符串
     * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
     * 参数:
     * 参数$string为要截取的字符串,
     * 参数$start为欲截取的起始位置,
     * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
     * 返回值:
     * 返回截取结果字符串
     * */
    $str_input=$string_input;
    $len=$length;
    $return_str="";
    //定义空字符串
    for ($i=0;$i<2*$len+2;$i++)
        $return_str=$return_str." ";
    $start_index=0;
    //计算起始字节偏移量
    for ($i=0;$i<$start;$i++)
    {
        if (ord($str_input{$start_index}>=161))          //是汉语     
        {
            $start_index+=2;
        }
        else                                          //是英文
        {
            $start_index+=1;
        }        
    }    
    $chr_index=$start_index;
    //截取
    for ($i=0;$i<$len;$i++)
    {
        $asc=ord($str_input{$chr_index});
        if ($asc>=161)
        {
            $return_str{$i}=chr($asc);
            $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
            $len+=1; //结束条件加1
            $i++;    //位置偏移量加1
            $chr_index+=2;
            continue;            
        }
        else 
        {
            $return_str{$i}=chr($asc);
            $chr_index+=1;
        }
    }    
    return trim($return_str);
}//end of substr_cn
?>

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • antdesign-vue结合sortablejs实现两个table相互拖拽排序功能

    这篇文章主要介绍了antdesign-vue结合sortablejs实现两个table相互拖拽排序功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-09
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23