Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

[分享] 自己动手给UChome管理后台增加回收站(三)

[复制链接]
putersham 发表于 2009-9-8 14:24:34 | 显示全部楼层 |阅读模式
本帖最后由 putersham 于 2009-9-8 14:30 编辑

http://blog.sina.com.cn/s/blog_3f1a25310100en5k.html

之前我们已经把数据库相关的数据回收操作以及回收站的显示做好了

接下来的工作还要艰巨,大致有以下几部分

回收站内数据的彻底删除(表单指向的修改,act参数的传递)

彻底删除时扣除积分的屏蔽,防止二次扣除积分

图片的回收(图片文件的移动)(做这个回收站的目的主要就是为了管理员批量删除黄色图片后有个备案,报备给上面,哪个上面就不说了)



首先来解决回收站内数据的彻底删除

其实我们只需要给每个删除时加上 act=recycled 那么删除的操作就会对回收站表来进行

以 动态 为例,打开动态的模板文件 /admincp/tpl/feed.htm

因为回收站内不需要编辑动态,所以我们先给编辑链接加上判断

<!--{if $allowmanage}-->

修改为

<!--{if $allowmanage && $_GET[act]<>'recycled'}-->

刷新缓存后即可发现在回收站状态时不会显示编辑了

其实想要保留此处的编辑也是可以的

只要在编辑的链接后面加上act参数咯

<a href="admincp.php?ac=feed&op=edit&feedid=$value[feedid]">编辑</a>

修改为

<a href="admincp.php?ac=feed&op=edit&feedid=$value[feedid]&act=$_GET[act]">编辑</a>

然后需要注意的是,在编辑回收站内的动态时的页面下方还有一个删除此动态的链接

我们同样需要给这个链接也加上act参数

  &nbsp; <a href="admincp.php?ac=feed&op=delete&feedid=$feed[feedid]" onclick="return confirm('确定要删除吗?');">删除此动态</a>
修改为

  &nbsp; <a href="admincp.php?ac=feed&op=delete&feedid=$feed[feedid]&act=$_GET[act]" onclick="return confirm('确定要删除吗?');">删除此动态</a>


其他部分也是一样的,涉及的页面很多 所以需要细心的检查和查找



同样,批量删除回收站内的资料时也只需要修改对应的form提交地址,在URL后加上act参数

同样以 动态 为例

将130行的

<form method="post" action="admincp.php?ac=feed">

修改为

<form method="post" action="admincp.php?ac=feed&act=$_GET[act]">

这将会是一个很大的修改量,没有什么好办法

在之前的1.5版中,我是采用的session传递回收站状态而实现这个功能的 但是遇到的麻烦更多

所以这次修改决定放弃使用session的办法,采用URL这个最原始也是最安全的办法

一共13个模板文件,修改一下大概需要1个小时



修改完成后就会发现我们可以在回收站内编辑相应的内容,也就是对回收站表的数据操作了



接下来需要解决的一个问题就是返回路径

我们发现在回收站状态下不管是批量删除,还是编辑,返回的都是非回收站路径

问题还是一样的 只要给程序里加上判断 以及act参数



依然以 动态(feed) 为例

打开admincp/admincp_feed.php

找到删除相关的操作 如下:

include_once(S_ROOT.'./source/function_delete.php');
if(!empty($_POST['ids']) && deletefeeds($_POST['ids'])) {
  cpmessage('do_success', $_POST['mpurl']);
} else {
  cpmessage('choose_to_delete_events', $_POST['mpurl']);
}
我们可以发现系统使用的是cpmessage函数来返回提示信息以及实现页面的跳转的

跳转的目标地址是通过表单传递来的,

所以我们返回feed.htm文件,找到 name为mpurl的隐藏表单项

在 feed.htm 第183行附近,我们找到如下

  <input type="hidden" name="mpurl" value="$mpurl">
发现mpurl的值是在程序里定义的,我们回到 admincp_feed.php 找$mpurl这个函数

一共有五处,第一处是初始化该函数,其余五处都是增加参数

所以我们只要对第一处修改即可,admincp_feed.php文件第138行

$mpurl = 'admincp.php?ac=feed';
修改为

$mpurl = 'admincp.php?ac=feed&act='.$_GET[act];


好了,现在在回收站内删除文件后还会返回回收站咯



然后我们再看看编辑,检查admincp_feed.php,我们找到用于处理添加和编辑数据提交的操作,如下

