DEDE免登陆接口 For DEDE_v5.X,实现自动登陆,永不过期

这个功能是从以前发布的DEDE预发布http://www.4wei.cn/archives/444)程序中剥离出来的。可以实现用火车采集器发布时,不需要登陆DEDE后台,特别适合无人值守发布更新。

本方法适用于DEDE所有模型和模块,所有发布模块仅需要添加一处配置参数即可。

实现步骤如下:

  1. 取消DEDE未登陆时出现的登陆提示
  2. 自动登陆DEDE

修改一处DEDE的代码,为DEDE程序管理员目录的config.php,默认路径为dede/config.php,代码如下:

//检验用户登录状态
$cuserLogin = new userLogin();
if($cuserLogin->getUserID()==-1)
{
    header("location:login.php?gotopage=".urlencode($dedeNowurl));
    exit();
}

这段代码的作用是如果未检测到用户的登陆信息,就引导用户进入登陆过程,修改如下:

 //检验用户登录状态
$cuserLogin = new userLogin();
if($cuserLogin->getUserID()==-1)
{
    if($my_u != ''){
        $res = $cuserLogin->checkUser($my_u, $my_p);
        if($res==1) $cuserLogin->keepUser();
 }
    if($cuserLogin->getUserID()==-1)
    {
        header("location:login.php?gotopage=".urlencode($dedeNowurl));
        exit();
    }
}

这段代码的作用是在检测到用户未登陆时,尝试使用页面传递过来的参数进行登陆,如果登陆成功,则保存用户的信息并进行其它操作;如果登陆失败,就引导用户进入登陆页面。

这段代码修改完成,接下来要修改火车采集器的发布模块了。

尘缘做过的火车采集器的发布模块可以在这里下载:

  1. V5.7所有发布模块
  2. V5.6/V5.3等所有发布模块

修改发布模块,只需要在发布模块中添加登陆的用户名和密码信息,修改如图:

PS:这段时间刚刚搬了新服务器,欢迎各位同志与交换友情链接哈。http://www.4wei.cn/aboutme/links

火车采集器发布DEDEv5.7图集失败的解决办法

DEDE5.7升级时,对代码进行了重构,以兼容PHP5.3,但部份代码升级时测试不到位,出现了一些问题。

以下为5.6时的代码,覆盖上来即可解决。正确的代码未研究,额。

/**
 *  获得网址的host和query部份
 *
 * @access    public
 * @param     string  $gurl  调整地址
 * @return    string
 */
function GetHostInfo($gurl)
{
	$gurl = eregi_replace("^http://","",trim($gurl));
	$garr['host'] = eregi_replace("/(.*)$","",$gurl);
	$garr['query'] = "/".eregi_replace("^([^/]*)/","",$gurl);
	return $garr;
}

火车采集器DEDE_V5.7 全套Web发布模块

额,不知不觉DEDE全套模块已经发布了几个年头了,从2007版到2011的V5.7版,感谢大家支持尘缘,尘缘的产品也由开始的模块收费模式变成了现在的模块免费模式,看到有几千个会员下载尘缘的作品,心里其实小有成就感。

这两年尘缘一直在开发PHP版的收费接口,像Discuz!的采集接口,相对而言DEDE这块出的作品不多,除了这一套更新非常及时的发布模块。

尘缘会开发DEDEv5.7的免登陆接口,到时也免费发布了,希望大家关注哈,估计会在尘缘的授权中心以免费的形式提供下载,欢迎大家下载使用。

以下是V5.7的模块打包下载,包含文章、图集、软件等五个模块。

点击下载DEDE_5.7全套发布模块_尘缘出品 继续阅读火车采集器DEDE_V5.7 全套Web发布模块

DEDEV5.7为什么不升级版本号为V6

国内稍稍知名一点的CMS都MVC了,DEDE最后也MVC了,我是喜,但也替人忧呐。

入门级的程序员和站长都喜欢用DEDE,图个简单好用,开发起来也方便。

MVC有一定的上手难度,看看PHPCMS2008及后续版本就知道,解决不了的问题太多,用不起呀。

DEDE也MVC了,我觉得不是好事,一大批入门级用户肯定蒙了。

我是因为DEDE不是MVC才转向PHPCMS的,现在发现DEDE也MVC了,额,搞得人不知道该用哪套程序了。

所以我是喜,但也替人忧呐。替DEDE忧,替DEDE的用户忧。搞不好DEDEV5.6系还得升级个两年。

对了,DEDEV5.7为什么不升级版本号为V6?

DEDE出现“Upload filetype not allow”的原因及解决办法

