PageRenderTime 51ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/source/admincp/admincp_smilies.php

https://github.com/kuaileshike/upload
PHP | 449 lines | 380 code | 63 blank | 6 comment | 91 complexity | 60f8f5e5e5985c92a88d10a5885ca94e MD5 | raw file
  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: admincp_smilies.php 29236 2012-03-30 05:34:47Z chenmengshu $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9. exit('Access Denied');
  10. }
  11. $imgextarray = array('jpg', 'gif', 'png');
  12. $id = $_GET['id'];
  13. if($operation == 'export' && $id) {
  14. $smileyarray = C::t('forum_imagetype')->fetch($id);
  15. if(!$smileyarray) {
  16. cpheader();
  17. cpmsg('smilies_type_nonexistence', '', 'error');
  18. }
  19. $smileyarray['smilies'] = array();
  20. foreach(C::t('common_smiley')->fetch_all_by_typeid_type($id, 'smiley') as $smiley) {
  21. $smileyarray['smilies'][] = $smiley;
  22. }
  23. $smileyarray['version'] = strip_tags($_G['setting']['version']);
  24. exportdata('Discuz! Smilies', $smileyarray['name'], $smileyarray);
  25. }
  26. cpheader();
  27. if(!$operation) {
  28. if(!submitcheck('smiliessubmit')) {
  29. shownav('style', 'smilies_edit');
  30. showsubmenu('nav_smilies', array(
  31. array('smilies_type', 'smilies', 1),
  32. array('smilies_import', 'smilies&operation=import', 0),
  33. ));
  34. showtips('smilies_tips_smileytypes');
  35. showformheader('smilies');
  36. showtableheader();
  37. showsubtitle(array('', 'display_order', 'enable', 'smilies_type', 'dir', 'smilies_nums', ''));
  38. $smtypes = 0;
  39. $dirfilter = array();
  40. foreach(C::t('forum_imagetype')->fetch_all_by_type('smiley') as $type) {
  41. $smiliesnum = C::t('common_smiley')->count_by_type_typeid('smiley', $type['typeid']);
  42. showtablerow('', array('class="td25"', 'class="td28"'), array(
  43. "<input class=\"checkbox\" type=\"checkbox\" name=\"delete[]\" value=\"$type[typeid]\" ".($smiliesnum ? 'disabled' : '').">",
  44. "<input type=\"text\" class=\"txt\" name=\"displayordernew[$type[typeid]]\" value=\"$type[displayorder]\" size=\"2\">",
  45. "<input class=\"checkbox\" type=\"checkbox\" name=\"availablenew[$type[typeid]]\" value=\"1\" ".($type['available'] ? 'checked' : '').">",
  46. "<input type=\"text\" class=\"txt\" name=\"namenew[$type[typeid]]\" value=\"$type[name]\" size=\"15\">",
  47. "./static/image/smiley/$type[directory]",
  48. "$smiliesnum<input type=\"hidden\" name=\"smiliesnum[$type[typeid]]\" value=\"$smiliesnum\" />",
  49. "<a href=\"".ADMINSCRIPT."?action=smilies&operation=update&id=$type[typeid]\" class=\"act\" onclick=\"return confirm('$lang[smilies_update_confirm1]$type[directory]$lang[smilies_update_confirm2]$type[name]$lang[smilies_update_confirm3]')\">$lang[smilies_update]</a>&nbsp;".
  50. "<a href=\"".ADMINSCRIPT."?action=smilies&operation=export&id=$type[typeid]\" class=\"act\">$lang[export]</a>&nbsp;".
  51. "<a href=\"".ADMINSCRIPT."?action=smilies&operation=edit&id=$type[typeid]\" class=\"act\">$lang[detail]</a>"
  52. ));
  53. $dirfilter[] = $type['directory'];
  54. $smtypes++;
  55. }
  56. $smdir = DISCUZ_ROOT.'./static/image/smiley';
  57. $smtypedir = dir($smdir);
  58. $dirnum = 0;
  59. while($entry = $smtypedir->read()) {
  60. if($entry != '.' && $entry != '..' && !in_array($entry, $dirfilter) && preg_match("/^\w+$/", $entry) && strlen($entry) < 30 && is_dir($smdir.'/'.$entry)){
  61. $smiliesdir = dir($smdir.'/'.$entry);
  62. $smnums = 0;
  63. $smilies = '';
  64. while($subentry = $smiliesdir->read()) {
  65. if(in_array(strtolower(fileext($subentry)), $imgextarray) && preg_match("/^[\w\-\.\[\]\(\)\<\> &]+$/", substr($subentry, 0, strrpos($subentry, '.'))) && strlen($subentry) < 30 && is_file($smdir.'/'.$entry.'/'.$subentry)) {
  66. $smilies .= '<input type="hidden" name="smilies['.$dirnum.']['.$smnums.'][available]" value="1"><input type="hidden" name="smilies['.$dirnum.']['.$smnums.'][displayorder]" value="0"><input type="hidden" name="smilies['.$dirnum.']['.$smnums.'][url]" value="'.$subentry.'">';
  67. $smnums++;
  68. }
  69. }
  70. showtablerow('', array('class="td25"', 'class="td28"'), array(
  71. ($lang['add_new']),
  72. '<input type="text" class="txt" name="newdisplayorder['.$dirnum.']" value="'.($smtypes + $dirnum + 1).'" size="2" />',
  73. '<input class="checkbox" type="checkbox" name="newavailable['.$dirnum.']" value="1"'.($smnums ? ' checked="checked"' : ' disabled="disabled"').' />',
  74. '<input type="text" class="txt" name="newname['.$dirnum.']" value="" size="15" />',
  75. './static/image/smiley/'.$entry.'<input type="hidden" name="newdirectory['.$dirnum.']" value="'.$entry.'">',
  76. "$smnums<input type=\"hidden\" name=\"smnums[$dirnum]\" value=\"$smnums\" />",
  77. $smilies,
  78. '',
  79. ''
  80. ));
  81. $dirnum++;
  82. }
  83. }
  84. if(!$dirnum) {
  85. showtablerow('', array('', 'colspan="8"'), array(
  86. cplang('add_new'),
  87. cplang('smiliesupload_tips')
  88. ));
  89. }
  90. showsubmit('smiliessubmit', 'submit', 'del');
  91. showtablefooter();
  92. showformfooter();
  93. } else {
  94. if(is_array($_GET['namenew'])) {
  95. foreach($_GET['namenew'] as $id => $val) {
  96. $_GET['availablenew'][$id] = $_GET['availablenew'][$id] && $_GET['smiliesnum'][$id] > 0 ? 1 : 0;
  97. C::t('forum_imagetype')->update($id, array(
  98. 'available' => $_GET['availablenew'][$id],
  99. 'name' => dhtmlspecialchars(trim($val)),
  100. 'displayorder' => $_GET['displayordernew'][$id]
  101. ));
  102. }
  103. }
  104. if($_GET['delete']) {
  105. if(C::t('common_smiley')->count_by_type_typeid('smiley', $_GET['delete'])) {
  106. cpmsg('smilies_delete_invalid', '', 'error');
  107. }
  108. C::t('forum_imagetype')->delete($_GET['delete']);
  109. }
  110. if(is_array($_GET['newname'])) {
  111. foreach($_GET['newname'] as $key => $val) {
  112. $val = trim($val);
  113. if($val) {
  114. $smurl = './static/image/smiley/'.$_GET['newdirectory'][$key];
  115. $smdir = DISCUZ_ROOT.$smurl;
  116. if(!is_dir($smdir)) {
  117. cpmsg('smilies_directory_invalid', '', 'error', array('smurl' => $smurl));
  118. }
  119. $newavailable[$key] = $_GET['newavailable'][$key] && $smnums[$key] > 0 ? 1 : 0;
  120. $data = array(
  121. 'available' => $_GET['newavailable'][$key],
  122. 'name' => dhtmlspecialchars($val),
  123. 'type' => 'smiley',
  124. 'displayorder' => $_GET['newdisplayorder'][$key],
  125. 'directory' => $_GET['newdirectory'][$key],
  126. );
  127. $newSmileId = C::t('forum_imagetype')->insert($data, true);
  128. $smilies = update_smiles($smdir, $newSmileId, $imgextarray);
  129. if($smilies['smilies']) {
  130. addsmilies($newSmileId, $smilies['smilies']);
  131. updatecache(array('smilies', 'smileycodes', 'smilies_js'));
  132. }
  133. }
  134. }
  135. }
  136. updatecache(array('smileytypes', 'smilies', 'smileycodes', 'smilies_js'));
  137. cpmsg('smilies_edit_succeed', 'action=smilies', 'succeed');
  138. }
  139. } elseif($operation == 'edit' && $id) {
  140. $type = C::t('forum_imagetype')->fetch($id);
  141. $smurl = './static/image/smiley/'.$type['directory'];
  142. $smdir = DISCUZ_ROOT.$smurl;
  143. if(!is_dir($smdir)) {
  144. cpmsg('smilies_directory_invalid', '', 'error', array('smurl' => $smurl));
  145. }
  146. $fastsmiley = C::t('common_setting')->fetch('fastsmiley', true);
  147. if(!$do) {
  148. if(!submitcheck('editsubmit')) {
  149. $smiliesperpage = 100;
  150. $start_limit = ($page - 1) * $smiliesperpage;
  151. $num = C::t('common_smiley')->count_by_type_typeid('smiley', $id);
  152. $multipage = multi($num, $smiliesperpage, $page, ADMINSCRIPT.'?action=smilies&operation=edit&id='.$id);
  153. $smileynum = 1;
  154. $smilies = '';
  155. foreach(C::t('common_smiley')->fetch_all_by_typeid_type($id, 'smiley', $start_limit, $smiliesperpage) as $smiley) {
  156. $smilies .= showtablerow('', array('class="td25"', 'class="td28 td24"', 'class="td25"', 'class="td23"', 'class="td23"', 'class="td24"'), array(
  157. "<input class=\"checkbox\" type=\"checkbox\" name=\"delete[]\" value=\"$smiley[id]\">",
  158. "<input type=\"text\" class=\"txt\" size=\"2\" name=\"displayorder[$smiley[id]]\" value=\"$smiley[displayorder]\">",
  159. "<input class=\"checkbox\" type=\"checkbox\" name=\"fast[]\" ".(in_array($smiley['id'], $fastsmiley[$id]) ? 'checked="checked"' : '')." value=\"$smiley[id]\">",
  160. "<img src=\"$smurl/$smiley[url]\" border=\"0\" onload=\"if(this.height>30) {this.resized=true; this.height=30;}\" onmouseover=\"if(this.resized) this.style.cursor='pointer';\" onclick=\"if(!this.resized) {return false;} else {window.open(this.src);}\">",
  161. $smiley['id'],
  162. "<input type=\"text\" class=\"txt\" size=\"25\" name=\"code[$smiley[id]]\" value=\"".dhtmlspecialchars($smiley['code'])."\" id=\"code_$smileynum\" smileyid=\"$smiley[id]\" />",
  163. "<input type=\"hidden\" value=\"$smiley[url]\" id=\"url_$smileynum\">$smiley[url]"
  164. ), TRUE);
  165. $imgfilter[] = $smiley[url];
  166. $smileynum ++;
  167. }
  168. echo <<<EOT
  169. <script type="text/JavaScript">
  170. function addsmileycodes(smiliesnum, pre) {
  171. smiliesnum = parseInt(smiliesnum);
  172. if(smiliesnum > 1) {
  173. for(var i = 1; i < smiliesnum; i++) {
  174. var prefix = trim($(pre + 'prefix').value);
  175. var suffix = trim($(pre + 'suffix').value);
  176. var page = parseInt('$page');
  177. var middle = $(pre + 'middle').value == 1 ? $(pre + 'url_' + i).value.substr(0,$(pre + 'url_' + i).value.lastIndexOf('.')) : ($(pre + 'middle').value == 2 ? i + page * 10 : $(pre + 'code_'+ i).attributes['smileyid'].nodeValue);
  178. if(!prefix || prefix == '$lang[smilies_prefix]' || !suffix || suffix == '$lang[smilies_suffix]') {
  179. alert('$lang[smilies_prefix_tips]');
  180. return;
  181. }
  182. suffix = !suffix || suffix == '$lang[smilies_suffix]' ? '' : suffix;
  183. $(pre + 'code_' + i).value = prefix + middle + suffix;
  184. }
  185. }
  186. }
  187. function autoaddsmileycodes(smiliesnum) {
  188. smiliesnum = parseInt(smiliesnum);
  189. if(smiliesnum > 1) {
  190. for(var i = 1; i < smiliesnum; i++) {
  191. $('code_' + i).value = '{:' + '$id' + '_' + $('code_'+ i).attributes['smileyid'].nodeValue + ':}';
  192. }
  193. }
  194. }
  195. function clearinput(obj, defaultval) {
  196. if(obj.value == defaultval) {
  197. obj.value = '';
  198. }
  199. }
  200. </script>
  201. EOT;
  202. shownav('style', 'nav_smilies');
  203. showsubmenu(cplang('smilies_edit').' - '.$type['name'], array(
  204. array('smilies_type', 'smilies', 0),
  205. array('admin', "smilies&operation=edit&id=$id", !$do),
  206. array('add', "smilies&operation=edit&do=add&id=$id", $do == 'add')
  207. ));
  208. showformheader("smilies&operation=edit&id=$id");
  209. showhiddenfields(array('page' => $_GET['page']));
  210. showtableheader('', 'nobottom');
  211. showsubtitle(array('', 'display_order', 'smilies_fast', 'smilies_edit_image', 'smilies_id', 'smilies_edit_code', 'smilies_edit_filename'));
  212. echo $smilies;
  213. showtablerow('', array('', 'colspan="5"'), array(
  214. '',
  215. $lang['smilies_edit_add_code'].' <input type="text" class="txt" style="margin-right:0;width:40px;" size="2" value="{:" title="'.$lang['smilies_prefix'].'" id="prefix" onclick="clearinput(this, \''.$lang['smilies_prefix'].'\')" /> + <select id="middle"><option value="1">'.$lang['smilies_edit_order_file'].'</option><option value="2">'.$lang['smilies_edit_order_radom'].'</option><option value="3">'.$lang['smilies_id'].'</option></select> + <input type="text" class="txt" style="margin-right:0;width:40px;" size="2" value=":}" title="'.$lang['smilies_suffix'].'" id="suffix" onclick="clearinput(this, \''.$lang['smilies_suffix'].'\')" /> <input type="button" class="btn" onclick="addsmileycodes(\''.$smileynum.'\', \'\');" value="'.$lang['apply'].'" /> &nbsp;&nbsp; <input type="button" class="btn" onclick="autoaddsmileycodes(\''.$smileynum.'\');" value="'.$lang['smilies_edit_addcode_auto'].'" />'
  216. ));
  217. showsubmit('editsubmit', 'submit', 'del', '', $multipage);
  218. showtablefooter();
  219. showformfooter();
  220. } else {
  221. if($_GET['delete']) {
  222. C::t('common_smiley')->delete($_GET['delete']);
  223. }
  224. $unsfast = array();
  225. if(is_array($_GET['displayorder'])) {
  226. foreach($_GET['displayorder'] as $key => $val) {
  227. if(!in_array($key, $_GET['fast'])) {
  228. $unsfast[] = $key;
  229. }
  230. $_GET['displayorder'][$key] = intval($_GET['displayorder'][$key]);
  231. $_GET['code'][$key] = trim($_GET['code'][$key]);
  232. $data = array('displayorder' => $_GET['displayorder'][$key]);
  233. if(!empty($_GET['code'][$key])) {
  234. $data['code'] = $_GET['code'][$key];
  235. }
  236. C::t('common_smiley')->update($key, $data);
  237. }
  238. }
  239. $fastsmiley[$id] = array_diff(array_unique(array_merge((array)$fastsmiley[$id], (array)$_GET['fast'])), $unsfast);
  240. C::t('common_setting')->update('fastsmiley', $fastsmiley);
  241. updatecache(array('smilies', 'smileycodes', 'smilies_js'));
  242. cpmsg('smilies_edit_succeed', "action=smilies&operation=edit&id=$id&page=$_GET[page]", 'succeed');
  243. }
  244. } elseif($do == 'add') {
  245. if(!submitcheck('editsubmit')) {
  246. shownav('style', 'nav_smilies');
  247. showsubmenu(cplang('smilies_edit').' - '.$type[name], array(
  248. array('smilies_type', 'smilies', 0),
  249. array('admin', "smilies&operation=edit&id=$id", !$do),
  250. array('add', "smilies&operation=edit&do=add&id=$id", $do == 'add')
  251. ));
  252. showtips('smilies_tips');
  253. showtagheader('div', 'addsmilies', TRUE);
  254. showtableheader('smilies_add', 'notop fixpadding');
  255. showtablerow('', '', "<span class=\"bold marginright\">$lang[smilies_type]:</span>$type[name]");
  256. showtablerow('', '', "<span class=\"bold marginright\">$lang[dir]:</span>$smurl $lang[smilies_add_search]");
  257. showtablerow('', '', '<input type="button" class="btn" value="'.$lang['search'].'" onclick="ajaxget(\''.ADMINSCRIPT.'?action=smilies&operation=edit&do=add&id='.$id.'&search=yes\', \'addsmilies\', \'addsmilies\', \'auto\');doane(event);">');
  258. showtablefooter();
  259. showtagfooter('div');
  260. if($_GET['search']) {
  261. $newid = 1;
  262. $newimages = '';
  263. $imgfilter = array();
  264. foreach(C::t('common_smiley')->fetch_all_by_typeid_type($id, 'smiley') as $smiley) {
  265. $imgfilter[] = $img[url];
  266. }
  267. $smiliesdir = dir($smdir);
  268. while($entry = $smiliesdir->read()) {
  269. if(in_array(strtolower(fileext($entry)), $imgextarray) && !in_array($entry, $imgfilter) && preg_match("/^[\w\-\.\[\]\(\)\<\> &]+$/", substr($entry, 0, strrpos($entry, '.'))) && strlen($entry) < 30 && is_file($smdir.'/'.$entry)) {
  270. $newimages .= showtablerow('', array('class="td25"', 'class="td28 td24"', 'class="td23"'), array(
  271. "<input class=\"checkbox\" type=\"checkbox\" name=\"smilies[$newid][available]\" value=\"1\" checked=\"checked\">",
  272. "<input type=\"text\" class=\"txt\" size=\"2\" name=\"smilies[$newid][displayorder]\" value=\"0\">",
  273. "<img src=\"$smurl/$entry\" border=\"0\" onload=\"if(this.height>30) {this.resized=true; this.height=30;}\" onmouseover=\"if(this.resized) this.style.cursor='pointer';\" onclick=\"if(!this.resized) {return false;} else {window.open(this.src);}\">",
  274. "<input type=\"hidden\" size=\"25\" name=\"smilies[$newid][url]\" value=\"$entry\" id=\"addurl_$newid\">$entry"
  275. ), TRUE);
  276. $newid ++;
  277. }
  278. }
  279. $smiliesdir->close();
  280. ajaxshowheader();
  281. if($newimages) {
  282. showformheader("smilies&operation=edit&do=add&id=$id");
  283. showtableheader('smilies_add', 'notop fixpadding');
  284. showsubtitle(array('', 'display_order', 'smilies_edit_image', 'smilies_edit_filename'));
  285. echo $newimages;
  286. showtablerow('', array('class="td25"', 'colspan="3"'), array(
  287. '<input type="checkbox" name="chkall" onclick="checkAll(\'prefix\', this.form, \'add\')" class="checkbox" checked="checked">'.$lang['enable'],
  288. '<input type="submit" class="btn" name="editsubmit" value="'.$lang['submit'].'"> &nbsp; <input type="button" class="btn" value="'.$lang['research'].'" onclick="ajaxget(\''.ADMINSCRIPT.'?action=smilies&operation=edit&do=add&id='.$id.'&search=yes\', \'addsmilies\', \'addsmilies\', \'auto\');doane(event);">'
  289. ));
  290. showtablefooter();
  291. showformfooter();
  292. } else {
  293. showtableheader('smilies_add', 'notop');
  294. showtablerow('', 'class="lineheight"', cplang('smilies_edit_add_tips', array('smurl' => $smurl)));
  295. showtablerow('', '', '<input type="button" class="btn" value="'.$lang['research'].'" onclick="ajaxget(\''.ADMINSCRIPT.'?action=smilies&operation=edit&do=add&id='.$id.'&search=yes\', \'addsmilies\', \'addsmilies\', \'auto\');doane(event);">');
  296. showtablefooter();
  297. }
  298. ajaxshowfooter();
  299. }
  300. } else {
  301. if(is_array($_GET['smilies'])) {
  302. addsmilies($id, $_GET['smilies']);
  303. }
  304. updatecache(array('smilies', 'smileycodes', 'smilies_js'));
  305. cpmsg('smilies_edit_succeed', "action=smilies&operation=edit&id=$id", 'succeed');
  306. }
  307. }
  308. } elseif($operation == 'update' && $id) {
  309. if(!($smtype = C::t('forum_imagetype')->fetch($id))) {
  310. cpmsg('smilies_type_nonexistence', '', 'error');
  311. } else {
  312. $smurl = './static/image/smiley/'.$smtype['directory'];
  313. $smdir = DISCUZ_ROOT.$smurl;
  314. if(!is_dir($smdir)) {
  315. cpmsg('smilies_directory_invalid', '', 'error', array('smurl' => $smurl));
  316. }
  317. }
  318. $smilies = update_smiles($smdir, $id, $imgextarray);
  319. if($smilies['smilies']) {
  320. addsmilies($id, $smilies['smilies']);
  321. updatecache(array('smilies', 'smileycodes', 'smilies_js'));
  322. cpmsg('smilies_update_succeed', "action=smilies", 'succeed', array('smurl' => $smurl, 'num' => $smilies['num'], 'typename' => $smtype['name']));
  323. } else {
  324. cpmsg('smilies_update_error', '', 'error', array('smurl' => $smurl));
  325. }
  326. } elseif($operation == 'import') {
  327. if(!submitcheck('importsubmit')) {
  328. shownav('style', 'smilies_edit');
  329. showsubmenu('nav_smilies', array(
  330. array('smilies_type', 'smilies', 0),
  331. array('smilies_import', 'smilies&operation=import', 1),
  332. ));
  333. showtips('smilies_tips');
  334. showformheader('smilies&operation=import', 'enctype');
  335. showtableheader('smilies_import');
  336. showimportdata();
  337. showsubmit('importsubmit');
  338. showtablefooter();
  339. showformfooter();
  340. } else {
  341. require_once libfile('function/importdata');
  342. $renamed = import_smilies();
  343. if($renamed) {
  344. cpmsg('smilies_import_succeed_renamed', 'action=smilies', 'succeed');
  345. } else {
  346. cpmsg('smilies_import_succeed', 'action=smilies', 'succeed');
  347. }
  348. }
  349. }
  350. function addsmilies($typeid, $smilies = array()) {
  351. if(is_array($smilies)) {
  352. $ids = array();
  353. foreach($smilies as $smiley) {
  354. if($smiley['available']) {
  355. $data = array(
  356. 'type' => 'smiley',
  357. 'displayorder' => $smiley['displayorder'],
  358. 'typeid' => $typeid,
  359. 'code' => '',
  360. 'url' => $smiley['url'],
  361. );
  362. $ids[] = C::t('common_smiley')->insert($data, true);
  363. }
  364. }
  365. if($ids) {
  366. C::t('common_smiley')->update_code_by_id($ids);
  367. }
  368. }
  369. }
  370. function update_smiles($smdir, $id, &$imgextarray) {
  371. $num = 0;
  372. $smilies = $imgfilter = array();
  373. foreach(C::t('common_smiley')->fetch_all_by_typeid_type($id, 'smiley') as $img) {
  374. $imgfilter[] = $img[url];
  375. }
  376. $smiliesdir = dir($smdir);
  377. while($entry = $smiliesdir->read()) {
  378. if(in_array(strtolower(fileext($entry)), $imgextarray) && !in_array($entry, $imgfilter) && preg_match("/^[\w\-\.\[\]\(\)\<\> &]+$/", substr($entry, 0, strrpos($entry, '.'))) && strlen($entry) < 30 && is_file($smdir.'/'.$entry)) {
  379. $smilies[] = array('available' => 1, 'displayorder' => 0, 'url' => $entry);
  380. $num++;
  381. }
  382. }
  383. $smiliesdir->close();
  384. return array('smilies'=>$smilies, 'num'=>$num);
  385. }
  386. ?>