PageRenderTime 44ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/admin/categories.php

https://bitbucket.org/gencer/punbb
PHP | 464 lines | 336 code | 92 blank | 36 comment | 32 complexity | 0dc37b8df0a626ca13b1df5d90bd27c9 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /**
  3. * Category management page.
  4. *
  5. * Allows administrators to create, reposition, and remove categories.
  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('acg_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_categories.php';
  21. // Add a new category
  22. if (isset($_POST['add_cat']))
  23. {
  24. $new_cat_name = forum_trim($_POST['new_cat_name']);
  25. if ($new_cat_name == '')
  26. message($lang_admin_categories['Must name category']);
  27. $new_cat_pos = intval($_POST['position']);
  28. ($hook = get_hook('acg_add_cat_form_submitted')) ? eval($hook) : null;
  29. $query = array(
  30. 'INSERT' => 'cat_name, disp_position',
  31. 'INTO' => 'categories',
  32. 'VALUES' => '\''.$forum_db->escape($new_cat_name).'\', '.$new_cat_pos
  33. );
  34. ($hook = get_hook('acg_add_cat_qr_add_category')) ? eval($hook) : null;
  35. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  36. // Add flash message
  37. $forum_flash->add_info($lang_admin_categories['Category added']);
  38. ($hook = get_hook('acg_add_cat_pre_redirect')) ? eval($hook) : null;
  39. redirect(forum_link($forum_url['admin_categories']), $lang_admin_categories['Category added']);
  40. }
  41. // Delete a category
  42. else if (isset($_POST['del_cat']) || isset($_POST['del_cat_comply']))
  43. {
  44. $cat_to_delete = intval($_POST['cat_to_delete']);
  45. if ($cat_to_delete < 1)
  46. message($lang_common['Bad request']);
  47. // User pressed the cancel button
  48. if (isset($_POST['del_cat_cancel']))
  49. redirect(forum_link($forum_url['admin_categories']), $lang_admin_common['Cancel redirect']);
  50. ($hook = get_hook('acg_del_cat_form_submitted')) ? eval($hook) : null;
  51. if (isset($_POST['del_cat_comply'])) // Delete a category with all forums and posts
  52. {
  53. @set_time_limit(0);
  54. $query = array(
  55. 'SELECT' => 'f.id',
  56. 'FROM' => 'forums AS f',
  57. 'WHERE' => 'cat_id='.$cat_to_delete
  58. );
  59. ($hook = get_hook('acg_del_cat_qr_get_forums_to_delete')) ? eval($hook) : null;
  60. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  61. $forum_ids = array();
  62. while ($cur_forum_id = $forum_db->fetch_assoc($result)) {
  63. $forum_ids[] = $cur_forum_id['id'];
  64. }
  65. if (!empty($forum_ids))
  66. {
  67. foreach ($forum_ids as $cur_forum)
  68. {
  69. // Prune all posts and topics
  70. prune($cur_forum, 1, -1);
  71. // Delete the forum
  72. $query = array(
  73. 'DELETE' => 'forums',
  74. 'WHERE' => 'id='.$cur_forum
  75. );
  76. ($hook = get_hook('acg_del_cat_qr_delete_forum')) ? eval($hook) : null;
  77. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  78. // Delete any forum subscriptions
  79. $query = array(
  80. 'DELETE' => 'forum_subscriptions',
  81. 'WHERE' => 'forum_id='.$cur_forum
  82. );
  83. ($hook = get_hook('acg_del_cat_qr_delete_forum_subscriptions')) ? eval($hook) : null;
  84. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  85. }
  86. }
  87. delete_orphans();
  88. // Delete the category
  89. $query = array(
  90. 'DELETE' => 'categories',
  91. 'WHERE' => 'id='.$cat_to_delete
  92. );
  93. ($hook = get_hook('acg_del_cat_qr_delete_category')) ? eval($hook) : null;
  94. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  95. // Regenerate the quickjump cache
  96. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  97. require FORUM_ROOT.'include/cache.php';
  98. generate_quickjump_cache();
  99. // Add flash message
  100. $forum_flash->add_info($lang_admin_categories['Category deleted']);
  101. ($hook = get_hook('acg_del_cat_pre_redirect')) ? eval($hook) : null;
  102. redirect(forum_link($forum_url['admin_categories']), $lang_admin_categories['Category deleted']);
  103. }
  104. else // If the user hasn't comfirmed the delete
  105. {
  106. $query = array(
  107. 'SELECT' => 'c.cat_name',
  108. 'FROM' => 'categories AS c',
  109. 'WHERE' => 'c.id='.$cat_to_delete
  110. );
  111. ($hook = get_hook('acg_del_cat_qr_get_category_name')) ? eval($hook) : null;
  112. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  113. $cat_name = $forum_db->result($result);
  114. if (is_null($cat_name) || $cat_name === false)
  115. message($lang_common['Bad request']);
  116. // Setup the form
  117. $forum_page['form_action'] = forum_link($forum_url['admin_categories']);
  118. $forum_page['hidden_fields'] = array(
  119. 'csrf_token' => '<input type="hidden" name="csrf_token" value="'.generate_form_token($forum_page['form_action']).'" />',
  120. 'cat_to_delete' => '<input type="hidden" name="cat_to_delete" value="'.$cat_to_delete.'" />'
  121. );
  122. // Setup breadcrumbs
  123. $forum_page['crumbs'] = array(
  124. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  125. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index'])),
  126. array($lang_admin_common['Start'], forum_link($forum_url['admin_index'])),
  127. array($lang_admin_common['Categories'], forum_link($forum_url['admin_categories'])),
  128. $lang_admin_categories['Delete category']
  129. );
  130. ($hook = get_hook('acg_del_cat_pre_header_load')) ? eval($hook) : null;
  131. define('FORUM_PAGE_SECTION', 'start');
  132. define('FORUM_PAGE', 'admin-categories');
  133. require FORUM_ROOT.'header.php';
  134. // START SUBST - <!-- forum_main -->
  135. ob_start();
  136. ($hook = get_hook('acg_del_cat_output_start')) ? eval($hook) : null;
  137. ?>
  138. <div class="main-subhead">
  139. <h2 class="hn"><span><?php printf($lang_admin_categories['Confirm delete cat'], forum_htmlencode($cat_name)) ?></span></h2>
  140. </div>
  141. <div class="main-content main-frm">
  142. <div class="ct-box warn-box">
  143. <p class="warn"><?php echo $lang_admin_categories['Delete category warning'] ?></p>
  144. </div>
  145. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo $forum_page['form_action'] ?>">
  146. <div class="hidden">
  147. <?php echo implode("\n\t\t\t\t", $forum_page['hidden_fields'])."\n" ?>
  148. </div>
  149. <div class="frm-buttons">
  150. <span class="submit primary caution"><input type="submit" name="del_cat_comply" value="<?php echo $lang_admin_categories['Delete category'] ?>" /></span>
  151. <span class="cancel"><input type="submit" name="del_cat_cancel" value="<?php echo $lang_admin_common['Cancel'] ?>" /></span>
  152. </div>
  153. </form>
  154. </div>
  155. <?php
  156. ($hook = get_hook('acg_del_cat_end')) ? eval($hook) : null;
  157. $tpl_temp = forum_trim(ob_get_contents());
  158. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  159. ob_end_clean();
  160. // END SUBST - <!-- forum_main -->
  161. require FORUM_ROOT.'footer.php';
  162. }
  163. }
  164. else if (isset($_POST['update'])) // Change position and name of the categories
  165. {
  166. $cat_order = array_map('intval', $_POST['cat_order']);
  167. $cat_name = array_map('trim', $_POST['cat_name']);
  168. ($hook = get_hook('acg_update_cats_form_submitted')) ? eval($hook) : null;
  169. $query = array(
  170. 'SELECT' => 'c.id, c.cat_name, c.disp_position',
  171. 'FROM' => 'categories AS c',
  172. 'ORDER BY' => 'c.id'
  173. );
  174. ($hook = get_hook('acg_update_cats_qr_get_categories')) ? eval($hook) : null;
  175. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  176. while ($cur_cat = $forum_db->fetch_assoc($result))
  177. {
  178. // If these aren't set, we're looking at a category that was added after
  179. // the admin started editing: we don't want to mess with it
  180. if (isset($cat_name[$cur_cat['id']]) && isset($cat_order[$cur_cat['id']]))
  181. {
  182. if ($cat_name[$cur_cat['id']] == '')
  183. message($lang_admin_categories['Must name category']);
  184. if ($cat_order[$cur_cat['id']] < 0)
  185. message($lang_admin_categories['Must be integer']);
  186. // We only want to update if we changed anything
  187. if ($cur_cat['cat_name'] != $cat_name[$cur_cat['id']] || $cur_cat['disp_position'] != $cat_order[$cur_cat['id']])
  188. {
  189. $query = array(
  190. 'UPDATE' => 'categories',
  191. 'SET' => 'cat_name=\''.$forum_db->escape($cat_name[$cur_cat['id']]).'\', disp_position='.$cat_order[$cur_cat['id']],
  192. 'WHERE' => 'id='.$cur_cat['id']
  193. );
  194. ($hook = get_hook('acg_update_cats_qr_update_category')) ? eval($hook) : null;
  195. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  196. }
  197. }
  198. }
  199. // Regenerate the quickjump cache
  200. if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
  201. require FORUM_ROOT.'include/cache.php';
  202. generate_quickjump_cache();
  203. // Add flash message
  204. $forum_flash->add_info($lang_admin_categories['Categories updated']);
  205. ($hook = get_hook('acg_update_cats_pre_redirect')) ? eval($hook) : null;
  206. redirect(forum_link($forum_url['admin_categories']), $lang_admin_categories['Categories updated']);
  207. }
  208. // Generate an array with all categories
  209. $query = array(
  210. 'SELECT' => 'c.id, c.cat_name, c.disp_position',
  211. 'FROM' => 'categories AS c',
  212. 'ORDER BY' => 'c.disp_position'
  213. );
  214. ($hook = get_hook('acg_qr_get_categories')) ? eval($hook) : null;
  215. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  216. $cat_list = array();
  217. while ($cur_cat = $forum_db->fetch_assoc($result))
  218. {
  219. $cat_list[] = $cur_cat;
  220. }
  221. // Setup the form
  222. $forum_page['group_count'] = $forum_page['item_count'] = $forum_page['fld_count'] = 0;
  223. $forum_page['form_action'] = forum_link($forum_url['admin_categories']).'?action=foo';
  224. $forum_page['hidden_fields'] = array(
  225. 'csrf_token' => '<input type="hidden" name="csrf_token" value="'.generate_form_token($forum_page['form_action']).'" />'
  226. );
  227. // Setup breadcrumbs
  228. $forum_page['crumbs'] = array(
  229. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  230. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index'])),
  231. array($lang_admin_common['Start'], forum_link($forum_url['admin_index'])),
  232. array($lang_admin_common['Categories'], forum_link($forum_url['admin_categories']))
  233. );
  234. ($hook = get_hook('acg_pre_header_load')) ? eval($hook) : null;
  235. define('FORUM_PAGE_SECTION', 'start');
  236. define('FORUM_PAGE', 'admin-categories');
  237. require FORUM_ROOT.'header.php';
  238. // START SUBST - <!-- forum_main -->
  239. ob_start();
  240. ($hook = get_hook('acg_main_output_start')) ? eval($hook) : null;
  241. ?>
  242. <div class="main-subhead">
  243. <h2 class="hn"><span><?php echo $lang_admin_categories['Add category head'] ?></span></h2>
  244. </div>
  245. <div class="main-content main-frm">
  246. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo $forum_page['form_action'] ?>">
  247. <div class="hidden">
  248. <?php echo implode("\n\t\t\t\t", $forum_page['hidden_fields'])."\n" ?>
  249. </div>
  250. <?php ($hook = get_hook('acg_pre_add_cat_fieldset')) ? eval($hook) : null; ?>
  251. <div class="ct-box">
  252. <p><?php printf($lang_admin_categories['Add category info'], '<a href="'.forum_link($forum_url['admin_forums']).'">'.$lang_admin_categories['Add category info link text'].'</a>') ?></p>
  253. </div>
  254. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  255. <legend class="group-legend"><span><?php echo $lang_admin_categories['Add category legend'] ?></span></legend>
  256. <?php ($hook = get_hook('acg_pre_new_category_name')) ? eval($hook) : null; ?>
  257. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  258. <div class="sf-box text">
  259. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_categories['New category label'] ?></span></label><br />
  260. <span class="fld-input"><input type="text" id="fld<?php echo $forum_page['fld_count'] ?>" name="new_cat_name" size="35" maxlength="80" required /></span>
  261. </div>
  262. </div>
  263. <?php ($hook = get_hook('acg_pre_new_category_position')) ? eval($hook) : null; ?>
  264. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  265. <div class="sf-box text">
  266. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_categories['Position label'] ?></span></label><br />
  267. <span class="fld-input"><input type="number" id="fld<?php echo $forum_page['fld_count'] ?>" name="position" size="3" maxlength="3" /></span>
  268. </div>
  269. </div>
  270. <?php ($hook = get_hook('acg_pre_add_cat_fieldset_end')) ? eval($hook) : null; ?>
  271. </fieldset>
  272. <?php ($hook = get_hook('acg_add_cat_fieldset_end')) ? eval($hook) : null; ?>
  273. <div class="frm-buttons">
  274. <span class="submit primary"><input type="submit" name="add_cat" value="<?php echo $lang_admin_categories['Add category'] ?>" /></span>
  275. </div>
  276. </form>
  277. </div>
  278. <?php
  279. ($hook = get_hook('acg_post_add_cat_form')) ? eval($hook) : null;
  280. // Reset counter
  281. $forum_page['group_count'] = $forum_page['item_count'] = 0;
  282. if (!empty($cat_list))
  283. {
  284. ?>
  285. <div class="main-subhead">
  286. <h2 class="hn"><span><?php echo $lang_admin_categories['Del category head'] ?></span></h2>
  287. </div>
  288. <div class="main-content main-frm">
  289. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo $forum_page['form_action'] ?>">
  290. <div class="hidden">
  291. <?php echo implode("\n\t\t\t\t", $forum_page['hidden_fields'])."\n" ?>
  292. </div>
  293. <?php ($hook = get_hook('acg_pre_del_cat_fieldset')) ? eval($hook) : null; ?>
  294. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  295. <legend class="group-legend"><strong><?php echo $lang_admin_categories['Delete category'] ?></strong></legend>
  296. <?php ($hook = get_hook('acg_pre_del_category_select')) ? eval($hook) : null; ?>
  297. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  298. <div class="sf-box select">
  299. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_categories['Select category label'] ?></span> <small><?php echo $lang_admin_common['Delete help'] ?></small></label><br />
  300. <span class="fld-input"><select id="fld<?php echo $forum_page['fld_count'] ?>" name="cat_to_delete">
  301. <?php
  302. foreach ($cat_list as $cur_category)
  303. {
  304. echo "\t\t\t\t\t\t\t".'<option value="'.$cur_category['id'].'">'.forum_htmlencode($cur_category['cat_name']).'</option>'."\n";
  305. }
  306. ?>
  307. </select></span>
  308. </div>
  309. </div>
  310. <?php ($hook = get_hook('acg_pre_del_cat_fieldset_end')) ? eval($hook) : null; ?>
  311. </fieldset>
  312. <?php ($hook = get_hook('acg_del_cat_fieldset_end')) ? eval($hook) : null; ?>
  313. <div class="frm-buttons">
  314. <span class="submit primary"><input type="submit" name="del_cat" value="<?php echo $lang_admin_categories['Delete category'] ?>" /></span>
  315. </div>
  316. </form>
  317. </div>
  318. <?php
  319. ($hook = get_hook('acg_post_del_cat_form')) ? eval($hook) : null;
  320. // Reset counter
  321. $forum_page['group_count'] = $forum_page['item_count'] = 0;
  322. ?>
  323. <div class="main-subhead">
  324. <h2 class="hn"><span><?php echo $lang_admin_categories['Edit categories head'] ?></span></h2>
  325. </div>
  326. <div class="main-content main-frm">
  327. <form class="frm-form" method="post" accept-charset="utf-8" action="<?php echo $forum_page['form_action'] ?>">
  328. <div class="hidden">
  329. <?php echo implode("\n\t\t\t\t", $forum_page['hidden_fields'])."\n" ?>
  330. </div>
  331. <?php
  332. ($hook = get_hook('acg_edit_cat_fieldsets_start')) ? eval($hook) : null;
  333. foreach ($cat_list as $cur_category)
  334. {
  335. $forum_page['item_count'] = 0;
  336. ($hook = get_hook('acg_pre_edit_cur_cat_fieldset')) ? eval($hook) : null;
  337. ?>
  338. <fieldset class="frm-group group<?php echo ++$forum_page['group_count'] ?>">
  339. <legend class="group-legend"><span><?php echo $lang_admin_categories['Edit category legend'] ?></span></legend>
  340. <div class="sf-set set<?php echo ++$forum_page['item_count'] ?>">
  341. <?php ($hook = get_hook('acg_pre_edit_cat_name')) ? eval($hook) : null; ?>
  342. <div class="sf-box text">
  343. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_categories['Category name label'] ?></span></label><br />
  344. <span class="fld-input"><input type="text" id="fld<?php echo $forum_page['fld_count'] ?>" name="cat_name[<?php echo $cur_category['id'] ?>]" value="<?php echo forum_htmlencode($cur_category['cat_name']) ?>" size="35" maxlength="80" required /></span>
  345. </div>
  346. <?php ($hook = get_hook('acg_pre_edit_cat_position')) ? eval($hook) : null; ?>
  347. <div class="sf-box text">
  348. <label for="fld<?php echo ++$forum_page['fld_count'] ?>"><span><?php echo $lang_admin_categories['Position label'] ?></span></label><br />
  349. <span class="fld-input"><input type="number" id="fld<?php echo $forum_page['fld_count'] ?>" name="cat_order[<?php echo $cur_category['id'] ?>]" value="<?php echo $cur_category['disp_position'] ?>" size="3" maxlength="3" /></span>
  350. </div>
  351. </div>
  352. <?php ($hook = get_hook('acg_pre_edit_cur_cat_fieldset_end')) ? eval($hook) : null; ?>
  353. </fieldset>
  354. <?php
  355. ($hook = get_hook('acg_edit_cur_cat_fieldset_end')) ? eval($hook) : null;
  356. }
  357. ($hook = get_hook('acg_edit_cat_fieldsets_end')) ? eval($hook) : null;
  358. ?>
  359. <div class="frm-buttons">
  360. <span class="submit primary"><input type="submit" name="update" value="<?php echo $lang_admin_categories['Update all categories'] ?>" /></span>
  361. </div>
  362. </form>
  363. </div>
  364. <?php
  365. ($hook = get_hook('acg_post_edit_cat_form')) ? eval($hook) : null;
  366. }
  367. ($hook = get_hook('acg_end')) ? eval($hook) : null;
  368. $tpl_temp = forum_trim(ob_get_contents());
  369. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  370. ob_end_clean();
  371. // END SUBST - <!-- forum_main -->
  372. require FORUM_ROOT.'footer.php';