本人是在近日升级DEDE5.6以后出现这个问题的,以下说明错误原因和解决办法。

如果有同学是按某些朋友用删除代码的方法解决问题的话,建议你修正此做法,毕竟这是有很大安全风险的。而DEDE本身的安全隐患比较多,任何不安全的修改和操作都会断送掉网站的安全。


$imtypes = array("image/pjpeg","image/jpeg","image/gif","image/png","image/xpng","image/wbmp","image/bmp");
 if(in_array(strtolower(trim(${$_key.'_type'})),$imtypes))
 {
 $image_dd = @getimagesize($$_key);
 if (!is_array($image_dd))
 {
 exit('Upload filetype not allow !');
 }
 }

这里的$$_key,指的是上传文件的临时路径,如“d:/php/temp/aaa.tmp”。

我们可以看出,这getimagesize($$_key)这个方法,是在请求PHP临时目录的读取权限,如果d:/php/temp没有读取权限就会出现无法读取的错误。
@getimagesize($$_key);返回的值其实是False,而这里DEDE程序员简单的使用了@屏掉错误提示,并没有考虑到权限问题,造成用户无法了解真正错误原因是没有目录权限,而不是文件类型不允许。

一顿茫然。

修改办法如下:
1,在PHP.ini中添加d:/php/temp的读写权限,这一步基本上都不用操作。因为这个目录一般都是可读写的,不然任何文件都无法上传;
2,部份虚拟主机用户,可能添加了php_admin_value open_basedir 指令,在这里,我们要求添加上临时目录的权限,如:“php_admin_value open_basedir "E:/wwwroot/www.a.com;D:/PHP/temp"”

然后重启WebServer,至此,问题解决。

DEDE V5.6栏目目录名优化方案

DEDE V5.6中已经增加了默认扩展名的优化设置,允许用户启用扩展名是否添加到栏目地址中。

在后台系统-核心,可以选择栏目网址使用目录名(不显示默认页,即是 /a/abc/ 形式),如果启用,所有的扩展名将会被忽略。

这里可以做一定的优化,如果用户为不同的栏目指定了不同的扩展名,则需要关闭此功能,关闭此功能,就会在链接中默认加上index.html这样的文件名。

以下为忽略index.html的修改办法,打开include/channelunit.func.php,行约175行,修改如下:


  if($isdefault==0 && $ispart==0)
  {
   $reurl = str_replace("{page}","1",$namerule2);
   $reurl = str_replace("{tid}",$typeid,$reurl);
   $reurl = str_replace("{typedir}",$typedir,$reurl);
  }
  else
  {
   if(in_array($defaultname, array('index.html', 'index.htm'))) $defaultname = '';
   if($cfg_typedir_df=='N' || $isdefault==0) $reurl = $typedir.'/'.$defaultname;
   else $reurl = $typedir.'/';
  }

可以修改文件名的数组,即可忽略所有不需要的文件名。

实现DEDE网站数据快速迁移、数据库备份和还原

近日要帮客户实现网站改版,又要用到数据库的备份和还原。我发现一些用户对数据库备份和还原并不熟悉,所以结合本次案例做一次完整的笔记,希望对大家有用。

一般的用户会安装PHPmyadmin或者帝国还原工具,安装这些软件的过程本身就很复杂,然后加上数据库的备份和下载还原,很多用户会比较头痛。

DEDE本身自带了不错的备份和还原功能,以下我就使用DEDE的备份和还原来快速实现数据库的备份和还原,最终达到快速方便的网站迁移。

注:以下办法适用于DEDE V5.3/5.5/5.6,dede为默认管理后台目录

第一步:备份数据。

登陆原网站后台,系统-数据库备份/还原,使用数据库备份功能,将网站数据库备份到data目录下。

第二步:FTP下载整个网站。

这一步非常简单,如果是虚拟主机,并能整站打包,可以使用打包下载;如果是独立服务器器,可以直接打包后下载,当然,你也可以使用FTP挨个下载。

第三步:建立数据库,配置数据库连接。

DEDE的数据库配置在data/common.inc.php中,请根据购买的数据库填写具体信息,修改主机名和用户信息,保存。如果是独立服务器,请手工建立数据库。 继续阅读实现DEDE网站数据快速迁移、数据库备份和还原

DEDE实现表单(模型)分步提交【完成】

一般的企业会遇到各类用户调查,我此前也用DEDE的自定义表单和模型,完成了一些诸如报名等系统的开发。

现在遇到一个用户需求,即,要求将一个表单(或者模型,以下统称表单)分成多步提交实现,以解决部分问卷内容过多,以减轻用户因内容繁杂产生的压力。

