dedecms织梦的arclist标签的二次开发,增加参数

首先官网的开发文档

http://help.dedecms.com/manual/tagmanual/DedeTagmanual_Finnal/arclist.htm

我们增加 mydata参数
形式如下

 {dede:arclist row=14 titlelen=32  mydata="params"}

修改文件 \include\taglib\arclist.lib.php

1)增加参数获取 在 function lib_arclist( &$ctag, &$refObj ) 函数里面

$mydata = $ctag->GetAtt(‘mydata’);

2)传递参数到 函数 lib_arclistDone

return lib_arclistDone
           (
             $refObj, $ctag, $typeid, $ctag->GetAtt('row'), $ctag->GetAtt('col'), $titlelen, $infolen,
             $ctag->GetAtt('imgwidth'), $ctag->GetAtt('imgheight'), $listtype, $orderby,
             $ctag->GetAtt('keyword'), $innertext, $envs['aid'], $ctag->GetAtt('idlist'), $channelid,
             $ctag->GetAtt('limit'), $flag,$ctag->GetAtt('orderway'), $ctag->GetAtt('subday'), $ctag->GetAtt('noflag'),
             $tagid,$pagesize,$isweight,$mydata
           );
}

3) 函数 lib_arclistDone定义处增加 mydata

function lib_arclistDone(&$refObj, &$ctag, $typeid=0, $row=10, $col=1, $titlelen=30, $infolen=160,
        $imgwidth=120, $imgheight=90, $listtype='all', $orderby='default', $keyword='',
        $innertext='', $arcid=0, $idlist='', $channelid=0, $limit='', $att='', $order='desc', $subday=0, $noflag='',$tagid='', $pagesize=0, $isweight='N',$mydata='')

4) 在 函数 lib_arclistDone 里面为所欲为吧

  $mydata = AttDef($mydata,'默认参数');
  if($mydata == '默认参数')
  {
   //您的需求实现代码
  }

dedecms 的keyword相关性改善

dedecms的相关文章的函数 lib_likearticle 里面是根据  keyword1 or keyword2 or … 这样的规律用一个sql解决的,并且用 order by id desc 来排序,可能导致第一个关键字的文章不在前面,下面的补丁就是解决这个问题。

思路是: 先根据第一个关键字搜索结果后,显示出来,如果数量不够 $row 指定的,那么就用关键字2继续查找,依次类推,直到搜索到 $row 数量。

修改的文件是 include\taglib\likearticle.lib.php 下面的连接是txt格式,请自行修改后缀为 .php

likearticle.lib

补丁文件

dedecms重整dede_arctiny表

症状: dede:list 标签出现混淆,一些分类的文章没有显示,原因是删除文章的时候只删除了dede_archives 表,而dede_arctiny表没做相应的删除行,你会发现有些文章id在dede_arctiny表里依然存在,而dedecms原本为了加快速度的dede_arctiny表反而导致了错误。

select id from dede_arctiny where not exists(select * from dede_archives where dede_arctiny.id=dede_archives.id);

这个语句就可以看出来存在于dede_arctiny表里的多余数据,但是并不保证缺失数据

删除dede_arctiny里面的无效数据的sql语句为

delete from dede_arctiny where not exists(select * from dede_archives where dede_arctiny.id=dede_archives.id);

================================================================

下面是我们写的查缺补漏的全部重新生成最新鲜数据dede_arciny表的方法:

dedecms 织梦的dede_arctiny表的重整

truncate table `dede_arctiny`;
insert into `dede_arctiny`(`id`,`typeid`,`typeid2`,`arcrank`,`channel`,`senddate`,`sortrank`,`mid`) select `id`,`typeid`,`typeid2`,`arcrank`,`channel`,`senddate`,`sortrank`,`mid` from `dede_archives` where `arcrank` > -1 order by `id` asc ;

模板自定义函数导致dede更新出现500错误

dedecms 模板里面使用的自定义函数,如果此模板在一个原始官方的dedecms下运行,会因为函数未定义而导致出现500错误,
一般这类函数定义在 include/common.inc.php ,所以需要做相应的移植或者采用老版本的common.inc.php
因为 在include/dedetag.class.php 里面dede执行模板里面的php代码的时候采用eval调用,图中红线部分

dedeeval

dedecms 生成栏目html缓慢的一个可能原因

在dede\makehtml_list_action.php 的文件行 101 处
//$lv->CountRecord();
有这样一处注释掉的代码,似乎DEDECMS的程序猿同学欲言又止
这一个计算某个栏目类有多少分页的代码居然不运行,从而导致后面一行

if($lv->TypeLink->TypeInfos[‘ispart’]==0 && $lv->TypeLink->TypeInfos[‘isdefault’]!=-1) $ntotalpage = $lv->TotalPage;
else $ntotalpage = 1;

导致这里面的 $ntotalpage 根本得不到值 (NULL),
因为 $lv->TotalPage 是在$lv->CountRecord  函数里面赋值
所以感觉特别奇怪。

从而想到,取消此处注释,让栏目生成HTML 分批进行

 //如果栏目的文档太多,分多批次更新
    if($ntotalpage <= $maxpagesize || $lv->TypeLink->TypeInfos['ispart']!=0 || $lv->TypeLink->TypeInfos['isdefault']==-1)
    {
        $reurl = $lv->MakeHtml('', '', $isremote);
        $finishType = TRUE;
    }
    else
    {
// 让代码进入此执行才是分批生成html
        $reurl = $lv->MakeHtml($mkpage, $maxpagesize, $isremote);
        $finishType = FALSE;
        $mkpage = $mkpage + $maxpagesize;
        if( $mkpage >= ($ntotalpage+1) ) $finishType = TRUE;
    }

