@@ -14,14 +14,14 @@ discard block |
||
| 14 | 14 | require_once __DIR__ . '/header.php'; |
| 15 | 15 | |
| 16 | 16 | if (!$forum = Request::getString('forum', '', 'GET')) { |
| 17 | - redirect_header(XOOPS_URL . '/index.php', 2, _MD_NEWBB_ERRORFORUM); |
|
| 17 | + redirect_header(XOOPS_URL . '/index.php', 2, _MD_NEWBB_ERRORFORUM); |
|
| 18 | 18 | } |
| 19 | 19 | |
| 20 | 20 | ///** @var Newbb\ForumHandler $forumHandler */ |
| 21 | 21 | //$forumHandler = Newbb\Helper::getInstance()->getHandler('Forum'); |
| 22 | 22 | $forumObject = $forumHandler->get($forum); |
| 23 | 23 | if (!$forumHandler->getPermission($forumObject)) { |
| 24 | - redirect_header(XOOPS_URL . '/index.php', 2, _NOPERM); |
|
| 24 | + redirect_header(XOOPS_URL . '/index.php', 2, _NOPERM); |
|
| 25 | 25 | } |
| 26 | 26 | |
| 27 | 27 | ///** @var Newbb\TopicHandler $topicHandler */ |
@@ -29,25 +29,25 @@ discard block |
||
| 29 | 29 | $topicObject = $topicHandler->create(); |
| 30 | 30 | $topicObject->setVar('forum_id', $forum); |
| 31 | 31 | if (!$topicHandler->getPermission($forumObject, 0, 'post')) { |
| 32 | - /* |
|
| 32 | + /* |
|
| 33 | 33 | * Build the page query |
| 34 | 34 | */ |
| 35 | - $query_vars = ['forum', 'order', 'mode', 'viewmode']; |
|
| 36 | - $query_array = []; |
|
| 37 | - foreach ($query_vars as $var) { |
|
| 38 | - if (Request::getString($var, '', 'GET')) { |
|
| 39 | - $query_array[$var] = "{$var}=" . Request::getString($var, '', 'GET'); |
|
| 40 | - } |
|
| 41 | - } |
|
| 42 | - $page_query = htmlspecialchars(implode('&', array_values($query_array)), ENT_QUOTES | ENT_HTML5); |
|
| 43 | - unset($query_array); |
|
| 44 | - redirect_header(XOOPS_URL . "/modules/newbb/viewforum.php?{$page_query}", 2, _MD_NEWBB_NORIGHTTOPOST); |
|
| 35 | + $query_vars = ['forum', 'order', 'mode', 'viewmode']; |
|
| 36 | + $query_array = []; |
|
| 37 | + foreach ($query_vars as $var) { |
|
| 38 | + if (Request::getString($var, '', 'GET')) { |
|
| 39 | + $query_array[$var] = "{$var}=" . Request::getString($var, '', 'GET'); |
|
| 40 | + } |
|
| 41 | + } |
|
| 42 | + $page_query = htmlspecialchars(implode('&', array_values($query_array)), ENT_QUOTES | ENT_HTML5); |
|
| 43 | + unset($query_array); |
|
| 44 | + redirect_header(XOOPS_URL . "/modules/newbb/viewforum.php?{$page_query}", 2, _MD_NEWBB_NORIGHTTOPOST); |
|
| 45 | 45 | } |
| 46 | 46 | |
| 47 | 47 | if ($GLOBALS['xoopsModuleConfig']['wol_enabled']) { |
| 48 | - // /** @var Newbb\OnlineHandler $onlineHandler */ |
|
| 49 | - // $onlineHandler = Newbb\Helper::getInstance()->getHandler('Online'); |
|
| 50 | - $onlineHandler->init($forumObject); |
|
| 48 | + // /** @var Newbb\OnlineHandler $onlineHandler */ |
|
| 49 | + // $onlineHandler = Newbb\Helper::getInstance()->getHandler('Online'); |
|
| 50 | + $onlineHandler->init($forumObject); |
|
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | $xoopsOption['template_main'] = 'newbb_edit_post.tpl'; |
@@ -55,7 +55,7 @@ discard block |
||
| 55 | 55 | require_once $GLOBALS['xoops']->path('header.php'); |
| 56 | 56 | |
| 57 | 57 | if (1 == $GLOBALS['xoopsModuleConfig']['disc_show'] || 3 == $GLOBALS['xoopsModuleConfig']['disc_show']) { |
| 58 | - $xoopsTpl->assign('disclaimer', $GLOBALS['xoopsModuleConfig']['disclaimer']); |
|
| 58 | + $xoopsTpl->assign('disclaimer', $GLOBALS['xoopsModuleConfig']['disclaimer']); |
|
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | $subject = ''; |
@@ -35,25 +35,25 @@ discard block |
||
| 35 | 35 | require_once __DIR__ . '/header.php'; |
| 36 | 36 | |
| 37 | 37 | if (Request::getString('submit', '', 'POST')) { |
| 38 | - foreach (['forum', 'newforum', 'newtopic'] as $getint) { |
|
| 39 | - ${$getint} = Request::getInt($getint, 0, 'POST');// (int)(@$_POST[$getint]); |
|
| 40 | - } |
|
| 41 | - foreach (['topic_id'] as $getint) { |
|
| 42 | - ${$getint} = Request::getInt($getint, 0, 'POST');// (int)(@$_POST[$getint]); |
|
| 43 | - } |
|
| 44 | - if (!is_array($topic_id)) { |
|
| 45 | - $topic_id = [$topic_id]; |
|
| 46 | - } |
|
| 38 | + foreach (['forum', 'newforum', 'newtopic'] as $getint) { |
|
| 39 | + ${$getint} = Request::getInt($getint, 0, 'POST');// (int)(@$_POST[$getint]); |
|
| 40 | + } |
|
| 41 | + foreach (['topic_id'] as $getint) { |
|
| 42 | + ${$getint} = Request::getInt($getint, 0, 'POST');// (int)(@$_POST[$getint]); |
|
| 43 | + } |
|
| 44 | + if (!is_array($topic_id)) { |
|
| 45 | + $topic_id = [$topic_id]; |
|
| 46 | + } |
|
| 47 | 47 | } else { |
| 48 | - foreach (['forum', 'topic_id'] as $getint) { |
|
| 49 | - ${$getint} = Request::getInt($getint, 0, 'GET');// (int)(@$_GET[$getint]); |
|
| 50 | - } |
|
| 48 | + foreach (['forum', 'topic_id'] as $getint) { |
|
| 49 | + ${$getint} = Request::getInt($getint, 0, 'GET');// (int)(@$_GET[$getint]); |
|
| 50 | + } |
|
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | if (empty($topic_id)) { |
| 54 | - $redirect = empty($forum_id) ? 'index.php' : 'viewforum.php?forum={$forum}'; |
|
| 55 | - $redirect = XOOPS_URL . '/modules/newbb/' . $redirect; |
|
| 56 | - redirect_header($redirect, 2, _MD_NEWBB_ERRORTOPIC); |
|
| 54 | + $redirect = empty($forum_id) ? 'index.php' : 'viewforum.php?forum={$forum}'; |
|
| 55 | + $redirect = XOOPS_URL . '/modules/newbb/' . $redirect; |
|
| 56 | + redirect_header($redirect, 2, _MD_NEWBB_ERRORTOPIC); |
|
| 57 | 57 | } |
| 58 | 58 | |
| 59 | 59 | ///** @var Newbb\TopicHandler $topicHandler */ |
@@ -62,43 +62,43 @@ discard block |
||
| 62 | 62 | //$forumHandler = Newbb\Helper::getInstance()->getHandler('Forum'); |
| 63 | 63 | |
| 64 | 64 | if (!$forum) { |
| 65 | - /** @var Newbb\Topic $topicObject */ |
|
| 66 | - $topicObject = $topicHandler->get((int)$topic_id); |
|
| 67 | - if (is_object($topicObject)) { |
|
| 68 | - $forum = $topicObject->getVar('forum_id'); |
|
| 69 | - } else { |
|
| 70 | - $redirect = XOOPS_URL . '/modules/newbb/viewtopic.php?topic_id=' . $topic_id; |
|
| 71 | - redirect_header($redirect, 2, _MD_NEWBB_FORUMNOEXIST); |
|
| 72 | - } |
|
| 73 | - unset($topicObject); |
|
| 65 | + /** @var Newbb\Topic $topicObject */ |
|
| 66 | + $topicObject = $topicHandler->get((int)$topic_id); |
|
| 67 | + if (is_object($topicObject)) { |
|
| 68 | + $forum = $topicObject->getVar('forum_id'); |
|
| 69 | + } else { |
|
| 70 | + $redirect = XOOPS_URL . '/modules/newbb/viewtopic.php?topic_id=' . $topic_id; |
|
| 71 | + redirect_header($redirect, 2, _MD_NEWBB_FORUMNOEXIST); |
|
| 72 | + } |
|
| 73 | + unset($topicObject); |
|
| 74 | 74 | } |
| 75 | 75 | |
| 76 | 76 | if ($GLOBALS['xoopsModuleConfig']['wol_enabled']) { |
| 77 | - // /** @var Newbb\OnlineHandler $onlineHandler */ |
|
| 78 | - // $onlineHandler = Newbb\Helper::getInstance()->getHandler('Online'); |
|
| 79 | - $onlineHandler->init($forum); |
|
| 77 | + // /** @var Newbb\OnlineHandler $onlineHandler */ |
|
| 78 | + // $onlineHandler = Newbb\Helper::getInstance()->getHandler('Online'); |
|
| 79 | + $onlineHandler->init($forum); |
|
| 80 | 80 | } |
| 81 | 81 | // irmtfan add restore to viewtopic |
| 82 | 82 | $action_array = [ |
| 83 | - 'merge', |
|
| 84 | - 'delete', |
|
| 85 | - 'restore', |
|
| 86 | - 'move', |
|
| 87 | - 'lock', |
|
| 88 | - 'unlock', |
|
| 89 | - 'sticky', |
|
| 90 | - 'unsticky', |
|
| 91 | - 'digest', |
|
| 92 | - 'undigest' |
|
| 83 | + 'merge', |
|
| 84 | + 'delete', |
|
| 85 | + 'restore', |
|
| 86 | + 'move', |
|
| 87 | + 'lock', |
|
| 88 | + 'unlock', |
|
| 89 | + 'sticky', |
|
| 90 | + 'unsticky', |
|
| 91 | + 'digest', |
|
| 92 | + 'undigest' |
|
| 93 | 93 | ]; |
| 94 | 94 | foreach ($action_array as $_action) { |
| 95 | - $action[$_action] = [ |
|
| 96 | - 'name' => $_action, |
|
| 97 | - 'desc' => constant(strtoupper("_MD_NEWBB_DESC_{$_action}")), |
|
| 98 | - 'submit' => constant(strtoupper("_MD_NEWBB_{$_action}")), |
|
| 99 | - 'sql' => "topic_{$_action}=1", |
|
| 100 | - 'msg' => constant(strtoupper("_MD_NEWBB_TOPIC{$_action}")) |
|
| 101 | - ]; |
|
| 95 | + $action[$_action] = [ |
|
| 96 | + 'name' => $_action, |
|
| 97 | + 'desc' => constant(strtoupper("_MD_NEWBB_DESC_{$_action}")), |
|
| 98 | + 'submit' => constant(strtoupper("_MD_NEWBB_{$_action}")), |
|
| 99 | + 'sql' => "topic_{$_action}=1", |
|
| 100 | + 'msg' => constant(strtoupper("_MD_NEWBB_TOPIC{$_action}")) |
|
| 101 | + ]; |
|
| 102 | 102 | } |
| 103 | 103 | $action['lock']['sql'] = 'topic_status = 1'; |
| 104 | 104 | $action['unlock']['sql'] = 'topic_status = 0'; |
@@ -112,269 +112,269 @@ discard block |
||
| 112 | 112 | require_once $GLOBALS['xoops']->path('header.php'); |
| 113 | 113 | |
| 114 | 114 | if (Request::getString('submit', '', 'POST')) { |
| 115 | - $mode = Request::getString('mode', '', 'POST');// $_POST['mode']; |
|
| 115 | + $mode = Request::getString('mode', '', 'POST');// $_POST['mode']; |
|
| 116 | 116 | |
| 117 | - if ('delete' === $mode) { |
|
| 118 | - foreach ($topic_id as $tid) { |
|
| 119 | - $topicObject = $topicHandler->get($tid); |
|
| 120 | - $topicHandler->delete($topicObject, false); |
|
| 121 | - // irmtfan - sync topic after delete |
|
| 122 | - $topicHandler->synchronization($topicObject); |
|
| 123 | - $forumHandler->synchronization($forum); |
|
| 124 | - //$topicObject->loadFilters("delete"); |
|
| 125 | - //sync($topic_id, "topic"); |
|
| 126 | - //xoops_notification_deletebyitem ($xoopsModule->getVar('mid'), 'thread', $topic_id); |
|
| 127 | - } |
|
| 128 | - // irmtfan full URL |
|
| 129 | - echo $action[$mode]['msg'] . "<p><a href='" . XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . "/viewforum.php?forum=$forum'>" . _MD_NEWBB_RETURNTOTHEFORUM . "</a></p><p><a href='index.php'>" . _MD_NEWBB_RETURNFORUMINDEX . '</a></p>'; |
|
| 130 | - } elseif ('restore' === $mode) { |
|
| 131 | - //$topicHandler = Newbb\Helper::getInstance()->getHandler('Topic'); |
|
| 132 | - $forums = []; |
|
| 133 | - $topicsObject = $topicHandler->getAll(new \Criteria('topic_id', '(' . implode(',', $topic_id) . ')', 'IN')); |
|
| 134 | - foreach (array_keys($topicsObject) as $id) { |
|
| 135 | - $topicObject = $topicsObject[$id]; |
|
| 136 | - $topicHandler->approve($topicObject); |
|
| 137 | - $topicHandler->synchronization($topicObject); |
|
| 138 | - $forums[$topicObject->getVar('forum_id')] = 1; |
|
| 139 | - } |
|
| 140 | - //irmtfan remove - no need to approve posts manually - see class/post.php approve function |
|
| 141 | - $criteria_forum = new \Criteria('forum_id', '(' . implode(',', array_keys($forums)) . ')', 'IN'); |
|
| 142 | - $forumsObject = $forumHandler->getAll($criteria_forum); |
|
| 143 | - foreach (array_keys($forumsObject) as $id) { |
|
| 144 | - $forumHandler->synchronization($forumsObject[$id]); |
|
| 145 | - } |
|
| 146 | - unset($topicsObject, $forumsObject); |
|
| 147 | - // irmtfan add restore to viewtopic |
|
| 148 | - $restoretopic_id = $topicObject->getVar('topic_id'); |
|
| 149 | - // irmtfan / missing in URL |
|
| 150 | - echo $action[$mode]['msg'] |
|
| 151 | - . "<p><a href='" |
|
| 152 | - . XOOPS_URL |
|
| 153 | - . '/modules/' |
|
| 154 | - . $xoopsModule->getVar('dirname') |
|
| 155 | - . "/viewtopic.php?topic_id=$restoretopic_id'>" |
|
| 156 | - . _MD_NEWBB_VIEWTHETOPIC |
|
| 157 | - . '</a></p>' |
|
| 158 | - . "<p><a href='" |
|
| 159 | - . XOOPS_URL |
|
| 160 | - . '/modules/' |
|
| 161 | - . $xoopsModule->getVar('dirname') |
|
| 162 | - . "/viewforum.php?forum=$forum'>" |
|
| 163 | - . _MD_NEWBB_RETURNTOTHEFORUM |
|
| 164 | - . '</a></p>' |
|
| 165 | - . "<p><a href='index.php'>" |
|
| 166 | - . _MD_NEWBB_RETURNFORUMINDEX |
|
| 167 | - . '</a></p>'; |
|
| 168 | - } elseif ('merge' === $mode) { |
|
| 169 | - // /** @var PostHandler $postHandler */ |
|
| 170 | - // $postHandler = Newbb\Helper::getInstance()->getHandler('Post'); |
|
| 171 | - // /** @var Newbb\RateHandler $rateHandler */ |
|
| 172 | - // $rateHandler = Newbb\Helper::getInstance()->getHandler('Rate'); |
|
| 117 | + if ('delete' === $mode) { |
|
| 118 | + foreach ($topic_id as $tid) { |
|
| 119 | + $topicObject = $topicHandler->get($tid); |
|
| 120 | + $topicHandler->delete($topicObject, false); |
|
| 121 | + // irmtfan - sync topic after delete |
|
| 122 | + $topicHandler->synchronization($topicObject); |
|
| 123 | + $forumHandler->synchronization($forum); |
|
| 124 | + //$topicObject->loadFilters("delete"); |
|
| 125 | + //sync($topic_id, "topic"); |
|
| 126 | + //xoops_notification_deletebyitem ($xoopsModule->getVar('mid'), 'thread', $topic_id); |
|
| 127 | + } |
|
| 128 | + // irmtfan full URL |
|
| 129 | + echo $action[$mode]['msg'] . "<p><a href='" . XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . "/viewforum.php?forum=$forum'>" . _MD_NEWBB_RETURNTOTHEFORUM . "</a></p><p><a href='index.php'>" . _MD_NEWBB_RETURNFORUMINDEX . '</a></p>'; |
|
| 130 | + } elseif ('restore' === $mode) { |
|
| 131 | + //$topicHandler = Newbb\Helper::getInstance()->getHandler('Topic'); |
|
| 132 | + $forums = []; |
|
| 133 | + $topicsObject = $topicHandler->getAll(new \Criteria('topic_id', '(' . implode(',', $topic_id) . ')', 'IN')); |
|
| 134 | + foreach (array_keys($topicsObject) as $id) { |
|
| 135 | + $topicObject = $topicsObject[$id]; |
|
| 136 | + $topicHandler->approve($topicObject); |
|
| 137 | + $topicHandler->synchronization($topicObject); |
|
| 138 | + $forums[$topicObject->getVar('forum_id')] = 1; |
|
| 139 | + } |
|
| 140 | + //irmtfan remove - no need to approve posts manually - see class/post.php approve function |
|
| 141 | + $criteria_forum = new \Criteria('forum_id', '(' . implode(',', array_keys($forums)) . ')', 'IN'); |
|
| 142 | + $forumsObject = $forumHandler->getAll($criteria_forum); |
|
| 143 | + foreach (array_keys($forumsObject) as $id) { |
|
| 144 | + $forumHandler->synchronization($forumsObject[$id]); |
|
| 145 | + } |
|
| 146 | + unset($topicsObject, $forumsObject); |
|
| 147 | + // irmtfan add restore to viewtopic |
|
| 148 | + $restoretopic_id = $topicObject->getVar('topic_id'); |
|
| 149 | + // irmtfan / missing in URL |
|
| 150 | + echo $action[$mode]['msg'] |
|
| 151 | + . "<p><a href='" |
|
| 152 | + . XOOPS_URL |
|
| 153 | + . '/modules/' |
|
| 154 | + . $xoopsModule->getVar('dirname') |
|
| 155 | + . "/viewtopic.php?topic_id=$restoretopic_id'>" |
|
| 156 | + . _MD_NEWBB_VIEWTHETOPIC |
|
| 157 | + . '</a></p>' |
|
| 158 | + . "<p><a href='" |
|
| 159 | + . XOOPS_URL |
|
| 160 | + . '/modules/' |
|
| 161 | + . $xoopsModule->getVar('dirname') |
|
| 162 | + . "/viewforum.php?forum=$forum'>" |
|
| 163 | + . _MD_NEWBB_RETURNTOTHEFORUM |
|
| 164 | + . '</a></p>' |
|
| 165 | + . "<p><a href='index.php'>" |
|
| 166 | + . _MD_NEWBB_RETURNFORUMINDEX |
|
| 167 | + . '</a></p>'; |
|
| 168 | + } elseif ('merge' === $mode) { |
|
| 169 | + // /** @var PostHandler $postHandler */ |
|
| 170 | + // $postHandler = Newbb\Helper::getInstance()->getHandler('Post'); |
|
| 171 | + // /** @var Newbb\RateHandler $rateHandler */ |
|
| 172 | + // $rateHandler = Newbb\Helper::getInstance()->getHandler('Rate'); |
|
| 173 | 173 | |
| 174 | - foreach ($topic_id as $tid) { |
|
| 175 | - $topicObject = $topicHandler->get($tid); |
|
| 176 | - $newtopicObject = $topicHandler->get($newtopic); |
|
| 174 | + foreach ($topic_id as $tid) { |
|
| 175 | + $topicObject = $topicHandler->get($tid); |
|
| 176 | + $newtopicObject = $topicHandler->get($newtopic); |
|
| 177 | 177 | |
| 178 | - /* return false if destination topic is not existing */ |
|
| 179 | - // irmtfan bug fix: the old topic will be deleted if user input a not exist new topic |
|
| 180 | - if (!is_object($newtopicObject)) { |
|
| 181 | - $redirect = XOOPS_URL . '/modules/newbb/viewtopic.php?topic_id=' . $tid; |
|
| 182 | - redirect_header($redirect, 2, _MD_NEWBB_ERRORTOPIC); |
|
| 183 | - } |
|
| 184 | - $criteria_topic = new \Criteria('topic_id', $tid); |
|
| 185 | - $criteria = new \CriteriaCompo($criteria_topic); |
|
| 186 | - $criteria->add(new \Criteria('pid', 0)); |
|
| 187 | - // irmtfan OR change to this for less query?: |
|
| 188 | - // $postHandler->updateAll("pid", $newtopicObject->getVar("topic_last_post_id"), $criteria, true); |
|
| 189 | - $postHandler->updateAll('pid', $topicHandler->getTopPostId($newtopic), $criteria, true); |
|
| 190 | - $postHandler->updateAll('topic_id', $newtopic, $criteria_topic, true); |
|
| 191 | - // irmtfan update vote data instead of deleting them |
|
| 192 | - $rateHandler->updateAll('topic_id', $newtopic, $criteria_topic, true); |
|
| 178 | + /* return false if destination topic is not existing */ |
|
| 179 | + // irmtfan bug fix: the old topic will be deleted if user input a not exist new topic |
|
| 180 | + if (!is_object($newtopicObject)) { |
|
| 181 | + $redirect = XOOPS_URL . '/modules/newbb/viewtopic.php?topic_id=' . $tid; |
|
| 182 | + redirect_header($redirect, 2, _MD_NEWBB_ERRORTOPIC); |
|
| 183 | + } |
|
| 184 | + $criteria_topic = new \Criteria('topic_id', $tid); |
|
| 185 | + $criteria = new \CriteriaCompo($criteria_topic); |
|
| 186 | + $criteria->add(new \Criteria('pid', 0)); |
|
| 187 | + // irmtfan OR change to this for less query?: |
|
| 188 | + // $postHandler->updateAll("pid", $newtopicObject->getVar("topic_last_post_id"), $criteria, true); |
|
| 189 | + $postHandler->updateAll('pid', $topicHandler->getTopPostId($newtopic), $criteria, true); |
|
| 190 | + $postHandler->updateAll('topic_id', $newtopic, $criteria_topic, true); |
|
| 191 | + // irmtfan update vote data instead of deleting them |
|
| 192 | + $rateHandler->updateAll('topic_id', $newtopic, $criteria_topic, true); |
|
| 193 | 193 | |
| 194 | - $topic_views = $topicObject->getVar('topic_views') + $newtopicObject->getVar('topic_views'); |
|
| 195 | - // irmtfan better method to update topic_views in new topic |
|
| 196 | - //$criteria_newtopic = new \Criteria('topic_id', $newtopic); |
|
| 197 | - //$topicHandler->updateAll('topic_views', $topic_views, $criteria_newtopic, true); |
|
| 198 | - $newtopicObject->setVar('topic_views', $topic_views); |
|
| 199 | - // START irmtfan poll_module and rewrite the method |
|
| 200 | - // irmtfan only move poll in old topic to new topic if new topic has not a poll |
|
| 201 | - $poll_id = $topicObject->getVar('poll_id'); |
|
| 202 | - if ($poll_id > 0 && (0 == $newtopicObject->getVar('poll_id'))) { |
|
| 203 | - $newtopicObject->setVar('topic_haspoll', 1); |
|
| 204 | - $newtopicObject->setVar('poll_id', $poll_id); |
|
| 205 | - $poll_id = 0;// set to not delete the poll |
|
| 206 | - $topicObject->setVar('topic_haspoll', 0); // set to not delete the poll |
|
| 207 | - $topicObject->setVar('poll_id', 0);// set to not delete the poll |
|
| 208 | - } |
|
| 209 | - //update and sync newtopic after merge |
|
| 210 | - //$topicHandler->insert($newtopicObject, true); |
|
| 211 | - $topicHandler->synchronization($newtopicObject); // very important: only use object |
|
| 212 | - //sync newforum after merge |
|
| 213 | - $newforum = $newtopicObject->getVar('forum_id'); |
|
| 214 | - $forumHandler->synchronization($newforum); |
|
| 215 | - //hardcode remove force to delete old topic from database |
|
| 216 | - //$topicHandler->delete($topicObject,true); // cannot use this |
|
| 217 | - $topicHandler->deleteAll($criteria_topic, true); // $force = true |
|
| 218 | - //delete poll if old topic had a poll |
|
| 219 | - $topicObject->deletePoll($poll_id); |
|
| 220 | - //sync forum after delete old topic |
|
| 221 | - $forumHandler->synchronization($forum); |
|
| 222 | - // END irmtfan poll_module and rewrite the method |
|
| 223 | - } |
|
| 224 | - echo $action[$mode]['msg'] |
|
| 225 | - . // irmtfan full URL |
|
| 226 | - "<p><a href='" |
|
| 227 | - . XOOPS_URL |
|
| 228 | - . '/modules/' |
|
| 229 | - . $xoopsModule->getVar('dirname') |
|
| 230 | - . "/viewtopic.php?topic_id=$newtopic'>" |
|
| 231 | - . _MD_NEWBB_VIEWTHETOPIC |
|
| 232 | - . '</a></p>' |
|
| 233 | - . "<p><a href='" |
|
| 234 | - . XOOPS_URL |
|
| 235 | - . '/modules/' |
|
| 236 | - . $xoopsModule->getVar('dirname') |
|
| 237 | - . "/viewforum.php?forum=$forum'>" |
|
| 238 | - . _MD_NEWBB_RETURNTOTHEFORUM |
|
| 239 | - . '</a></p>' |
|
| 240 | - . "<p><a href='" |
|
| 241 | - . XOOPS_URL |
|
| 242 | - . '/modules/' |
|
| 243 | - . $xoopsModule->getVar('dirname') |
|
| 244 | - . "/index.php'>" |
|
| 245 | - . _MD_NEWBB_RETURNFORUMINDEX |
|
| 246 | - . '</a></p>'; |
|
| 247 | - } elseif ('move' === $mode) { |
|
| 248 | - if ($newforum > 0) { |
|
| 249 | - $topic_id = $topic_id[0]; |
|
| 250 | - $topicObject = $topicHandler->get($topic_id); |
|
| 251 | - $topicObject->loadFilters('update'); |
|
| 252 | - $topicObject->setVar('forum_id', $newforum, true); |
|
| 253 | - $topicHandler->insert($topicObject, true); |
|
| 254 | - $topicObject->loadFilters('update'); |
|
| 194 | + $topic_views = $topicObject->getVar('topic_views') + $newtopicObject->getVar('topic_views'); |
|
| 195 | + // irmtfan better method to update topic_views in new topic |
|
| 196 | + //$criteria_newtopic = new \Criteria('topic_id', $newtopic); |
|
| 197 | + //$topicHandler->updateAll('topic_views', $topic_views, $criteria_newtopic, true); |
|
| 198 | + $newtopicObject->setVar('topic_views', $topic_views); |
|
| 199 | + // START irmtfan poll_module and rewrite the method |
|
| 200 | + // irmtfan only move poll in old topic to new topic if new topic has not a poll |
|
| 201 | + $poll_id = $topicObject->getVar('poll_id'); |
|
| 202 | + if ($poll_id > 0 && (0 == $newtopicObject->getVar('poll_id'))) { |
|
| 203 | + $newtopicObject->setVar('topic_haspoll', 1); |
|
| 204 | + $newtopicObject->setVar('poll_id', $poll_id); |
|
| 205 | + $poll_id = 0;// set to not delete the poll |
|
| 206 | + $topicObject->setVar('topic_haspoll', 0); // set to not delete the poll |
|
| 207 | + $topicObject->setVar('poll_id', 0);// set to not delete the poll |
|
| 208 | + } |
|
| 209 | + //update and sync newtopic after merge |
|
| 210 | + //$topicHandler->insert($newtopicObject, true); |
|
| 211 | + $topicHandler->synchronization($newtopicObject); // very important: only use object |
|
| 212 | + //sync newforum after merge |
|
| 213 | + $newforum = $newtopicObject->getVar('forum_id'); |
|
| 214 | + $forumHandler->synchronization($newforum); |
|
| 215 | + //hardcode remove force to delete old topic from database |
|
| 216 | + //$topicHandler->delete($topicObject,true); // cannot use this |
|
| 217 | + $topicHandler->deleteAll($criteria_topic, true); // $force = true |
|
| 218 | + //delete poll if old topic had a poll |
|
| 219 | + $topicObject->deletePoll($poll_id); |
|
| 220 | + //sync forum after delete old topic |
|
| 221 | + $forumHandler->synchronization($forum); |
|
| 222 | + // END irmtfan poll_module and rewrite the method |
|
| 223 | + } |
|
| 224 | + echo $action[$mode]['msg'] |
|
| 225 | + . // irmtfan full URL |
|
| 226 | + "<p><a href='" |
|
| 227 | + . XOOPS_URL |
|
| 228 | + . '/modules/' |
|
| 229 | + . $xoopsModule->getVar('dirname') |
|
| 230 | + . "/viewtopic.php?topic_id=$newtopic'>" |
|
| 231 | + . _MD_NEWBB_VIEWTHETOPIC |
|
| 232 | + . '</a></p>' |
|
| 233 | + . "<p><a href='" |
|
| 234 | + . XOOPS_URL |
|
| 235 | + . '/modules/' |
|
| 236 | + . $xoopsModule->getVar('dirname') |
|
| 237 | + . "/viewforum.php?forum=$forum'>" |
|
| 238 | + . _MD_NEWBB_RETURNTOTHEFORUM |
|
| 239 | + . '</a></p>' |
|
| 240 | + . "<p><a href='" |
|
| 241 | + . XOOPS_URL |
|
| 242 | + . '/modules/' |
|
| 243 | + . $xoopsModule->getVar('dirname') |
|
| 244 | + . "/index.php'>" |
|
| 245 | + . _MD_NEWBB_RETURNFORUMINDEX |
|
| 246 | + . '</a></p>'; |
|
| 247 | + } elseif ('move' === $mode) { |
|
| 248 | + if ($newforum > 0) { |
|
| 249 | + $topic_id = $topic_id[0]; |
|
| 250 | + $topicObject = $topicHandler->get($topic_id); |
|
| 251 | + $topicObject->loadFilters('update'); |
|
| 252 | + $topicObject->setVar('forum_id', $newforum, true); |
|
| 253 | + $topicHandler->insert($topicObject, true); |
|
| 254 | + $topicObject->loadFilters('update'); |
|
| 255 | 255 | |
| 256 | - $sql = sprintf('UPDATE "%s" SET forum_id = "%u" WHERE topic_id = "%u"', $GLOBALS['xoopsDB']->prefix('newbb_posts'), $newforum, $topic_id); |
|
| 257 | - if (!$r = $GLOBALS['xoopsDB']->query($sql)) { |
|
| 258 | - return false; |
|
| 259 | - } |
|
| 260 | - $forumHandler->synchronization($forum); |
|
| 261 | - $forumHandler->synchronization($newforum); |
|
| 262 | - // irmtfan full URL |
|
| 263 | - echo $action[$mode]['msg'] |
|
| 264 | - . "<p><a href='" |
|
| 265 | - . XOOPS_URL |
|
| 266 | - . '/modules/' |
|
| 267 | - . $xoopsModule->getVar('dirname') |
|
| 268 | - . "/viewtopic.php?topic_id=$topic_id&forum=$newforum'>" |
|
| 269 | - . _MD_NEWBB_GOTONEWFORUM |
|
| 270 | - . "</a></p><p><a href='" |
|
| 271 | - . XOOPS_URL |
|
| 272 | - . "/modules/newbb/index.php'>" |
|
| 273 | - . _MD_NEWBB_RETURNFORUMINDEX |
|
| 274 | - . '</a></p>'; |
|
| 275 | - } else { |
|
| 276 | - // irmtfan - issue with javascript:history.go(-1) |
|
| 277 | - redirect_header(Request::getString('HTTP_REFERER', '', 'SERVER'), 2, _MD_NEWBB_ERRORFORUM); |
|
| 278 | - } |
|
| 279 | - } else { |
|
| 280 | - $topic_id = $topic_id[0]; |
|
| 281 | - $forum = $topicHandler->get($topic_id, 'forum_id'); |
|
| 282 | - $forum_new = !empty($newtopic) ? $topicHandler->get($newtopic, 'forum_id') : 0; |
|
| 256 | + $sql = sprintf('UPDATE "%s" SET forum_id = "%u" WHERE topic_id = "%u"', $GLOBALS['xoopsDB']->prefix('newbb_posts'), $newforum, $topic_id); |
|
| 257 | + if (!$r = $GLOBALS['xoopsDB']->query($sql)) { |
|
| 258 | + return false; |
|
| 259 | + } |
|
| 260 | + $forumHandler->synchronization($forum); |
|
| 261 | + $forumHandler->synchronization($newforum); |
|
| 262 | + // irmtfan full URL |
|
| 263 | + echo $action[$mode]['msg'] |
|
| 264 | + . "<p><a href='" |
|
| 265 | + . XOOPS_URL |
|
| 266 | + . '/modules/' |
|
| 267 | + . $xoopsModule->getVar('dirname') |
|
| 268 | + . "/viewtopic.php?topic_id=$topic_id&forum=$newforum'>" |
|
| 269 | + . _MD_NEWBB_GOTONEWFORUM |
|
| 270 | + . "</a></p><p><a href='" |
|
| 271 | + . XOOPS_URL |
|
| 272 | + . "/modules/newbb/index.php'>" |
|
| 273 | + . _MD_NEWBB_RETURNFORUMINDEX |
|
| 274 | + . '</a></p>'; |
|
| 275 | + } else { |
|
| 276 | + // irmtfan - issue with javascript:history.go(-1) |
|
| 277 | + redirect_header(Request::getString('HTTP_REFERER', '', 'SERVER'), 2, _MD_NEWBB_ERRORFORUM); |
|
| 278 | + } |
|
| 279 | + } else { |
|
| 280 | + $topic_id = $topic_id[0]; |
|
| 281 | + $forum = $topicHandler->get($topic_id, 'forum_id'); |
|
| 282 | + $forum_new = !empty($newtopic) ? $topicHandler->get($newtopic, 'forum_id') : 0; |
|
| 283 | 283 | |
| 284 | - if (!$forumHandler->getPermission($forum, 'moderate') |
|
| 285 | - || (!empty($forum_new) |
|
| 286 | - && !$forumHandler->getPermission($forum_new, 'reply')) // The forum for the topic to be merged to |
|
| 287 | - || (!empty($newforum) && !$forumHandler->getPermission($newforum, 'post')) // The forum to be moved to |
|
| 288 | - ) { |
|
| 289 | - redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id", 2, _NOPERM); |
|
| 290 | - } |
|
| 284 | + if (!$forumHandler->getPermission($forum, 'moderate') |
|
| 285 | + || (!empty($forum_new) |
|
| 286 | + && !$forumHandler->getPermission($forum_new, 'reply')) // The forum for the topic to be merged to |
|
| 287 | + || (!empty($newforum) && !$forumHandler->getPermission($newforum, 'post')) // The forum to be moved to |
|
| 288 | + ) { |
|
| 289 | + redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id", 2, _NOPERM); |
|
| 290 | + } |
|
| 291 | 291 | |
| 292 | - if (!empty($action[$mode]['sql'])) { |
|
| 293 | - $sql = sprintf('UPDATE `%s` SET ' . $action[$mode]['sql'] . ' WHERE topic_id = %u', $GLOBALS['xoopsDB']->prefix('newbb_topics'), $topic_id); |
|
| 294 | - if (!$r = $GLOBALS['xoopsDB']->query($sql)) { |
|
| 295 | - redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id&order=$order&viewmode=$viewmode", 2, _MD_NEWBB_ERROR_BACK . '<br>sql: ' . $sql); |
|
| 296 | - } |
|
| 297 | - } else { |
|
| 298 | - redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id", 2, _MD_NEWBB_ERROR_BACK); |
|
| 299 | - } |
|
| 300 | - if ('digest' === $mode && $GLOBALS['xoopsDB']->getAffectedRows()) { |
|
| 301 | - $topicObject = $topicHandler->get($topic_id); |
|
| 302 | - // /** @var Newbb\StatsHandler $statsHandler */ |
|
| 303 | - // $statsHandler = Newbb\Helper::getInstance()->getHandler('Stats'); |
|
| 304 | - $statsHandler->update($topicObject->getVar('forum_id'), 'digest'); |
|
| 305 | - // /** @var Newbb\UserstatsHandler $userstatsHandler */ |
|
| 306 | - // $userstatsHandler = Newbb\Helper::getInstance()->getHandler('Userstats'); |
|
| 307 | - if ($user_stat = $userstatsHandler->get($topicObject->getVar('topic_poster'))) { |
|
| 308 | - $z = $user_stat->getVar('user_digests') + 1; |
|
| 309 | - $user_stat->setVar('user_digests', (int)$z); |
|
| 310 | - $userstatsHandler->insert($user_stat); |
|
| 311 | - } |
|
| 312 | - } |
|
| 313 | - // irmtfan full URL |
|
| 314 | - echo $action[$mode]['msg'] |
|
| 315 | - . "<p><a href='" |
|
| 316 | - . XOOPS_URL |
|
| 317 | - . '/modules/' |
|
| 318 | - . $xoopsModule->getVar('dirname') |
|
| 319 | - . "/viewtopic.php?topic_id=$topic_id&forum=$forum'>" |
|
| 320 | - . _MD_NEWBB_VIEWTHETOPIC |
|
| 321 | - . "</a></p><p><a href='" |
|
| 322 | - . XOOPS_URL |
|
| 323 | - . "/modules/newbb/viewforum.php?forum=$forum'>" |
|
| 324 | - . _MD_NEWBB_RETURNFORUMINDEX |
|
| 325 | - . '</a></p>'; |
|
| 326 | - } |
|
| 292 | + if (!empty($action[$mode]['sql'])) { |
|
| 293 | + $sql = sprintf('UPDATE `%s` SET ' . $action[$mode]['sql'] . ' WHERE topic_id = %u', $GLOBALS['xoopsDB']->prefix('newbb_topics'), $topic_id); |
|
| 294 | + if (!$r = $GLOBALS['xoopsDB']->query($sql)) { |
|
| 295 | + redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id&order=$order&viewmode=$viewmode", 2, _MD_NEWBB_ERROR_BACK . '<br>sql: ' . $sql); |
|
| 296 | + } |
|
| 297 | + } else { |
|
| 298 | + redirect_header(XOOPS_URL . "/modules/newbb/viewtopic.php?forum=$forum&topic_id=$topic_id", 2, _MD_NEWBB_ERROR_BACK); |
|
| 299 | + } |
|
| 300 | + if ('digest' === $mode && $GLOBALS['xoopsDB']->getAffectedRows()) { |
|
| 301 | + $topicObject = $topicHandler->get($topic_id); |
|
| 302 | + // /** @var Newbb\StatsHandler $statsHandler */ |
|
| 303 | + // $statsHandler = Newbb\Helper::getInstance()->getHandler('Stats'); |
|
| 304 | + $statsHandler->update($topicObject->getVar('forum_id'), 'digest'); |
|
| 305 | + // /** @var Newbb\UserstatsHandler $userstatsHandler */ |
|
| 306 | + // $userstatsHandler = Newbb\Helper::getInstance()->getHandler('Userstats'); |
|
| 307 | + if ($user_stat = $userstatsHandler->get($topicObject->getVar('topic_poster'))) { |
|
| 308 | + $z = $user_stat->getVar('user_digests') + 1; |
|
| 309 | + $user_stat->setVar('user_digests', (int)$z); |
|
| 310 | + $userstatsHandler->insert($user_stat); |
|
| 311 | + } |
|
| 312 | + } |
|
| 313 | + // irmtfan full URL |
|
| 314 | + echo $action[$mode]['msg'] |
|
| 315 | + . "<p><a href='" |
|
| 316 | + . XOOPS_URL |
|
| 317 | + . '/modules/' |
|
| 318 | + . $xoopsModule->getVar('dirname') |
|
| 319 | + . "/viewtopic.php?topic_id=$topic_id&forum=$forum'>" |
|
| 320 | + . _MD_NEWBB_VIEWTHETOPIC |
|
| 321 | + . "</a></p><p><a href='" |
|
| 322 | + . XOOPS_URL |
|
| 323 | + . "/modules/newbb/viewforum.php?forum=$forum'>" |
|
| 324 | + . _MD_NEWBB_RETURNFORUMINDEX |
|
| 325 | + . '</a></p>'; |
|
| 326 | + } |
|
| 327 | 327 | } else { // No submit |
| 328 | - $mode = Request::getString('mode', '', 'GET'); //$_GET['mode']; |
|
| 329 | - echo "<form action='" . Request::getString('PHP_SELF', '', 'SERVER') . "' method='post'>"; |
|
| 330 | - echo "<table border='0' cellpadding='1' cellspacing='0' align='center' width='95%'>"; |
|
| 331 | - echo "<tr><td class='bg2'>"; |
|
| 332 | - echo "<table border='0' cellpadding='1' cellspacing='1' width='100%'>"; |
|
| 333 | - echo "<tr class='bg3' align='left'>"; |
|
| 334 | - echo "<td colspan='2' align='center'>" . $action[$mode]['desc'] . '</td></tr>'; |
|
| 328 | + $mode = Request::getString('mode', '', 'GET'); //$_GET['mode']; |
|
| 329 | + echo "<form action='" . Request::getString('PHP_SELF', '', 'SERVER') . "' method='post'>"; |
|
| 330 | + echo "<table border='0' cellpadding='1' cellspacing='0' align='center' width='95%'>"; |
|
| 331 | + echo "<tr><td class='bg2'>"; |
|
| 332 | + echo "<table border='0' cellpadding='1' cellspacing='1' width='100%'>"; |
|
| 333 | + echo "<tr class='bg3' align='left'>"; |
|
| 334 | + echo "<td colspan='2' align='center'>" . $action[$mode]['desc'] . '</td></tr>'; |
|
| 335 | 335 | |
| 336 | - if ('move' === $mode) { |
|
| 337 | - echo '<tr><td class="bg3">' . _MD_NEWBB_MOVETOPICTO . '</td><td class="bg1">'; |
|
| 338 | - $box = '<select name="newforum" size="1">'; |
|
| 336 | + if ('move' === $mode) { |
|
| 337 | + echo '<tr><td class="bg3">' . _MD_NEWBB_MOVETOPICTO . '</td><td class="bg1">'; |
|
| 338 | + $box = '<select name="newforum" size="1">'; |
|
| 339 | 339 | |
| 340 | - // /** @var Newbb\CategoryHandler $categoryHandler */ |
|
| 341 | - // $categoryHandler = Newbb\Helper::getInstance()->getHandler('Category'); |
|
| 342 | - $categories = $categoryHandler->getByPermission('access'); |
|
| 343 | - $forums = $forumHandler->getForumsByCategory(array_keys($categories), 'post', false); |
|
| 340 | + // /** @var Newbb\CategoryHandler $categoryHandler */ |
|
| 341 | + // $categoryHandler = Newbb\Helper::getInstance()->getHandler('Category'); |
|
| 342 | + $categories = $categoryHandler->getByPermission('access'); |
|
| 343 | + $forums = $forumHandler->getForumsByCategory(array_keys($categories), 'post', false); |
|
| 344 | 344 | |
| 345 | - if (count($categories) > 0 && count($forums) > 0) { |
|
| 346 | - foreach (array_keys($forums) as $key) { |
|
| 347 | - /** @var Newbb\Category[] $categories */ |
|
| 348 | - $box .= "<option value='-1'>[" . $categories[$key]->getVar('cat_title') . ']</option>'; |
|
| 349 | - foreach ($forums[$key] as $forumid => $_forum) { |
|
| 350 | - $box .= "<option value='" . $forumid . "'>-- " . $_forum['title'] . '</option>'; |
|
| 351 | - if (!isset($_forum['sub'])) { |
|
| 352 | - continue; |
|
| 353 | - } |
|
| 354 | - foreach (array_keys($_forum['sub']) as $fid) { |
|
| 355 | - $box .= "<option value='" . $fid . "'>---- " . $_forum['sub'][$fid]['title'] . '</option>'; |
|
| 356 | - } |
|
| 357 | - } |
|
| 358 | - } |
|
| 359 | - } else { |
|
| 360 | - $box .= "<option value='-1'>" . _MD_NEWBB_NOFORUMINDB . '</option>'; |
|
| 361 | - } |
|
| 362 | - unset($forums, $categories); |
|
| 345 | + if (count($categories) > 0 && count($forums) > 0) { |
|
| 346 | + foreach (array_keys($forums) as $key) { |
|
| 347 | + /** @var Newbb\Category[] $categories */ |
|
| 348 | + $box .= "<option value='-1'>[" . $categories[$key]->getVar('cat_title') . ']</option>'; |
|
| 349 | + foreach ($forums[$key] as $forumid => $_forum) { |
|
| 350 | + $box .= "<option value='" . $forumid . "'>-- " . $_forum['title'] . '</option>'; |
|
| 351 | + if (!isset($_forum['sub'])) { |
|
| 352 | + continue; |
|
| 353 | + } |
|
| 354 | + foreach (array_keys($_forum['sub']) as $fid) { |
|
| 355 | + $box .= "<option value='" . $fid . "'>---- " . $_forum['sub'][$fid]['title'] . '</option>'; |
|
| 356 | + } |
|
| 357 | + } |
|
| 358 | + } |
|
| 359 | + } else { |
|
| 360 | + $box .= "<option value='-1'>" . _MD_NEWBB_NOFORUMINDB . '</option>'; |
|
| 361 | + } |
|
| 362 | + unset($forums, $categories); |
|
| 363 | 363 | |
| 364 | - echo $box; |
|
| 365 | - echo '</select></td></tr>'; |
|
| 366 | - } |
|
| 367 | - if ('merge' === $mode) { |
|
| 368 | - echo '<tr><td class="bg3">' . _MD_NEWBB_MERGETOPICTO . '</td><td class="bg1">'; |
|
| 369 | - echo _MD_NEWBB_TOPIC . " ID-$topic_id -> ID: <input name='newtopic' value='' />"; |
|
| 370 | - echo '</td></tr>'; |
|
| 371 | - } |
|
| 372 | - echo '<tr class="bg3"><td colspan="2" align="center">'; |
|
| 373 | - echo "<input type='hidden' name='mode' value='" . $action[$mode]['name'] . "' />"; |
|
| 374 | - echo "<input type='hidden' name='topic_id' value='" . $topic_id . "' />"; |
|
| 375 | - echo "<input type='hidden' name='forum' value='" . $forum . "' />"; |
|
| 376 | - echo "<input type='submit' name='submit' value='" . $action[$mode]['submit'] . "' />"; |
|
| 377 | - echo '</td></tr></form></table></td></tr></table>'; |
|
| 364 | + echo $box; |
|
| 365 | + echo '</select></td></tr>'; |
|
| 366 | + } |
|
| 367 | + if ('merge' === $mode) { |
|
| 368 | + echo '<tr><td class="bg3">' . _MD_NEWBB_MERGETOPICTO . '</td><td class="bg1">'; |
|
| 369 | + echo _MD_NEWBB_TOPIC . " ID-$topic_id -> ID: <input name='newtopic' value='' />"; |
|
| 370 | + echo '</td></tr>'; |
|
| 371 | + } |
|
| 372 | + echo '<tr class="bg3"><td colspan="2" align="center">'; |
|
| 373 | + echo "<input type='hidden' name='mode' value='" . $action[$mode]['name'] . "' />"; |
|
| 374 | + echo "<input type='hidden' name='topic_id' value='" . $topic_id . "' />"; |
|
| 375 | + echo "<input type='hidden' name='forum' value='" . $forum . "' />"; |
|
| 376 | + echo "<input type='submit' name='submit' value='" . $action[$mode]['submit'] . "' />"; |
|
| 377 | + echo '</td></tr></form></table></td></tr></table>'; |
|
| 378 | 378 | } |
| 379 | 379 | // irmtfan move to footer.php |
| 380 | 380 | require_once __DIR__ . '/footer.php'; |
@@ -8,81 +8,81 @@ |
||
| 8 | 8 | */ |
| 9 | 9 | class GroupPermForm extends \XoopsGroupPermForm |
| 10 | 10 | { |
| 11 | - /** |
|
| 12 | - * @param $title |
|
| 13 | - * @param $modid |
|
| 14 | - * @param $permname |
|
| 15 | - * @param $permdesc |
|
| 16 | - * @param string $url |
|
| 17 | - */ |
|
| 11 | + /** |
|
| 12 | + * @param $title |
|
| 13 | + * @param $modid |
|
| 14 | + * @param $permname |
|
| 15 | + * @param $permdesc |
|
| 16 | + * @param string $url |
|
| 17 | + */ |
|
| 18 | 18 | |
| 19 | - public function __construct($title, $modid, $permname, $permdesc, $url = '') |
|
| 20 | - { |
|
| 21 | - parent::__construct($title, $modid, $permname, $permdesc, $url); |
|
| 22 | - } |
|
| 19 | + public function __construct($title, $modid, $permname, $permdesc, $url = '') |
|
| 20 | + { |
|
| 21 | + parent::__construct($title, $modid, $permname, $permdesc, $url); |
|
| 22 | + } |
|
| 23 | 23 | |
| 24 | - /** |
|
| 25 | - * @param $title |
|
| 26 | - * @param $modid |
|
| 27 | - * @param $permname |
|
| 28 | - * @param $permdesc |
|
| 29 | - * @param string $url |
|
| 30 | - */ |
|
| 24 | + /** |
|
| 25 | + * @param $title |
|
| 26 | + * @param $modid |
|
| 27 | + * @param $permname |
|
| 28 | + * @param $permdesc |
|
| 29 | + * @param string $url |
|
| 30 | + */ |
|
| 31 | 31 | |
| 32 | - /* |
|
| 32 | + /* |
|
| 33 | 33 | public function newbb_XoopsGroupPermForm($title, $modid, $permname, $permdesc, $url = "") |
| 34 | 34 | { |
| 35 | 35 | // $this->XoopsGroupPermForm($title, $modid, $permname, $permdesc, $url); |
| 36 | 36 | self::__construct($title, $modid, $permname, $permdesc, $url); |
| 37 | 37 | } |
| 38 | 38 | */ |
| 39 | - /** |
|
| 40 | - * @return string |
|
| 41 | - */ |
|
| 42 | - public function render() |
|
| 43 | - { |
|
| 44 | - // load all child ids for javascript codes |
|
| 45 | - foreach (array_keys($this->_itemTree) as $item_id) { |
|
| 46 | - $this->_itemTree[$item_id]['allchild'] = []; |
|
| 47 | - $this->_loadAllChildItemIds($item_id, $this->_itemTree[$item_id]['allchild']); |
|
| 48 | - } |
|
| 49 | - /** @var \XoopsGroupPermHandler $grouppermHandler */ |
|
| 50 | - $grouppermHandler = xoops_getHandler('groupperm'); |
|
| 51 | - /** @var \XoopsMemberHandler $memberHandler */ |
|
| 52 | - $memberHandler = xoops_getHandler('member'); |
|
| 53 | - $glist = $memberHandler->getGroupList(); |
|
| 54 | - foreach (array_keys($glist) as $i) { |
|
| 55 | - // get selected item id(s) for each group |
|
| 56 | - $selected = $grouppermHandler->getItemIds($this->_permName, $i, $this->_modid); |
|
| 57 | - $ele = new Newbb\GroupFormCheckBox($glist[$i], 'perms[' . $this->_permName . ']', $i, $selected); |
|
| 58 | - $ele->setOptionTree($this->_itemTree); |
|
| 59 | - $this->addElement($ele); |
|
| 60 | - unset($ele); |
|
| 61 | - } |
|
| 62 | - $tray = new \XoopsFormElementTray(''); |
|
| 63 | - $tray->addElement(new \XoopsFormButton('', 'submit', _SUBMIT, 'submit')); |
|
| 64 | - $tray->addElement(new \XoopsFormButton('', 'reset', _CANCEL, 'reset')); |
|
| 65 | - $this->addElement($tray); |
|
| 66 | - $ret = '<br><strong>' . $this->getTitle() . '</strong><br>' . $this->_permDesc . '<br>'; |
|
| 67 | - $ret .= "<form name='" . $this->getName() . "' id='" . $this->getName() . "' action='" . $this->getAction() . "' method='" . $this->getMethod() . "'" . $this->getExtra() . ">\n<table width='100%' class='outer' cellspacing='1' valign='top'>\n"; |
|
| 68 | - $elements = $this->getElements(); |
|
| 69 | - $hidden = ''; |
|
| 70 | - foreach (array_keys($elements) as $i) { |
|
| 71 | - if (!is_object($elements[$i])) { |
|
| 72 | - $ret .= $elements[$i]; |
|
| 73 | - } elseif (!$elements[$i]->isHidden()) { |
|
| 74 | - $ret .= "<tr valign='top' align='left'><td class='head'>" . $elements[$i]->getCaption(); |
|
| 75 | - if ('' !== $elements[$i]->getDescription()) { |
|
| 76 | - $ret .= '<br><br><span style="font-weight: normal;">' . $elements[$i]->getDescription() . '</span>'; |
|
| 77 | - } |
|
| 78 | - $ret .= "</td>\n<td class='even' style='text-align:center;'>\n" . $elements[$i]->render() . "\n</td></tr>\n"; |
|
| 79 | - } else { |
|
| 80 | - $hidden .= $elements[$i]->render(); |
|
| 81 | - } |
|
| 82 | - } |
|
| 83 | - $ret .= "</table>$hidden</form>"; |
|
| 84 | - $ret .= $this->renderValidationJS(true); |
|
| 39 | + /** |
|
| 40 | + * @return string |
|
| 41 | + */ |
|
| 42 | + public function render() |
|
| 43 | + { |
|
| 44 | + // load all child ids for javascript codes |
|
| 45 | + foreach (array_keys($this->_itemTree) as $item_id) { |
|
| 46 | + $this->_itemTree[$item_id]['allchild'] = []; |
|
| 47 | + $this->_loadAllChildItemIds($item_id, $this->_itemTree[$item_id]['allchild']); |
|
| 48 | + } |
|
| 49 | + /** @var \XoopsGroupPermHandler $grouppermHandler */ |
|
| 50 | + $grouppermHandler = xoops_getHandler('groupperm'); |
|
| 51 | + /** @var \XoopsMemberHandler $memberHandler */ |
|
| 52 | + $memberHandler = xoops_getHandler('member'); |
|
| 53 | + $glist = $memberHandler->getGroupList(); |
|
| 54 | + foreach (array_keys($glist) as $i) { |
|
| 55 | + // get selected item id(s) for each group |
|
| 56 | + $selected = $grouppermHandler->getItemIds($this->_permName, $i, $this->_modid); |
|
| 57 | + $ele = new Newbb\GroupFormCheckBox($glist[$i], 'perms[' . $this->_permName . ']', $i, $selected); |
|
| 58 | + $ele->setOptionTree($this->_itemTree); |
|
| 59 | + $this->addElement($ele); |
|
| 60 | + unset($ele); |
|
| 61 | + } |
|
| 62 | + $tray = new \XoopsFormElementTray(''); |
|
| 63 | + $tray->addElement(new \XoopsFormButton('', 'submit', _SUBMIT, 'submit')); |
|
| 64 | + $tray->addElement(new \XoopsFormButton('', 'reset', _CANCEL, 'reset')); |
|
| 65 | + $this->addElement($tray); |
|
| 66 | + $ret = '<br><strong>' . $this->getTitle() . '</strong><br>' . $this->_permDesc . '<br>'; |
|
| 67 | + $ret .= "<form name='" . $this->getName() . "' id='" . $this->getName() . "' action='" . $this->getAction() . "' method='" . $this->getMethod() . "'" . $this->getExtra() . ">\n<table width='100%' class='outer' cellspacing='1' valign='top'>\n"; |
|
| 68 | + $elements = $this->getElements(); |
|
| 69 | + $hidden = ''; |
|
| 70 | + foreach (array_keys($elements) as $i) { |
|
| 71 | + if (!is_object($elements[$i])) { |
|
| 72 | + $ret .= $elements[$i]; |
|
| 73 | + } elseif (!$elements[$i]->isHidden()) { |
|
| 74 | + $ret .= "<tr valign='top' align='left'><td class='head'>" . $elements[$i]->getCaption(); |
|
| 75 | + if ('' !== $elements[$i]->getDescription()) { |
|
| 76 | + $ret .= '<br><br><span style="font-weight: normal;">' . $elements[$i]->getDescription() . '</span>'; |
|
| 77 | + } |
|
| 78 | + $ret .= "</td>\n<td class='even' style='text-align:center;'>\n" . $elements[$i]->render() . "\n</td></tr>\n"; |
|
| 79 | + } else { |
|
| 80 | + $hidden .= $elements[$i]->render(); |
|
| 81 | + } |
|
| 82 | + } |
|
| 83 | + $ret .= "</table>$hidden</form>"; |
|
| 84 | + $ret .= $this->renderValidationJS(true); |
|
| 85 | 85 | |
| 86 | - return $ret; |
|
| 87 | - } |
|
| 86 | + return $ret; |
|
| 87 | + } |
|
| 88 | 88 | } |
@@ -19,16 +19,16 @@ |
||
| 19 | 19 | */ |
| 20 | 20 | class Userstats extends \XoopsObject |
| 21 | 21 | { |
| 22 | - /** |
|
| 23 | - * |
|
| 24 | - */ |
|
| 25 | - public function __construct() |
|
| 26 | - { |
|
| 27 | - parent::__construct(); |
|
| 28 | - $this->initVar('uid', XOBJ_DTYPE_INT); |
|
| 29 | - $this->initVar('user_topics', XOBJ_DTYPE_INT); |
|
| 30 | - $this->initVar('user_digests', XOBJ_DTYPE_INT); |
|
| 31 | - $this->initVar('user_posts', XOBJ_DTYPE_INT); |
|
| 32 | - $this->initVar('user_lastpost', XOBJ_DTYPE_INT); |
|
| 33 | - } |
|
| 22 | + /** |
|
| 23 | + * |
|
| 24 | + */ |
|
| 25 | + public function __construct() |
|
| 26 | + { |
|
| 27 | + parent::__construct(); |
|
| 28 | + $this->initVar('uid', XOBJ_DTYPE_INT); |
|
| 29 | + $this->initVar('user_topics', XOBJ_DTYPE_INT); |
|
| 30 | + $this->initVar('user_digests', XOBJ_DTYPE_INT); |
|
| 31 | + $this->initVar('user_posts', XOBJ_DTYPE_INT); |
|
| 32 | + $this->initVar('user_lastpost', XOBJ_DTYPE_INT); |
|
| 33 | + } |
|
| 34 | 34 | } |
@@ -23,82 +23,82 @@ |
||
| 23 | 23 | */ |
| 24 | 24 | class PermissionCategoryHandler extends Newbb\PermissionHandler |
| 25 | 25 | { |
| 26 | - /** |
|
| 27 | - * @param \XoopsDatabase $db |
|
| 28 | - */ |
|
| 29 | - public function __construct(\XoopsDatabase $db) |
|
| 30 | - { |
|
| 31 | - // $this->PermissionHandler($db); |
|
| 32 | - parent::__construct($db); |
|
| 33 | - } |
|
| 26 | + /** |
|
| 27 | + * @param \XoopsDatabase $db |
|
| 28 | + */ |
|
| 29 | + public function __construct(\XoopsDatabase $db) |
|
| 30 | + { |
|
| 31 | + // $this->PermissionHandler($db); |
|
| 32 | + parent::__construct($db); |
|
| 33 | + } |
|
| 34 | 34 | |
| 35 | - /** |
|
| 36 | - * @param $mid |
|
| 37 | - * @param int $id |
|
| 38 | - * @return array |
|
| 39 | - */ |
|
| 40 | - public function getValidItems($mid, $id = 0) |
|
| 41 | - { |
|
| 42 | - $full_items = []; |
|
| 43 | - if (empty($mid)) { |
|
| 44 | - return $full_items; |
|
| 45 | - } |
|
| 35 | + /** |
|
| 36 | + * @param $mid |
|
| 37 | + * @param int $id |
|
| 38 | + * @return array |
|
| 39 | + */ |
|
| 40 | + public function getValidItems($mid, $id = 0) |
|
| 41 | + { |
|
| 42 | + $full_items = []; |
|
| 43 | + if (empty($mid)) { |
|
| 44 | + return $full_items; |
|
| 45 | + } |
|
| 46 | 46 | |
| 47 | - $full_items[] = "'category_access'"; |
|
| 47 | + $full_items[] = "'category_access'"; |
|
| 48 | 48 | |
| 49 | - return $full_items; |
|
| 50 | - } |
|
| 49 | + return $full_items; |
|
| 50 | + } |
|
| 51 | 51 | |
| 52 | - /** |
|
| 53 | - * @param $cat_id |
|
| 54 | - * @return bool |
|
| 55 | - */ |
|
| 56 | - public function deleteByCategory($cat_id) |
|
| 57 | - { |
|
| 58 | - $cat_id = (int)$cat_id; |
|
| 59 | - if (empty($cat_id)) { |
|
| 60 | - return false; |
|
| 61 | - } |
|
| 62 | - /** @var \XoopsGroupPermHandler $grouppermHandler */ |
|
| 63 | - $grouppermHandler = xoops_getHandler('groupperm'); |
|
| 64 | - $criteria = new \CriteriaCompo(new \Criteria('gperm_modid', $GLOBALS['xoopsModule']->getVar('mid'))); |
|
| 65 | - $criteria->add(new \Criteria('gperm_name', 'category_access')); |
|
| 66 | - $criteria->add(new \Criteria('gperm_itemid', $cat_id)); |
|
| 52 | + /** |
|
| 53 | + * @param $cat_id |
|
| 54 | + * @return bool |
|
| 55 | + */ |
|
| 56 | + public function deleteByCategory($cat_id) |
|
| 57 | + { |
|
| 58 | + $cat_id = (int)$cat_id; |
|
| 59 | + if (empty($cat_id)) { |
|
| 60 | + return false; |
|
| 61 | + } |
|
| 62 | + /** @var \XoopsGroupPermHandler $grouppermHandler */ |
|
| 63 | + $grouppermHandler = xoops_getHandler('groupperm'); |
|
| 64 | + $criteria = new \CriteriaCompo(new \Criteria('gperm_modid', $GLOBALS['xoopsModule']->getVar('mid'))); |
|
| 65 | + $criteria->add(new \Criteria('gperm_name', 'category_access')); |
|
| 66 | + $criteria->add(new \Criteria('gperm_itemid', $cat_id)); |
|
| 67 | 67 | |
| 68 | - return $grouppermHandler->deleteAll($criteria); |
|
| 69 | - } |
|
| 68 | + return $grouppermHandler->deleteAll($criteria); |
|
| 69 | + } |
|
| 70 | 70 | |
| 71 | - /** |
|
| 72 | - * @param $category |
|
| 73 | - * @param array $groups |
|
| 74 | - * @return bool |
|
| 75 | - */ |
|
| 76 | - public function setCategoryPermission($category, array $groups = []) |
|
| 77 | - { |
|
| 78 | - if (is_object($GLOBALS['xoopsModule']) && 'newbb' === $GLOBALS['xoopsModule']->getVar('dirname')) { |
|
| 79 | - $mid = $GLOBALS['xoopsModule']->getVar('mid'); |
|
| 80 | - } else { |
|
| 81 | - /** @var \XoopsModuleHandler $moduleHandler */ |
|
| 82 | - $moduleHandler = xoops_getHandler('module'); |
|
| 83 | - $newbb = $moduleHandler->getByDirname('newbb'); |
|
| 84 | - $mid = $newbb->getVar('mid'); |
|
| 85 | - } |
|
| 86 | - if (empty($groups)) { |
|
| 87 | - /** @var \XoopsMemberHandler $memberHandler */ |
|
| 88 | - $memberHandler = xoops_getHandler('member'); |
|
| 89 | - $glist = $memberHandler->getGroupList(); |
|
| 90 | - $groups = array_keys($glist); |
|
| 91 | - } |
|
| 92 | - $ids = $this->getGroupIds('category_access', $category, $mid); |
|
| 93 | - $ids_add = array_diff($groups, $ids); |
|
| 94 | - $ids_rmv = array_diff($ids, $groups); |
|
| 95 | - foreach ($ids_add as $group) { |
|
| 96 | - $this->addRight('category_access', $category, $group, $mid); |
|
| 97 | - } |
|
| 98 | - foreach ($ids_rmv as $group) { |
|
| 99 | - $this->deleteRight('category_access', $category, $group, $mid); |
|
| 100 | - } |
|
| 71 | + /** |
|
| 72 | + * @param $category |
|
| 73 | + * @param array $groups |
|
| 74 | + * @return bool |
|
| 75 | + */ |
|
| 76 | + public function setCategoryPermission($category, array $groups = []) |
|
| 77 | + { |
|
| 78 | + if (is_object($GLOBALS['xoopsModule']) && 'newbb' === $GLOBALS['xoopsModule']->getVar('dirname')) { |
|
| 79 | + $mid = $GLOBALS['xoopsModule']->getVar('mid'); |
|
| 80 | + } else { |
|
| 81 | + /** @var \XoopsModuleHandler $moduleHandler */ |
|
| 82 | + $moduleHandler = xoops_getHandler('module'); |
|
| 83 | + $newbb = $moduleHandler->getByDirname('newbb'); |
|
| 84 | + $mid = $newbb->getVar('mid'); |
|
| 85 | + } |
|
| 86 | + if (empty($groups)) { |
|
| 87 | + /** @var \XoopsMemberHandler $memberHandler */ |
|
| 88 | + $memberHandler = xoops_getHandler('member'); |
|
| 89 | + $glist = $memberHandler->getGroupList(); |
|
| 90 | + $groups = array_keys($glist); |
|
| 91 | + } |
|
| 92 | + $ids = $this->getGroupIds('category_access', $category, $mid); |
|
| 93 | + $ids_add = array_diff($groups, $ids); |
|
| 94 | + $ids_rmv = array_diff($ids, $groups); |
|
| 95 | + foreach ($ids_add as $group) { |
|
| 96 | + $this->addRight('category_access', $category, $group, $mid); |
|
| 97 | + } |
|
| 98 | + foreach ($ids_rmv as $group) { |
|
| 99 | + $this->deleteRight('category_access', $category, $group, $mid); |
|
| 100 | + } |
|
| 101 | 101 | |
| 102 | - return true; |
|
| 103 | - } |
|
| 102 | + return true; |
|
| 103 | + } |
|
| 104 | 104 | } |
@@ -48,340 +48,340 @@ |
||
| 48 | 48 | */ |
| 49 | 49 | class ReadHandler extends \XoopsPersistableObjectHandler |
| 50 | 50 | { |
| 51 | - /** |
|
| 52 | - * Object type. |
|
| 53 | - * <ul> |
|
| 54 | - * <li>forum</li> |
|
| 55 | - * <li>topic</li> |
|
| 56 | - * </ul> |
|
| 57 | - * |
|
| 58 | - * @var string |
|
| 59 | - */ |
|
| 60 | - public $type; |
|
| 61 | - |
|
| 62 | - /** |
|
| 63 | - * seconds records will persist. |
|
| 64 | - * assigned from $GLOBALS['xoopsModuleConfig']["read_expire"] |
|
| 65 | - * <ul> |
|
| 66 | - * <li>positive days = delete all read records exist in the tables before expire time // irmtfan add comment</li> |
|
| 67 | - * <li>0 = never expires // irmtfan change comment</li> |
|
| 68 | - * <li>-1 or any negative days = never records // irmtfan change comment</li> |
|
| 69 | - * </ul> |
|
| 70 | - * |
|
| 71 | - * @var integer |
|
| 72 | - */ |
|
| 73 | - public $lifetime; |
|
| 74 | - |
|
| 75 | - /** |
|
| 76 | - * storage mode for records. |
|
| 77 | - * assigned from $GLOBALS['xoopsModuleConfig']["read_mode"] |
|
| 78 | - * <ul> |
|
| 79 | - * <li>0 = never records</li> |
|
| 80 | - * <li>1 = uses cookie</li> |
|
| 81 | - * <li>2 = stores in database</li> |
|
| 82 | - * </ul> |
|
| 83 | - * |
|
| 84 | - * @var integer |
|
| 85 | - */ |
|
| 86 | - public $mode; |
|
| 87 | - |
|
| 88 | - /** |
|
| 89 | - * @param \XoopsDatabase $db |
|
| 90 | - * @param $type |
|
| 91 | - */ |
|
| 92 | - public function __construct(\XoopsDatabase $db, $type) |
|
| 93 | - { |
|
| 94 | - $type = ('forum' === $type) ? 'forum' : 'topic'; |
|
| 95 | - parent::__construct($db, 'newbb_reads_' . $type, Read::class . $type, 'read_id', 'post_id'); |
|
| 96 | - $this->type = $type; |
|
| 97 | - $newbbConfig = newbbLoadConfig(); |
|
| 98 | - // irmtfan if read_expire = 0 dont clean |
|
| 99 | - $this->lifetime = isset($newbbConfig['read_expire']) ? (int)$newbbConfig['read_expire'] * 24 * 3600 : 30 * 24 * 3600; |
|
| 100 | - $this->mode = isset($newbbConfig['read_mode']) ? $newbbConfig['read_mode'] : 2; |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - /** |
|
| 104 | - * Clear garbage |
|
| 105 | - * |
|
| 106 | - * Delete all expired and duplicated records |
|
| 107 | - */ |
|
| 108 | - // START irmtfan rephrase function to 1- add clearDuplicate and 2- dont clean when read_expire = 0 |
|
| 109 | - public function clearGarbage() |
|
| 110 | - { |
|
| 111 | - // irmtfan clear duplicaed rows |
|
| 112 | - if (!$result = $this->clearDuplicate()) { |
|
| 113 | - return false; |
|
| 114 | - } |
|
| 115 | - |
|
| 116 | - $sql = 'DELETE bb FROM ' . $this->table . ' AS bb' . ' LEFT JOIN ' . $this->table . ' AS aa ON bb.read_item = aa.read_item ' . ' WHERE aa.post_id > bb.post_id'; |
|
| 117 | - if (!$result = $this->db->queryF($sql)) { |
|
| 118 | - //xoops_error($this->db->error()); |
|
| 119 | - return false; |
|
| 120 | - } |
|
| 121 | - // irmtfan if read_expire = 0 dont clean |
|
| 122 | - if (empty($this->lifetime)) { |
|
| 123 | - return true; |
|
| 124 | - } |
|
| 125 | - // irmtfan move here and rephrase |
|
| 126 | - $expire = time() - (int)$this->lifetime; |
|
| 127 | - $sql = 'DELETE FROM ' . $this->table . ' WHERE read_time < ' . $expire; |
|
| 128 | - if (!$result = $this->db->queryF($sql)) { |
|
| 129 | - //xoops_error($this->db->error()); |
|
| 130 | - return false; |
|
| 131 | - } |
|
| 132 | - |
|
| 133 | - return true; |
|
| 134 | - } |
|
| 135 | - |
|
| 136 | - // END irmtfan rephrase function to 1- add clearDuplicate and 2- dont clean when read_expire = 0 |
|
| 137 | - |
|
| 138 | - /** |
|
| 139 | - * @param $read_item |
|
| 140 | - * @param null $uid |
|
| 141 | - * @return bool|mixed|null |
|
| 142 | - */ |
|
| 143 | - public function getRead($read_item, $uid = null) |
|
| 144 | - { |
|
| 145 | - if (empty($this->mode)) { |
|
| 146 | - return null; |
|
| 147 | - } |
|
| 148 | - if (1 == $this->mode) { |
|
| 149 | - return $this->getReadCookie($read_item); |
|
| 150 | - } |
|
| 151 | - |
|
| 152 | - return $this->getReadDb($read_item, $uid); |
|
| 153 | - } |
|
| 154 | - |
|
| 155 | - /** |
|
| 156 | - * @param $item_id |
|
| 157 | - * @return mixed |
|
| 158 | - */ |
|
| 159 | - public function getReadCookie($item_id) |
|
| 160 | - { |
|
| 161 | - $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 162 | - $cookie_var = $item_id; |
|
| 163 | - // irmtfan set true to return array |
|
| 164 | - $lastview = newbbGetCookie($cookie_name, true); |
|
| 165 | - |
|
| 166 | - return @$lastview[$cookie_var]; |
|
| 167 | - } |
|
| 168 | - |
|
| 169 | - /** |
|
| 170 | - * @param $read_item |
|
| 171 | - * @param $uid |
|
| 172 | - * @return bool|null |
|
| 173 | - */ |
|
| 174 | - public function getReadDb($read_item, $uid) |
|
| 175 | - { |
|
| 176 | - if (empty($uid)) { |
|
| 177 | - if (is_object($GLOBALS['xoopsUser'])) { |
|
| 178 | - $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 179 | - } else { |
|
| 180 | - return false; |
|
| 181 | - } |
|
| 182 | - } |
|
| 183 | - $sql = 'SELECT post_id ' . ' FROM ' . $this->table . ' WHERE read_item = ' . (int)$read_item . ' AND uid = ' . (int)$uid; |
|
| 184 | - if (!$result = $this->db->queryF($sql, 1)) { |
|
| 185 | - return null; |
|
| 186 | - } |
|
| 187 | - list($post_id) = $this->db->fetchRow($result); |
|
| 188 | - |
|
| 189 | - return $post_id; |
|
| 190 | - } |
|
| 191 | - |
|
| 192 | - /** |
|
| 193 | - * @param $read_item |
|
| 194 | - * @param $post_id |
|
| 195 | - * @param null $uid |
|
| 196 | - * @return bool|mixed|void |
|
| 197 | - */ |
|
| 198 | - public function setRead($read_item, $post_id, $uid = null) |
|
| 199 | - { |
|
| 200 | - if (empty($this->mode)) { |
|
| 201 | - return true; |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - if (1 == $this->mode) { |
|
| 205 | - return $this->setReadCookie($read_item, $post_id); |
|
| 206 | - } |
|
| 207 | - |
|
| 208 | - return $this->setReadDb($read_item, $post_id, $uid); |
|
| 209 | - } |
|
| 210 | - |
|
| 211 | - /** |
|
| 212 | - * @param $read_item |
|
| 213 | - * @param $post_id |
|
| 214 | - */ |
|
| 215 | - public function setReadCookie($read_item, $post_id) |
|
| 216 | - { |
|
| 217 | - $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 218 | - $lastview = newbbGetCookie($cookie_name, true); |
|
| 219 | - $lastview[$read_item] = time(); |
|
| 220 | - newbbSetCookie($cookie_name, $lastview); |
|
| 221 | - } |
|
| 222 | - |
|
| 223 | - /** |
|
| 224 | - * @param $read_item |
|
| 225 | - * @param $post_id |
|
| 226 | - * @param $uid |
|
| 227 | - * @return bool|mixed |
|
| 228 | - */ |
|
| 229 | - public function setReadDb($read_item, $post_id, $uid) |
|
| 230 | - { |
|
| 231 | - if (empty($uid)) { |
|
| 232 | - if (is_object($GLOBALS['xoopsUser'])) { |
|
| 233 | - $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 234 | - } else { |
|
| 235 | - return false; |
|
| 236 | - } |
|
| 237 | - } |
|
| 238 | - |
|
| 239 | - $sql = 'UPDATE ' . $this->table . ' SET post_id = ' . (int)$post_id . ',' . ' read_time =' . time() . ' WHERE read_item = ' . (int)$read_item . ' AND uid = ' . (int)$uid; |
|
| 240 | - if ($this->db->queryF($sql) && $this->db->getAffectedRows()) { |
|
| 241 | - return true; |
|
| 242 | - } |
|
| 243 | - $object = $this->create(); |
|
| 244 | - $object->setVar('read_item', $read_item); |
|
| 245 | - $object->setVar('post_id', $post_id); |
|
| 246 | - $object->setVar('uid', $uid); |
|
| 247 | - $object->setVar('read_time', time()); |
|
| 248 | - |
|
| 249 | - return parent::insert($object); |
|
| 250 | - } |
|
| 251 | - |
|
| 252 | - /** |
|
| 253 | - * @param $items |
|
| 254 | - * @param null $uid |
|
| 255 | - * @return array|null |
|
| 256 | - */ |
|
| 257 | - public function isReadItems(&$items, $uid = null) |
|
| 258 | - { |
|
| 259 | - $ret = null; |
|
| 260 | - if (empty($this->mode)) { |
|
| 261 | - return $ret; |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - if (1 == $this->mode) { |
|
| 265 | - $ret = $this->isReadItemsCookie($items); |
|
| 266 | - } else { |
|
| 267 | - $ret = $this->isReadItemsDb($items, $uid); |
|
| 268 | - } |
|
| 269 | - |
|
| 270 | - return $ret; |
|
| 271 | - } |
|
| 272 | - |
|
| 273 | - /** |
|
| 274 | - * @param $items |
|
| 275 | - * @return array |
|
| 276 | - */ |
|
| 277 | - public function isReadItemsCookie(&$items) |
|
| 278 | - { |
|
| 279 | - $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 280 | - $cookie_vars = newbbGetCookie($cookie_name, true); |
|
| 281 | - |
|
| 282 | - $ret = []; |
|
| 283 | - foreach ($items as $key => $last_update) { |
|
| 284 | - $ret[$key] = (max(@$GLOBALS['last_visit'], @$cookie_vars[$key]) >= $last_update); |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - return $ret; |
|
| 288 | - } |
|
| 289 | - |
|
| 290 | - /** |
|
| 291 | - * @param $items |
|
| 292 | - * @param $uid |
|
| 293 | - * @return array |
|
| 294 | - */ |
|
| 295 | - public function isReadItemsDb(&$items, $uid) |
|
| 296 | - { |
|
| 297 | - $ret = []; |
|
| 298 | - if (empty($items)) { |
|
| 299 | - return $ret; |
|
| 300 | - } |
|
| 301 | - |
|
| 302 | - if (empty($uid)) { |
|
| 303 | - if (is_object($GLOBALS['xoopsUser'])) { |
|
| 304 | - $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 305 | - } else { |
|
| 306 | - return $ret; |
|
| 307 | - } |
|
| 308 | - } |
|
| 309 | - |
|
| 310 | - $criteria = new \CriteriaCompo(new \Criteria('uid', $uid)); |
|
| 311 | - $criteria->add(new \Criteria('read_item', '(' . implode(', ', array_map('intval', array_keys($items))) . ')', 'IN')); |
|
| 312 | - $itemsObject = $this->getAll($criteria, ['read_item', 'post_id']); |
|
| 313 | - |
|
| 314 | - $items_list = []; |
|
| 315 | - foreach (array_keys($itemsObject) as $key) { |
|
| 316 | - $items_list[$itemsObject[$key]->getVar('read_item')] = $itemsObject[$key]->getVar('post_id'); |
|
| 317 | - } |
|
| 318 | - unset($itemsObject); |
|
| 319 | - |
|
| 320 | - foreach ($items as $key => $last_update) { |
|
| 321 | - $ret[$key] = (@$items_list[$key] >= $last_update); |
|
| 322 | - } |
|
| 323 | - |
|
| 324 | - return $ret; |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - // START irmtfan add clear duplicated rows function |
|
| 328 | - |
|
| 329 | - /** |
|
| 330 | - * @return bool |
|
| 331 | - */ |
|
| 332 | - public function clearDuplicate() |
|
| 333 | - { |
|
| 334 | - /** |
|
| 335 | - * This is needed for the following query GROUP BY clauses to work in MySQL 5.7. |
|
| 336 | - * This is a TEMPORARY fix. Needing this function is bad in the first place, but |
|
| 337 | - * needing sloppy SQL to make it work is worse. |
|
| 338 | - * @todo The schema itself should preclude the duplicates |
|
| 339 | - */ |
|
| 340 | - $sql = "SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''))"; |
|
| 341 | - $this->db->queryF($sql); |
|
| 342 | - |
|
| 343 | - $sql = 'CREATE TABLE ' . $this->table . '_duplicate LIKE ' . $this->table . '; '; |
|
| 344 | - if (!$result = $this->db->queryF($sql)) { |
|
| 345 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 346 | - |
|
| 347 | - return false; |
|
| 348 | - } |
|
| 349 | - $sql = 'INSERT ' . $this->table . '_duplicate SELECT * FROM ' . $this->table . ' GROUP BY read_item, uid; '; |
|
| 350 | - if (!$result = $this->db->queryF($sql)) { |
|
| 351 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 352 | - |
|
| 353 | - return false; |
|
| 354 | - } |
|
| 355 | - $sql = 'RENAME TABLE ' . $this->table . ' TO ' . $this->table . '_with_duplicate; '; |
|
| 356 | - if (!$result = $this->db->queryF($sql)) { |
|
| 357 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 358 | - |
|
| 359 | - return false; |
|
| 360 | - } |
|
| 361 | - $sql = 'RENAME TABLE ' . $this->table . '_duplicate TO ' . $this->table . '; '; |
|
| 362 | - if (!$result = $this->db->queryF($sql)) { |
|
| 363 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 364 | - |
|
| 365 | - return false; |
|
| 366 | - } |
|
| 367 | - $sql = 'SHOW INDEX FROM ' . $this->table . " WHERE KEY_NAME = 'read_item_uid'"; |
|
| 368 | - $result = $this->db->queryF($sql); |
|
| 369 | - if (empty($result)) { |
|
| 370 | - $sql .= 'ALTER TABLE ' . $this->table . ' ADD INDEX read_item_uid ( read_item, uid ); '; |
|
| 371 | - if (!$result = $this->db->queryF($sql)) { |
|
| 372 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 373 | - |
|
| 374 | - return false; |
|
| 375 | - } |
|
| 376 | - } |
|
| 377 | - $sql = 'DROP TABLE ' . $this->table . '_with_duplicate; '; |
|
| 378 | - if (!$result = $this->db->queryF($sql)) { |
|
| 379 | - xoops_error($this->db->error() . '<br>' . $sql); |
|
| 380 | - |
|
| 381 | - return false; |
|
| 382 | - } |
|
| 383 | - |
|
| 384 | - return true; |
|
| 385 | - } |
|
| 386 | - // END irmtfan add clear duplicated rows function |
|
| 51 | + /** |
|
| 52 | + * Object type. |
|
| 53 | + * <ul> |
|
| 54 | + * <li>forum</li> |
|
| 55 | + * <li>topic</li> |
|
| 56 | + * </ul> |
|
| 57 | + * |
|
| 58 | + * @var string |
|
| 59 | + */ |
|
| 60 | + public $type; |
|
| 61 | + |
|
| 62 | + /** |
|
| 63 | + * seconds records will persist. |
|
| 64 | + * assigned from $GLOBALS['xoopsModuleConfig']["read_expire"] |
|
| 65 | + * <ul> |
|
| 66 | + * <li>positive days = delete all read records exist in the tables before expire time // irmtfan add comment</li> |
|
| 67 | + * <li>0 = never expires // irmtfan change comment</li> |
|
| 68 | + * <li>-1 or any negative days = never records // irmtfan change comment</li> |
|
| 69 | + * </ul> |
|
| 70 | + * |
|
| 71 | + * @var integer |
|
| 72 | + */ |
|
| 73 | + public $lifetime; |
|
| 74 | + |
|
| 75 | + /** |
|
| 76 | + * storage mode for records. |
|
| 77 | + * assigned from $GLOBALS['xoopsModuleConfig']["read_mode"] |
|
| 78 | + * <ul> |
|
| 79 | + * <li>0 = never records</li> |
|
| 80 | + * <li>1 = uses cookie</li> |
|
| 81 | + * <li>2 = stores in database</li> |
|
| 82 | + * </ul> |
|
| 83 | + * |
|
| 84 | + * @var integer |
|
| 85 | + */ |
|
| 86 | + public $mode; |
|
| 87 | + |
|
| 88 | + /** |
|
| 89 | + * @param \XoopsDatabase $db |
|
| 90 | + * @param $type |
|
| 91 | + */ |
|
| 92 | + public function __construct(\XoopsDatabase $db, $type) |
|
| 93 | + { |
|
| 94 | + $type = ('forum' === $type) ? 'forum' : 'topic'; |
|
| 95 | + parent::__construct($db, 'newbb_reads_' . $type, Read::class . $type, 'read_id', 'post_id'); |
|
| 96 | + $this->type = $type; |
|
| 97 | + $newbbConfig = newbbLoadConfig(); |
|
| 98 | + // irmtfan if read_expire = 0 dont clean |
|
| 99 | + $this->lifetime = isset($newbbConfig['read_expire']) ? (int)$newbbConfig['read_expire'] * 24 * 3600 : 30 * 24 * 3600; |
|
| 100 | + $this->mode = isset($newbbConfig['read_mode']) ? $newbbConfig['read_mode'] : 2; |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + /** |
|
| 104 | + * Clear garbage |
|
| 105 | + * |
|
| 106 | + * Delete all expired and duplicated records |
|
| 107 | + */ |
|
| 108 | + // START irmtfan rephrase function to 1- add clearDuplicate and 2- dont clean when read_expire = 0 |
|
| 109 | + public function clearGarbage() |
|
| 110 | + { |
|
| 111 | + // irmtfan clear duplicaed rows |
|
| 112 | + if (!$result = $this->clearDuplicate()) { |
|
| 113 | + return false; |
|
| 114 | + } |
|
| 115 | + |
|
| 116 | + $sql = 'DELETE bb FROM ' . $this->table . ' AS bb' . ' LEFT JOIN ' . $this->table . ' AS aa ON bb.read_item = aa.read_item ' . ' WHERE aa.post_id > bb.post_id'; |
|
| 117 | + if (!$result = $this->db->queryF($sql)) { |
|
| 118 | + //xoops_error($this->db->error()); |
|
| 119 | + return false; |
|
| 120 | + } |
|
| 121 | + // irmtfan if read_expire = 0 dont clean |
|
| 122 | + if (empty($this->lifetime)) { |
|
| 123 | + return true; |
|
| 124 | + } |
|
| 125 | + // irmtfan move here and rephrase |
|
| 126 | + $expire = time() - (int)$this->lifetime; |
|
| 127 | + $sql = 'DELETE FROM ' . $this->table . ' WHERE read_time < ' . $expire; |
|
| 128 | + if (!$result = $this->db->queryF($sql)) { |
|
| 129 | + //xoops_error($this->db->error()); |
|
| 130 | + return false; |
|
| 131 | + } |
|
| 132 | + |
|
| 133 | + return true; |
|
| 134 | + } |
|
| 135 | + |
|
| 136 | + // END irmtfan rephrase function to 1- add clearDuplicate and 2- dont clean when read_expire = 0 |
|
| 137 | + |
|
| 138 | + /** |
|
| 139 | + * @param $read_item |
|
| 140 | + * @param null $uid |
|
| 141 | + * @return bool|mixed|null |
|
| 142 | + */ |
|
| 143 | + public function getRead($read_item, $uid = null) |
|
| 144 | + { |
|
| 145 | + if (empty($this->mode)) { |
|
| 146 | + return null; |
|
| 147 | + } |
|
| 148 | + if (1 == $this->mode) { |
|
| 149 | + return $this->getReadCookie($read_item); |
|
| 150 | + } |
|
| 151 | + |
|
| 152 | + return $this->getReadDb($read_item, $uid); |
|
| 153 | + } |
|
| 154 | + |
|
| 155 | + /** |
|
| 156 | + * @param $item_id |
|
| 157 | + * @return mixed |
|
| 158 | + */ |
|
| 159 | + public function getReadCookie($item_id) |
|
| 160 | + { |
|
| 161 | + $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 162 | + $cookie_var = $item_id; |
|
| 163 | + // irmtfan set true to return array |
|
| 164 | + $lastview = newbbGetCookie($cookie_name, true); |
|
| 165 | + |
|
| 166 | + return @$lastview[$cookie_var]; |
|
| 167 | + } |
|
| 168 | + |
|
| 169 | + /** |
|
| 170 | + * @param $read_item |
|
| 171 | + * @param $uid |
|
| 172 | + * @return bool|null |
|
| 173 | + */ |
|
| 174 | + public function getReadDb($read_item, $uid) |
|
| 175 | + { |
|
| 176 | + if (empty($uid)) { |
|
| 177 | + if (is_object($GLOBALS['xoopsUser'])) { |
|
| 178 | + $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 179 | + } else { |
|
| 180 | + return false; |
|
| 181 | + } |
|
| 182 | + } |
|
| 183 | + $sql = 'SELECT post_id ' . ' FROM ' . $this->table . ' WHERE read_item = ' . (int)$read_item . ' AND uid = ' . (int)$uid; |
|
| 184 | + if (!$result = $this->db->queryF($sql, 1)) { |
|
| 185 | + return null; |
|
| 186 | + } |
|
| 187 | + list($post_id) = $this->db->fetchRow($result); |
|
| 188 | + |
|
| 189 | + return $post_id; |
|
| 190 | + } |
|
| 191 | + |
|
| 192 | + /** |
|
| 193 | + * @param $read_item |
|
| 194 | + * @param $post_id |
|
| 195 | + * @param null $uid |
|
| 196 | + * @return bool|mixed|void |
|
| 197 | + */ |
|
| 198 | + public function setRead($read_item, $post_id, $uid = null) |
|
| 199 | + { |
|
| 200 | + if (empty($this->mode)) { |
|
| 201 | + return true; |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + if (1 == $this->mode) { |
|
| 205 | + return $this->setReadCookie($read_item, $post_id); |
|
| 206 | + } |
|
| 207 | + |
|
| 208 | + return $this->setReadDb($read_item, $post_id, $uid); |
|
| 209 | + } |
|
| 210 | + |
|
| 211 | + /** |
|
| 212 | + * @param $read_item |
|
| 213 | + * @param $post_id |
|
| 214 | + */ |
|
| 215 | + public function setReadCookie($read_item, $post_id) |
|
| 216 | + { |
|
| 217 | + $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 218 | + $lastview = newbbGetCookie($cookie_name, true); |
|
| 219 | + $lastview[$read_item] = time(); |
|
| 220 | + newbbSetCookie($cookie_name, $lastview); |
|
| 221 | + } |
|
| 222 | + |
|
| 223 | + /** |
|
| 224 | + * @param $read_item |
|
| 225 | + * @param $post_id |
|
| 226 | + * @param $uid |
|
| 227 | + * @return bool|mixed |
|
| 228 | + */ |
|
| 229 | + public function setReadDb($read_item, $post_id, $uid) |
|
| 230 | + { |
|
| 231 | + if (empty($uid)) { |
|
| 232 | + if (is_object($GLOBALS['xoopsUser'])) { |
|
| 233 | + $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 234 | + } else { |
|
| 235 | + return false; |
|
| 236 | + } |
|
| 237 | + } |
|
| 238 | + |
|
| 239 | + $sql = 'UPDATE ' . $this->table . ' SET post_id = ' . (int)$post_id . ',' . ' read_time =' . time() . ' WHERE read_item = ' . (int)$read_item . ' AND uid = ' . (int)$uid; |
|
| 240 | + if ($this->db->queryF($sql) && $this->db->getAffectedRows()) { |
|
| 241 | + return true; |
|
| 242 | + } |
|
| 243 | + $object = $this->create(); |
|
| 244 | + $object->setVar('read_item', $read_item); |
|
| 245 | + $object->setVar('post_id', $post_id); |
|
| 246 | + $object->setVar('uid', $uid); |
|
| 247 | + $object->setVar('read_time', time()); |
|
| 248 | + |
|
| 249 | + return parent::insert($object); |
|
| 250 | + } |
|
| 251 | + |
|
| 252 | + /** |
|
| 253 | + * @param $items |
|
| 254 | + * @param null $uid |
|
| 255 | + * @return array|null |
|
| 256 | + */ |
|
| 257 | + public function isReadItems(&$items, $uid = null) |
|
| 258 | + { |
|
| 259 | + $ret = null; |
|
| 260 | + if (empty($this->mode)) { |
|
| 261 | + return $ret; |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + if (1 == $this->mode) { |
|
| 265 | + $ret = $this->isReadItemsCookie($items); |
|
| 266 | + } else { |
|
| 267 | + $ret = $this->isReadItemsDb($items, $uid); |
|
| 268 | + } |
|
| 269 | + |
|
| 270 | + return $ret; |
|
| 271 | + } |
|
| 272 | + |
|
| 273 | + /** |
|
| 274 | + * @param $items |
|
| 275 | + * @return array |
|
| 276 | + */ |
|
| 277 | + public function isReadItemsCookie(&$items) |
|
| 278 | + { |
|
| 279 | + $cookie_name = ('forum' === $this->type) ? 'LF' : 'LT'; |
|
| 280 | + $cookie_vars = newbbGetCookie($cookie_name, true); |
|
| 281 | + |
|
| 282 | + $ret = []; |
|
| 283 | + foreach ($items as $key => $last_update) { |
|
| 284 | + $ret[$key] = (max(@$GLOBALS['last_visit'], @$cookie_vars[$key]) >= $last_update); |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + return $ret; |
|
| 288 | + } |
|
| 289 | + |
|
| 290 | + /** |
|
| 291 | + * @param $items |
|
| 292 | + * @param $uid |
|
| 293 | + * @return array |
|
| 294 | + */ |
|
| 295 | + public function isReadItemsDb(&$items, $uid) |
|
| 296 | + { |
|
| 297 | + $ret = []; |
|
| 298 | + if (empty($items)) { |
|
| 299 | + return $ret; |
|
| 300 | + } |
|
| 301 | + |
|
| 302 | + if (empty($uid)) { |
|
| 303 | + if (is_object($GLOBALS['xoopsUser'])) { |
|
| 304 | + $uid = $GLOBALS['xoopsUser']->getVar('uid'); |
|
| 305 | + } else { |
|
| 306 | + return $ret; |
|
| 307 | + } |
|
| 308 | + } |
|
| 309 | + |
|
| 310 | + $criteria = new \CriteriaCompo(new \Criteria('uid', $uid)); |
|
| 311 | + $criteria->add(new \Criteria('read_item', '(' . implode(', ', array_map('intval', array_keys($items))) . ')', 'IN')); |
|
| 312 | + $itemsObject = $this->getAll($criteria, ['read_item', 'post_id']); |
|
| 313 | + |
|
| 314 | + $items_list = []; |
|
| 315 | + foreach (array_keys($itemsObject) as $key) { |
|
| 316 | + $items_list[$itemsObject[$key]->getVar('read_item')] = $itemsObject[$key]->getVar('post_id'); |
|
| 317 | + } |
|
| 318 | + unset($itemsObject); |
|
| 319 | + |
|
| 320 | + foreach ($items as $key => $last_update) { |
|
| 321 | + $ret[$key] = (@$items_list[$key] >= $last_update); |
|
| 322 | + } |
|
| 323 | + |
|
| 324 | + return $ret; |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + // START irmtfan add clear duplicated rows function |
|
| 328 | + |
|
| 329 | + /** |
|
| 330 | + * @return bool |
|
| 331 | + */ |
|
| 332 | + public function clearDuplicate() |
|
| 333 | + { |
|
| 334 | + /** |
|
| 335 | + * This is needed for the following query GROUP BY clauses to work in MySQL 5.7. |
|
| 336 | + * This is a TEMPORARY fix. Needing this function is bad in the first place, but |
|
| 337 | + * needing sloppy SQL to make it work is worse. |
|
| 338 | + * @todo The schema itself should preclude the duplicates |
|
| 339 | + */ |
|
| 340 | + $sql = "SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''))"; |
|
| 341 | + $this->db->queryF($sql); |
|
| 342 | + |
|
| 343 | + $sql = 'CREATE TABLE ' . $this->table . '_duplicate LIKE ' . $this->table . '; '; |
|
| 344 | + if (!$result = $this->db->queryF($sql)) { |
|
| 345 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 346 | + |
|
| 347 | + return false; |
|
| 348 | + } |
|
| 349 | + $sql = 'INSERT ' . $this->table . '_duplicate SELECT * FROM ' . $this->table . ' GROUP BY read_item, uid; '; |
|
| 350 | + if (!$result = $this->db->queryF($sql)) { |
|
| 351 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 352 | + |
|
| 353 | + return false; |
|
| 354 | + } |
|
| 355 | + $sql = 'RENAME TABLE ' . $this->table . ' TO ' . $this->table . '_with_duplicate; '; |
|
| 356 | + if (!$result = $this->db->queryF($sql)) { |
|
| 357 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 358 | + |
|
| 359 | + return false; |
|
| 360 | + } |
|
| 361 | + $sql = 'RENAME TABLE ' . $this->table . '_duplicate TO ' . $this->table . '; '; |
|
| 362 | + if (!$result = $this->db->queryF($sql)) { |
|
| 363 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 364 | + |
|
| 365 | + return false; |
|
| 366 | + } |
|
| 367 | + $sql = 'SHOW INDEX FROM ' . $this->table . " WHERE KEY_NAME = 'read_item_uid'"; |
|
| 368 | + $result = $this->db->queryF($sql); |
|
| 369 | + if (empty($result)) { |
|
| 370 | + $sql .= 'ALTER TABLE ' . $this->table . ' ADD INDEX read_item_uid ( read_item, uid ); '; |
|
| 371 | + if (!$result = $this->db->queryF($sql)) { |
|
| 372 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 373 | + |
|
| 374 | + return false; |
|
| 375 | + } |
|
| 376 | + } |
|
| 377 | + $sql = 'DROP TABLE ' . $this->table . '_with_duplicate; '; |
|
| 378 | + if (!$result = $this->db->queryF($sql)) { |
|
| 379 | + xoops_error($this->db->error() . '<br>' . $sql); |
|
| 380 | + |
|
| 381 | + return false; |
|
| 382 | + } |
|
| 383 | + |
|
| 384 | + return true; |
|
| 385 | + } |
|
| 386 | + // END irmtfan add clear duplicated rows function |
|
| 387 | 387 | } |
@@ -17,63 +17,63 @@ |
||
| 17 | 17 | */ |
| 18 | 18 | trait VersionChecks |
| 19 | 19 | { |
| 20 | - /** |
|
| 21 | - * |
|
| 22 | - * Verifies XOOPS version meets minimum requirements for this module |
|
| 23 | - * @static |
|
| 24 | - * @param \XoopsModule $module |
|
| 25 | - * |
|
| 26 | - * @param null|string $requiredVer |
|
| 27 | - * @return bool true if meets requirements, false if not |
|
| 28 | - */ |
|
| 29 | - public static function checkVerXoops(\XoopsModule $module = null, $requiredVer = null) |
|
| 30 | - { |
|
| 31 | - $moduleDirName = basename(dirname(dirname(__DIR__))); |
|
| 32 | - $moduleDirNameUpper = strtoupper($moduleDirName); |
|
| 33 | - if (null === $module) { |
|
| 34 | - $module = \XoopsModule::getByDirname($moduleDirName); |
|
| 35 | - } |
|
| 36 | - xoops_loadLanguage('admin', $moduleDirName); |
|
| 20 | + /** |
|
| 21 | + * |
|
| 22 | + * Verifies XOOPS version meets minimum requirements for this module |
|
| 23 | + * @static |
|
| 24 | + * @param \XoopsModule $module |
|
| 25 | + * |
|
| 26 | + * @param null|string $requiredVer |
|
| 27 | + * @return bool true if meets requirements, false if not |
|
| 28 | + */ |
|
| 29 | + public static function checkVerXoops(\XoopsModule $module = null, $requiredVer = null) |
|
| 30 | + { |
|
| 31 | + $moduleDirName = basename(dirname(dirname(__DIR__))); |
|
| 32 | + $moduleDirNameUpper = strtoupper($moduleDirName); |
|
| 33 | + if (null === $module) { |
|
| 34 | + $module = \XoopsModule::getByDirname($moduleDirName); |
|
| 35 | + } |
|
| 36 | + xoops_loadLanguage('admin', $moduleDirName); |
|
| 37 | 37 | |
| 38 | - //check for minimum XOOPS version |
|
| 39 | - $currentVer = substr(XOOPS_VERSION, 6); // get the numeric part of string |
|
| 40 | - if (null === $requiredVer) { |
|
| 41 | - $requiredVer = '' . $module->getInfo('min_xoops'); //making sure it's a string |
|
| 42 | - } |
|
| 43 | - $success = true; |
|
| 38 | + //check for minimum XOOPS version |
|
| 39 | + $currentVer = substr(XOOPS_VERSION, 6); // get the numeric part of string |
|
| 40 | + if (null === $requiredVer) { |
|
| 41 | + $requiredVer = '' . $module->getInfo('min_xoops'); //making sure it's a string |
|
| 42 | + } |
|
| 43 | + $success = true; |
|
| 44 | 44 | |
| 45 | - if (version_compare($currentVer, $requiredVer, '<')) { |
|
| 46 | - $success = false; |
|
| 47 | - $module->setErrors(sprintf(constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_XOOPS'), $requiredVer, $currentVer)); |
|
| 48 | - } |
|
| 45 | + if (version_compare($currentVer, $requiredVer, '<')) { |
|
| 46 | + $success = false; |
|
| 47 | + $module->setErrors(sprintf(constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_XOOPS'), $requiredVer, $currentVer)); |
|
| 48 | + } |
|
| 49 | 49 | |
| 50 | - return $success; |
|
| 51 | - } |
|
| 50 | + return $success; |
|
| 51 | + } |
|
| 52 | 52 | |
| 53 | - /** |
|
| 54 | - * |
|
| 55 | - * Verifies PHP version meets minimum requirements for this module |
|
| 56 | - * @static |
|
| 57 | - * @param \XoopsModule $module |
|
| 58 | - * |
|
| 59 | - * @return bool true if meets requirements, false if not |
|
| 60 | - */ |
|
| 61 | - public static function checkVerPhp(\XoopsModule $module) |
|
| 62 | - { |
|
| 63 | - $moduleDirName = basename(dirname(__DIR__)); |
|
| 64 | - $moduleDirNameUpper = strtoupper($moduleDirName); |
|
| 65 | - xoops_loadLanguage('admin', $module->dirname()); |
|
| 66 | - // check for minimum PHP version |
|
| 67 | - $success = true; |
|
| 68 | - $verNum = PHP_VERSION; |
|
| 69 | - $reqVer = $module->getInfo('min_php'); |
|
| 70 | - if (false !== $reqVer && '' !== $reqVer) { |
|
| 71 | - if (version_compare($verNum, $reqVer, '<')) { |
|
| 72 | - $module->setErrors(sprintf(constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_PHP'), $reqVer, $verNum)); |
|
| 73 | - $success = false; |
|
| 74 | - } |
|
| 75 | - } |
|
| 53 | + /** |
|
| 54 | + * |
|
| 55 | + * Verifies PHP version meets minimum requirements for this module |
|
| 56 | + * @static |
|
| 57 | + * @param \XoopsModule $module |
|
| 58 | + * |
|
| 59 | + * @return bool true if meets requirements, false if not |
|
| 60 | + */ |
|
| 61 | + public static function checkVerPhp(\XoopsModule $module) |
|
| 62 | + { |
|
| 63 | + $moduleDirName = basename(dirname(__DIR__)); |
|
| 64 | + $moduleDirNameUpper = strtoupper($moduleDirName); |
|
| 65 | + xoops_loadLanguage('admin', $module->dirname()); |
|
| 66 | + // check for minimum PHP version |
|
| 67 | + $success = true; |
|
| 68 | + $verNum = PHP_VERSION; |
|
| 69 | + $reqVer = $module->getInfo('min_php'); |
|
| 70 | + if (false !== $reqVer && '' !== $reqVer) { |
|
| 71 | + if (version_compare($verNum, $reqVer, '<')) { |
|
| 72 | + $module->setErrors(sprintf(constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_PHP'), $reqVer, $verNum)); |
|
| 73 | + $success = false; |
|
| 74 | + } |
|
| 75 | + } |
|
| 76 | 76 | |
| 77 | - return $success; |
|
| 78 | - } |
|
| 77 | + return $success; |
|
| 78 | + } |
|
| 79 | 79 | } |
@@ -27,35 +27,35 @@ |
||
| 27 | 27 | */ |
| 28 | 28 | class Configurator |
| 29 | 29 | { |
| 30 | - public $name; |
|
| 31 | - public $paths = []; |
|
| 32 | - public $uploadFolders = []; |
|
| 33 | - public $copyBlankFiles = []; |
|
| 34 | - public $copyTestFolders = []; |
|
| 35 | - public $templateFolders = []; |
|
| 36 | - public $oldFiles = []; |
|
| 37 | - public $oldFolders = []; |
|
| 38 | - public $modCopyright; |
|
| 30 | + public $name; |
|
| 31 | + public $paths = []; |
|
| 32 | + public $uploadFolders = []; |
|
| 33 | + public $copyBlankFiles = []; |
|
| 34 | + public $copyTestFolders = []; |
|
| 35 | + public $templateFolders = []; |
|
| 36 | + public $oldFiles = []; |
|
| 37 | + public $oldFolders = []; |
|
| 38 | + public $modCopyright; |
|
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * Configurator constructor. |
|
| 42 | - */ |
|
| 43 | - public function __construct() |
|
| 44 | - { |
|
| 45 | - $moduleDirName = basename(dirname(__DIR__)); |
|
| 46 | - $capsDirName = strtoupper($moduleDirName); |
|
| 40 | + /** |
|
| 41 | + * Configurator constructor. |
|
| 42 | + */ |
|
| 43 | + public function __construct() |
|
| 44 | + { |
|
| 45 | + $moduleDirName = basename(dirname(__DIR__)); |
|
| 46 | + $capsDirName = strtoupper($moduleDirName); |
|
| 47 | 47 | |
| 48 | - require_once dirname(dirname(__DIR__)) . '/include/config.php'; |
|
| 49 | - $config = getConfig(); |
|
| 48 | + require_once dirname(dirname(__DIR__)) . '/include/config.php'; |
|
| 49 | + $config = getConfig(); |
|
| 50 | 50 | |
| 51 | - $this->name = $config->name; |
|
| 52 | - $this->paths = $config->paths; |
|
| 53 | - $this->uploadFolders = $config->uploadFolders; |
|
| 54 | - $this->copyBlankFiles = $config->copyBlankFiles; |
|
| 55 | - $this->copyTestFolders = $config->copyTestFolders; |
|
| 56 | - $this->templateFolders = $config->templateFolders; |
|
| 57 | - $this->oldFiles = $config->oldFiles; |
|
| 58 | - $this->oldFolders = $config->oldFolders; |
|
| 59 | - $this->modCopyright = $config->modCopyright; |
|
| 60 | - } |
|
| 51 | + $this->name = $config->name; |
|
| 52 | + $this->paths = $config->paths; |
|
| 53 | + $this->uploadFolders = $config->uploadFolders; |
|
| 54 | + $this->copyBlankFiles = $config->copyBlankFiles; |
|
| 55 | + $this->copyTestFolders = $config->copyTestFolders; |
|
| 56 | + $this->templateFolders = $config->templateFolders; |
|
| 57 | + $this->oldFiles = $config->oldFiles; |
|
| 58 | + $this->oldFolders = $config->oldFolders; |
|
| 59 | + $this->modCopyright = $config->modCopyright; |
|
| 60 | + } |
|
| 61 | 61 | } |
@@ -17,229 +17,229 @@ |
||
| 17 | 17 | */ |
| 18 | 18 | trait FilesManagement |
| 19 | 19 | { |
| 20 | - /** |
|
| 21 | - * Function responsible for checking if a directory exists, we can also write in and create an index.html file |
|
| 22 | - * |
|
| 23 | - * @param string $folder The full path of the directory to check |
|
| 24 | - * |
|
| 25 | - * @return void |
|
| 26 | - */ |
|
| 27 | - public static function createFolder($folder) |
|
| 28 | - { |
|
| 29 | - try { |
|
| 30 | - if (!file_exists($folder)) { |
|
| 31 | - if (!is_dir($folder) && !mkdir($folder) && !is_dir($folder)) { |
|
| 32 | - throw new \RuntimeException(sprintf('Unable to create the %s directory', $folder)); |
|
| 33 | - } |
|
| 34 | - |
|
| 35 | - file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>'); |
|
| 36 | - } |
|
| 37 | - } catch (\Exception $e) { |
|
| 38 | - echo 'Caught exception: ', $e->getMessage(), "\n", '<br>'; |
|
| 39 | - } |
|
| 40 | - } |
|
| 41 | - |
|
| 42 | - /** |
|
| 43 | - * @param $file |
|
| 44 | - * @param $folder |
|
| 45 | - * @return bool |
|
| 46 | - */ |
|
| 47 | - public static function copyFile($file, $folder) |
|
| 48 | - { |
|
| 49 | - return copy($file, $folder); |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * @param $src |
|
| 54 | - * @param $dst |
|
| 55 | - */ |
|
| 56 | - public static function recurseCopy($src, $dst) |
|
| 57 | - { |
|
| 58 | - $dir = opendir($src); |
|
| 59 | - // @mkdir($dst); |
|
| 60 | - if (!@mkdir($dst) && !is_dir($dst)) { |
|
| 61 | - throw new \RuntimeException('The directory ' . $dst . ' could not be created.'); |
|
| 62 | - } |
|
| 63 | - while (false !== ($file = readdir($dir))) { |
|
| 64 | - if (('.' !== $file) && ('..' !== $file)) { |
|
| 65 | - if (is_dir($src . '/' . $file)) { |
|
| 66 | - self::recurseCopy($src . '/' . $file, $dst . '/' . $file); |
|
| 67 | - } else { |
|
| 68 | - copy($src . '/' . $file, $dst . '/' . $file); |
|
| 69 | - } |
|
| 70 | - } |
|
| 71 | - } |
|
| 72 | - closedir($dir); |
|
| 73 | - } |
|
| 74 | - |
|
| 75 | - /** |
|
| 76 | - * |
|
| 77 | - * Remove files and (sub)directories |
|
| 78 | - * |
|
| 79 | - * @param string $src source directory to delete |
|
| 80 | - * |
|
| 81 | - * @uses \Xmf\Module\Helper::getHelper() |
|
| 82 | - * @uses \Xmf\Module\Helper::isUserAdmin() |
|
| 83 | - * |
|
| 84 | - * @return bool true on success |
|
| 85 | - */ |
|
| 86 | - public static function deleteDirectory($src) |
|
| 87 | - { |
|
| 88 | - // Only continue if user is a 'global' Admin |
|
| 89 | - if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 90 | - return false; |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - $success = true; |
|
| 94 | - // remove old files |
|
| 95 | - $dirInfo = new \SplFileInfo($src); |
|
| 96 | - // validate is a directory |
|
| 97 | - if ($dirInfo->isDir()) { |
|
| 98 | - $fileList = array_diff(scandir($src, SCANDIR_SORT_NONE), ['..', '.']); |
|
| 99 | - foreach ($fileList as $k => $v) { |
|
| 100 | - $fileInfo = new \SplFileInfo("{$src}/{$v}"); |
|
| 101 | - if ($fileInfo->isDir()) { |
|
| 102 | - // recursively handle subdirectories |
|
| 103 | - if (!$success = self::deleteDirectory($fileInfo->getRealPath())) { |
|
| 104 | - break; |
|
| 105 | - } |
|
| 106 | - } else { |
|
| 107 | - // delete the file |
|
| 108 | - if (!($success = unlink($fileInfo->getRealPath()))) { |
|
| 109 | - break; |
|
| 110 | - } |
|
| 111 | - } |
|
| 112 | - } |
|
| 113 | - // now delete this (sub)directory if all the files are gone |
|
| 114 | - if ($success) { |
|
| 115 | - $success = rmdir($dirInfo->getRealPath()); |
|
| 116 | - } |
|
| 117 | - } else { |
|
| 118 | - // input is not a valid directory |
|
| 119 | - $success = false; |
|
| 120 | - } |
|
| 121 | - return $success; |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - /** |
|
| 125 | - * |
|
| 126 | - * Recursively remove directory |
|
| 127 | - * |
|
| 128 | - * @todo currently won't remove directories with hidden files, should it? |
|
| 129 | - * |
|
| 130 | - * @param string $src directory to remove (delete) |
|
| 131 | - * |
|
| 132 | - * @return bool true on success |
|
| 133 | - */ |
|
| 134 | - public static function rrmdir($src) |
|
| 135 | - { |
|
| 136 | - // Only continue if user is a 'global' Admin |
|
| 137 | - if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 138 | - return false; |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - // If source is not a directory stop processing |
|
| 142 | - if (!is_dir($src)) { |
|
| 143 | - return false; |
|
| 144 | - } |
|
| 145 | - |
|
| 146 | - $success = true; |
|
| 147 | - |
|
| 148 | - // Open the source directory to read in files |
|
| 149 | - $iterator = new \DirectoryIterator($src); |
|
| 150 | - foreach ($iterator as $fObj) { |
|
| 151 | - if ($fObj->isFile()) { |
|
| 152 | - $filename = $fObj->getPathname(); |
|
| 153 | - $fObj = null; // clear this iterator object to close the file |
|
| 154 | - if (!unlink($filename)) { |
|
| 155 | - return false; // couldn't delete the file |
|
| 156 | - } |
|
| 157 | - } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 158 | - // Try recursively on directory |
|
| 159 | - self::rrmdir($fObj->getPathname()); |
|
| 160 | - } |
|
| 161 | - } |
|
| 162 | - $iterator = null; // clear iterator Obj to close file/directory |
|
| 163 | - return rmdir($src); // remove the directory & return results |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - /** |
|
| 167 | - * Recursively move files from one directory to another |
|
| 168 | - * |
|
| 169 | - * @param string $src - Source of files being moved |
|
| 170 | - * @param string $dest - Destination of files being moved |
|
| 171 | - * |
|
| 172 | - * @return bool true on success |
|
| 173 | - */ |
|
| 174 | - public static function rmove($src, $dest) |
|
| 175 | - { |
|
| 176 | - // Only continue if user is a 'global' Admin |
|
| 177 | - if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 178 | - return false; |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - // If source is not a directory stop processing |
|
| 182 | - if (!is_dir($src)) { |
|
| 183 | - return false; |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - // If the destination directory does not exist and could not be created stop processing |
|
| 187 | - if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) { |
|
| 188 | - return false; |
|
| 189 | - } |
|
| 190 | - |
|
| 191 | - // Open the source directory to read in files |
|
| 192 | - $iterator = new \DirectoryIterator($src); |
|
| 193 | - foreach ($iterator as $fObj) { |
|
| 194 | - if ($fObj->isFile()) { |
|
| 195 | - rename($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 196 | - } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 197 | - // Try recursively on directory |
|
| 198 | - self::rmove($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 199 | - // rmdir($fObj->getPath()); // now delete the directory |
|
| 200 | - } |
|
| 201 | - } |
|
| 202 | - $iterator = null; // clear iterator Obj to close file/directory |
|
| 203 | - return rmdir($src); // remove the directory & return results |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - /** |
|
| 207 | - * Recursively copy directories and files from one directory to another |
|
| 208 | - * |
|
| 209 | - * @param string $src - Source of files being moved |
|
| 210 | - * @param string $dest - Destination of files being moved |
|
| 211 | - * |
|
| 212 | - * @uses \Xmf\Module\Helper::getHelper() |
|
| 213 | - * @uses \Xmf\Module\Helper::isUserAdmin() |
|
| 214 | - * |
|
| 215 | - * @return bool true on success |
|
| 216 | - */ |
|
| 217 | - public static function rcopy($src, $dest) |
|
| 218 | - { |
|
| 219 | - // Only continue if user is a 'global' Admin |
|
| 220 | - if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 221 | - return false; |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - // If source is not a directory stop processing |
|
| 225 | - if (!is_dir($src)) { |
|
| 226 | - return false; |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - // If the destination directory does not exist and could not be created stop processing |
|
| 230 | - if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) { |
|
| 231 | - return false; |
|
| 232 | - } |
|
| 233 | - |
|
| 234 | - // Open the source directory to read in files |
|
| 235 | - $iterator = new \DirectoryIterator($src); |
|
| 236 | - foreach ($iterator as $fObj) { |
|
| 237 | - if ($fObj->isFile()) { |
|
| 238 | - copy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 239 | - } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 240 | - self::rcopy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 241 | - } |
|
| 242 | - } |
|
| 243 | - return true; |
|
| 244 | - } |
|
| 20 | + /** |
|
| 21 | + * Function responsible for checking if a directory exists, we can also write in and create an index.html file |
|
| 22 | + * |
|
| 23 | + * @param string $folder The full path of the directory to check |
|
| 24 | + * |
|
| 25 | + * @return void |
|
| 26 | + */ |
|
| 27 | + public static function createFolder($folder) |
|
| 28 | + { |
|
| 29 | + try { |
|
| 30 | + if (!file_exists($folder)) { |
|
| 31 | + if (!is_dir($folder) && !mkdir($folder) && !is_dir($folder)) { |
|
| 32 | + throw new \RuntimeException(sprintf('Unable to create the %s directory', $folder)); |
|
| 33 | + } |
|
| 34 | + |
|
| 35 | + file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>'); |
|
| 36 | + } |
|
| 37 | + } catch (\Exception $e) { |
|
| 38 | + echo 'Caught exception: ', $e->getMessage(), "\n", '<br>'; |
|
| 39 | + } |
|
| 40 | + } |
|
| 41 | + |
|
| 42 | + /** |
|
| 43 | + * @param $file |
|
| 44 | + * @param $folder |
|
| 45 | + * @return bool |
|
| 46 | + */ |
|
| 47 | + public static function copyFile($file, $folder) |
|
| 48 | + { |
|
| 49 | + return copy($file, $folder); |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * @param $src |
|
| 54 | + * @param $dst |
|
| 55 | + */ |
|
| 56 | + public static function recurseCopy($src, $dst) |
|
| 57 | + { |
|
| 58 | + $dir = opendir($src); |
|
| 59 | + // @mkdir($dst); |
|
| 60 | + if (!@mkdir($dst) && !is_dir($dst)) { |
|
| 61 | + throw new \RuntimeException('The directory ' . $dst . ' could not be created.'); |
|
| 62 | + } |
|
| 63 | + while (false !== ($file = readdir($dir))) { |
|
| 64 | + if (('.' !== $file) && ('..' !== $file)) { |
|
| 65 | + if (is_dir($src . '/' . $file)) { |
|
| 66 | + self::recurseCopy($src . '/' . $file, $dst . '/' . $file); |
|
| 67 | + } else { |
|
| 68 | + copy($src . '/' . $file, $dst . '/' . $file); |
|
| 69 | + } |
|
| 70 | + } |
|
| 71 | + } |
|
| 72 | + closedir($dir); |
|
| 73 | + } |
|
| 74 | + |
|
| 75 | + /** |
|
| 76 | + * |
|
| 77 | + * Remove files and (sub)directories |
|
| 78 | + * |
|
| 79 | + * @param string $src source directory to delete |
|
| 80 | + * |
|
| 81 | + * @uses \Xmf\Module\Helper::getHelper() |
|
| 82 | + * @uses \Xmf\Module\Helper::isUserAdmin() |
|
| 83 | + * |
|
| 84 | + * @return bool true on success |
|
| 85 | + */ |
|
| 86 | + public static function deleteDirectory($src) |
|
| 87 | + { |
|
| 88 | + // Only continue if user is a 'global' Admin |
|
| 89 | + if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 90 | + return false; |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + $success = true; |
|
| 94 | + // remove old files |
|
| 95 | + $dirInfo = new \SplFileInfo($src); |
|
| 96 | + // validate is a directory |
|
| 97 | + if ($dirInfo->isDir()) { |
|
| 98 | + $fileList = array_diff(scandir($src, SCANDIR_SORT_NONE), ['..', '.']); |
|
| 99 | + foreach ($fileList as $k => $v) { |
|
| 100 | + $fileInfo = new \SplFileInfo("{$src}/{$v}"); |
|
| 101 | + if ($fileInfo->isDir()) { |
|
| 102 | + // recursively handle subdirectories |
|
| 103 | + if (!$success = self::deleteDirectory($fileInfo->getRealPath())) { |
|
| 104 | + break; |
|
| 105 | + } |
|
| 106 | + } else { |
|
| 107 | + // delete the file |
|
| 108 | + if (!($success = unlink($fileInfo->getRealPath()))) { |
|
| 109 | + break; |
|
| 110 | + } |
|
| 111 | + } |
|
| 112 | + } |
|
| 113 | + // now delete this (sub)directory if all the files are gone |
|
| 114 | + if ($success) { |
|
| 115 | + $success = rmdir($dirInfo->getRealPath()); |
|
| 116 | + } |
|
| 117 | + } else { |
|
| 118 | + // input is not a valid directory |
|
| 119 | + $success = false; |
|
| 120 | + } |
|
| 121 | + return $success; |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + /** |
|
| 125 | + * |
|
| 126 | + * Recursively remove directory |
|
| 127 | + * |
|
| 128 | + * @todo currently won't remove directories with hidden files, should it? |
|
| 129 | + * |
|
| 130 | + * @param string $src directory to remove (delete) |
|
| 131 | + * |
|
| 132 | + * @return bool true on success |
|
| 133 | + */ |
|
| 134 | + public static function rrmdir($src) |
|
| 135 | + { |
|
| 136 | + // Only continue if user is a 'global' Admin |
|
| 137 | + if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 138 | + return false; |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + // If source is not a directory stop processing |
|
| 142 | + if (!is_dir($src)) { |
|
| 143 | + return false; |
|
| 144 | + } |
|
| 145 | + |
|
| 146 | + $success = true; |
|
| 147 | + |
|
| 148 | + // Open the source directory to read in files |
|
| 149 | + $iterator = new \DirectoryIterator($src); |
|
| 150 | + foreach ($iterator as $fObj) { |
|
| 151 | + if ($fObj->isFile()) { |
|
| 152 | + $filename = $fObj->getPathname(); |
|
| 153 | + $fObj = null; // clear this iterator object to close the file |
|
| 154 | + if (!unlink($filename)) { |
|
| 155 | + return false; // couldn't delete the file |
|
| 156 | + } |
|
| 157 | + } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 158 | + // Try recursively on directory |
|
| 159 | + self::rrmdir($fObj->getPathname()); |
|
| 160 | + } |
|
| 161 | + } |
|
| 162 | + $iterator = null; // clear iterator Obj to close file/directory |
|
| 163 | + return rmdir($src); // remove the directory & return results |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + /** |
|
| 167 | + * Recursively move files from one directory to another |
|
| 168 | + * |
|
| 169 | + * @param string $src - Source of files being moved |
|
| 170 | + * @param string $dest - Destination of files being moved |
|
| 171 | + * |
|
| 172 | + * @return bool true on success |
|
| 173 | + */ |
|
| 174 | + public static function rmove($src, $dest) |
|
| 175 | + { |
|
| 176 | + // Only continue if user is a 'global' Admin |
|
| 177 | + if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 178 | + return false; |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + // If source is not a directory stop processing |
|
| 182 | + if (!is_dir($src)) { |
|
| 183 | + return false; |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + // If the destination directory does not exist and could not be created stop processing |
|
| 187 | + if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) { |
|
| 188 | + return false; |
|
| 189 | + } |
|
| 190 | + |
|
| 191 | + // Open the source directory to read in files |
|
| 192 | + $iterator = new \DirectoryIterator($src); |
|
| 193 | + foreach ($iterator as $fObj) { |
|
| 194 | + if ($fObj->isFile()) { |
|
| 195 | + rename($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 196 | + } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 197 | + // Try recursively on directory |
|
| 198 | + self::rmove($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 199 | + // rmdir($fObj->getPath()); // now delete the directory |
|
| 200 | + } |
|
| 201 | + } |
|
| 202 | + $iterator = null; // clear iterator Obj to close file/directory |
|
| 203 | + return rmdir($src); // remove the directory & return results |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + /** |
|
| 207 | + * Recursively copy directories and files from one directory to another |
|
| 208 | + * |
|
| 209 | + * @param string $src - Source of files being moved |
|
| 210 | + * @param string $dest - Destination of files being moved |
|
| 211 | + * |
|
| 212 | + * @uses \Xmf\Module\Helper::getHelper() |
|
| 213 | + * @uses \Xmf\Module\Helper::isUserAdmin() |
|
| 214 | + * |
|
| 215 | + * @return bool true on success |
|
| 216 | + */ |
|
| 217 | + public static function rcopy($src, $dest) |
|
| 218 | + { |
|
| 219 | + // Only continue if user is a 'global' Admin |
|
| 220 | + if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) { |
|
| 221 | + return false; |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + // If source is not a directory stop processing |
|
| 225 | + if (!is_dir($src)) { |
|
| 226 | + return false; |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + // If the destination directory does not exist and could not be created stop processing |
|
| 230 | + if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) { |
|
| 231 | + return false; |
|
| 232 | + } |
|
| 233 | + |
|
| 234 | + // Open the source directory to read in files |
|
| 235 | + $iterator = new \DirectoryIterator($src); |
|
| 236 | + foreach ($iterator as $fObj) { |
|
| 237 | + if ($fObj->isFile()) { |
|
| 238 | + copy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 239 | + } elseif (!$fObj->isDot() && $fObj->isDir()) { |
|
| 240 | + self::rcopy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename()); |
|
| 241 | + } |
|
| 242 | + } |
|
| 243 | + return true; |
|
| 244 | + } |
|
| 245 | 245 | } |