此功能,我想通过DEDE的自定义表单或者模型实现,再配合DEDE的管理权限分组,实现多用户分级控制用户问卷内容,如果可能,再增加图表输出的功能。

这里有一些技术难题,想跟各位大虾分请教下。

1,实现字段分步显示并实现分步提交数据的缓存,目前考虑通过$_SESSION或者文本储存;
2,实现用户重复提交控制;
3,实现分字段筛选的功能。

这里,分步显示字段的功能,有难度,欢迎各位大虾探讨。

续:
上述功能已经完成,整个项目开发周期3个工作日,目前已运用到新东方的学员问诊项目中。

功能如下:

  1. 通过DEDE自定义模型可以自由创建字段
  2. DEDE模型管理,可以定义字段显示顺序,可以定义字段分步显示
  3. 模型中添加的联动字段,可以定义显示方式,默认为Select,可以显示为checkbox和radio
  4. 增加表单变量控制,用户提交申请控制
  5. 后台管理列表增加按字段筛选的功能

效果预览如下:

总结:DEDE的模型二次开发非常方便,至少上手非常容易,适合小型企业开发;不足之外在于代码重复率高,如果能融入部分MVC开发思想就太好了。目前,这方面DEDE已经走在PHPCMS后面了,希望DEDE能速度跟上。

DEDECMS+Js实现自定义二级联动

DEDE有现成的二级联动管理,可以添加并生成二级联动的JS代码,使用起来非常方便。
如果要实现自己的效果,可能要对联动过程做一点开发。

下面的代码实例是在二级联动的过程中,添加了一个新的字段,以保存选项的值,并在前台根据JS的值做不同的事件。

<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");

//查询根节点
$dsql->SetQuery("SELECT evalue,ename from `#@__sys_enum` where egroup='center' AND evalue%500 = 0 order by disorder asc, evalue asc");
$dsql->Execute();

$enums = array();
$sort = 1 ;
while($row = $dsql->GetArray())
{
    $options .= "<option value=\"{$sort}\">{$row['ename']}</option>\r\n";
    $enums[] = $row['evalue'];
    $sort ++ ;
}


$count = count($enums);
foreach($enums as $i=>$evalue)
{
    //添加了一个名为link的字段,保存选项的跳转链接
    $dsql->SetQuery("SELECT evalue,ename,link from `#@__sys_enum` where egroup='center' AND evalue > {$evalue} AND evalue < ({$evalue} + 500) order by disorder asc, evalue asc");
    $dsql->Execute();
   
    $sort = 0 ;
    $i++;
    while($row = $dsql->GetArray())
    {
        $js .= "select2[". $i ."][{$sort}] = new Option(\"{$row['ename']}\", \"{$row['link']}\");\r\n";
        $sort++;
    }
}

$html = '
<form name="frm">
<div class="city_sch">
<h2 class="f13">选择里您最近的学习中心</h2>
<table width="190" height="128" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td height="51" align="center" valign="middle"><label>
        <select name="s1" onChange="redirec(document.frm.s1.options.selectedIndex)">
        <option selected>点击选择城市</option>
        '. $options .'
        </select>
    </label></td>
  </tr>
  <tr>
    <td height="22" align="center" valign="middle"><label>
        <select name="s2" id="s2">
         <option value="点击选择中心" selected>点击选择中心</option>
        </select>
    </label></td>
  </tr>
  <tr>
    <td height="55" align="center" valign="middle"><label>
      <input type="submit" name="button" id="button" value="马上提交" onclick="window.location=document.frm.s2.value;return false;"/>
    </label></td>
  </tr>
</table>
</div>
</form>
<script language="javascript">
var select1_len = document.frm.s1.options.length;
var select2 = new Array(select1_len);
for (i=0; i<select1_len; i++)
{
 select2[i] = new Array();
}
select2[0][0] = new Option("请选择", " ");
'. $js .'
function redirec(x)
{
 var temp = document.frm.s2; 
 for (i=0;i<select2[x].length;i++)
 {
  temp.options[i]=new Option(select2[x][i].text,select2[x][i].value);
 }
temp.options[0].selected=true;
}
</script>
';

$html = addslashes(str_replace(array("\r\n", '"'), array('', '\''), $html));
echo "document.write(\" $html \")";
?>

让DEDE的文章和列表使用二级域名,实现千万级子站点

突发奇想,额,算了,还是招了吧。这个功能其实早就有了,有人做过了,也有客户联系开发这个功能。