dedecms 的cn_substr_utf8的商榷

在dedecms里面 cn_substr_utf8 函数是这样的

/**
 *  utf-8中文截取,单字节截取模式
 *
 * @access    public
 * @param     string  $str  需要截取的字符串
 * @param     int  $slen  截取的长度
 * @param     int  $startdd  开始标记处
 * @return    string
 */
if ( ! function_exists('cn_substr_utf8'))
{
    function cn_substr_utf8($str, $length, $start=0)
    {
        if(strlen($str) < $start+1)
        {
            return '';
        }
        preg_match_all("/./su", $str, $ar);
        $str = '';
        $tstr = '';

        //为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
        for($i=0; isset($ar[0][$i]); $i++)
        {
            if(strlen($tstr) < $start)
            {
                $tstr .= $ar[0][$i];
            }
            else
            {
                if(strlen($str) < $length + strlen($ar[0][$i]) )
                {
                    $str .= $ar[0][$i];
                }
                else
                {
                    break;
                }
            }
        }
        return $str;
    }
}

其中

if(strlen($str) < $length + strlen($ar[0][$i]) )

一行可能会造成截取后多了一个字符,可以考虑改为

if(strlen($str) < $length + strlen($ar[0][$i]) -1 )

测试代码如下

 
$f = "你好fasdfa你fasdf#e#";
$pos = strpos($f,'#e#');
var_dump($pos);
var_dump(cn_substr_utf8($f,$pos));
var_dump(cn_substr_utf82($f,$pos));

function cn_substr($str, $slen, $startdd=0)
{
	global $cfg_soft_lang;
	if($cfg_soft_lang=='utf-8')
	{
		return cn_substr_utf8($str, $slen, $startdd);
	}
	$restr = '';
	$c = '';
	$str_len = strlen($str);
	if($str_len < $startdd+1)
	{
		return '';
	}
	if($str_len < $startdd + $slen || $slen==0)
	{
		$slen = $str_len - $startdd;
	}
	$enddd = $startdd + $slen - 1;
	for($i=0;$i<$str_len;$i++) 	{ 		if($startdd==0) 		{ 			$restr .= $c; 		} 		else if($i > $startdd)
		{
			$restr .= $c;
		}

		if(ord($str[$i])>0x80)
		{
			if($str_len>$i+1)
			{
				$c = $str[$i].$str[$i+1];
			}
			$i++;
		}
		else
		{
			$c = $str[$i];
		}

		if($i >= $enddd)
		{
			if(strlen($restr)+strlen($c)>$slen)
			{
				break;
			}
			else
			{
				$restr .= $c;
				break;
			}
		}
	}
	return $restr;
}

function cn_substr_utf8($str, $length, $start=0)
{
	if(strlen($str) < $start+1)
	{
		return '';
	}
	preg_match_all("/./su", $str, $ar);

	$str = '';
	$tstr = '';

	//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
	for($i=0; isset($ar[0][$i]); $i++)
	{
		if(strlen($tstr) < $start)
		{

			$tstr .= $ar[0][$i];
		}
		else
		{

			if(strlen($str) < $length + strlen($ar[0][$i])  )
			{

				$str .= $ar[0][$i];
			}
			else
			{

				break;
			}
		}
	}
	return $str;
}

function cn_substr_utf82($str, $length, $start=0)
{
	if(strlen($str) < $start+1)
	{
		return '';
	}
	preg_match_all("/./su", $str, $ar);

	$str = '';
	$tstr = '';

	//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
	for($i=0; isset($ar[0][$i]); $i++)
	{
		if(strlen($tstr) < $start)
		{

			$tstr .= $ar[0][$i];
		}
		else
		{

			if(strlen($str) < $length + strlen($ar[0][$i]) -1 ) // phpsir 加了 -1 
			{

				$str .= $ar[0][$i];
			}
			else
			{

				break;
			}
		}
	}
	return $str;
}

dedecms 分页标题提取方法

提取每个分页标题到模版里面

修改includes\arc.archives.class.php 的 GetPageTitlesST函数

pagetitle3

模版里面调用方法

首先保存 文章标题

{dede:field.title runphp=’yes’}$GLOBALS[“phpsir”]=@me;@me=””;{/dede:field.title}

调用方法是 pagetitle  style=’biaoti’ , 同时把原来文章标题附着在后面…..

{dede:pagetitle style=’biaoti’ runphp=”yes”}if(@me==” ) {@me = $GLOBALS[“phpsir”]; }else { @me = @me . “_” . $GLOBALS[“phpsir”]  ;} {/dede:pagetitle}

发布文章时候的格式是如下的

pagetitle2

 

参考网上文章为

http://www.veryhuo.com/a/view/6753.html

 

dedecms 的一点经验分享

GetFileName 位于 include\helpers\chanelunit.helper.php 文件中

此函数 是 dedecms 用于生成文件名和获得文件url 地址的 关键文件!!!!!

而且是入口型文件,所有的文件名和url地址的获取都从此走出

dedecms 图片水印加不上解法一种,水印图片要真如其名!

今天一个朋友说他的dedecms上传图片加不上水印了
经调试代码最终发下啼笑皆非的原因是,
后台设置水印图片是gif ,但是上传了一个jpeg的图片,仅仅是后缀是gif,导致了php的 imagecreatefromgif 出错
同样的,后台设置水印图片是png,你也得上传一个真的png图片,而不仅仅后缀是png

切,切!