block_member.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: block_member.php 32370 2013-01-07 03:00:27Z zhangguosheng $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class block_member extends discuz_block {
  12. var $setting = array();
  13. function block_member() {
  14. $this->setting = array(
  15. 'uids' => array(
  16. 'title' => 'memberlist_uids',
  17. 'type' => 'text'
  18. ),
  19. 'groupid' => array(
  20. 'title' => 'memberlist_groupid',
  21. 'type' => 'mselect',
  22. 'value' => array()
  23. ),
  24. 'special' => array(
  25. 'title' => 'memberlist_special',
  26. 'type' => 'mradio',
  27. 'value' => array(
  28. array('', 'memberlist_special_nolimit'),
  29. array('0', 'memberlist_special_hot'),
  30. array('1', 'memberlist_special_default'),
  31. ),
  32. 'default' => ''
  33. ),
  34. 'gender' => array(
  35. 'title' => 'memberlist_gender',
  36. 'type' => 'mradio',
  37. 'value' => array(
  38. array('1', 'memberlist_gender_male'),
  39. array('2', 'memberlist_gender_female'),
  40. array('', 'memberlist_gender_nolimit'),
  41. ),
  42. 'default' => ''
  43. ),
  44. 'birthcity' => array(
  45. 'title' => 'memberlist_birthcity',
  46. 'type' => 'district',
  47. 'value' => array('xbirthprovince', 'xbirthcity', 'xbirthdist', 'xbirthcommunity'),
  48. ),
  49. 'residecity' => array(
  50. 'title' => 'memberlist_residecity',
  51. 'type' => 'district',
  52. 'value' => array('xresideprovince', 'xresidecity', 'xresidedist', 'xresidecommunity')
  53. ),
  54. 'avatarstatus' => array(
  55. 'title' => 'memberlist_avatarstatus',
  56. 'type' => 'radio',
  57. 'default' => ''
  58. ),
  59. 'emailstatus' => array(
  60. 'title' => 'memberlist_emailstatus',
  61. 'type' => 'mcheckbox',
  62. 'value' => array(
  63. array(1, 'memberlist_yes'),
  64. ),
  65. 'default' => ''
  66. ),
  67. 'verifystatus' => array(
  68. 'title' => 'memberlist_verifystatus',
  69. 'type' => 'mcheckbox',
  70. 'value' => array(),
  71. 'default' => '',
  72. ),
  73. 'orderby' => array(
  74. 'title' => 'memberlist_orderby',
  75. 'type' => 'mradio',
  76. 'value' => array(
  77. array('credits', 'memberlist_orderby_credits'),
  78. array('extcredits', 'memberlist_orderby_extcredits'),
  79. array('threads', 'memberlist_orderby_threads'),
  80. array('posts', 'memberlist_orderby_posts'),
  81. array('blogs', 'memberlist_orderby_blogs'),
  82. array('doings', 'memberlist_orderby_doings'),
  83. array('albums', 'memberlist_orderby_albums'),
  84. array('sharings', 'memberlist_orderby_sharings'),
  85. array('digestposts', 'memberlist_orderby_digestposts'),
  86. array('regdate', 'memberlist_orderby_regdate'),
  87. array('show', 'memberlist_orderby_show'),
  88. array('special', 'memberlist_orderby_special'),
  89. array('todayposts', 'memberlist_orderby_todayposts'),
  90. ),
  91. 'default' => 'credits'
  92. ),
  93. 'extcredit' => array(
  94. 'title' => 'memberlist_orderby_extcreditselect',
  95. 'type' => 'select',
  96. 'value' => array()
  97. ),
  98. 'lastpost' => array(
  99. 'title' => 'memberlist_lastpost',
  100. 'type' => 'mradio',
  101. 'value' => array(
  102. array('', 'memberlist_lastpost_nolimit'),
  103. array('3600', 'memberlist_lastpost_hour'),
  104. array('86400', 'memberlist_lastpost_day'),
  105. array('604800', 'memberlist_lastpost_week'),
  106. array('2592000', 'memberlist_lastpost_month'),
  107. ),
  108. 'default' => ''
  109. ),
  110. 'startrow' => array(
  111. 'title' => 'memberlist_startrow',
  112. 'type' => 'text',
  113. 'default' => 0
  114. ),
  115. );
  116. $verifys = getglobal('setting/verify');
  117. if(!empty($verifys)) {
  118. foreach($verifys as $key => $value) {
  119. if($value['title']) {
  120. $this->setting['verifystatus']['value'][] = array($key, $value['title']);
  121. }
  122. }
  123. }
  124. if(empty($this->setting['verifystatus']['value'])) {
  125. unset($this->setting['verifystatus']);
  126. }
  127. }
  128. function name() {
  129. return lang('blockclass', 'blockclass_member_script_member');
  130. }
  131. function blockclass() {
  132. return array('member', lang('blockclass', 'blockclass_member_member'));
  133. }
  134. function fields() {
  135. global $_G;
  136. $fields = array(
  137. 'id' => array('name' => lang('blockclass', 'blockclass_field_id'), 'formtype' => 'text', 'datatype' => 'int'),
  138. 'url' => array('name' => lang('blockclass', 'blockclass_member_field_url'), 'formtype' => 'text', 'datatype' => 'string'),
  139. 'title' => array('name' => lang('blockclass', 'blockclass_member_field_title'), 'formtype' => 'title', 'datatype' => 'title'),
  140. 'avatar' => array('name' => lang('blockclass', 'blockclass_member_field_avatar'), 'formtype' => 'text', 'datatype' => 'string'),
  141. 'avatar_middle' => array('name' => lang('blockclass', 'blockclass_member_field_avatar_middle'), 'formtype' => 'text', 'datatype' => 'string'),
  142. 'avatar_big' => array('name' => lang('blockclass', 'blockclass_member_field_avatar_big'), 'formtype' => 'text', 'datatype' => 'string'),
  143. 'regdate' => array('name' => lang('blockclass', 'blockclass_member_field_regdate'), 'formtype' => 'date', 'datatype' => 'date'),
  144. 'posts' => array('name' => lang('blockclass', 'blockclass_member_field_posts'), 'formtype' => 'text', 'datatype' => 'int'),
  145. 'threads' => array('name' => lang('blockclass', 'blockclass_member_field_threads'), 'formtype' => 'text', 'datatype' => 'int'),
  146. 'digestposts' => array('name' => lang('blockclass', 'blockclass_member_field_digestposts'), 'formtype' => 'text', 'datatype' => 'int'),
  147. 'credits' => array('name' => lang('blockclass', 'blockclass_member_field_credits'), 'formtype' => 'text', 'datatype' => 'int'),
  148. 'reason' => array('name' => lang('blockclass', 'blockclass_member_field_reason'), 'formtype' => 'text', 'datatype' => 'string'),
  149. 'unitprice' => array('name' => lang('blockclass', 'blockclass_member_field_unitprice'), 'formtype' => 'text', 'datatype' => 'int'),
  150. 'showcredit' => array('name' => lang('blockclass', 'blockclass_member_field_showcredit'), 'formtype' => 'text', 'datatype' => 'int'),
  151. 'shownote' => array('name' => lang('blockclass', 'blockclass_member_field_shownote'), 'formtype' => 'text', 'datatype' => 'string'),
  152. );
  153. foreach($_G['setting']['extcredits'] as $key=>$value) {
  154. $fields['extcredits'.$key] = array('name'=>$value['title'], 'formtype'=>'text', 'datatype'=>'int');
  155. }
  156. loadcache('profilesetting');
  157. foreach($_G['cache']['profilesetting'] as $key=>$value) {
  158. if($value['available']) {
  159. $fields[$key] = array('name'=>$value['title'], 'formtype'=>'text', 'datatype'=>'string');
  160. }
  161. }
  162. return $fields;
  163. }
  164. function getsetting() {
  165. global $_G;
  166. $settings = $this->setting;
  167. if($settings['extcredit']) {
  168. foreach($_G['setting']['extcredits'] as $id => $credit) {
  169. $settings['extcredit']['value'][] = array($id, $credit['title']);
  170. }
  171. }
  172. if($settings['groupid']) {
  173. $settings['groupid']['value'][] = array(0, lang('portalcp', 'block_all_group'));
  174. foreach(C::t('common_usergroup')->fetch_all_by_type(array('member', 'special')) as $value) {
  175. $settings['groupid']['value'][] = array($value['groupid'], $value['grouptitle']);
  176. }
  177. }
  178. return $settings;
  179. }
  180. function getdata($style, $parameter) {
  181. global $_G;
  182. $parameter = $this->cookparameter($parameter);
  183. $uids = !empty($parameter['uids']) ? explode(',',$parameter['uids']) : array();
  184. $groupid = !empty($parameter['groupid']) && !in_array(0, $parameter['groupid']) ? $parameter['groupid'] : array();
  185. $startrow = !empty($parameter['startrow']) ? intval($parameter['startrow']) : 0;
  186. $items = !empty($parameter['items']) ? intval($parameter['items']) : 10;
  187. $orderby = isset($parameter['orderby']) && in_array($parameter['orderby'],array('credits', 'extcredits', 'threads', 'posts', 'digestposts', 'regdate', 'show', 'blogs', 'albums', 'doings', 'sharings', 'special', 'todayposts')) ? $parameter['orderby'] : '';
  188. $special = isset($parameter['special']) && strlen($parameter['special']) ? intval($parameter['special']) : null;
  189. $lastpost = !empty($parameter['lastpost']) ? intval($parameter['lastpost']) : '';
  190. $avatarstatus = !empty($parameter['avatarstatus']) ? 1 : 0;
  191. $emailstatus = !empty($parameter['emailstatus']) ? 1 : 0;
  192. $verifystatus = !empty($parameter['verifystatus']) ? $parameter['verifystatus'] : array();
  193. $profiles = array();
  194. $profiles['gender'] = !empty($parameter['gender']) ? intval($parameter['gender']) : 0;
  195. $profiles['resideprovince'] = !empty($parameter['xresideprovince']) ? $parameter['xresideprovince'] : '';
  196. $profiles['residecity'] = !empty($parameter['xresidecity']) ? $parameter['xresidecity'] : '';
  197. $profiles['residedist'] = !empty($parameter['xresidedist']) ? $parameter['xresidedist'] : '';
  198. $profiles['residecommunity'] = !empty($parameter['xresidecommunity']) ? $parameter['xresidecommunity'] : '';
  199. $profiles['birthprovince'] = !empty($parameter['xbirthprovince']) ? $parameter['xbirthprovince'] : '';
  200. $profiles['birthcity'] = !empty($parameter['xbirthcity']) ? $parameter['xbirthcity'] : '';
  201. $bannedids = !empty($parameter['bannedids']) ? explode(',', $parameter['bannedids']) : array();
  202. $list = $todayuids = $todayposts = array();
  203. $tables = $wheres = array();
  204. $sqlorderby = '';
  205. $olditems = $items;
  206. $tables[] = DB::table('common_member').' m';
  207. if($groupid) {
  208. $wheres[] = 'm.groupid IN ('.dimplode($groupid).')';
  209. }
  210. if($bannedids) {
  211. $wheres[] = 'm.uid NOT IN ('.dimplode($bannedids).')';
  212. }
  213. if($avatarstatus) {
  214. $wheres[] = "m.avatarstatus='1'";
  215. }
  216. if($emailstatus) {
  217. $wheres[] = "m.emailstatus='1'";
  218. }
  219. if(!empty($verifystatus)) {
  220. $flag = false;
  221. foreach($verifystatus as $value) {
  222. if(isset($_G['setting']['verify'][$value])) {
  223. $flag = true;
  224. $wheres[] = "cmv.verify$value='1'";
  225. }
  226. }
  227. if($flag) {
  228. $tables[] = DB::table('common_member_verify').' cmv';
  229. $wheres[] = 'cmv.uid=m.uid';
  230. }
  231. }
  232. $tables[] = DB::table('common_member_count').' mc';
  233. $wheres[] = 'mc.uid=m.uid';
  234. foreach($profiles as $key=>$value) {
  235. if($value) {
  236. $tables[] = DB::table('common_member_profile').' mp';
  237. $wheres[] = 'mp.uid=m.uid';
  238. $wheres[] = "mp.$key='$value'";
  239. }
  240. }
  241. $reason = $show = '';
  242. if($special !== null) {
  243. $special = in_array($special, array(-1, 0, 1)) ? $special : -1;
  244. $tables[] = DB::table('home_specialuser').' su';
  245. if($special != -1) {
  246. $wheres[] = "su.status='$special'";
  247. }
  248. $wheres[] = 'su.uid=m.uid';
  249. $reason = ', su.reason';
  250. }
  251. if($lastpost && $orderby != 'todayposts') {
  252. $time = TIMESTAMP - $lastpost;
  253. $tables[] = DB::table('common_member_status')." ms";
  254. $wheres[] = "ms.uid=m.uid";
  255. $wheres[] = "ms.lastpost>'$time'";
  256. }
  257. switch($orderby) {
  258. case 'credits':
  259. case 'regdate':
  260. $sqlorderby = " ORDER BY m.$orderby DESC";
  261. break;
  262. case 'extcredits':
  263. $extcredits = 'extcredits'.(in_array($parameter['extcredit'], range(1, 8)) ? $parameter['extcredit'] : '1');
  264. $sqlorderby = " ORDER BY mc.$extcredits DESC";
  265. break;
  266. case 'threads':
  267. case 'posts':
  268. case 'blogs':
  269. case 'albums':
  270. case 'doings':
  271. case 'sharings':
  272. case 'digestposts':
  273. $sqlorderby = " ORDER BY mc.$orderby DESC";
  274. break;
  275. case 'show':
  276. $show = ', s.unitprice, s.credit as showcredit, s.note as shownote';
  277. $tables[] = DB::table('home_show')." s";
  278. $wheres[] = 's.uid=m.uid';
  279. $sqlorderby = ' ORDER BY s.unitprice DESC, s.credit DESC';
  280. break;
  281. case 'special':
  282. $sqlorderby = $special !== null ? ' ORDER BY su.displayorder, dateline DESC' : '';
  283. break;
  284. case 'todayposts':
  285. $todaytime = strtotime(dgmdate(TIMESTAMP, 'Ymd'));
  286. $inuids = $uids ? ' AND uid IN ('.dimplode($uids).')' : '';
  287. $items = $items * 5;
  288. $query = DB::query('SELECT uid, count(*) as sum FROM '.DB::table('common_member_action_log')."
  289. WHERE dateline>=$todaytime AND action='".getuseraction('pid')."'$inuids GROUP BY uid ORDER BY sum DESC LIMIT $items");
  290. while($value = DB::fetch($query)) {
  291. $todayposts[$value['uid']] = $value['sum'];
  292. $todayuids[] = $value['uid'];
  293. }
  294. if(empty($todayuids)) {
  295. $todayuids = array(0);
  296. }
  297. $uids = $todayuids;
  298. break;
  299. }
  300. if($uids) {
  301. $wheres[] = 'm.uid IN ('.dimplode($uids).')';
  302. }
  303. $wheres[] = '(m.groupid < 4 OR m.groupid > 8)';
  304. $tables = array_unique($tables);
  305. $wheres = array_unique($wheres);
  306. $tablesql = implode(',',$tables);
  307. $wheresql = implode(' AND ',$wheres);
  308. $query = DB::query("SELECT m.*, mc.*$reason$show FROM $tablesql WHERE $wheresql $sqlorderby LIMIT $startrow,$items");
  309. $resultuids = array();
  310. while($data = DB::fetch($query)){
  311. $resultuids[] = intval($data['uid']);
  312. $list[] = array(
  313. 'id' => $data['uid'],
  314. 'idtype' => 'uid',
  315. 'title' => $data['username'],
  316. 'url' => 'home.php?mod=space&uid='.$data['uid'],
  317. 'pic' => '',
  318. 'picflag' => 0,
  319. 'summary' => '',
  320. 'fields' => array(
  321. 'avatar' => avatar($data['uid'], 'small', true, false, false, $_G['setting']['ucenterurl']),
  322. 'avatar_middle' => avatar($data['uid'], 'middle', true, false, false, $_G['setting']['ucenterurl']),
  323. 'avatar_big' => avatar($data['uid'], 'big', true, false, false, $_G['setting']['ucenterurl']),
  324. 'credits' => $data['credits'],
  325. 'extcredits1' => $data['extcredits1'],
  326. 'extcredits2' => $data['extcredits2'],
  327. 'extcredits3' => $data['extcredits3'],
  328. 'extcredits4' => $data['extcredits4'],
  329. 'extcredits5' => $data['extcredits5'],
  330. 'extcredits6' => $data['extcredits6'],
  331. 'extcredits7' => $data['extcredits7'],
  332. 'extcredits8' => $data['extcredits8'],
  333. 'regdate' => $data['regdate'],
  334. 'posts' => empty($todayposts[$data['uid']]) ? $data['posts'] : $todayposts[$data['uid']],
  335. 'threads' => $data['threads'],
  336. 'digestposts' => $data['digestposts'],
  337. 'reason' => isset($data['reason']) ? $data['reason'] : '',
  338. 'unitprice' => isset($data['unitprice']) ? $data['unitprice'] : '',
  339. 'showcredit' => isset($data['showcredit']) ? $data['showcredit'] : '',
  340. 'shownote' => isset($data['shownote']) ? $data['shownote'] : '',
  341. )
  342. );
  343. }
  344. if($resultuids) {
  345. include_once libfile('function/profile');
  346. $profiles = array();
  347. $query = DB::query('SELECT * FROM '.DB::table('common_member_profile')." WHERE uid IN (".dimplode($resultuids).")");
  348. while($data = DB::fetch($query)) {
  349. $profile = array();
  350. foreach($data as $fieldid=>$fieldvalue) {
  351. $fieldvalue = profile_show($fieldid, $data, true);
  352. if(false !== $fieldvalue) {
  353. $profile[$fieldid] = $fieldvalue;
  354. }
  355. }
  356. $profiles[$data['uid']] = $profile;
  357. }
  358. for($i=0,$L=count($list); $i<$L; $i++) {
  359. $uid = $list[$i]['id'];
  360. if($profiles[$uid]) {
  361. $list[$i]['fields'] = array_merge($list[$i]['fields'], $profiles[$uid]);
  362. }
  363. }
  364. if(!empty($todayuids)) {
  365. $datalist = array();
  366. foreach($todayuids as $uid) {
  367. foreach($list as $user) {
  368. if($user['id'] == $uid) {
  369. $datalist[] = $user;
  370. break;
  371. }
  372. }
  373. if(count($datalist) >= $olditems) {
  374. break;
  375. }
  376. }
  377. $list = $datalist;
  378. }
  379. }
  380. return array('html' => '', 'data' => $list);
  381. }
  382. }
  383. ?>