让DEDE的文章和列表使用二级域名,据说这样的SEO效果比较好。这里的比较好,并不是一定说文章收录得就多,就快,而是说权重可能会高一点,收录稳定一点。

但有朋友说,这样的效果做出来,收录会慢一些。

1,要求IIS支持rewrite或者Apache支持mod_rewrite
2,没有独立服务器则要求支持.htaccess
3,一个能做泛解析的域名

第一步,将咱的域名泛解析过来,就是*.4wei.cn解析到..8.8.8,这个过程太复杂

接下来做第二步,将.htaccss上传到网站根目录,实现二级域名的转发,并禁止人访问以前的html页面,因为相同的内容可能会造成被K的杯具。 继续阅读让DEDE的文章和列表使用二级域名,实现千万级子站点

DEDE,给文章中的标题加上链接

DEDE能给文章中的关键字加上链接,同理,也可以自动给文章中其它文章的标题加上链接,今天就来实现这个功能。

实现的思路和过程如下:

  1. 将所有文章的标题和链接地址缓存到临时表或者缓存文件
  2. 这里的文章链接地址可以是动态也可以静态,但生成静态链接则要消耗更多资源

我这里采用了静态地址+文件缓存的办法,在一键更新网站的过程中,按需要增加一步缓存过程,将所有文章的标题和链接缓存处理,然后调用替换过程。

本实例为客户定制开发代码,故不能完整提供程序代码,仅供有动手能力的朋友参考。 继续阅读DEDE,给文章中的标题加上链接

DEDE实现后台禁用登陆验证码

程序版本:DEDE V5.5系列版本
修改文件:dede/login.php; dede/templets/login.htm

适用范围:火车采集器实现DEDE经典登陆的解决方案

解决步骤如下:

  1. 系统基本参数-添加新变量-添加一个后台验证码选项:
    变量名称:    cfg_validate
    变量类型:     布尔(Y/N)
    参数说明:     是否显示后台验证码
    变量值:      Y
    所属组:    其它选项
  2. 修改dede/login.php,行44-45左右,修改添加判断过程 继续阅读DEDE实现后台禁用登陆验证码

DEDE获取当前栏目及所有子栏目的文章数量

因DEDEV5起,加强了对SQL注入和安全的检查,导致无法查询一些正常的子查询的SQL。
以下代码用来解决查询当前栏目及当前栏目下所有子栏目的文章总数,添加到/include/common.func.php
或者
/include/extend.func.php中,然后在模板中调用getTotalArcByTid(1)。

/*
 * 返回符合记录的文章数量
 * @description DEDE不允许执行子查询,解决栏目下文章统计的问题
 * @param $level 为真时查询所有子类目
 * */
function getTotalArcByTid($tid, $level=TRUE) {
 global $dsql;
 
 $level==TRUE && $tid = GetSonTypeID($tid);
 $sql = "SELECT count(id) as total from `#@__archives` where typeid in($tid)";
 $result = $dsql->GetOne($sql);
 return $result['total'];
}

/*
 * 递归获取符合条件的子栏目
 * @param $tid 栏目ID
 * @return string
 * */
function GetSonTypeID($tid)
{
 global $dsql;
 $dsql->SetQuery("Select id From `#@__arctype` where reid in($tid) And ishidden<>1 order by sortrank");
 $dsql->Execute($tid);

 $typeid = '';
 while($row=$dsql->GetObject($tid))
 {
  $typeid .= "{$row->id},";
  $typeid .= GetSonTypeID($row->id);
 }
 
 return trim($typeid,',');
}

DEDEcms使用SQL获得当天已审核的文章总数

24小时发布的新文章:
86400 是 3600 * 24,就是24小时发布的新文章。

select count(id)+0 as total from dede_archives where UNIX_TIMESTAMP() - pubdate < 86400 and arcrank >0;

任意日期发布的最新文章:

SELECT count(ID) as count from dede_archives where pubdate > UNIX_TIMESTAMP( FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d 00:00:00'))  limit 1;

任意日期审核通过的最新文章

SELECT count(ID) as count from dede_archives where pubdate > UNIX_TIMESTAMP( FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d 00:00:00')) and arcrank >  limit 1;

获取当日的零时时间:

FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d 00:00:00')

获取当时零时时间戳:

UNIX_TIMESTAMP( FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d 00:00:00'))

当天发布的最新文章:

SELECT count(ID) as count from dede_archives where to_days(curdate())=to_days(from_unixtime(pubdate))  limit 1;

这里使用 to_days(curdate())=to_days(from_unixtime(pubdate)),使用起来比较方便,资源占用也少,在只查询当天的文档时,推荐使用。