PageRenderTime 64ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 1ms

/admin/forums.php

https://bitbucket.org/gencer/punbb
PHP | 851 lines | 630 code | 165 blank | 56 comment | 105 complexity | e663608663dd94d213b95ca71a2fd11c MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /**
  3. * Forum management page.
  4. *
  5. * Allows administrators to add, modify, and remove forums.
  6. *
  7. * @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009 FluxBB.org
  8. * @license http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  9. * @package PunBB
  10. */
  11. if (!defined('FORUM_ROOT'))
  12. define('FORUM_ROOT', '../');
  13. require FORUM_ROOT.'include/common.php';
  14. require FORUM_ROOT.'include/common_admin.php';
  15. ($hook = get_hook('afo_start')) ? eval($hook) : null;
  16. if ($forum_user['g_id'] != FORUM_ADMIN)
  17. message($lang_common['No permission']);
  18. // Load the admin.php language file
  19. require FORUM_ROOT.'lang/'.$forum_user['language'].'/admin_common.php';
  20. require FORUM_ROOT.'lang/'.$forum_user['language'].'/admin_forums.php';
  21. // Add a "default" forum
  22. if (isset($_POST['add_forum']))
  23. {
  24. $add_to_cat = isset($_POST['add_to_cat']) ? intval($_POST['add_to_cat']) : 0;
  25. if ($add_to_cat < 1)
  26. message($lang_common['Bad request']);
  27. $forum_name = forum_trim($_POST['forum_name']);
  28. $position = intval($_POST['position']);
  29. ($hook = get_hook('afo_add_forum_form_submitted')) ? eval($hook) : null;
  30. if ($forum_name == '')
  31. message($lang_admin_forums['Must enter forum message']);
  32. // Make sure the category we're adding to exists
  33. $query = array(
  34. 'SELECT' => 'COUNT(c.id)',
  35. 'FROM' => 'categories AS c',
  36. 'WHERE' => 'c.id='.$add_to_cat
  37. );
  38. ($hook = get_hook('afo_add_forum_qr_validate_category_id')) ? eval($hook) : null;
  39. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  40. if ($forum_db->result($result) != 1)
  41. message($lang_common['Bad request']);
  42. $query = array(
  43. 'INSERT' => 'forum_name, disp_position, cat_id',
  44. 'INTO' => 'forums',
  45. 'VALUES' => '\''.$forum_db->escape($forum_name).'\', '.$position.', '.$add_to_cat
  46. );
  47. ($hook = get_hook('afo_add_forum_qr_add_forum')) ? eval($hook) : null;
  48. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  49. // Regenerate the quickjump cache
  50. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  51. require FORUM_ROOT.'include/cache.php';
  52. generate_quickjump_cache();
  53. // Add flash message
  54. $forum_flash->add_info($lang_admin_forums['Forum added']);
  55. ($hook = get_hook('afo_add_forum_pre_redirect')) ? eval($hook) : null;
  56. redirect(forum_link($forum_url['admin_forums']), $lang_admin_forums['Forum added']);
  57. }
  58. // Delete a forum
  59. else if (isset($_GET['del_forum']))
  60. {
  61. $forum_to_delete = intval($_GET['del_forum']);
  62. if ($forum_to_delete < 1)
  63. message($lang_common['Bad request']);
  64. // User pressed the cancel button
  65. if (isset($_POST['del_forum_cancel']))
  66. redirect(forum_link($forum_url['admin_forums']), $lang_admin_common['Cancel redirect']);
  67. ($hook = get_hook('afo_del_forum_form_submitted')) ? eval($hook) : null;
  68. if (isset($_POST['del_forum_comply'])) // Delete a forum with all posts
  69. {
  70. @set_time_limit(0);
  71. // Prune all posts and topics
  72. prune($forum_to_delete, 1, -1);
  73. delete_orphans();
  74. // Delete the forum and any forum specific group permissions
  75. $query = array(
  76. 'DELETE' => 'forums',
  77. 'WHERE' => 'id='.$forum_to_delete
  78. );
  79. ($hook = get_hook('afo_del_forum_qr_delete_forum')) ? eval($hook) : null;
  80. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  81. $query = array(
  82. 'DELETE' => 'forum_perms',
  83. 'WHERE' => 'forum_id='.$forum_to_delete
  84. );
  85. ($hook = get_hook('afo_del_forum_qr_delete_forum_perms')) ? eval($hook) : null;
  86. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  87. // Delete forum subscriptions
  88. $query = array(
  89. 'DELETE' => 'forum_subscriptions',
  90. 'WHERE' => 'forum_id='.$forum_to_delete
  91. );
  92. ($hook = get_hook('afo_del_forum_qr_delete_forum_subscriptions')) ? eval($hook) : null;
  93. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  94. // Regenerate the quickjump cache
  95. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  96. require FORUM_ROOT.'include/cache.php';
  97. generate_quickjump_cache();
  98. // Add flash message
  99. $forum_flash->add_info($lang_admin_forums['Forum deleted']);
  100. ($hook = get_hook('afo_del_forum_pre_redirect')) ? eval($hook) : null;
  101. redirect(forum_link($forum_url['admin_forums']), $lang_admin_forums['Forum deleted']);
  102. }
  103. else // If the user hasn't confirmed the delete
  104. {
  105. $query = array(
  106. 'SELECT' => 'f.forum_name',
  107. 'FROM' => 'forums AS f',
  108. 'WHERE' => 'f.id='.$forum_to_delete
  109. );
  110. ($hook = get_hook('afo_del_forum_qr_get_forum_name')) ? eval($hook) : null;
  111. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  112. $forum_name = $forum_db->result($result);
  113. if (is_null($forum_name) || $forum_name === false)
  114. message($lang_common['Bad request']);
  115. // Setup breadcrumbs
  116. $forum_page['crumbs'] = array(
  117. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  118. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index'])),
  119. array($lang_admin_common['Start'], forum_link($forum_url['admin_index'])),
  120. array($lang_admin_common['Forums'], forum_link($forum_url['admin_forums'])),
  121. $lang_admin_forums['Delete forum']
  122. );
  123. ($hook = get_hook('afo_del_forum_pre_header_load')) ? eval($hook) : null;
  124. define('FORUM_PAGE_SECTION', 'start');
  125. define('FORUM_PAGE', 'admin-forums');
  126. require FORUM_ROOT.'header.php';
  127. // START SUBST - <!-- forum_main -->
  128. ob_start();
  129. ($hook = get_hook('afo_del_forum_output_start')) ? eval($hook) : null;
  130. ?>
  131. <div class="main-subhead">
  132. <h2 class="hn"><span><?php printf($lang_admin_forums['Confirm delete forum'], forum_htmlencode($forum_name)) ?></span></h2>
  133. </div>
  134. <div class="main-content main-frm">
  135. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_forums']) ?>?del_forum=<?php echo $forum_to_delete ?>">
  136. <div class="hidden">
  137. <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_forums']).'?del_forum='.$forum_to_delete) ?>" />
  138. </div>
  139. <div class="ct-box warn-box">
  140. <p class="warn"><?php echo $lang_admin_forums['Delete forum warning'] ?></p>
  141. </div>
  142. <div class="frm-buttons">
  143. <span class="submit primary caution"><input type="submit" name="del_forum_comply" value="<?php echo $lang_admin_forums['Delete forum'] ?>" /></span>
  144. <span class="cancel"><input type="submit" name="del_forum_cancel" value="<?php echo $lang_admin_common['Cancel'] ?>" /></span>
  145. </div>
  146. </form>
  147. </div>
  148. <?php
  149. ($hook = get_hook('afo_del_forum_end')) ? eval($hook) : null;
  150. $tpl_temp = forum_trim(ob_get_contents());
  151. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  152. ob_end_clean();
  153. // END SUBST - <!-- forum_main -->
  154. require FORUM_ROOT.'footer.php';
  155. }
  156. }
  157. // Update forum positions
  158. else if (isset($_POST['update_positions']))
  159. {
  160. $positions = array_map('intval', $_POST['position']);
  161. ($hook = get_hook('afo_update_positions_form_submitted')) ? eval($hook) : null;
  162. $query = array(
  163. 'SELECT' => 'f.id, f.disp_position',
  164. 'FROM' => 'categories AS c',
  165. 'JOINS' => array(
  166. array(
  167. 'INNER JOIN' => 'forums AS f',
  168. 'ON' => 'c.id=f.cat_id'
  169. )
  170. ),
  171. 'ORDER BY' => 'c.disp_position, c.id, f.disp_position'
  172. );
  173. ($hook = get_hook('afo_update_positions_qr_get_forums')) ? eval($hook) : null;
  174. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  175. while ($cur_forum = $forum_db->fetch_assoc($result))
  176. {
  177. // If these aren't set, we're looking at a forum that was added after
  178. // the admin started editing: we don't want to mess with it
  179. if (isset($positions[$cur_forum['id']]))
  180. {
  181. $new_disp_position = $positions[$cur_forum['id']];
  182. if ($new_disp_position < 0)
  183. message($lang_admin_forums['Must be integer']);
  184. // We only want to update if we changed the position
  185. if ($cur_forum['disp_position'] != $new_disp_position)
  186. {
  187. $query = array(
  188. 'UPDATE' => 'forums',
  189. 'SET' => 'disp_position='.$new_disp_position,
  190. 'WHERE' => 'id='.$cur_forum['id']
  191. );
  192. ($hook = get_hook('afo_update_positions_qr_update_forum_position')) ? eval($hook) : null;
  193. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  194. }
  195. }
  196. }
  197. // Regenerate the quickjump cache
  198. require_once FORUM_ROOT.'include/cache.php';
  199. generate_quickjump_cache();
  200. // Add flash message
  201. $forum_flash->add_info($lang_admin_forums['Forums updated']);
  202. ($hook = get_hook('afo_update_positions_pre_redirect')) ? eval($hook) : null;
  203. redirect(forum_link($forum_url['admin_forums']), $lang_admin_forums['Forums updated']);
  204. }
  205. else if (isset($_GET['edit_forum']))
  206. {
  207. $forum_id = intval($_GET['edit_forum']);
  208. if ($forum_id < 1)
  209. message($lang_common['Bad request']);
  210. ($hook = get_hook('afo_edit_forum_selected')) ? eval($hook) : null;
  211. // Fetch forum info
  212. $query = array(
  213. 'SELECT' => 'f.id, f.forum_name, f.forum_desc, f.redirect_url, f.num_topics, f.sort_by, f.cat_id',
  214. 'FROM' => 'forums AS f',
  215. 'WHERE' => 'f.id='.$forum_id
  216. );
  217. ($hook = get_hook('afo_edit_forum_qr_get_forum_details')) ? eval($hook) : null;
  218. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  219. $cur_forum = $forum_db->fetch_assoc($result);
  220. if (is_null($cur_forum) || $cur_forum === false)
  221. message($lang_common['Bad request']);
  222. // Update group permissions for $forum_id
  223. if (isset($_POST['save']))
  224. {
  225. // Start with the forum details
  226. $forum_name = forum_trim($_POST['forum_name']);
  227. $forum_desc = forum_linebreaks(forum_trim($_POST['forum_desc']));
  228. $cat_id = intval($_POST['cat_id']);
  229. $sort_by = intval($_POST['sort_by']);
  230. $redirect_url = isset($_POST['redirect_url']) && $cur_forum['num_topics'] == 0 ? forum_trim($_POST['redirect_url']) : null;
  231. ($hook = get_hook('afo_save_forum_form_submitted')) ? eval($hook) : null;
  232. if ($forum_name == '')
  233. message($lang_admin_forums['Must enter forum message']);
  234. if ($cat_id < 1)
  235. message($lang_common['Bad request']);
  236. $forum_desc = ($forum_desc != '') ? '\''.$forum_db->escape($forum_desc).'\'' : 'NULL';
  237. $redirect_url = ($redirect_url != '') ? '\''.$forum_db->escape($redirect_url).'\'' : 'NULL';
  238. $query = array(
  239. 'UPDATE' => 'forums',
  240. 'SET' => 'forum_name=\''.$forum_db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id,
  241. 'WHERE' => 'id='.$forum_id
  242. );
  243. ($hook = get_hook('afo_save_forum_qr_update_forum')) ? eval($hook) : null;
  244. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  245. // Now let's deal with the permissions
  246. if (isset($_POST['read_forum_old']))
  247. {
  248. $query = array(
  249. 'SELECT' => 'g.g_id, g.g_read_board, g.g_post_replies, g.g_post_topics',
  250. 'FROM' => 'groups AS g',
  251. 'WHERE' => 'g_id!='.FORUM_ADMIN
  252. );
  253. ($hook = get_hook('afo_save_forum_qr_get_groups')) ? eval($hook) : null;
  254. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  255. while ($cur_group = $forum_db->fetch_assoc($result))
  256. {
  257. // The default permissions for this group
  258. $perms_default = array(
  259. 'read_forum' => $cur_group['g_read_board'],
  260. 'post_replies' => $cur_group['g_post_replies'],
  261. 'post_topics' => $cur_group['g_post_topics']
  262. );
  263. // The old permissions for this group
  264. $perms_old = array(
  265. 'read_forum' => $_POST['read_forum_old'][$cur_group['g_id']],
  266. 'post_replies' => $_POST['post_replies_old'][$cur_group['g_id']],
  267. 'post_topics' => $_POST['post_topics_old'][$cur_group['g_id']]
  268. );
  269. // The new permissions for this group
  270. $perms_new = array(
  271. 'read_forum' => ($cur_group['g_read_board'] == '1') ? isset($_POST['read_forum_new'][$cur_group['g_id']]) ? '1' : '0' : intval($_POST['read_forum_old'][$cur_group['g_id']]),
  272. 'post_replies' => isset($_POST['post_replies_new'][$cur_group['g_id']]) ? '1' : '0',
  273. 'post_topics' => isset($_POST['post_topics_new'][$cur_group['g_id']]) ? '1' : '0'
  274. );
  275. ($hook = get_hook('afo_save_forum_pre_perms_compare')) ? eval($hook) : null;
  276. // Force all permissions values to integers
  277. $perms_default = array_map('intval', $perms_default);
  278. $perms_old = array_map('intval', $perms_old);
  279. $perms_new = array_map('intval', $perms_new);
  280. // Check if the new permissions differ from the old
  281. if ($perms_new !== $perms_old)
  282. {
  283. // If the new permissions are identical to the default permissions for this group, delete its row in forum_perms
  284. if ($perms_new === $perms_default)
  285. {
  286. $query = array(
  287. 'DELETE' => 'forum_perms',
  288. 'WHERE' => 'group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id
  289. );
  290. ($hook = get_hook('afo_save_forum_qr_delete_group_forum_perms')) ? eval($hook) : null;
  291. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  292. }
  293. else
  294. {
  295. // Run an UPDATE and see if it affected a row, if not, INSERT
  296. $query = array(
  297. 'UPDATE' => 'forum_perms',
  298. 'WHERE' => 'group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id
  299. );
  300. $perms_new_values = array();
  301. foreach ($perms_new as $key => $value)
  302. $perms_new_values[] = $key.'='.$value;
  303. $query['SET'] = implode(', ', $perms_new_values);
  304. ($hook = get_hook('afo_save_forum_qr_update_forum_perms')) ? eval($hook) : null;
  305. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  306. if (!$forum_db->affected_rows())
  307. {
  308. $query = array(
  309. 'INSERT' => 'group_id, forum_id',
  310. 'INTO' => 'forum_perms',
  311. 'VALUES' => $cur_group['g_id'].', '.$forum_id
  312. );
  313. $query['INSERT'] .= ', '.implode(', ', array_keys($perms_new));
  314. $query['VALUES'] .= ', '.implode(', ', $perms_new);
  315. ($hook = get_hook('afo_save_forum_qr_add_forum_perms')) ? eval($hook) : null;
  316. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  317. }
  318. }
  319. }
  320. }
  321. }
  322. // Regenerate the quickjump cache
  323. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  324. require FORUM_ROOT.'include/cache.php';
  325. generate_quickjump_cache();
  326. // Add flash message
  327. $forum_flash->add_info($lang_admin_forums['Forum updated']);
  328. ($hook = get_hook('afo_save_forum_pre_redirect')) ? eval($hook) : null;
  329. redirect(forum_link($forum_url['admin_forums_forum'], $forum_id), $lang_admin_forums['Forum updated']);
  330. }
  331. else if (isset($_POST['revert_perms']))
  332. {
  333. ($hook = get_hook('afo_revert_perms_form_submitted')) ? eval($hook) : null;
  334. $query = array(
  335. 'DELETE' => 'forum_perms',
  336. 'WHERE' => 'forum_id='.$forum_id
  337. );
  338. ($hook = get_hook('afo_revert_perms_qr_revert_forum_perms')) ? eval($hook) : null;
  339. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  340. // Regenerate the quickjump cache
  341. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  342. require FORUM_ROOT.'include/cache.php';
  343. generate_quickjump_cache();
  344. $forum_flash->add_info($lang_admin_forums['Permissions reverted']);
  345. ($hook = get_hook('afo_revert_perms_pre_redirect')) ? eval($hook) : null;
  346. redirect(forum_link($forum_url['admin_forums']).'?edit_forum='.$forum_id, $lang_admin_forums['Permissions reverted']);
  347. }
  348. $forum_page['form_info'] = array();
  349. if ($cur_forum['redirect_url'])
  350. $forum_page['form_info'][] = '<li><span>'.$lang_admin_forums['Forum perms redirect info'].'</span></li>';
  351. $forum_page['form_info']['read'] = '<li><span>'.$lang_admin_forums['Forum perms read info'].'</span></li>';
  352. $forum_page['form_info']['restore'] = '<li><span>'.$lang_admin_forums['Forum perms restore info'].'</span></li>';
  353. $forum_page['form_info']['groups'] = '<li><span>'. sprintf($lang_admin_forums['Forum perms groups info'], '<a href="'.forum_link($forum_url['admin_groups']).'">'.$lang_admin_forums['User groups'].'</a>').'</span></li>';
  354. $forum_page['form_info']['admins'] = '<li><span>'.$lang_admin_forums['Forum perms admins info'].'</span></li>';
  355. // Setup the form
  356. $forum_page['item_count'] = $forum_page['group_count'] = $forum_page['fld_count'] = 0;
  357. // Setup breadcrumbs
  358. $forum_page['crumbs'] = array(
  359. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  360. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index'])),
  361. array($lang_admin_common['Start'], forum_link($forum_url['admin_index'])),
  362. array($lang_admin_common['Forums'], forum_link($forum_url['admin_forums'])),
  363. $lang_admin_forums['Edit forum']
  364. );
  365. ($hook = get_hook('afo_edit_forum_pre_header_load')) ? eval($hook) : null;
  366. define('FORUM_PAGE_SECTION', 'start');
  367. define('FORUM_PAGE', 'admin-forums');
  368. require FORUM_ROOT.'header.php';
  369. // START SUBST - <!-- forum_main -->
  370. ob_start();
  371. ($hook = get_hook('afo_edit_forum_output_start')) ? eval($hook) : null;
  372. ?>
  373. <div class="main-subhead">
  374. <h2 class="hn"><span><?php printf($lang_admin_forums['Edit forum head'], forum_htmlencode($cur_forum['forum_name'])) ?></span></h2>
  375. </div>
  376. <div class="main-content main-frm">
  377. <form method="post" class="frm-form" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_forums']) ?>?edit_forum=<?php echo $forum_id ?>">
  378. <div class="hidden">
  379. <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_forums']).'?edit_forum='.$forum_id) ?>" />
  380. </div>
  381. <div class="content-head">
  382. <h3 class="hn"><span><?php echo $lang_admin_forums['Edit forum details head'] ?></span></h3>
  383. </div>
  384. <?php ($hook = get_hook('afo_edit_forum_pre_details_fieldset')) ? eval($hook) : null; ?>
  385. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  386. <legend class="group-legend"><strong><?php echo $lang_admin_forums['Edit forum details legend'] ?></strong></legend>
  387. <?php ($hook = get_hook('afo_edit_forum_pre_forum_name')) ? eval($hook) : null; ?>
  388. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  389. <div class="sf-box text">
  390. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Forum name'] ?></span></label><br />
  391. <span class="fld-input"><input type="text" id="fld<?php echo $forum_page['fld_count'] ?>" name="forum_name" size="35" maxlength="80" value="<?php echo forum_htmlencode($cur_forum['forum_name']) ?>" required /></span>
  392. </div>
  393. </div>
  394. <?php ($hook = get_hook('afo_edit_forum_pre_forum_descrip')) ? eval($hook) : null; ?>
  395. <div class="txt-set set<?php echo ++$forum_page['item_count'] ?>">
  396. <div class="txt-box textarea">
  397. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Forum description'] ?></span> <small><?php echo $lang_admin_forums['Forum description help'] ?></small></label><br />
  398. <div class="txt-input"><span class="fld-input"><textarea id="fld<?php echo $forum_page['fld_count'] ?>" name="forum_desc" rows="3" cols="50"><?php echo forum_htmlencode($cur_forum['forum_desc']) ?></textarea></span></div>
  399. </div>
  400. </div>
  401. <?php ($hook = get_hook('afo_edit_forum_pre_forum_cat')) ? eval($hook) : null; ?>
  402. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  403. <div class="sf-box select">
  404. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Category assignment'] ?></span></label><br />
  405. <span class="fld-input"><select id="fld<?php echo $forum_page['fld_count'] ?>" name="cat_id">
  406. <?php
  407. $query = array(
  408. 'SELECT' => 'c.id, c.cat_name',
  409. 'FROM' => 'categories AS c',
  410. 'ORDER BY' => 'c.disp_position'
  411. );
  412. ($hook = get_hook('afo_edit_forum_qr_get_categories')) ? eval($hook) : null;
  413. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  414. while ($cur_cat = $forum_db->fetch_assoc($result))
  415. {
  416. $selected = ($cur_cat['id'] == $cur_forum['cat_id']) ? ' selected="selected"' : '';
  417. echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_cat['id'].'"'.$selected.'>'.forum_htmlencode($cur_cat['cat_name']).'</option>'."\n";
  418. }
  419. ?>
  420. </select></span>
  421. </div>
  422. </div>
  423. <?php ($hook = get_hook('afo_edit_forum_pre_forum_sort_by')) ? eval($hook) : null; ?>
  424. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  425. <div class="sf-box select">
  426. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Sort topics by'] ?></span></label><br />
  427. <span class="fld-input"><select id="fld<?php echo $forum_page['fld_count'] ?>" name="sort_by">
  428. <option value="0"<?php if ($cur_forum['sort_by'] == '0') echo ' selected="selected"' ?>><?php echo $lang_admin_forums['Sort last post'] ?></option>
  429. <option value="1"<?php if ($cur_forum['sort_by'] == '1') echo ' selected="selected"' ?>><?php echo $lang_admin_forums['Sort topic start'] ?></option>
  430. <?php ($hook = get_hook('afo_edit_forum_modify_sort_by')) ? eval($hook) : null; ?> </select></span>
  431. </div>
  432. </div>
  433. <?php ($hook = get_hook('afo_edit_forum_pre_forum_redirect_url')) ? eval($hook) : null; ?>
  434. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  435. <div class="sf-box text">
  436. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Redirect URL'] ?></span></label><br />
  437. <span class="fld-input"><?php echo ($cur_forum['num_topics']) ? '<input type="url" id="fld'.$forum_page['fld_count'].'" name="redirect_url" size="45" maxlength="100" value="'.$lang_admin_forums['Only for empty forums'].'" disabled="disabled" />' : '<input type="text" id="fld'.$forum_page['fld_count'].'" name="redirect_url" size="35" maxlength="100" value="'.forum_htmlencode($cur_forum['redirect_url']).'" />' ?></span>
  438. </div>
  439. </div>
  440. <?php ($hook = get_hook('afo_edit_forum_pre_details_fieldset_end')) ? eval($hook) : null; ?>
  441. </fieldset>
  442. <?php
  443. ($hook = get_hook('afo_edit_forum_details_fieldset_end')) ? eval($hook) : null;
  444. // Reset fieldset counter
  445. $forum_page['group_count'] = $forum_page['item_count'] = 0;
  446. ($hook = get_hook('afo_edit_forum_pre_permissions_part')) ? eval($hook) : null;
  447. ?>
  448. <div class="content-head">
  449. <h3 class="hn"><span><?php echo $lang_admin_forums['Edit forum perms head'] ?></span></h3>
  450. </div>
  451. <div class="ct-box">
  452. <ul>
  453. <?php echo implode("\n\t\t\t\t\t", $forum_page['form_info'])."\n" ?>
  454. </ul>
  455. </div>
  456. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  457. <legend class="group-legend"><strong><?php echo $lang_admin_forums['Edit forum perms legend'] ?></strong></legend>
  458. <?php
  459. $i = 2;
  460. $query = array(
  461. 'SELECT' => 'g.g_id, g.g_title, g.g_read_board, g.g_post_replies, g.g_post_topics, fp.read_forum, fp.post_replies, fp.post_topics',
  462. 'FROM' => 'groups AS g',
  463. 'JOINS' => array(
  464. array(
  465. 'LEFT JOIN' => 'forum_perms AS fp',
  466. 'ON' => 'g.g_id=fp.group_id AND fp.forum_id='.$forum_id
  467. )
  468. ),
  469. 'WHERE' => 'g.g_id!='.FORUM_ADMIN,
  470. 'ORDER BY' => 'g.g_id'
  471. );
  472. ($hook = get_hook('afo_qr_get_forum_perms')) ? eval($hook) : null;
  473. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  474. while ($cur_perm = $forum_db->fetch_assoc($result))
  475. {
  476. $read_forum = ($cur_perm['read_forum'] != '0') ? true : false;
  477. $post_replies = (($cur_perm['g_post_replies'] == '0' && $cur_perm['post_replies'] == '1') || ($cur_perm['g_post_replies'] == '1' && $cur_perm['post_replies'] != '0')) ? true : false;
  478. $post_topics = (($cur_perm['g_post_topics'] == '0' && $cur_perm['post_topics'] == '1') || ($cur_perm['g_post_topics'] == '1' && $cur_perm['post_topics'] != '0')) ? true : false;
  479. // Determine if the current sittings differ from the default or not
  480. $read_forum_def = ($cur_perm['read_forum'] == '0') ? false : true;
  481. $post_replies_def = (($post_replies && $cur_perm['g_post_replies'] == '0') || (!$post_replies && ($cur_perm['g_post_replies'] == '' || $cur_perm['g_post_replies'] == '1'))) ? false : true;
  482. $post_topics_def = (($post_topics && $cur_perm['g_post_topics'] == '0') || (!$post_topics && ($cur_perm['g_post_topics'] == '' || $cur_perm['g_post_topics'] == '1'))) ? false : true;
  483. ($hook = get_hook('afo_edit_forum_pre_cur_group_permissions_fieldset')) ? eval($hook) : null;
  484. ?>
  485. <fieldset class="mf-set set<?php echo ++$forum_page['item_count'] ?>">
  486. <legend><span><?php echo forum_htmlencode($cur_perm['g_title']) ?></span></legend>
  487. <div class="mf-box mf-yesno">
  488. <?php ($hook = get_hook('afo_edit_forum_pre_cur_group_read_forum_permission')) ? eval($hook) : null; ?>
  489. <div class="mf-item">
  490. <input type="hidden" name="read_forum_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($read_forum) ? '1' : '0' ?>" />
  491. <span class="fld-input"><input type="checkbox" id="fld<?php echo ++$forum_page['fld_count'] ?>" name="read_forum_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php if ($read_forum) echo ' checked="checked"'; echo ($cur_perm['g_read_board'] == '0') ? ' disabled="disabled"' : ''; ?> /></span>
  492. <label for="fld<?php echo $forum_page['fld_count'] ?>"<?php if (!$read_forum_def) echo ' class="warn"' ?>><?php echo $lang_admin_forums['Read forum'] ?> <?php if (!$read_forum_def) echo $lang_admin_forums['Not default'] ?></label>
  493. </div>
  494. <?php ($hook = get_hook('afo_edit_forum_pre_cur_group_post_replies_permission')) ? eval($hook) : null; ?>
  495. <div class="mf-item">
  496. <input type="hidden" name="post_replies_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($post_replies) ? '1' : '0' ?>" />
  497. <span class="fld-input"><input type="checkbox" id="fld<?php echo ++$forum_page['fld_count'] ?>" name="post_replies_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php if ($post_replies) echo ' checked="checked"'; echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> /></span>
  498. <label for="fld<?php echo $forum_page['fld_count'] ?>"<?php if (!$post_replies_def) echo ' class="warn"'; ?>><?php echo $lang_admin_forums['Post replies'] ?> <?php if (!$post_replies_def) echo $lang_admin_forums['Not default'] ?></label>
  499. </div>
  500. <?php ($hook = get_hook('afo_edit_forum_pre_cur_group_post_topics_permission')) ? eval($hook) : null; ?>
  501. <div class="mf-item">
  502. <input type="hidden" name="post_topics_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($post_topics) ? '1' : '0' ?>" />
  503. <span class="fld-input"><input type="checkbox" id="fld<?php echo ++$forum_page['fld_count'] ?>" name="post_topics_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php if ($post_topics) echo ' checked="checked"'; echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> /></span>
  504. <label for="fld<?php echo $forum_page['fld_count'] ?>"<?php if (!$post_topics_def) echo ' class="warn"'; ?>><?php echo $lang_admin_forums['Post topics'] ?> <?php if (!$post_topics_def) echo $lang_admin_forums['Not default'] ?></label>
  505. </div>
  506. <?php ($hook = get_hook('afo_edit_forum_post_cur_group_post_topics_permission')) ? eval($hook) : null; ?>
  507. </div>
  508. <?php ($hook = get_hook('afo_edit_forum_pre_cur_group_permissions_fieldset_end')) ? eval($hook) : null; ?>
  509. </fieldset>
  510. <?php
  511. ($hook = get_hook('afo_edit_forum_cur_group_permissions_fieldset_end')) ? eval($hook) : null;
  512. ++$i;
  513. }
  514. ?>
  515. </fieldset>
  516. <div class="frm-buttons">
  517. <span class="submit primary"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" /></span>
  518. <span class="submit"><input type="submit" name="revert_perms" value="<?php echo $lang_admin_forums['Restore defaults'] ?>" formnovalidate /></span>
  519. </div>
  520. </form>
  521. </div>
  522. <?php
  523. ($hook = get_hook('afo_edit_forum_end')) ? eval($hook) : null;
  524. $tpl_temp = forum_trim(ob_get_contents());
  525. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  526. ob_end_clean();
  527. // END SUBST - <!-- forum_main -->
  528. require FORUM_ROOT.'footer.php';
  529. }
  530. // Setup the form
  531. $forum_page['fld_count'] = $forum_page['group_count'] = $forum_page['item_count'] = 0;
  532. // Setup breadcrumbs
  533. $forum_page['crumbs'] = array(
  534. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  535. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index'])),
  536. array($lang_admin_common['Start'], forum_link($forum_url['admin_index'])),
  537. array($lang_admin_common['Forums'], forum_link($forum_url['admin_forums']))
  538. );
  539. ($hook = get_hook('afo_pre_header_load')) ? eval($hook) : null;
  540. define('FORUM_PAGE_SECTION', 'start');
  541. define('FORUM_PAGE', 'admin-forums');
  542. require FORUM_ROOT.'header.php';
  543. // START SUBST - <!-- forum_main -->
  544. ob_start();
  545. ($hook = get_hook('afo_main_output_start')) ? eval($hook) : null;
  546. ?>
  547. <div class="main-subhead">
  548. <h2 class="hn"><span><?php echo $lang_admin_forums['Add forum head'] ?></span></h2>
  549. </div>
  550. <div class="main-content main-frm">
  551. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_forums']) ?>?action=adddel">
  552. <div class="hidden">
  553. <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_forums']).'?action=adddel') ?>" />
  554. </div>
  555. <?php ($hook = get_hook('afo_pre_add_forum_fieldset')) ? eval($hook) : null; ?>
  556. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  557. <legend class="group-legend"><strong><?php echo $lang_admin_forums['Add forum legend'] ?></strong></legend>
  558. <?php ($hook = get_hook('afo_pre_new_forum_name')) ? eval($hook) : null; ?>
  559. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  560. <div class="sf-box text">
  561. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Forum name label'] ?></span></label><br />
  562. <span class="fld-input"><input type="text" id="fld<?php echo $forum_page['fld_count'] ?>" name="forum_name" size="35" maxlength="80" required /></span>
  563. </div>
  564. </div>
  565. <?php ($hook = get_hook('afo_pre_new_forum_position')) ? eval($hook) : null; ?>
  566. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  567. <div class="sf-box text">
  568. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Position label'] ?></span></label><br />
  569. <span class="fld-input"><input type="number" id="fld<?php echo $forum_page['fld_count'] ?>" name="position" size="3" maxlength="3" /></span>
  570. </div>
  571. </div>
  572. <?php ($hook = get_hook('afo_pre_new_forum_cat')) ? eval($hook) : null; ?>
  573. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  574. <div class="sf-box select">
  575. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Add to category label'] ?></span></label><br />
  576. <span class="fld-input"><select id="fld<?php echo $forum_page['fld_count'] ?>" name="add_to_cat">
  577. <?php
  578. $query = array(
  579. 'SELECT' => 'c.id, c.cat_name',
  580. 'FROM' => 'categories AS c',
  581. 'ORDER BY' => 'c.disp_position'
  582. );
  583. ($hook = get_hook('afo_qr_get_categories')) ? eval($hook) : null;
  584. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  585. while ($cur_cat = $forum_db->fetch_assoc($result))
  586. echo "\t\t\t\t\t\t\t".'<option value="'.$cur_cat['id'].'">'.forum_htmlencode($cur_cat['cat_name']).'</option>'."\n";
  587. ?>
  588. </select></span>
  589. </div>
  590. </div>
  591. <?php ($hook = get_hook('afo_pre_add_forum_fieldset_end')) ? eval($hook) : null; ?>
  592. </fieldset>
  593. <?php ($hook = get_hook('afo_add_forum_fieldset_end')) ? eval($hook) : null; ?>
  594. <div class="frm-buttons">
  595. <span class="submit primary"><input type="submit" name="add_forum" value=" <?php echo $lang_admin_forums['Add forum'] ?> " /></span>
  596. </div>
  597. </form>
  598. </div>
  599. <?php
  600. // Display all the categories and forums
  601. $query = array(
  602. 'SELECT' => 'c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.disp_position',
  603. 'FROM' => 'categories AS c',
  604. 'JOINS' => array(
  605. array(
  606. 'INNER JOIN' => 'forums AS f',
  607. 'ON' => 'c.id=f.cat_id'
  608. )
  609. ),
  610. 'ORDER BY' => 'c.disp_position, c.id, f.disp_position'
  611. );
  612. ($hook = get_hook('afo_qr_get_cats_and_forums')) ? eval($hook) : null;
  613. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  614. $forums = array();
  615. while ($cur_forum = $forum_db->fetch_assoc($result))
  616. {
  617. $forums[] = $cur_forum;
  618. }
  619. if (!empty($forums))
  620. {
  621. // Reset fieldset counter
  622. $forum_page['set_count'] = 0;
  623. ?>
  624. <div class="main-subhead">
  625. <h2 class="hn"><span><?php echo $lang_admin_forums['Edit forums head'] ?></span></h2>
  626. </div>
  627. <div class="main-content main-frm">
  628. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_forums']) ?>?action=edit">
  629. <div class="hidden">
  630. <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_forums']).'?action=edit') ?>" />
  631. </div>
  632. <?php
  633. $cur_category = 0;
  634. $i = 2;
  635. $forum_page['item_count'] = 0;
  636. foreach ($forums as $cur_forum)
  637. {
  638. if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
  639. {
  640. if ($i > 2) echo "\t\t\t".'</div>'."\n";
  641. $forum_page['group_count'] = $forum_page['item_count'] = 0;
  642. ?>
  643. <div class="content-head">
  644. <h3 class="hn"><span><?php printf($lang_admin_forums['Forums in category'], forum_htmlencode($cur_forum['cat_name'])) ?></span></h3>
  645. </div>
  646. <div class="frm-group frm-hdgroup group<?php echo ++$forum_page['group_count'] ?>">
  647. <?php
  648. $cur_category = $cur_forum['cid'];
  649. }
  650. ($hook = get_hook('afo_pre_edit_cur_forum_fieldset')) ? eval($hook) : null;
  651. ?>
  652. <fieldset id="forum<?php echo $cur_forum['fid'] ?>" class="mf-set set<?php echo ++$forum_page['item_count'] ?><?php echo ($forum_page['item_count'] == 1) ? ' mf-head' : ' mf-extra' ?>">
  653. <legend><span><?php printf($lang_admin_forums['Edit or delete'], '<a href="'.forum_link($forum_url['admin_forums']).'?edit_forum='.$cur_forum['fid'].'">'.$lang_admin_forums['Edit'].'</a>', '<a href="'.forum_link($forum_url['admin_forums']).'?del_forum='.$cur_forum['fid'].'">'.$lang_admin_forums['Delete'].'</a>') ?></span></legend>
  654. <div class="mf-box">
  655. <?php ($hook = get_hook('afo_pre_edit_cur_forum_name')) ? eval($hook) : null; ?>
  656. <div class="mf-field mf-field1 forum-field">
  657. <span class="aslabel"><?php echo $lang_admin_forums['Forum name'] ?></span>
  658. <span class="fld-input"><?php echo forum_htmlencode($cur_forum['forum_name']) ?></span>
  659. </div>
  660. <?php ($hook = get_hook('afo_pre_edit_cur_forum_position')) ? eval($hook) : null; ?>
  661. <div class="mf-field">
  662. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_forums['Position label'] ?></span></label><br />
  663. <span class="fld-input"><input type="number" id="fld<?php echo $forum_page['fld_count'] ?>" name="position[<?php echo $cur_forum['fid'] ?>]" size="3" maxlength="3" value="<?php echo $cur_forum['disp_position'] ?>" /></span>
  664. </div>
  665. </div>
  666. <?php ($hook = get_hook('afo_pre_edit_cur_forum_fieldset_end')) ? eval($hook) : null; ?>
  667. </fieldset>
  668. <?php
  669. ($hook = get_hook('afo_edit_cur_forum_fieldset_end')) ? eval($hook) : null;
  670. ++$i;
  671. }
  672. ?>
  673. </div>
  674. <div class="frm-buttons">
  675. <span class="submit primary"><input type="submit" name="update_positions" value="<?php echo $lang_admin_forums['Update positions'] ?>" /></span>
  676. </div>
  677. </form>
  678. </div>
  679. <?php
  680. }
  681. ($hook = get_hook('afo_end')) ? eval($hook) : null;
  682. $tpl_temp = forum_trim(ob_get_contents());
  683. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  684. ob_end_clean();
  685. // END SUBST - <!-- forum_main -->
  686. require FORUM_ROOT.'footer.php';