| 1: | <?php | 
| 2: |  | 
| 3: |  | 
| 4: |  | 
| 5: |  | 
| 6: |  | 
| 7: |  | 
| 8: |  | 
| 9: |  | 
| 10: |  | 
| 11: |  | 
| 12: |  | 
| 13: |  | 
| 14: |  | 
| 15: |  | 
| 16: |  | 
| 17: |  | 
| 18: |  | 
| 19: |  | 
| 20: | defined('XOOPS_ROOT_PATH') || exit('Restricted access'); | 
| 21: |  | 
| 22: | $GLOBALS['xoopsLogger']->addDeprecated("'/class/xoopstopic.php' is deprecated since XOOPS 2.5.4, please create your own class instead."); | 
| 23: |  | 
| 24: | include_once XOOPS_ROOT_PATH . '/class/xoopstree.php'; | 
| 25: |  | 
| 26: |  | 
| 27: |  | 
| 28: |  | 
| 29: | class XoopsTopic | 
| 30: | { | 
| 31: |  | 
| 32: |  | 
| 33: |  | 
| 34: | public $db; | 
| 35: | public $table; | 
| 36: | public $topic_id; | 
| 37: | public $topic_pid; | 
| 38: | public $topic_title; | 
| 39: | public $topic_imgurl; | 
| 40: | public $prefix; | 
| 41: | public $use_permission = false; | 
| 42: | public $mid; | 
| 43: |  | 
| 44: |  | 
| 45: |  | 
| 46: |  | 
| 47: |  | 
| 48: | public function __construct($table, $topicid = 0) | 
| 49: | { | 
| 50: | $this->db    = XoopsDatabaseFactory::getDatabaseConnection(); | 
| 51: | $this->table = $table; | 
| 52: | if (is_array($topicid)) { | 
| 53: | $this->makeTopic($topicid); | 
| 54: | } elseif ($topicid != 0) { | 
| 55: | $this->getTopic((int)$topicid); | 
| 56: | } else { | 
| 57: | $this->topic_id = $topicid; | 
| 58: | } | 
| 59: | } | 
| 60: |  | 
| 61: |  | 
| 62: |  | 
| 63: |  | 
| 64: | public function setTopicTitle($value) | 
| 65: | { | 
| 66: | $this->topic_title = $value; | 
| 67: | } | 
| 68: |  | 
| 69: |  | 
| 70: |  | 
| 71: |  | 
| 72: | public function setTopicImgurl($value) | 
| 73: | { | 
| 74: | $this->topic_imgurl = $value; | 
| 75: | } | 
| 76: |  | 
| 77: |  | 
| 78: |  | 
| 79: |  | 
| 80: | public function setTopicPid($value) | 
| 81: | { | 
| 82: | $this->topic_pid = $value; | 
| 83: | } | 
| 84: |  | 
| 85: |  | 
| 86: |  | 
| 87: |  | 
| 88: | public function getTopic($topicid) | 
| 89: | { | 
| 90: | $topicid = (int)$topicid; | 
| 91: | $sql     = 'SELECT * FROM ' . $this->table . ' WHERE topic_id=' . $topicid . ''; | 
| 92: | $result = $this->db->query($sql); | 
| 93: | if (!$this->db->isResultSet($result)) { | 
| 94: | throw new \RuntimeException( | 
| 95: | \sprintf(_DB_QUERY_ERROR, $sql) . $this->db->error(), E_USER_ERROR | 
| 96: | ); | 
| 97: | } | 
| 98: | $array   = $this->db->fetchArray($result); | 
| 99: | $this->makeTopic($array); | 
| 100: | } | 
| 101: |  | 
| 102: |  | 
| 103: |  | 
| 104: |  | 
| 105: | public function makeTopic($array) | 
| 106: | { | 
| 107: | foreach ($array as $key => $value) { | 
| 108: | $this->$key = $value; | 
| 109: | } | 
| 110: | } | 
| 111: |  | 
| 112: |  | 
| 113: |  | 
| 114: |  | 
| 115: | public function usePermission($mid) | 
| 116: | { | 
| 117: | $this->mid            = $mid; | 
| 118: | $this->use_permission = true; | 
| 119: | } | 
| 120: |  | 
| 121: |  | 
| 122: |  | 
| 123: |  | 
| 124: | public function store() | 
| 125: | { | 
| 126: | $myts   = \MyTextSanitizer::getInstance(); | 
| 127: | $title  = ''; | 
| 128: | $imgurl = ''; | 
| 129: | if (isset($this->topic_title) && $this->topic_title != '') { | 
| 130: | $title = $myts->addSlashes($this->topic_title); | 
| 131: | } | 
| 132: | if (isset($this->topic_imgurl) && $this->topic_imgurl != '') { | 
| 133: | $imgurl = $myts->addSlashes($this->topic_imgurl); | 
| 134: | } | 
| 135: | if (!isset($this->topic_pid) || !is_numeric($this->topic_pid)) { | 
| 136: | $this->topic_pid = 0; | 
| 137: | } | 
| 138: | if (empty($this->topic_id)) { | 
| 139: | $this->topic_id = $this->db->genId($this->table . '_topic_id_seq'); | 
| 140: | $sql            = sprintf("INSERT INTO %s (topic_id, topic_pid, topic_imgurl, topic_title) VALUES (%u, %u, '%s', '%s')", $this->table, $this->topic_id, $this->topic_pid, $imgurl, $title); | 
| 141: | } else { | 
| 142: | $sql = sprintf("UPDATE %s SET topic_pid = %u, topic_imgurl = '%s', topic_title = '%s' WHERE topic_id = %u", $this->table, $this->topic_pid, $imgurl, $title, $this->topic_id); | 
| 143: | } | 
| 144: | if (!$result = $this->db->query($sql)) { | 
| 145: | ErrorHandler::show('0022'); | 
| 146: | } | 
| 147: | if ($this->use_permission == true) { | 
| 148: | if (empty($this->topic_id)) { | 
| 149: | $this->topic_id = $this->db->getInsertId(); | 
| 150: | } | 
| 151: | $xt            = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 152: | $parent_topics = $xt->getAllParentId($this->topic_id); | 
| 153: | if (!empty($this->m_groups) && \is_array($this->m_groups)) { | 
| 154: | foreach ($this->m_groups as $m_g) { | 
| 155: | $moderate_topics = XoopsPerms::getPermitted($this->mid, 'ModInTopic', $m_g); | 
| 156: | $add             = true; | 
| 157: |  | 
| 158: | foreach ($parent_topics as $p_topic) { | 
| 159: | if (!in_array($p_topic, $moderate_topics)) { | 
| 160: | $add = false; | 
| 161: | continue; | 
| 162: | } | 
| 163: | } | 
| 164: | if ($add == true) { | 
| 165: | $xp = new XoopsPerms(); | 
| 166: | $xp->setModuleId($this->mid); | 
| 167: | $xp->setName('ModInTopic'); | 
| 168: | $xp->setItemId($this->topic_id); | 
| 169: | $xp->store(); | 
| 170: | $xp->addGroup($m_g); | 
| 171: | } | 
| 172: | } | 
| 173: | } | 
| 174: | if (!empty($this->s_groups) && \is_array($this->s_groups)) { | 
| 175: | foreach ($s_groups as $s_g) { | 
| 176: | $submit_topics = XoopsPerms::getPermitted($this->mid, 'SubmitInTopic', $s_g); | 
| 177: | $add           = true; | 
| 178: | foreach ($parent_topics as $p_topic) { | 
| 179: | if (!in_array($p_topic, $submit_topics)) { | 
| 180: | $add = false; | 
| 181: | continue; | 
| 182: | } | 
| 183: | } | 
| 184: | if ($add == true) { | 
| 185: | $xp = new XoopsPerms(); | 
| 186: | $xp->setModuleId($this->mid); | 
| 187: | $xp->setName('SubmitInTopic'); | 
| 188: | $xp->setItemId($this->topic_id); | 
| 189: | $xp->store(); | 
| 190: | $xp->addGroup($s_g); | 
| 191: | } | 
| 192: | } | 
| 193: | } | 
| 194: | if (!empty($this->r_groups) && \is_array($this->r_groups)) { | 
| 195: | foreach ($r_groups as $r_g) { | 
| 196: | $read_topics = XoopsPerms::getPermitted($this->mid, 'ReadInTopic', $r_g); | 
| 197: | $add         = true; | 
| 198: | foreach ($parent_topics as $p_topic) { | 
| 199: | if (!in_array($p_topic, $read_topics)) { | 
| 200: | $add = false; | 
| 201: | continue; | 
| 202: | } | 
| 203: | } | 
| 204: | if ($add == true) { | 
| 205: | $xp = new XoopsPerms(); | 
| 206: | $xp->setModuleId($this->mid); | 
| 207: | $xp->setName('ReadInTopic'); | 
| 208: | $xp->setItemId($this->topic_id); | 
| 209: | $xp->store(); | 
| 210: | $xp->addGroup($r_g); | 
| 211: | } | 
| 212: | } | 
| 213: | } | 
| 214: | } | 
| 215: |  | 
| 216: | return true; | 
| 217: | } | 
| 218: |  | 
| 219: | public function delete() | 
| 220: | { | 
| 221: | $sql = sprintf('DELETE FROM %s WHERE topic_id = %u', $this->table, $this->topic_id); | 
| 222: | $this->db->query($sql); | 
| 223: | } | 
| 224: |  | 
| 225: |  | 
| 226: |  | 
| 227: |  | 
| 228: | public function topic_id() | 
| 229: | { | 
| 230: | return $this->topic_id; | 
| 231: | } | 
| 232: |  | 
| 233: | public function topic_pid() | 
| 234: | { | 
| 235: | return $this->topic_pid; | 
| 236: | } | 
| 237: |  | 
| 238: |  | 
| 239: |  | 
| 240: |  | 
| 241: |  | 
| 242: |  | 
| 243: | public function topic_title($format = 'S') | 
| 244: | { | 
| 245: | $myts = \MyTextSanitizer::getInstance(); | 
| 246: | switch ($format) { | 
| 247: | case 'S': | 
| 248: | case 'E': | 
| 249: | $title = $myts->htmlSpecialChars($this->topic_title); | 
| 250: | break; | 
| 251: | case 'P': | 
| 252: | case 'F': | 
| 253: | $title = $myts->htmlSpecialChars($myts->stripSlashesGPC($this->topic_title)); | 
| 254: | break; | 
| 255: | } | 
| 256: |  | 
| 257: | return $title; | 
| 258: | } | 
| 259: |  | 
| 260: |  | 
| 261: |  | 
| 262: |  | 
| 263: |  | 
| 264: |  | 
| 265: | public function topic_imgurl($format = 'S') | 
| 266: | { | 
| 267: | $myts = \MyTextSanitizer::getInstance(); | 
| 268: | switch ($format) { | 
| 269: | case 'S': | 
| 270: | case 'E': | 
| 271: | $imgurl = $myts->htmlSpecialChars($this->topic_imgurl); | 
| 272: | break; | 
| 273: | case 'P': | 
| 274: | case 'F': | 
| 275: | $imgurl = $myts->htmlSpecialChars($myts->stripSlashesGPC($this->topic_imgurl)); | 
| 276: | break; | 
| 277: | } | 
| 278: |  | 
| 279: | return $imgurl; | 
| 280: | } | 
| 281: |  | 
| 282: | public function prefix() | 
| 283: | { | 
| 284: | if (isset($this->prefix)) { | 
| 285: | return $this->prefix; | 
| 286: | } | 
| 287: | return null; | 
| 288: | } | 
| 289: |  | 
| 290: |  | 
| 291: |  | 
| 292: |  | 
| 293: | public function getFirstChildTopics() | 
| 294: | { | 
| 295: | $ret       = array(); | 
| 296: | $xt        = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 297: | $topic_arr = $xt->getFirstChild($this->topic_id, 'topic_title'); | 
| 298: | if (!empty($topic_arr) && \is_array($topic_arr)) { | 
| 299: | foreach ($topic_arr as $topic) { | 
| 300: | $ret[] = new XoopsTopic($this->table, $topic); | 
| 301: | } | 
| 302: | } | 
| 303: |  | 
| 304: | return $ret; | 
| 305: | } | 
| 306: |  | 
| 307: |  | 
| 308: |  | 
| 309: |  | 
| 310: | public function getAllChildTopics() | 
| 311: | { | 
| 312: | $ret       = array(); | 
| 313: | $xt        = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 314: | $topic_arr = $xt->getAllChild($this->topic_id, 'topic_title'); | 
| 315: | if (!empty($topic_arr) && \is_array($topic_arr)) { | 
| 316: | foreach ($topic_arr as $topic) { | 
| 317: | $ret[] = new XoopsTopic($this->table, $topic); | 
| 318: | } | 
| 319: | } | 
| 320: |  | 
| 321: | return $ret; | 
| 322: | } | 
| 323: |  | 
| 324: |  | 
| 325: |  | 
| 326: |  | 
| 327: | public function getChildTopicsTreeArray() | 
| 328: | { | 
| 329: | $ret       = array(); | 
| 330: | $xt        = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 331: | $topic_arr = $xt->getChildTreeArray($this->topic_id, 'topic_title'); | 
| 332: | if (!empty($topic_arr) && \is_array($topic_arr)) { | 
| 333: | foreach ($topic_arr as $topic) { | 
| 334: | $ret[] = new XoopsTopic($this->table, $topic); | 
| 335: | } | 
| 336: | } | 
| 337: |  | 
| 338: | return $ret; | 
| 339: | } | 
| 340: |  | 
| 341: |  | 
| 342: |  | 
| 343: |  | 
| 344: |  | 
| 345: |  | 
| 346: |  | 
| 347: | public function makeTopicSelBox($none = 0, $seltopic = -1, $selname = '', $onchange = '') | 
| 348: | { | 
| 349: | $xt = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 350: | if ($seltopic != -1) { | 
| 351: | $xt->makeMySelBox('topic_title', 'topic_title', $seltopic, $none, $selname, $onchange); | 
| 352: | } elseif (!empty($this->topic_id)) { | 
| 353: | $xt->makeMySelBox('topic_title', 'topic_title', $this->topic_id, $none, $selname, $onchange); | 
| 354: | } else { | 
| 355: | $xt->makeMySelBox('topic_title', 'topic_title', 0, $none, $selname, $onchange); | 
| 356: | } | 
| 357: | } | 
| 358: |  | 
| 359: |  | 
| 360: |  | 
| 361: |  | 
| 362: |  | 
| 363: |  | 
| 364: |  | 
| 365: | public function getNiceTopicPathFromId($funcURL) | 
| 366: | { | 
| 367: | $xt  = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 368: | $ret = $xt->getNicePathFromId($this->topic_id, 'topic_title', $funcURL); | 
| 369: |  | 
| 370: | return $ret; | 
| 371: | } | 
| 372: |  | 
| 373: |  | 
| 374: |  | 
| 375: |  | 
| 376: | public function getAllChildTopicsId() | 
| 377: | { | 
| 378: | $xt  = new XoopsTree($this->table, 'topic_id', 'topic_pid'); | 
| 379: | $ret = $xt->getAllChildId($this->topic_id, 'topic_title'); | 
| 380: |  | 
| 381: | return $ret; | 
| 382: | } | 
| 383: |  | 
| 384: |  | 
| 385: |  | 
| 386: |  | 
| 387: | public function getTopicsList() | 
| 388: | { | 
| 389: | $sql = 'SELECT topic_id, topic_pid, topic_title FROM ' . $this->table; | 
| 390: | $result = $this->db->query($sql); | 
| 391: | if (!$this->db->isResultSet($result)) { | 
| 392: | throw new \RuntimeException( | 
| 393: | \sprintf(_DB_QUERY_ERROR, $sql) . $this->db->error(), E_USER_ERROR | 
| 394: | ); | 
| 395: | } | 
| 396: | $ret    = array(); | 
| 397: | $myts   = \MyTextSanitizer::getInstance(); | 
| 398: | while (false !== ($myrow = $this->db->fetchArray($result))) { | 
| 399: | $ret[$myrow['topic_id']] = array('title' => $myts->htmlSpecialChars($myrow['topic_title']), 'pid' => $myrow['topic_pid']); | 
| 400: | } | 
| 401: |  | 
| 402: | return $ret; | 
| 403: | } | 
| 404: |  | 
| 405: |  | 
| 406: |  | 
| 407: |  | 
| 408: |  | 
| 409: |  | 
| 410: |  | 
| 411: | public function topicExists($pid, $title) | 
| 412: | { | 
| 413: | $sql = 'SELECT COUNT(*) from ' . $this->table . ' WHERE topic_pid = ' . (int)$pid . " AND topic_title = '" . trim($title) . "'"; | 
| 414: | $result  = $this->db->query($sql); | 
| 415: | if (!$this->db->isResultSet($result)) { | 
| 416: | throw new \RuntimeException( | 
| 417: | \sprintf(_DB_QUERY_ERROR, $sql) . $this->db->error(), E_USER_ERROR | 
| 418: | ); | 
| 419: | } | 
| 420: | list($count) = $this->db->fetchRow($result); | 
| 421: | if ($count > 0) { | 
| 422: | return true; | 
| 423: | } else { | 
| 424: | return false; | 
| 425: | } | 
| 426: | } | 
| 427: | } | 
| 428: |  |