让DEDECMSv4的loop标签具有和v5sql标签相同功能

Filed under: dedecms专栏, 实践与研究 | No Comments »
Posted on

DEDECMSv5版中新增加的SQL标签用起来比较爽,在功能上要比v4的loop标签强。像有些要select count(*)的计算用loop是实现不了的,要不就写function,但是SQL标签可以实现。所以,我把SQL标签功能给加入到v4 版中。
方法如下:
修改文件共5个,全部在 /include 下:
1、在 inc_arcpart_view.php 中找到: 阅读全文 »

Tags : ,

dedecms 负载性能优化实例,三招让你的dede快10倍以上

Filed under: PHP研究, dedecms专栏, 数据库技术 | 6 Comments »
Posted on

        助易网测评小组曾在08年4月对国内主流php类cms做了负载测评,参考我们的测评文章http://www.cmshelp.com.cn/cms/cms2008.htm,其中对dedecms表现出来的相对较差的性能也感觉比较迷惑,到底是什么在制约其负载效率?难道真的是某些脑残的dede论坛版主说的是因为mysql不堪重负的原因吗?还是因为一个表的大数据造成性能严重下降?难道我们必须通过分多个表来存储才能解决问题吗?以下我们通过一个实例来解析和优化dedecms的数据管理性能,千万别让mysql当替罪羊,罪莫大焉。

        欢迎转载本文,转载请注明本文出自助易网(http://www.cmshelp.com.cn)。

        测试数据是无意中得到的企业黄页的数据,数据量将近90万,都是完全真实的数据,测试使用的程序是dedecms4.0版本,你问为什么不用dedecms5.1?那是因为我们为了优化,针对dedecms做了很多修改,如果使用dedecms5.1,我们害怕收到法院传票……,补充一句,以下的优化方法均能在dedecms5.1中使用,请在理解其原理的基础上自行完成。

        未优化前我们测试发现主要有三个经常性的操作在dede大数据量的情况下影响管理性能,分别是文档生成、列表页生成和栏目列出所有文章,我们就针对这三个方面进行优化实践。

        欢迎转载本文,转载请注明本文出肥龙龙博客(http://www.blog-dragon.com/)。

        以下是测试数据的基本信息:

optimize-dede1.jpg

文档数量接近90万

阅读全文 »

Tags : , , ,

dedecms5.1升级sp1出现IfTagNull()错误解决方法记录

Filed under: dedecms专栏 | No Comments »
Posted on

最近有报告错误说从dedecms5.1升级sp1出现错误,代码大致如下:
Fatal error: Call to undefined function IfTagNull() in /……/include/pub_dedetag.php(485) : eval()’d code on line 1
分析错误原因,是因为模板中调用了IfTagNull函数而程序中找不到这个函数导致出错,解决的办法很简单,两种,这里记录一下:
1、修改article_article.htm模板,把{dede:tag type=’current’ function=’IfTagNull(@me)’/} 换回原来的{dede:tag type=’current’ /}
2、修改include目录下的inc_functions.php文件,加入代码如下:

//这个函数根据自己需要进行修改
function IfTagNull($tag){
 
//这里直接输出了Tag:自行修改
 
if(!$tag=="")  $tag="Tag:".$tag;
 
return $tag;
}
Tags : , ,

dedecms中实现列表页面调用其它栏目的信息

Filed under: dedecms专栏 | No Comments »
Posted on

群里有人问如何在dedecms中实现列表页面调用不同栏目的文章信息,以下给出解决方法,针对dedecms4.0。

首先,为dedecma增加一个标签的属性,我修改的标签为【List 标记】增加属性addonid,使用方法为:

addonid= ‘调用的栏目编号’,不同的栏目请用半角“,”的分隔,这些栏目必须是最终列表栏目,同时不必在这个栏目编号中增加本栏目的编号。

例子:{dede:list pagesize=’2′ addonid=’1,2′} {/dede:list}

继续修改include/inc_arclist_view.php,这个比较麻烦,不会的话,直接拷贝粘贴。

第一步,新增$addonid变量,如下:

class ListView
{
 var $dsql;
 var $dtp;
 var $dtp2;
 var $TypeID;
 var $TypeLink;
 var $PageNo;
 var $TotalPage;
 var $TotalResult;
 var $PageSize;
 var $ChannelUnit;
 var $ListType;
 var $Fields;
 var $PartView;
 var $StartTime;
 var $addonid; //这里为新增的变量

……

第二步:获得模板中的addonid的值,并且统计文章总数,修改function CountRecord()函数:

原本代码为:

  //——————
  //统计列表里的记录
  //——————
  function CountRecord()
  {
   global $cfg_list_son;
   //统计数据库记录
   $this->TotalResult = -1;
   if(isset($GLOBALS[’TotalResult’])) $this->TotalResult = $GLOBALS[’TotalResult’];
   if(isset($GLOBALS[’PageNo’])) $this->PageNo = $GLOBALS[’PageNo’];
   else $this->PageNo = 1;
   
   if($this->TotalResult==-1)
   {
     $addSql  = ” arcrank > -1 “;
    
     if($cfg_list_son==’否’) $addSql .= ” And (typeid=’”.$this->TypeID.”‘ or typeid2=’”.$this->TypeID.”‘) “;
     else $addSql .= ” And (”.$this->TypeLink->GetSunID($this->TypeID,”#@__archives”,$this->Fields[’channeltype’]).” Or #@__archives.typeid2=’”.$this->TypeID.”‘) “;
    
     if($this->StartTime>0) $addSql .= ” And senddate>’”.$this->StartTime.”‘”;
     $cquery = “Select count(*) as dd From #@__archives where $addSql”;
    $row = $this->dsql->GetOne($cquery);
    if(is_array($row)) $this->TotalResult = $row[’dd’];
    else $this->TotalResult = 0;
   }
   
   //初始化列表模板,并统计页面总数
   $tempfile = $GLOBALS[’cfg_basedir’].$GLOBALS[’cfg_templets_dir’].”/”.$this->TypeLink->TypeInfos[’templist’];
   $tempfile = str_replace(”{tid}”,$this->TypeID,$tempfile);
   $tempfile = str_replace(”{cid}”,$this->ChannelUnit->ChannelInfos[’nid’],$tempfile);
   if(!file_exists($tempfile)){
       $tempfile = $GLOBALS[’cfg_basedir’].$GLOBALS[’cfg_templets_dir’].”/”.$GLOBALS[’cfg_df_style’].”/list_default.htm”;
    }
   if(!file_exists($tempfile)||!is_file($tempfile)){
    echo “模板文件:’”.$tempfile.”‘ 不存在,无法解析文档!”;
    exit();
   }
   $this->dtp->LoadTemplate($tempfile);
   $ctag = $this->dtp->GetTag(”page”);
   if(!is_object($ctag)){ $ctag = $this->dtp->GetTag(”list”); }
   if(!is_object($ctag)) $this->PageSize = 20;
   else{
     if($ctag->GetAtt(”pagesize”)!=”") $this->PageSize = $ctag->GetAtt(”pagesize”);
      else $this->PageSize = 20;
    }
    $this->TotalPage = ceil($this->TotalResult/$this->PageSize);
  }

修改为:

  //——————
  //统计列表里的记录
  //——————
  function CountRecord()
  {
   global $cfg_list_son;
  
   //初始化列表模板,并统计页面总数
   $tempfile = $GLOBALS[’cfg_basedir’].$GLOBALS[’cfg_templets_dir’].”/”.$this->TypeLink->TypeInfos[’templist’];
   $tempfile = str_replace(”{tid}”,$this->TypeID,$tempfile);
   $tempfile = str_replace(”{cid}”,$this->ChannelUnit->ChannelInfos[’nid’],$tempfile);
   if(!file_exists($tempfile)){
       $tempfile = $GLOBALS[’cfg_basedir’].$GLOBALS[’cfg_templets_dir’].”/”.$GLOBALS[’cfg_df_style’].”/list_default.htm”;
    }
   if(!file_exists($tempfile)||!is_file($tempfile)){
    echo “模板文件:’”.$tempfile.”‘ 不存在,无法解析文档!”;
    exit();
   }
   $this->dtp->LoadTemplate($tempfile);
   $ctag = $this->dtp->GetTag(”page”);
   if(!is_object($ctag)){ $ctag = $this->dtp->GetTag(”list”); }  
  if($ctag->GetAtt(”addonid”)!=”") $this->addonid = $ctag->GetAtt(”addonid”);
   if(!is_object($ctag)) $this->PageSize = 20;
   else{
     if($ctag->GetAtt(”pagesize”)!=”") {
     $this->PageSize = $ctag->GetAtt(”pagesize”);
   }
      else $this->PageSize = 20;
    }
 
   //统计数据库记录
   $this->TotalResult = -1;
   if(isset($GLOBALS[’TotalResult’])) $this->TotalResult = $GLOBALS[’TotalResult’];
   if(isset($GLOBALS[’PageNo’])) $this->PageNo = $GLOBALS[’PageNo’];
   else $this->PageNo = 1;
   
   if($this->TotalResult==-1)
   {
     $addSql  = ” arcrank > -1 “;
    
  if($this->addonid!=”") $isaddon = ” Or #@__archives.typeid in (”.$this->addonid.”)”;
  else $isaddon = “”;
    
     if($cfg_list_son==’否’) $addSql .= ” And (typeid=’”.$this->TypeID.”‘ or typeid2=’”.$this->TypeID.”‘ “.$isaddon.”) “;
     else $addSql .= ” And (”.$this->TypeLink->GetSunID($this->TypeID,”#@__archives”,$this->Fields[’channeltype’]).” Or #@__archives.typeid2=’”.$this->TypeID.”‘ “.$isaddon.”) “;

    
     if($this->StartTime>0) $addSql .= ” And senddate>’”.$this->StartTime.”‘”;
     $cquery = “Select count(*) as dd From #@__archives where $addSql”;
    $row = $this->dsql->GetOne($cquery);
    if(is_array($row)) $this->TotalResult = $row[’dd’];
    else $this->TotalResult = 0;
   }
 
    $this->TotalPage = ceil($this->TotalResult/$this->PageSize);
  }

说明,首先把统计数据库记录这部分代码后移,目的是为了利用获得的属性参数addonid,接着通过$this->addonid = $ctag->GetAtt(”addonid”);获得模板中的addonid的值,然后生成新的统计数据库的sql语句。

第三步,修改function GetArcList()函数,显示文档列表。

原文件为(代码片断):

  if($cfg_list_son==’否’) $orwhere .= ” And (arc.typeid=’”.$this->TypeID.”‘ or arc.typeid2=’”.$this->TypeID.”‘) “;
  else $orwhere .= ” And (”.$this->TypeLink->GetSunID($this->TypeID,”arc”,$this->Fields[’channeltype’]).” Or arc.typeid2=’”.$this->TypeID.”‘) “;

修改为:

  if($this->addonid!=”") $isaddon = ” Or arc.typeid in (”.$this->addonid.”)”;
  else $isaddon = “”;
  if($cfg_list_son==’否’) $orwhere .= ” And (arc.typeid=’”.$this->TypeID.”‘ or arc.typeid2=’”.$this->TypeID.”‘ “.$isaddon.”) “;
  else $orwhere .= ” And (”.$this->TypeLink->GetSunID($this->TypeID,”arc”,$this->Fields[’channeltype’]).” Or arc.typeid2=’”.$this->TypeID.”‘ “.$isaddon.”) “;

到此就可以实现列表页面调用其它栏目的信息。有问题的话Q我。

Tags : , ,

实现dedecms图集单击图片翻页的功能

Filed under: dedecms专栏 | No Comments »
Posted on

题记:在很多相册的网站中,都有这样的功能:当图片分多页显示的情况下,点击图片会自动翻页到下一张图片,接下来我们在dedecms4中实现这个功能。以下是实现方法:

关于图集修改,还可以参考以下文章:
·dedecms图集缩略功能完美修改
·图片自动缩小完美策略 分享
·DeDecms中实现更漂亮整齐的缩略图

1、为了实现这个功能,我们首先需要获得图片页面的当前页码和总页码
编辑include/inc_archives_view.php文件

(1)找到function ParseDMFields,修改为:

function ParseDMFields($pageNo,$ismake=1)
{
$this->NowPage = $pageNo;
//获得当前页面编号
$this->Fields['cpagenum'] = $this->NowPage;
if($this->SplitPageField!="" && isset($this->Fields[$this->SplitPageField]))
{
$this->Fields[$this->SplitPageField] = $this->SplitFields[$pageNo - 1];
}

注意增加了如下代码用来获得当前的页码:
$this->Fields[’cpagenum’] = $this->NowPage;

(2)找到function __construct构造函数,修改为:

<?php
……
$this->TotalPage = count($this->SplitFields);
}
//获得当前页面总数
$this->Fields['totalpage'] = $this->TotalPage;
$this->LoadTemplet();
$this->ParseTempletsFirst();
}

注意增加了如下代码用来获得总页码:
$this->Fields[’totalpage’] = $this->TotalPage;

2、接下来在模板中用js实现分析静态页面和动态页面以及向下翻页

编辑article_image.htm或者你的图集最终显示的模板,增加如下js代码:

<script language="javascript">
            
var npage = {dede:field name=\\'cpagenum\\'/};
      var totalpage = {dede:field name=\\'totalpage\\'
/};
      
var filename="";
      
var curl=location.href;
 
function goNextPic(){
      
str1 = /\.html/ig;
      
str2 = /_/ig;
      
r = curl.search(str1);
      
r1 = curl.search(str2);
      
if(r>0){
          
if(npage==1) filename = curl.substr(0,r);
          
else filename = curl.substr(0,r1);
 
if(npage==totalpage){ location.href = filename+".html"; }
          
else{             
location.href = filename+"_"+(npage+1)+".html";
          
}
      
}else{
          
if(npage==totalpage){ location.href = "view.php?aid={dede:field name=\\'id\\'/}"; }
          
else{
              
location.href = "view.php?aid={dede:field name=\\'id\\'/}&pageno="+(npage+1);
          
}
    
}
 
}
<
/script>

在这个js脚本中,我们定义一个方法goNextPic用来切换到下一个图片。

3、最后修改图片输出代码,完成goNextPic方法调用

修改include/inc_channel_unit.php
找到”//全部列出式或分页式图集”的部分。
修改类似(仔细看代码,需要修改好几个地方):

$revalue = "<center><a target="_blank" href="http://www.blog-dragon.com/wp-admin/$src"><img border="0" src="http://www.blog-dragon.com/wp-admin/$src" alt="$alt" /></a>
$alt
</
center>\r\n";
为:
<coolcode linenum=
"off" lang="php"></coolcode>
$revalue = " <center><a href="javascript:goNextPic();"><img border="0" src="http://www.blog-dragon.com/wp-admin/$src" alt="$alt" /></a>
$alt
</
center>";
?>

the end. have fun!

Tags :

dedecms2007第一时间试用评测及使用感受

Filed under: dedecms专栏 | 2 Comments »
Posted on

2007年12月2日,众多站长期待已久的dedecms2007在经历了近1年的跳票后,终于放出测试版。到底2007版本和4有什么区别,之前已经传得满城风雨,肥龙第一时间下载试用,现将所见分享如下:

1、dede被众多网友病垢的模板做了美化,采用了DIV+CSS的布局,样式无论前后台都比之前的版本好了很多,看来织梦团队在美工上下了不少功夫,但是测试版还没有实现完全的模板更换,还有部分模型和页面使用的是旧的模板

图1 官方主页

图2 栏目内页

图3 文章页

图4 后台管理界面

2、会员新增个人主页、圈子、企业黄页和问答等功能,为会员提供了更多的功能,但是每个部分的功能都是独立的,和dede的核心集成度不高,应该是从其他类似开源的系统修改组装而成,透过这些功能,可以知道dedecms的发展方向从开源走向商业化,期望满足企业建站的需求。

图5 会员后台

图6 个人空间页面

图7 圈子页面

图8 企业黄页

图9 问答

3、频道模型新增作品、产品、和分类信息,用于满足不同的建站的类型需求,这点的改变还是为了dedecms的商业化做准备,同时造成整个dedecms的系统瞬间变得庞大起来,系统安装后建立的表也由4.0时代的50个增加到84个。在关键的表设计上,依旧采用了主表+附加表的模式,原本系统存在的数据量大会产生的问题没有得到解决,反而会更加严重。

图10 分类信息板块

图11 作品板块

图12 产品板块

4、旧的文章、图集、flash、下载和专题等模型,在4.0的基础上没有大的变化,仅仅做了模板和局部功能的调整。

图13 新的图集显示页面

5、新增一个连载栏目,不太明白这个栏目为什么独立于模型之外单独管理和设置,可以用dedecms方便建立小说类型的网站了

图14 连载栏目

Page 1 of 3123»