if(submitcheck('feedsubmit')) {

if(!$allowmanage) {
  cpmessage('no_authority_management_operation');
}

$feedid = intval($_POST['feedid']);

if(empty($_POST['feeduid']) || empty($feedid)) {
  $setarr = array(
   'title_template' => trim($_POST['title_template']),
   'body_template' => trim($_POST['body_template'])
  );
  if(empty($setarr['title_template']) && empty($setarr['body_template'])) {
   cpmessage('sitefeed_error');
  }
} else {
  $setarr = array();
}

//时间问题
$_POST['dateline'] = trim($_POST['dateline']);
if($_POST['dateline']) {
  $newtimestamp = sstrtotime($_POST['dateline']);
  if($newtimestamp > $_SGLOBAL['timestamp']) {
   $_SGLOBAL['timestamp'] = $newtimestamp;
  }
}

if(empty($feedid)) {
  $_SGLOBAL['supe_uid'] = 0;
  
  include_once(S_ROOT.'./source/function_cp.php');
  $feedid = feed_add('sitefeed',
   trim($_POST['title_template']),array(),
   trim($_POST['body_template']),array(),
   trim($_POST['body_general']),
   array(trim($_POST['image_1']),trim($_POST['image_2']),trim($_POST['image_3']),trim($_POST['image_4'])),
   array(trim($_POST['image_1_link']),trim($_POST['image_2_link']),trim($_POST['image_3_link']),trim($_POST['image_4_link'])),
   '','','',1
  );
  
} else {
  if(empty($_POST['feeduid'])) {
   $setarr['body_general'] = trim($_POST['body_general']);
  }
  $setarr['image_1'] = trim($_POST['image_1']);
  $setarr['image_1_link'] = trim($_POST['image_1_link']);
  $setarr['image_2'] = trim($_POST['image_2']);
  $setarr['image_2_link'] = trim($_POST['image_2_link']);
  $setarr['image_3'] = trim($_POST['image_3']);
  $setarr['image_3_link'] = trim($_POST['image_3_link']);
  $setarr['image_4'] = trim($_POST['image_4']);
  $setarr['image_4_link'] = trim($_POST['image_4_link']);
  
  $setarr['dateline'] = $newtimestamp;
  $setarr['hot'] = intval($_POST['hot']);
  
  updatetable('feed', $setarr, array('feedid'=>$feedid));
  
  if($setarr['hot'] && $_POST['id'] && $_POST['idtype']) {
   include_once(S_ROOT.'./source/function_cp.php');
   if($tablename = gettablebyidtype($_POST['idtype'])) {
    updatetable($tablename, array('hot'=>$setarr['hot']), array($_POST['idtype']=>$_POST['id']));
   }
  }
}
cpmessage('do_success', 'admincp.php?ac=feed&feedid='.$feedid);

}

且不管是如何修改或者增加的,我们注意到这个代码片段的最后一行:

cpmessage('do_success', 'admincp.php?ac=feed&feedid='.$feedid);

同样是一个信息提示以及页面的转向,很显然,转向的地址依然没有带 act参数

加上即可

cpmessage('do_success', 'admincp.php?ac=feed&feedid='.$feedid.'&act='.$_GET['act']);


优化的解决方案:

通过对所有文件的搜索,我们发现 cpmessage这个函数只存在于admincp目录下的文件

也就是说只有管理后台的操作使用到了这个函数

将计就计,我们就直接对这个函数下手先,这样可以省去我们不少工作哦

在function cpmessage($msgkey, $url_forward='', $second=1, $values=array()) 这个函数的最顶部对第二个参数进行操作

修改后的cpmessage如下:

function cpmessage($msgkey, $url_forward='', $second=1, $values=array()) {
if($url_forward){
  $url_forward = $url_forward.'&act='.$_GET[act];
}
global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $_SN, $space;

//去掉广告
$_SGLOBAL['ad'] = array();

include_once(S_ROOT.'./language/lang_cpmessage.php');
if(isset($_SGLOBAL['cplang'][$msgkey])) {
  $message = lang_replace($_SGLOBAL['cplang'][$msgkey], $values);
} else {
  $message = $msgkey;
}

//显示
obclean();

//菜单激活
$menuactive = array('index' => ' class="active"');

if(!empty($url_forward)) {
  $second = $second * 1000;
  $message .= "<script>setTimeout(\"window.location.href ='$url_forward';\", $second);</script>";
}
include template('admin/tpl/message');
exit();
}
回复

使用道具 举报

coldhair 发表于 2009-9-8 15:11:40 | 显示全部楼层
都是楼主自己写的吗,真厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-9-9 19:11 , Processed in 0.085167 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表