123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: model_forum_thread.php 34684 2014-07-07 07:27:56Z nemohou $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class model_forum_thread extends discuz_model
- {
- public $forum;
- public $thread;
- public $post;
- public $tid;
- public $pid;
- public $feed = array();
- public function __construct($fid = null) {
- parent::__construct();
- if($fid) {
- include_once libfile('function/forum');
- loadforum($fid);
- }
- $this->forum = &$this->app->var['forum'];
- }
- public function newthread($parameters) {
- require_once libfile('function/post');
- $this->tid = $this->pid = 0;
- $this->_init_parameters($parameters);
- if(trim($this->param['subject']) == '') {
- return $this->showmessage('post_sm_isnull');
- }
- if(!$this->param['sortid'] && !$this->param['special'] && trim($this->param['message']) == '') {
- return $this->showmessage('post_sm_isnull');
- }
- list($this->param['modnewthreads'], $this->param['modnewreplies']) = threadmodstatus($this->param['subject']."\t".$this->param['message'].$this->param['extramessage']);
- if(($post_invalid = checkpost($this->param['subject'], $this->param['message'], ($this->param['special'] || $this->param['sortid'])))) {
- return $this->showmessage($post_invalid, '', array('minpostsize' => $this->setting['minpostsize'], 'maxpostsize' => $this->setting['maxpostsize']));
- }
- if(checkflood()) {
- return $this->showmessage('post_flood_ctrl', '', array('floodctrl' => $this->setting['floodctrl']));
- } elseif(checkmaxperhour('tid')) {
- return $this->showmessage('thread_flood_ctrl_threads_per_hour', '', array('threads_per_hour' => $this->group['maxthreadsperhour']));
- }
- $this->param['save'] = $this->member['uid'] ? $this->param['save'] : 0;
- $this->param['typeid'] = isset($this->param['typeid']) && isset($this->forum['threadtypes']['types'][$this->param['typeid']]) && (!$this->forum['threadtypes']['moderators'][$this->param['typeid']] || $this->forum['ismoderator']) ? $this->param['typeid'] : 0;
- $this->param['displayorder'] = $this->param['modnewthreads'] ? -2 : (($this->forum['ismoderator'] && $this->group['allowstickthread'] && !empty($this->param['sticktopic'])) ? 1 : (empty($this->param['save']) ? 0 : -4));
- if($this->param['displayorder'] == -2) {
- C::t('forum_forum')->update($this->forum['fid'], array('modworks' => '1'));
- }
- $this->param['digest'] = $this->forum['ismoderator'] && $this->group['allowdigestthread'] && !empty($this->param['digest']) ? 1 : 0;
- $this->param['readperm'] = $this->group['allowsetreadperm'] ? $this->param['readperm'] : 0;
- $this->param['isanonymous'] = $this->group['allowanonymous'] && $this->param['isanonymous'] ? 1 : 0;
- $this->param['price'] = intval($this->param['price']);
- if(!$this->param['special']) {
- $this->param['price'] = $this->group['maxprice'] ? ($this->param['price'] <= $this->group['maxprice'] ? $this->param['price'] : $this->group['maxprice']) : 0;
- }
- if(!$this->param['typeid'] && $this->forum['threadtypes']['required'] && !$this->param['special']) {
- return $this->showmessage('post_type_isnull');
- }
- if(!$this->param['sortid'] && $this->forum['threadsorts']['required'] && !$this->param['special']) {
- return $this->showmessage('post_sort_isnull');
- }
- if(!$this->param['special'] && $this->param['price'] > 0 && floor($this->param['price'] * (1 - $this->setting['creditstax'])) == 0) {
- return $this->showmessage('post_net_price_iszero');
- }
- $this->param['sortid'] = $this->param['special'] && $this->forum['threadsorts']['types'][$this->param['sortid']] ? 0 : $this->param['sortid'];
- $this->param['typeexpiration'] = intval($this->param['typeexpiration']);
- if($this->forum['threadsorts']['expiration'][$this->param['typeid']] && !$this->param['typeexpiration']) {
- return $this->showmessage('threadtype_expiration_invalid');
- }
- $author = !$this->param['isanonymous'] ? $this->member['username'] : '';
- $this->param['moderated'] = $this->param['digest'] || $this->param['displayorder'] > 0 ? 1 : 0;
- $this->param['ordertype'] && $this->param['tstatus'] = setstatus(4, 1, $this->param['tstatus']);
- $this->param['imgcontent'] && $this->param['tstatus'] = setstatus(15, $this->param['imgcontent'], $this->param['tstatus']);
- $this->param['hiddenreplies'] && $this->param['tstatus'] = setstatus(2, 1, $this->param['tstatus']);
- $this->param['allownoticeauthor'] && $this->param['tstatus'] = setstatus(6, 1, $this->param['tstatus']);
- $this->param['isgroup'] = $this->forum['status'] == 3 ? 1 : 0;
- $this->param['publishdate'] = !$this->param['modnewthreads'] ? $this->param['publishdate'] : TIMESTAMP;
- $newthread = array(
- 'fid' => $this->forum['fid'],
- 'posttableid' => 0,
- 'readperm' => $this->param['readperm'],
- 'price' => $this->param['price'],
- 'typeid' => $this->param['typeid'],
- 'sortid' => $this->param['sortid'],
- 'author' => $author,
- 'authorid' => $this->member['uid'],
- 'subject' => $this->param['subject'],
- 'dateline' => $this->param['publishdate'],
- 'lastpost' => $this->param['publishdate'],
- 'lastposter' => $author,
- 'displayorder' => $this->param['displayorder'],
- 'digest' => $this->param['digest'],
- 'special' => $this->param['special'],
- 'attachment' => 0,
- 'moderated' => $this->param['moderated'],
- 'status' => $this->param['tstatus'],
- 'isgroup' => $this->param['isgroup'],
- 'replycredit' => $this->param['replycredit'],
- 'closed' => $this->param['closed'] ? 1 : 0
- );
- $this->tid = C::t('forum_thread')->insert($newthread, true);
- C::t('forum_newthread')->insert(array(
- 'tid' => $this->tid,
- 'fid' => $this->forum['fid'],
- 'dateline' => $this->param['publishdate'],
- ));
- useractionlog($this->member['uid'], 'tid');
- if(!getuserprofile('threads') && $this->setting['newbie']) {
- C::t('forum_thread')->update($this->tid, array('icon' => $this->setting['newbie']));
- }
- if ($this->param['publishdate'] != TIMESTAMP) {
- $cron_publish_ids = dunserialize($this->cache('cronpublish'));
- $cron_publish_ids[$this->tid] = $this->tid;
- $cron_publish_ids = serialize($cron_publish_ids);
- savecache('cronpublish', $cron_publish_ids);
- }
- if(!$this->param['isanonymous']) {
- C::t('common_member_field_home')->update($this->member['uid'], array('recentnote'=>$this->param['subject']));
- }
- if($this->param['moderated']) {
- updatemodlog($this->tid, ($this->param['displayorder'] > 0 ? 'STK' : 'DIG'));
- updatemodworks(($this->param['displayorder'] > 0 ? 'STK' : 'DIG'), 1);
- }
- $this->param['bbcodeoff'] = checkbbcodes($this->param['message'], !empty($this->param['bbcodeoff']));
- $this->param['smileyoff'] = checksmilies($this->param['message'], !empty($this->param['smileyoff']));
- $this->param['parseurloff'] = !empty($this->param['parseurloff']);
- $this->param['htmlon'] = $this->group['allowhtml'] && !empty($this->param['htmlon']) ? 1 : 0;
- $this->param['usesig'] = !empty($this->param['usesig']) && $this->group['maxsigsize'] ? 1 : 0;
- $class_tag = new tag();
- $this->param['tagstr'] = $class_tag->add_tag($this->param['tags'], $this->tid, 'tid');
- $this->param['pinvisible'] = $this->param['modnewthreads'] ? -2 : (empty($this->param['save']) ? 0 : -3);
- $this->param['message'] = preg_replace('/\[attachimg\](\d+)\[\/attachimg\]/is', '[attach]\1[/attach]', $this->param['message']);
- $this->param['pstatus'] = intval($this->param['pstatus']);
- defined('IN_MOBILE') && $this->param['pstatus'] = setstatus(4, 1, $this->param['pstatus']);
- if($this->param['imgcontent']) {
- stringtopic($this->param['message'], $this->tid, true, $this->param['imgcontentwidth']);
- }
- $this->pid = insertpost(array(
- 'fid' => $this->forum['fid'],
- 'tid' => $this->tid,
- 'first' => '1',
- 'author' => $this->member['username'],
- 'authorid' => $this->member['uid'],
- 'subject' => $this->param['subject'],
- 'dateline' => $this->param['publishdate'],
- 'message' => $this->param['message'],
- 'useip' => $this->param['clientip'] ? $this->param['clientip'] : getglobal('clientip'),
- 'port' => $this->param['remoteport'] ? $this->param['remoteport'] : getglobal('remoteport'),
- 'invisible' => $this->param['pinvisible'],
- 'anonymous' => $this->param['isanonymous'],
- 'usesig' => $this->param['usesig'],
- 'htmlon' => $this->param['htmlon'],
- 'bbcodeoff' => $this->param['bbcodeoff'],
- 'smileyoff' => $this->param['smileyoff'],
- 'parseurloff' => $this->param['parseurloff'],
- 'attachment' => '0',
- 'tags' => $this->param['tagstr'],
- 'replycredit' => 0,
- 'status' => $this->param['pstatus']
- ));
- $statarr = array(0 => 'thread', 1 => 'poll', 2 => 'trade', 3 => 'reward', 4 => 'activity', 5 => 'debate', 127 => 'thread');
- include_once libfile('function/stat');
- updatestat($this->param['isgroup'] ? 'groupthread' : $statarr[$this->param['special']]);
- if($this->param['geoloc'] && IN_MOBILE == 2) {
- list($mapx, $mapy, $location) = explode('|', $this->param['geoloc']);
- if($mapx && $mapy && $location) {
- C::t('forum_post_location')->insert(array(
- 'pid' => $this->pid,
- 'tid' => $this->tid,
- 'uid' => $this->member['uid'],
- 'mapx' => $mapx,
- 'mapy' => $mapy,
- 'location' => $location,
- ));
- }
- }
- if($this->param['modnewthreads']) {
- updatemoderate('tid', $this->tid);
- C::t('forum_forum')->update_forum_counter($this->forum['fid'], 0, 0, 1);
- manage_addnotify('verifythread');
- return 'post_newthread_mod_succeed';
- } else {
- if($this->param['displayorder'] != -4) {
- if($this->param['digest']) {
- updatepostcredits('+', $this->member['uid'], 'digest', $this->forum['fid']);
- }
- updatepostcredits('+', $this->member['uid'], 'post', $this->forum['fid']);
- if($this->param['isgroup']) {
- C::t('forum_groupuser')->update_counter_for_user($this->member['uid'], $this->forum['fid'], 1);
- }
- $subject = str_replace("\t", ' ', $this->param['subject']);
- $lastpost = "$this->tid\t".$subject."\t".TIMESTAMP."\t$author";
- C::t('forum_forum')->update($this->forum['fid'], array('lastpost' => $lastpost));
- C::t('forum_forum')->update_forum_counter($this->forum['fid'], 1, 1, 1);
- if($this->forum['type'] == 'sub') {
- C::t('forum_forum')->update($this->forum['fup'], array('lastpost' => $lastpost));
- }
- }
- if($this->param['isgroup']) {
- C::t('forum_forumfield')->update($this->forum['fid'], array('lastupdate' => TIMESTAMP));
- require_once libfile('function/grouplog');
- updategroupcreditlog($this->forum['fid'], $this->member['uid']);
- }
- C::t('forum_sofa')->insert(array('tid' => $this->tid,'fid' => $this->forum['fid']));
- return 'post_newthread_succeed';
- }
- }
- public function feed() {
- if($this->forum('allowfeed') && !$this->param['isanonymous']) {
- if(empty($this->feed)) {
- $this->feed = array(
- 'icon' => '',
- 'title_template' => '',
- 'title_data' => array(),
- 'body_template' => '',
- 'body_data' => array(),
- 'title_data' => array(),
- 'images' => array()
- );
- $message = !$this->param['price'] && !$this->param['readperm'] ? $this->param['message'] : '';
- $message = messagesafeclear($message);
- $this->feed['icon'] = 'thread';
- $this->feed['title_template'] = 'feed_thread_title';
- $this->feed['body_template'] = 'feed_thread_message';
- $this->feed['body_data'] = array(
- 'subject' => "<a href=\"forum.php?mod=viewthread&tid={$this->tid}\">{$this->param['subject']}</a>",
- 'message' => messagecutstr($message, 150)
- );
- if(getglobal('forum_attachexist')) {// $firstaid = DB::result_first("SELECT aid FROM ".DB::table(getattachtablebytid($tid))." WHERE pid='$pid' AND dateline>'0' AND isimage='1' ORDER BY dateline LIMIT 1");
- $imgattach = C::t('forum_attachment_n')->fetch_max_image('tid:'.$this->tid, 'pid', $this->pid);
- $firstaid = $imgattach['aid'];
- unset($imgattach);
- if($firstaid) {
- $this->feed['images'] = array(getforumimg($firstaid));
- $this->feed['image_links'] = array("forum.php?mod=viewthread&do=tradeinfo&tid={$this->tid}&pid={$this->pid}");
- }
- }
- }
- $this->feed['title_data']['hash_data'] = 'tid'.$this->tid;
- $this->feed['id'] = $this->tid;
- $this->feed['idtype'] = 'tid';
- if($this->feed['icon']) {
- postfeed($this->feed);
- }
- }
- }
- protected function _init_parameters($parameters){
- $varname = array(
- 'member', 'group', 'forum', 'extramessage',
- 'subject', 'sticktopic', 'save', 'ordertype', 'hiddenreplies',
- 'allownoticeauthor', 'readperm', 'price', 'typeid', 'sortid',
- 'publishdate', 'digest', 'moderated', 'tstatus', 'isgroup', 'imgcontent', 'imgcontentwidth',
- 'replycredit', 'closed', 'special', 'tags',
- 'message','clientip', 'invisible', 'isanonymous', 'usesig',
- 'htmlon', 'bbcodeoff', 'smileyoff', 'parseurloff', 'pstatus', 'geoloc',
- );
- foreach($varname as $name) {
- if(!isset($this->param[$name]) && isset($parameters[$name])) {
- $this->param[$name] = $parameters[$name];
- }
- }
- }
- public function forum($name = null, $val = null) {
- if(isset($val)) {
- return $this->setvar($this->forum, $name, $val);
- } else {
- return $this->getvar($this->forum, $name);
- }
- }
- }
- ?>
|