| 1 | <?php |
|---|
| 2 | // $Id: comment_delete.php,v 1.4 2005/08/03 12:39:11 onokazu Exp $ |
|---|
| 3 | // ------------------------------------------------------------------------ // |
|---|
| 4 | // XOOPS - PHP Content Management System // |
|---|
| 5 | // Copyright (c) 2000 XOOPS.org // |
|---|
| 6 | // <http://www.xoops.org/> // |
|---|
| 7 | // ------------------------------------------------------------------------ // |
|---|
| 8 | // This program is free software; you can redistribute it and/or modify // |
|---|
| 9 | // it under the terms of the GNU General Public License as published by // |
|---|
| 10 | // the Free Software Foundation; either version 2 of the License, or // |
|---|
| 11 | // (at your option) any later version. // |
|---|
| 12 | // // |
|---|
| 13 | // You may not change or alter any portion of this comment or credits // |
|---|
| 14 | // of supporting developers from this source code or any supporting // |
|---|
| 15 | // source code which is considered copyrighted (c) material of the // |
|---|
| 16 | // original comment or credit authors. // |
|---|
| 17 | // // |
|---|
| 18 | // This program is distributed in the hope that it will be useful, // |
|---|
| 19 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|---|
| 20 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|---|
| 21 | // GNU General Public License for more details. // |
|---|
| 22 | // // |
|---|
| 23 | // You should have received a copy of the GNU General Public License // |
|---|
| 24 | // along with this program; if not, write to the Free Software // |
|---|
| 25 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // |
|---|
| 26 | // ------------------------------------------------------------------------ // |
|---|
| 27 | // Author: Kazumi Ono (AKA onokazu) // |
|---|
| 28 | // URL: http://www.xoops.org/ http://jp.xoops.org/ http://www.myweb.ne.jp/ // |
|---|
| 29 | // Project: The XOOPS Project (http://www.xoops.org/) // |
|---|
| 30 | // ------------------------------------------------------------------------- // |
|---|
| 31 | |
|---|
| 32 | if (!defined('XOOPS_ROOT_PATH') || !is_object($xoopsModule)) { |
|---|
| 33 | exit(); |
|---|
| 34 | } |
|---|
| 35 | include_once XOOPS_ROOT_PATH.'/include/comment_constants.php'; |
|---|
| 36 | $op = 'delete'; |
|---|
| 37 | if (!empty($_POST)) { |
|---|
| 38 | $com_mode = isset($_POST['com_mode']) ? htmlspecialchars(trim($_POST['com_mode']), ENT_QUOTES) : 'flat'; |
|---|
| 39 | $com_order = isset($_POST['com_order']) ? intval($_POST['com_order']) : XOOPS_COMMENT_OLD1ST; |
|---|
| 40 | $com_id = isset($_POST['com_id']) ? intval($_POST['com_id']) : 0; |
|---|
| 41 | $op = isset($_POST['op']) ? $_POST['op'] : 'delete'; |
|---|
| 42 | } else { |
|---|
| 43 | $com_mode = isset($_GET['com_mode']) ? htmlspecialchars(trim($_GET['com_mode']), ENT_QUOTES) : 'flat'; |
|---|
| 44 | $com_order = isset($_GET['com_order']) ? intval($_GET['com_order']) : XOOPS_COMMENT_OLD1ST; |
|---|
| 45 | $com_id = isset($_GET['com_id']) ? intval($_GET['com_id']) : 0; |
|---|
| 46 | |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | if ('system' == $xoopsModule->getVar('dirname')) { |
|---|
| 50 | $comment_handler =& xoops_gethandler('comment'); |
|---|
| 51 | $comment =& $comment_handler->get($com_id); |
|---|
| 52 | $module_handler =& xoops_gethandler('module'); |
|---|
| 53 | $module =& $module_handler->get($comment->getVar('com_modid')); |
|---|
| 54 | $comment_config = $module->getInfo('comments'); |
|---|
| 55 | $com_modid = $module->getVar('mid'); |
|---|
| 56 | $redirect_page = XOOPS_URL.'/modules/system/admin.php?fct=comments&com_modid='.$com_modid.'&com_itemid'; |
|---|
| 57 | $moddir = $module->getVar('dirname'); |
|---|
| 58 | unset($comment); |
|---|
| 59 | } else { |
|---|
| 60 | if (XOOPS_COMMENT_APPROVENONE == $xoopsModuleConfig['com_rule']) { |
|---|
| 61 | exit(); |
|---|
| 62 | } |
|---|
| 63 | $comment_config = $xoopsModule->getInfo('comments'); |
|---|
| 64 | $com_modid = $xoopsModule->getVar('mid'); |
|---|
| 65 | $redirect_page = $comment_config['pageName'].'?'; |
|---|
| 66 | $comment_confirm_extra = array(); |
|---|
| 67 | if (isset($comment_config['extraParams']) && is_array($comment_config['extraParams'])) { |
|---|
| 68 | foreach ($comment_config['extraParams'] as $extra_param) { |
|---|
| 69 | if (isset(${$extra_param})) { |
|---|
| 70 | $redirect_page .= $extra_param.'='.${$extra_param}.'&'; |
|---|
| 71 | |
|---|
| 72 | // for the confirmation page |
|---|
| 73 | $comment_confirm_extra [$extra_param] = ${$extra_param}; |
|---|
| 74 | } elseif (isset($_GET[$extra_param])) { |
|---|
| 75 | $redirect_page .= $extra_param.'='.$_GET[$extra_param].'&'; |
|---|
| 76 | |
|---|
| 77 | // for the confirmation page |
|---|
| 78 | $comment_confirm_extra [$extra_param] = $_GET[$extra_param]; |
|---|
| 79 | } |
|---|
| 80 | } |
|---|
| 81 | } |
|---|
| 82 | $redirect_page .= $comment_config['itemName']; |
|---|
| 83 | $moddir = $xoopsModule->getVar('dirname'); |
|---|
| 84 | } |
|---|
| 85 | |
|---|
| 86 | $accesserror = false; |
|---|
| 87 | if (!is_object($xoopsUser)) { |
|---|
| 88 | $accesserror = true; |
|---|
| 89 | } else { |
|---|
| 90 | if (!$xoopsUser->isAdmin($com_modid)) { |
|---|
| 91 | $sysperm_handler =& xoops_gethandler('groupperm'); |
|---|
| 92 | if (!$sysperm_handler->checkRight('system_admin', XOOPS_SYSTEM_COMMENT, $xoopsUser->getGroups())) { |
|---|
| 93 | $accesserror = true; |
|---|
| 94 | } |
|---|
| 95 | } |
|---|
| 96 | } |
|---|
| 97 | |
|---|
| 98 | if (false != $accesserror) { |
|---|
| 99 | $ref = xoops_getenv('HTTP_REFERER'); |
|---|
| 100 | if ($ref != '') { |
|---|
| 101 | redirect_header($ref, 2, _NOPERM); |
|---|
| 102 | } else { |
|---|
| 103 | redirect_header($redirect_page.'?'.$comment_config['itemName'].'='.intval($com_itemid), 2, _NOPERM); |
|---|
| 104 | } |
|---|
| 105 | exit(); |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | include_once XOOPS_ROOT_PATH.'/language/'.$xoopsConfig['language'].'/comment.php'; |
|---|
| 109 | |
|---|
| 110 | switch ($op) { |
|---|
| 111 | case 'delete_one': |
|---|
| 112 | $comment_handler = xoops_gethandler('comment'); |
|---|
| 113 | $comment =& $comment_handler->get($com_id); |
|---|
| 114 | if (!$comment_handler->delete($comment)) { |
|---|
| 115 | include XOOPS_ROOT_PATH.'/header.php'; |
|---|
| 116 | xoops_error(_CM_COMDELETENG.' (ID: '.$comment->getVar('com_id').')'); |
|---|
| 117 | include XOOPS_ROOT_PATH.'/footer.php'; |
|---|
| 118 | exit(); |
|---|
| 119 | } |
|---|
| 120 | |
|---|
| 121 | $com_itemid = $comment->getVar('com_itemid'); |
|---|
| 122 | |
|---|
| 123 | // execute updateStat callback function if set |
|---|
| 124 | if (isset($comment_config['callback']['update']) && trim($comment_config['callback']['update']) != '') { |
|---|
| 125 | $skip = false; |
|---|
| 126 | if (!function_exists($comment_config['callback']['update'])) { |
|---|
| 127 | if (isset($comment_config['callbackFile'])) { |
|---|
| 128 | $callbackfile = trim($comment_config['callbackFile']); |
|---|
| 129 | if ($callbackfile != '' && file_exists(XOOPS_ROOT_PATH.'/modules/'.$moddir.'/'.$callbackfile)) { |
|---|
| 130 | include_once XOOPS_ROOT_PATH.'/modules/'.$moddir.'/'.$callbackfile; |
|---|
| 131 | } |
|---|
| 132 | if (!function_exists($comment_config['callback']['update'])) { |
|---|
| 133 | $skip = true; |
|---|
| 134 | } |
|---|
| 135 | } else { |
|---|
| 136 | $skip = true; |
|---|
| 137 | } |
|---|
| 138 | } |
|---|
| 139 | if (!$skip) { |
|---|
| 140 | $criteria = new CriteriaCompo(new Criteria('com_modid', $com_modid)); |
|---|
| 141 | $criteria->add(new Criteria('com_itemid', $com_itemid)); |
|---|
| 142 | $criteria->add(new Criteria('com_status', XOOPS_COMMENT_ACTIVE)); |
|---|
| 143 | $comment_count = $comment_handler->getCount($criteria); |
|---|
| 144 | $comment_config['callback']['update']($com_itemid, $comment_count); |
|---|
| 145 | } |
|---|
| 146 | } |
|---|
| 147 | |
|---|
| 148 | // update user posts if its not an anonymous post |
|---|
| 149 | if ($comment->getVar('com_uid') != 0) { |
|---|
| 150 | $member_handler =& xoops_gethandler('member'); |
|---|
| 151 | $com_poster =& $member_handler->getUser($comment->getVar('com_uid')); |
|---|
| 152 | if (is_object($com_poster)) { |
|---|
| 153 | $member_handler->updateUserByField($com_poster, 'posts', $com_poster->getVar('posts') - 1); |
|---|
| 154 | } |
|---|
| 155 | } |
|---|
| 156 | |
|---|
| 157 | // get all comments posted later within the same thread |
|---|
| 158 | $thread_comments =& $comment_handler->getThread($comment->getVar('com_rootid'), $com_id); |
|---|
| 159 | |
|---|
| 160 | include_once XOOPS_ROOT_PATH.'/class/tree.php'; |
|---|
| 161 | $xot = new XoopsObjectTree($thread_comments, 'com_id', 'com_pid', 'com_rootid'); |
|---|
| 162 | |
|---|
| 163 | $child_comments =& $xot->getFirstChild($com_id); |
|---|
| 164 | |
|---|
| 165 | // now set new parent ID for direct child comments |
|---|
| 166 | $new_pid = $comment->getVar('com_pid'); |
|---|
| 167 | $errs = array(); |
|---|
| 168 | foreach (array_keys($child_comments) as $i) { |
|---|
| 169 | $child_comments[$i]->setVar('com_pid', $new_pid); |
|---|
| 170 | // if the deleted comment is a root comment, need to change root id to own id |
|---|
| 171 | if (false != $comment->isRoot()) { |
|---|
| 172 | $new_rootid = $child_comments[$i]->getVar('com_id'); |
|---|
| 173 | $child_comments[$i]->setVar('com_rootid', $child_comments[$i]->getVar('com_id')); |
|---|
| 174 | if (!$comment_handler->insert($child_comments[$i])) { |
|---|
| 175 | $errs[] = 'Could not change comment parent ID from <b>'.$com_id.'</b> to <b>'.$new_pid.'</b>. (ID: '.$new_rootid.')'; |
|---|
| 176 | } else { |
|---|
| 177 | // need to change root id for all its child comments as well |
|---|
| 178 | $c_child_comments =& $xot->getAllChild($new_rootid); |
|---|
| 179 | $cc_count = count($c_child_comments); |
|---|
| 180 | foreach (array_keys($c_child_comments) as $j) { |
|---|
| 181 | $c_child_comments[$j]->setVar('com_rootid', $new_rootid); |
|---|
| 182 | if (!$comment_handler->insert($c_child_comments[$j])) { |
|---|
| 183 | $errs[] = 'Could not change comment root ID from <b>'.$com_id.'</b> to <b>'.$new_rootid.'</b>.'; |
|---|
| 184 | } |
|---|
| 185 | } |
|---|
| 186 | } |
|---|
| 187 | } else { |
|---|
| 188 | if (!$comment_handler->insert($child_comments[$i])) { |
|---|
| 189 | $errs[] = 'Could not change comment parent ID from <b>'.$com_id.'</b> to <b>'.$new_pid.'</b>.'; |
|---|
| 190 | } |
|---|
| 191 | } |
|---|
| 192 | } |
|---|
| 193 | if (count($errs) > 0) { |
|---|
| 194 | include XOOPS_ROOT_PATH.'/header.php'; |
|---|
| 195 | xoops_error($errs); |
|---|
| 196 | include XOOPS_ROOT_PATH.'/footer.php'; |
|---|
| 197 | exit(); |
|---|
| 198 | } |
|---|
| 199 | redirect_header($redirect_page.'='.$com_itemid.'&com_order='.$com_order.'&com_mode='.$com_mode, 1, _CM_COMDELETED); |
|---|
| 200 | break; |
|---|
| 201 | |
|---|
| 202 | case 'delete_all': |
|---|
| 203 | $comment_handler = xoops_gethandler('comment'); |
|---|
| 204 | $comment =& $comment_handler->get($com_id); |
|---|
| 205 | $com_rootid = $comment->getVar('com_rootid'); |
|---|
| 206 | |
|---|
| 207 | // get all comments posted later within the same thread |
|---|
| 208 | $thread_comments =& $comment_handler->getThread($com_rootid, $com_id); |
|---|
| 209 | |
|---|
| 210 | // construct a comment tree |
|---|
| 211 | include_once XOOPS_ROOT_PATH.'/class/tree.php'; |
|---|
| 212 | $xot = new XoopsObjectTree($thread_comments, 'com_id', 'com_pid', 'com_rootid'); |
|---|
| 213 | $child_comments =& $xot->getAllChild($com_id); |
|---|
| 214 | // add itself here |
|---|
| 215 | $child_comments[$com_id] =& $comment; |
|---|
| 216 | $msgs = array(); |
|---|
| 217 | $deleted_num = array(); |
|---|
| 218 | $member_handler =& xoops_gethandler('member'); |
|---|
| 219 | foreach (array_keys($child_comments) as $i) { |
|---|
| 220 | if (!$comment_handler->delete($child_comments[$i])) { |
|---|
| 221 | $msgs[] = _CM_COMDELETENG.' (ID: '.$child_comments[$i]->getVar('com_id').')'; |
|---|
| 222 | } else { |
|---|
| 223 | $msgs[] = _CM_COMDELETED.' (ID: '.$child_comments[$i]->getVar('com_id').')'; |
|---|
| 224 | // store poster ID and deleted post number into array for later use |
|---|
| 225 | $poster_id = $child_comments[$i]->getVar('com_uid'); |
|---|
| 226 | if ($poster_id > 0) { |
|---|
| 227 | $deleted_num[$poster_id] = !isset($deleted_num[$poster_id]) ? 1 : ($deleted_num[$poster_id] + 1); |
|---|
| 228 | } |
|---|
| 229 | } |
|---|
| 230 | } |
|---|
| 231 | foreach ($deleted_num as $user_id => $post_num) { |
|---|
| 232 | // update user posts |
|---|
| 233 | $com_poster = $member_handler->getUser($user_id); |
|---|
| 234 | if (is_object($com_poster)) { |
|---|
| 235 | $member_handler->updateUserByField($com_poster, 'posts', $com_poster->getVar('posts') - $post_num); |
|---|
| 236 | } |
|---|
| 237 | } |
|---|
| 238 | |
|---|
| 239 | $com_itemid = $comment->getVar('com_itemid'); |
|---|
| 240 | |
|---|
| 241 | // execute updateStat callback function if set |
|---|
| 242 | if (isset($comment_config['callback']['update']) && trim($comment_config['callback']['update']) != '') { |
|---|
| 243 | $skip = false; |
|---|
| 244 | if (!function_exists($comment_config['callback']['update'])) { |
|---|
| 245 | if (isset($comment_config['callbackFile'])) { |
|---|
| 246 | $callbackfile = trim($comment_config['callbackFile']); |
|---|
| 247 | if ($callbackfile != '' && file_exists(XOOPS_ROOT_PATH.'/modules/'.$moddir.'/'.$callbackfile)) { |
|---|
| 248 | include_once XOOPS_ROOT_PATH.'/modules/'.$moddir.'/'.$callbackfile; |
|---|
| 249 | } |
|---|
| 250 | if (!function_exists($comment_config['callback']['update'])) { |
|---|
| 251 | $skip = true; |
|---|
| 252 | } |
|---|
| 253 | } else { |
|---|
| 254 | $skip = true; |
|---|
| 255 | } |
|---|
| 256 | } |
|---|
| 257 | if (!$skip) { |
|---|
| 258 | $criteria = new CriteriaCompo(new Criteria('com_modid', $com_modid)); |
|---|
| 259 | $criteria->add(new Criteria('com_itemid', $com_itemid)); |
|---|
| 260 | $criteria->add(new Criteria('com_status', XOOPS_COMMENT_ACTIVE)); |
|---|
| 261 | $comment_count = $comment_handler->getCount($criteria); |
|---|
| 262 | $comment_config['callback']['update']($com_itemid, $comment_count); |
|---|
| 263 | } |
|---|
| 264 | } |
|---|
| 265 | |
|---|
| 266 | include XOOPS_ROOT_PATH.'/header.php'; |
|---|
| 267 | xoops_result($msgs); |
|---|
| 268 | echo '<br /><a href="'.$redirect_page.'='.$com_itemid.'&com_order='.$com_order.'&com_mode='.$com_mode.'">'._BACK.'</a>'; |
|---|
| 269 | include XOOPS_ROOT_PATH.'/footer.php'; |
|---|
| 270 | break; |
|---|
| 271 | |
|---|
| 272 | case 'delete': |
|---|
| 273 | default: |
|---|
| 274 | include XOOPS_ROOT_PATH.'/header.php'; |
|---|
| 275 | $comment_confirm = array('com_id' => $com_id, 'com_mode' => $com_mode, 'com_order' => $com_order, 'op' => array(_CM_DELETEONE => 'delete_one', _CM_DELETEALL => 'delete_all')); |
|---|
| 276 | if (!empty($comment_confirm_extra) && is_array($comment_confirm_extra)) { |
|---|
| 277 | $comment_confirm = $comment_confirm + $comment_confirm_extra; |
|---|
| 278 | } |
|---|
| 279 | xoops_confirm($comment_confirm, 'comment_delete.php', _CM_DELETESELECT); |
|---|
| 280 | include XOOPS_ROOT_PATH.'/footer.php'; |
|---|
| 281 | break; |
|---|
| 282 | } |
|---|
| 283 | ?> |
|---|