|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
/** |
|
4
|
|
|
* Manage and maintain the boards and categories of the forum. |
|
5
|
|
|
* |
|
6
|
|
|
* @package ElkArte Forum |
|
7
|
|
|
* @copyright ElkArte Forum contributors |
|
8
|
|
|
* @license BSD http://opensource.org/licenses/BSD-3-Clause (see accompanying LICENSE.txt file) |
|
9
|
|
|
* |
|
10
|
|
|
* This file contains code covered by: |
|
11
|
|
|
* copyright: 2011 Simple Machines (http://www.simplemachines.org) |
|
12
|
|
|
* |
|
13
|
|
|
* @version 2.0 dev |
|
14
|
|
|
* |
|
15
|
|
|
*/ |
|
16
|
|
|
|
|
17
|
|
|
namespace ElkArte\AdminController; |
|
18
|
|
|
|
|
19
|
|
|
use BBC\ParserWrapper; |
|
20
|
|
|
use ElkArte\AbstractController; |
|
21
|
|
|
use ElkArte\Action; |
|
22
|
|
|
use ElkArte\BoardsTree; |
|
23
|
|
|
use ElkArte\Converters\Html2BBC; |
|
24
|
|
|
use ElkArte\Exceptions\Exception; |
|
25
|
|
|
use ElkArte\Helper\Util; |
|
26
|
|
|
use ElkArte\Languages\Txt; |
|
27
|
|
|
use ElkArte\SettingsForm\SettingsForm; |
|
28
|
|
|
|
|
29
|
|
|
/** |
|
30
|
|
|
* This class controls execution for actions in the manage boards area |
|
31
|
|
|
* of the admin panel. |
|
32
|
|
|
* |
|
33
|
|
|
* @package Boards |
|
34
|
|
|
*/ |
|
35
|
|
|
class ManageBoards extends AbstractController |
|
36
|
|
|
{ |
|
37
|
|
|
/** @var int Category being worked on */ |
|
38
|
|
|
public int $cat; |
|
39
|
|
|
|
|
40
|
|
|
/** @var int Current board id being modified */ |
|
41
|
|
|
public int $boardid; |
|
42
|
|
|
|
|
43
|
|
|
/** |
|
44
|
|
|
* The main dispatcher; delegates. |
|
45
|
|
|
* |
|
46
|
|
|
* What it does: |
|
47
|
|
|
* |
|
48
|
|
|
* - This is the main entry point for all the manageboards admin screens. |
|
49
|
|
|
* - Called by ?action=admin;area=manageboards. |
|
50
|
|
|
* - It checks the permissions, based on the sub-action, and calls a function based on the sub-action. |
|
51
|
|
|
* |
|
52
|
|
|
* @uses ManageBoards language file. |
|
53
|
|
|
*/ |
|
54
|
|
|
public function action_index() |
|
55
|
|
|
{ |
|
56
|
|
|
global $context; |
|
57
|
|
|
|
|
58
|
|
|
// Everything's gonna need this. |
|
59
|
|
|
Txt::load('ManageBoards'); |
|
60
|
|
|
|
|
61
|
|
|
// Format: 'sub-action' => array('controller', 'function', 'permission'=>'need') |
|
62
|
|
|
$subActions = [ |
|
63
|
|
|
'board' => [ |
|
64
|
|
|
'controller' => $this, |
|
65
|
|
|
'function' => 'action_board', |
|
66
|
|
|
'permission' => 'manage_boards'], |
|
67
|
|
|
'board2' => [ |
|
68
|
|
|
'controller' => $this, |
|
69
|
|
|
'function' => 'action_board2', |
|
70
|
|
|
'permission' => 'manage_boards'], |
|
71
|
|
|
'cat' => [ |
|
72
|
|
|
'controller' => $this, |
|
73
|
|
|
'function' => 'action_cat', |
|
74
|
|
|
'permission' => 'manage_boards'], |
|
75
|
|
|
'cat2' => [ |
|
76
|
|
|
'controller' => $this, |
|
77
|
|
|
'function' => 'action_cat2', |
|
78
|
|
|
'permission' => 'manage_boards'], |
|
79
|
|
|
'main' => [ |
|
80
|
|
|
'controller' => $this, |
|
81
|
|
|
'function' => 'action_main', |
|
82
|
|
|
'permission' => 'manage_boards'], |
|
83
|
|
|
'move' => [ |
|
84
|
|
|
'controller' => $this, |
|
85
|
|
|
'function' => 'action_main', |
|
86
|
|
|
'permission' => 'manage_boards'], |
|
87
|
|
|
'newcat' => [ |
|
88
|
|
|
'controller' => $this, |
|
89
|
|
|
'function' => 'action_cat', |
|
90
|
|
|
'permission' => 'manage_boards'], |
|
91
|
|
|
'newboard' => [ |
|
92
|
|
|
'controller' => $this, |
|
93
|
|
|
'function' => 'action_board', |
|
94
|
|
|
'permission' => 'manage_boards'], |
|
95
|
|
|
'settings' => [ |
|
96
|
|
|
'controller' => $this, |
|
97
|
|
|
'function' => 'action_boardSettings_display', |
|
98
|
|
|
'permission' => 'admin_forum'], |
|
99
|
|
|
]; |
|
100
|
|
|
|
|
101
|
|
|
// You way will end here if you don't have permission. |
|
102
|
|
|
$action = new Action('manage_boards'); |
|
103
|
|
|
|
|
104
|
|
|
// Default to sub-action 'main' or 'settings' depending on permissions. |
|
105
|
|
|
$subAction = $action->initialize($subActions, allowedTo('manage_boards') ? 'main' : 'settings'); |
|
106
|
|
|
$context['sub_action'] = $subAction; |
|
107
|
|
|
|
|
108
|
|
|
// Create the tabs for the template. |
|
109
|
|
|
$context[$context['admin_menu_name']]['object']->prepareTabData([ |
|
110
|
|
|
'title' => 'boards_and_cats', |
|
111
|
|
|
'help' => 'manage_boards', |
|
112
|
|
|
'description' => 'boards_and_cats_desc', |
|
113
|
|
|
'prefix' => 'mboards', |
|
114
|
|
|
]); |
|
115
|
|
|
|
|
116
|
|
|
$action->dispatch($subAction); |
|
117
|
|
|
} |
|
118
|
|
|
|
|
119
|
|
|
/** |
|
120
|
|
|
* The main control panel thing, the screen showing all boards and categories. |
|
121
|
|
|
* |
|
122
|
|
|
* What it does: |
|
123
|
|
|
* |
|
124
|
|
|
* - Called by ?action=admin;area=manageboards or ?action=admin;area=manageboards;sa=move. |
|
125
|
|
|
* - Requires manage_boards permission. |
|
126
|
|
|
* - It also handles the interface for moving boards. |
|
127
|
|
|
* |
|
128
|
|
|
* @event integrate_boards_main Used to access global board arrays before the template |
|
129
|
|
|
* @uses ManageBoards template, main sub-template. |
|
130
|
|
|
*/ |
|
131
|
|
|
public function action_main(): void |
|
132
|
|
|
{ |
|
133
|
|
|
global $txt, $context; |
|
134
|
|
|
|
|
135
|
|
|
theme()->getTemplates()->load('ManageBoards'); |
|
136
|
|
|
|
|
137
|
|
|
require_once(SUBSDIR . '/Boards.subs.php'); |
|
138
|
|
|
|
|
139
|
|
|
// Moving a board, child of, before, after, top |
|
140
|
|
|
if ($this->_req->compareQuery('sa', 'move', 'trim|strval') |
|
141
|
|
|
&& in_array($this->_req->query->move_to, ['child', 'before', 'after', 'top'])) |
|
142
|
|
|
{ |
|
143
|
|
|
checkSession('get'); |
|
144
|
|
|
validateToken('admin-bm-' . (int) $this->_req->query->src_board, 'request'); |
|
145
|
|
|
|
|
146
|
|
|
// Top is special, its the top! |
|
147
|
|
|
if ($this->_req->query->move_to === 'top') |
|
148
|
|
|
{ |
|
149
|
|
|
$boardOptions = [ |
|
150
|
|
|
'move_to' => $this->_req->query->move_to, |
|
151
|
|
|
'target_category' => $this->_req->getQuery('target_cat', 'intval', 0), |
|
152
|
|
|
'move_first_child' => true, |
|
153
|
|
|
]; |
|
154
|
|
|
} |
|
155
|
|
|
// Moving it after another board |
|
156
|
|
|
else |
|
157
|
|
|
{ |
|
158
|
|
|
$boardOptions = [ |
|
159
|
|
|
'move_to' => $this->_req->query->move_to, |
|
160
|
|
|
'target_board' => $this->_req->getQuery('target_board', 'intval', 0), |
|
161
|
|
|
'move_first_child' => true, |
|
162
|
|
|
]; |
|
163
|
|
|
} |
|
164
|
|
|
|
|
165
|
|
|
// Use modifyBoard to perform the action |
|
166
|
|
|
modifyBoard((int) $this->_req->query->src_board, $boardOptions); |
|
167
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
168
|
|
|
} |
|
169
|
|
|
|
|
170
|
|
|
$boardTree = new BoardsTree(database()); |
|
171
|
|
|
$boards = $boardTree->getBoards(); |
|
172
|
|
|
$boardList = $boardTree->getBoardList(); |
|
173
|
|
|
|
|
174
|
|
|
createToken('admin-sort'); |
|
175
|
|
|
$move_board = $this->_req->getQuery('move', 'intval', 0); |
|
176
|
|
|
$context['move_board'] = isset($boards[$move_board]) ? $move_board : 0; |
|
177
|
|
|
|
|
178
|
|
|
$bbc_parser = ParserWrapper::instance(); |
|
179
|
|
|
$cat_tree = $boardTree->getCategories(); |
|
180
|
|
|
|
|
181
|
|
|
$context['categories'] = []; |
|
182
|
|
|
foreach ($cat_tree as $catid => $tree) |
|
183
|
|
|
{ |
|
184
|
|
|
$context['categories'][$catid] = [ |
|
185
|
|
|
'name' => $tree['node']['name'], |
|
186
|
|
|
'id' => $tree['node']['id'], |
|
187
|
|
|
'boards' => [] |
|
188
|
|
|
]; |
|
189
|
|
|
$move_cat = !empty($context['move_board']) && $boards[$context['move_board']]['category'] === $catid; |
|
190
|
|
|
foreach ($boardList[$catid] as $boardid) |
|
191
|
|
|
{ |
|
192
|
|
|
$boards[$boardid]['description'] = $bbc_parser->parseBoard($boards[$boardid]['description']); |
|
193
|
|
|
$context['categories'][$catid]['boards'][$boardid] = [ |
|
194
|
|
|
'id' => $boards[$boardid]['id'], |
|
195
|
|
|
'name' => $boards[$boardid]['name'], |
|
196
|
|
|
'description' => $boards[$boardid]['description'], |
|
197
|
|
|
'child_level' => $boards[$boardid]['level'], |
|
198
|
|
|
'move' => $move_cat && ($boardid === $context['move_board'] || $boardTree->isChildOf($boardid, (int) $context['move_board'])), |
|
199
|
|
|
'permission_profile' => $boards[$boardid]['profile'], |
|
200
|
|
|
]; |
|
201
|
|
|
} |
|
202
|
|
|
} |
|
203
|
|
|
|
|
204
|
|
|
if (!empty($context['move_board'])) |
|
205
|
|
|
{ |
|
206
|
|
|
createToken('admin-bm-' . $context['move_board'], 'request'); |
|
207
|
|
|
|
|
208
|
|
|
$context['move_title'] = sprintf($txt['mboards_select_destination'], htmlspecialchars($boards[$context['move_board']]['name'], ENT_COMPAT, 'UTF-8')); |
|
209
|
|
|
foreach ($cat_tree as $catid => $tree) |
|
210
|
|
|
{ |
|
211
|
|
|
$prev_child_level = 0; |
|
212
|
|
|
$prev_board = 0; |
|
213
|
|
|
$stack = []; |
|
214
|
|
|
|
|
215
|
|
|
// Just a shortcut, this is the same for all the urls |
|
216
|
|
|
$security_token = $context['admin-bm-' . $context['move_board'] . '_token_var'] . '=' . $context['admin-bm-' . $context['move_board'] . '_token']; |
|
217
|
|
|
foreach ($boardList[$catid] as $boardid) |
|
218
|
|
|
{ |
|
219
|
|
|
if (!isset($context['categories'][$catid]['move_link'])) |
|
220
|
|
|
{ |
|
221
|
|
|
$context['categories'][$catid]['move_link'] = [ |
|
222
|
|
|
'child_level' => 0, |
|
223
|
|
|
'label' => $txt['mboards_order_before'] . " '" . htmlspecialchars($boards[$boardid]['name'], ENT_COMPAT, 'UTF-8') . "'", |
|
224
|
|
|
'href' => getUrl('admin', ['action' => 'admin', 'area' => 'manageboards', 'sa' => 'move', 'src_board' => $context['move_board'], 'target_board' => $boardid, 'move_to' => 'before', '{session_data}', $security_token]), |
|
225
|
|
|
]; |
|
226
|
|
|
} |
|
227
|
|
|
|
|
228
|
|
|
if (!$context['categories'][$catid]['boards'][$boardid]['move']) |
|
229
|
|
|
{ |
|
230
|
|
|
$context['categories'][$catid]['boards'][$boardid]['move_links'] = [ |
|
231
|
|
|
[ |
|
232
|
|
|
'child_level' => $boards[$boardid]['level'], |
|
233
|
|
|
'label' => $txt['mboards_order_after'] . "'" . htmlspecialchars($boards[$boardid]['name'], ENT_COMPAT, 'UTF-8') . "'", |
|
234
|
|
|
'href' => getUrl('admin', ['action' => 'admin', 'area' => 'manageboards', 'sa' => 'move', 'src_board' => $context['move_board'], 'target_board' => $boardid, 'move_to' => 'after', '{session_data}', $security_token]), |
|
235
|
|
|
], |
|
236
|
|
|
[ |
|
237
|
|
|
'child_level' => $boards[$boardid]['level'] + 1, |
|
238
|
|
|
'label' => $txt['mboards_order_child_of'] . " '" . htmlspecialchars($boards[$boardid]['name'], ENT_COMPAT, 'UTF-8') . "'", |
|
239
|
|
|
'href' => getUrl('admin', ['action' => 'admin', 'area' => 'manageboards', 'sa' => 'move', 'src_board' => $context['move_board'], 'target_board' => $boardid, 'move_to' => 'child', '{session_data}', $security_token]), |
|
240
|
|
|
], |
|
241
|
|
|
]; |
|
242
|
|
|
} |
|
243
|
|
|
|
|
244
|
|
|
$difference = $boards[$boardid]['level'] - $prev_child_level; |
|
245
|
|
|
if ($difference === 1) |
|
246
|
|
|
{ |
|
247
|
|
|
$stack[] = empty($context['categories'][$catid]['boards'][$prev_board]['move_links']) ? null : array_shift($context['categories'][$catid]['boards'][$prev_board]['move_links']); |
|
248
|
|
|
} |
|
249
|
|
|
elseif ($difference < 0) |
|
250
|
|
|
{ |
|
251
|
|
|
if (empty($context['categories'][$catid]['boards'][$prev_board]['move_links'])) |
|
252
|
|
|
{ |
|
253
|
|
|
$context['categories'][$catid]['boards'][$prev_board]['move_links'] = []; |
|
254
|
|
|
} |
|
255
|
|
|
|
|
256
|
|
|
for ($i = 0; $i < -$difference; $i++) |
|
257
|
|
|
{ |
|
258
|
|
|
if (($temp = array_pop($stack)) !== null) |
|
259
|
|
|
{ |
|
260
|
|
|
array_unshift($context['categories'][$catid]['boards'][$prev_board]['move_links'], $temp); |
|
261
|
|
|
} |
|
262
|
|
|
} |
|
263
|
|
|
} |
|
264
|
|
|
|
|
265
|
|
|
$prev_board = $boardid; |
|
266
|
|
|
$prev_child_level = $boards[$boardid]['level']; |
|
267
|
|
|
} |
|
268
|
|
|
|
|
269
|
|
|
if (!empty($stack) && !empty($context['categories'][$catid]['boards'][$prev_board]['move_links'])) |
|
270
|
|
|
{ |
|
271
|
|
|
$context['categories'][$catid]['boards'][$prev_board]['move_links'] = array_merge($stack, $context['categories'][$catid]['boards'][$prev_board]['move_links']); |
|
272
|
|
|
} |
|
273
|
|
|
elseif (!empty($stack)) |
|
274
|
|
|
{ |
|
275
|
|
|
$context['categories'][$catid]['boards'][$prev_board]['move_links'] = $stack; |
|
276
|
|
|
} |
|
277
|
|
|
|
|
278
|
|
|
if (empty($boardList[$catid])) |
|
279
|
|
|
{ |
|
280
|
|
|
$context['categories'][$catid]['move_link'] = [ |
|
281
|
|
|
'child_level' => 0, |
|
282
|
|
|
'label' => $txt['mboards_order_before'] . " '" . htmlspecialchars($tree['node']['name'], ENT_COMPAT, 'UTF-8') . "'", |
|
283
|
|
|
'href' => getUrl('admin', ['action' => 'admin', 'area' => 'manageboards', 'sa' => 'move', 'src_board' => $context['move_board'], 'target_cat' => $catid, 'move_to' => 'top', '{session_data}', $security_token]), |
|
284
|
|
|
]; |
|
285
|
|
|
} |
|
286
|
|
|
} |
|
287
|
|
|
} |
|
288
|
|
|
|
|
289
|
|
|
call_integration_hook('integrate_boards_main'); |
|
290
|
|
|
|
|
291
|
|
|
$context['page_title'] = $txt['boards_and_cats']; |
|
292
|
|
|
$context['sub_template'] = 'manage_boards'; |
|
293
|
|
|
$context['can_manage_permissions'] = allowedTo('manage_permissions'); |
|
294
|
|
|
} |
|
295
|
|
|
|
|
296
|
|
|
/** |
|
297
|
|
|
* Function for handling a submitted form saving the category. |
|
298
|
|
|
* |
|
299
|
|
|
* What it does: |
|
300
|
|
|
* |
|
301
|
|
|
* - complete the modifications to a specific category. |
|
302
|
|
|
* - It also handles deletion of a category. |
|
303
|
|
|
* - It requires manage_boards permission. |
|
304
|
|
|
* - Called by ?action=admin;area=manageboards;sa=cat2 |
|
305
|
|
|
* - Redirects to ?action=admin;area=manageboards. |
|
306
|
|
|
*/ |
|
307
|
|
|
public function action_cat2(): void |
|
308
|
|
|
{ |
|
309
|
|
|
checkSession(); |
|
310
|
|
|
validateToken('admin-bc-' . $this->_req->post->cat); |
|
311
|
|
|
|
|
312
|
|
|
require_once(SUBSDIR . '/Categories.subs.php'); |
|
313
|
|
|
|
|
314
|
|
|
$this->cat = $this->_req->getPost('cat', 'intval'); |
|
315
|
|
|
|
|
316
|
|
|
// Add a new category or modify an existing one.. |
|
317
|
|
|
if (isset($this->_req->post->edit) || isset($this->_req->post->add)) |
|
318
|
|
|
{ |
|
319
|
|
|
$catOptions = []; |
|
320
|
|
|
|
|
321
|
|
|
if (isset($this->_req->post->cat_order)) |
|
322
|
|
|
{ |
|
323
|
|
|
$catOptions['move_after'] = (int) $this->_req->post->cat_order; |
|
324
|
|
|
} |
|
325
|
|
|
|
|
326
|
|
|
// Change "This & That" to "This & That" but don't change "¢" to "&cent;"... |
|
327
|
|
|
$catOptions['cat_name'] = preg_replace('~[&]([^;]{8}|[^;]{0,8}$)~', '&$1', $this->_req->post->cat_name); |
|
328
|
|
|
$catOptions['is_collapsible'] = isset($this->_req->post->collapse); |
|
329
|
|
|
|
|
330
|
|
|
if (isset($this->_req->post->add)) |
|
331
|
|
|
{ |
|
332
|
|
|
createCategory($catOptions); |
|
333
|
|
|
} |
|
334
|
|
|
else |
|
335
|
|
|
{ |
|
336
|
|
|
modifyCategory($this->cat, $catOptions); |
|
337
|
|
|
} |
|
338
|
|
|
} |
|
339
|
|
|
// If they want to delete - first give them confirmation. |
|
340
|
|
|
elseif (isset($this->_req->post->delete) && !isset($this->_req->post->confirmation) && !isset($this->_req->post->empty)) |
|
341
|
|
|
{ |
|
342
|
|
|
$this->action_cat(); |
|
343
|
|
|
|
|
344
|
|
|
return; |
|
345
|
|
|
} |
|
346
|
|
|
// Delete the category! |
|
347
|
|
|
elseif (isset($this->_req->post->delete)) |
|
348
|
|
|
{ |
|
349
|
|
|
// First off - check if we are moving all the current boards first - before we start deleting! |
|
350
|
|
|
if ($this->_req->comparePost('delete_action', 1, 'intval')) |
|
351
|
|
|
{ |
|
352
|
|
|
if (empty($this->_req->post->cat_to)) |
|
353
|
|
|
{ |
|
354
|
|
|
throw new Exception('mboards_delete_error'); |
|
355
|
|
|
} |
|
356
|
|
|
|
|
357
|
|
|
deleteCategories([$this->cat], $this->_req->getPost('cat_to', 'intval')); |
|
358
|
|
|
} |
|
359
|
|
|
else |
|
360
|
|
|
{ |
|
361
|
|
|
deleteCategories([$this->cat]); |
|
362
|
|
|
} |
|
363
|
|
|
} |
|
364
|
|
|
|
|
365
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
366
|
|
|
} |
|
367
|
|
|
|
|
368
|
|
|
/** |
|
369
|
|
|
* Modify a specific category. |
|
370
|
|
|
* |
|
371
|
|
|
* What it does: |
|
372
|
|
|
* |
|
373
|
|
|
* - screen for editing and repositioning a category. |
|
374
|
|
|
* - Also used to show the confirm deletion of category screen |
|
375
|
|
|
* - Called by ?action=admin;area=manageboards;sa=cat |
|
376
|
|
|
* - Requires manage_boards permission. |
|
377
|
|
|
* |
|
378
|
|
|
* @event integrate_edit_category access category globals before the template |
|
379
|
|
|
* @uses ManageBoards template, modify_category sub-template. |
|
380
|
|
|
*/ |
|
381
|
|
|
public function action_cat(): void |
|
382
|
|
|
{ |
|
383
|
|
|
global $txt, $context; |
|
384
|
|
|
|
|
385
|
|
|
theme()->getTemplates()->load('ManageBoards'); |
|
386
|
|
|
require_once(SUBSDIR . '/Boards.subs.php'); |
|
387
|
|
|
$boardTree = new BoardsTree(database()); |
|
388
|
|
|
$cat_tree = $boardTree->getCategories(); |
|
389
|
|
|
|
|
390
|
|
|
// id_cat must be a number.... if it exists. |
|
391
|
|
|
$this->cat = $this->_req->getQuery('cat', 'intval', 0); |
|
392
|
|
|
|
|
393
|
|
|
// Start with one - "In first place". |
|
394
|
|
|
$context['category_order'] = [ |
|
395
|
|
|
[ |
|
396
|
|
|
'id' => 0, |
|
397
|
|
|
'name' => $txt['mboards_order_first'], |
|
398
|
|
|
'selected' => !empty($this->cat) && !empty($cat_tree[$this->cat]['is_first']), |
|
399
|
|
|
'true_name' => '' |
|
400
|
|
|
] |
|
401
|
|
|
]; |
|
402
|
|
|
|
|
403
|
|
|
// If this is a new category set up some defaults. |
|
404
|
|
|
if ($this->_req->compareQuery('sa', 'newcat', 'trim')) |
|
405
|
|
|
{ |
|
406
|
|
|
$context['category'] = [ |
|
407
|
|
|
'id' => 0, |
|
408
|
|
|
'name' => $txt['mboards_new_cat_name'], |
|
409
|
|
|
'editable_name' => htmlspecialchars($txt['mboards_new_cat_name'], ENT_COMPAT, 'UTF-8'), |
|
410
|
|
|
'can_collapse' => true, |
|
411
|
|
|
'is_new' => true, |
|
412
|
|
|
'is_empty' => true |
|
413
|
|
|
]; |
|
414
|
|
|
} |
|
415
|
|
|
// Category doesn't exist, man... sorry. |
|
416
|
|
|
elseif ($boardTree->categoryExists($this->cat) === false) |
|
417
|
|
|
{ |
|
418
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
419
|
|
|
} |
|
420
|
|
|
else |
|
421
|
|
|
{ |
|
422
|
|
|
$context['category'] = [ |
|
423
|
|
|
'id' => $this->cat, |
|
424
|
|
|
'name' => $cat_tree[$this->cat]['node']['name'], |
|
425
|
|
|
'editable_name' => htmlspecialchars($cat_tree[$this->cat]['node']['name'], ENT_COMPAT, 'UTF-8'), |
|
426
|
|
|
'can_collapse' => !empty($cat_tree[$this->cat]['node']['can_collapse']), |
|
427
|
|
|
'children' => [], |
|
428
|
|
|
'is_empty' => empty($cat_tree[$this->cat]['children']) |
|
429
|
|
|
]; |
|
430
|
|
|
|
|
431
|
|
|
$boardCat = $boardTree->getBoardsInCat($this->cat); |
|
432
|
|
|
$boards = $boardTree->getBoards(); |
|
433
|
|
|
foreach ($boardCat as $child_board) |
|
434
|
|
|
{ |
|
435
|
|
|
$context['category']['children'][] = str_repeat('-', $boards[$child_board]['level']) . ' ' . $boards[$child_board]['name']; |
|
436
|
|
|
} |
|
437
|
|
|
} |
|
438
|
|
|
|
|
439
|
|
|
$prevCat = 0; |
|
440
|
|
|
foreach ($cat_tree as $catid => $tree) |
|
441
|
|
|
{ |
|
442
|
|
|
if ($catid === $this->cat && $prevCat > 0) |
|
443
|
|
|
{ |
|
444
|
|
|
$context['category_order'][$prevCat]['selected'] = true; |
|
445
|
|
|
} |
|
446
|
|
|
elseif ($catid !== $this->cat) |
|
447
|
|
|
{ |
|
448
|
|
|
$context['category_order'][$catid] = [ |
|
449
|
|
|
'id' => $catid, |
|
450
|
|
|
'name' => $txt['mboards_order_after'] . $tree['node']['name'], |
|
451
|
|
|
'selected' => false, |
|
452
|
|
|
'true_name' => $tree['node']['name'] |
|
453
|
|
|
]; |
|
454
|
|
|
} |
|
455
|
|
|
|
|
456
|
|
|
$prevCat = $catid; |
|
457
|
|
|
} |
|
458
|
|
|
|
|
459
|
|
|
if (!isset($this->_req->query->delete)) |
|
460
|
|
|
{ |
|
461
|
|
|
$context['sub_template'] = 'modify_category'; |
|
462
|
|
|
$context['page_title'] = $this->_req->compareQuery('sa', 'newcat') ? $txt['mboards_new_cat_name'] : $txt['catEdit']; |
|
463
|
|
|
} |
|
464
|
|
|
else |
|
465
|
|
|
{ |
|
466
|
|
|
$context['sub_template'] = 'confirm_category_delete'; |
|
467
|
|
|
$context['page_title'] = $txt['mboards_delete_cat']; |
|
468
|
|
|
} |
|
469
|
|
|
|
|
470
|
|
|
// Create a special token. |
|
471
|
|
|
$context['token_check'] = 'admin-bc-' . $this->cat; |
|
472
|
|
|
createToken($context['token_check']); |
|
473
|
|
|
|
|
474
|
|
|
call_integration_hook('integrate_edit_category'); |
|
475
|
|
|
} |
|
476
|
|
|
|
|
477
|
|
|
/** |
|
478
|
|
|
* Make changes to/delete a board. |
|
479
|
|
|
* |
|
480
|
|
|
* What it does: |
|
481
|
|
|
* |
|
482
|
|
|
* - function for handling a submitted form saving the board. |
|
483
|
|
|
* - It also handles deletion of a board. |
|
484
|
|
|
* - Called by ?action=admin;area=manageboards;sa=board2 |
|
485
|
|
|
* - Redirects to ?action=admin;area=manageboards. |
|
486
|
|
|
* - It requires manage_boards permission. |
|
487
|
|
|
* |
|
488
|
|
|
* @event integrate_save_board |
|
489
|
|
|
*/ |
|
490
|
|
|
public function action_board2(): void |
|
491
|
|
|
{ |
|
492
|
|
|
global $context; |
|
493
|
|
|
|
|
494
|
|
|
$board_id = $this->_req->getPost('boardid', 'intval', 0); |
|
495
|
|
|
checkSession(); |
|
496
|
|
|
validateToken('admin-be-' . $this->_req->post->boardid); |
|
497
|
|
|
|
|
498
|
|
|
require_once(SUBSDIR . '/Boards.subs.php'); |
|
499
|
|
|
require_once(SUBSDIR . '/Post.subs.php'); |
|
500
|
|
|
|
|
501
|
|
|
$posts = getBoardProperties($this->_req->post->boardid)['numPosts']; |
|
502
|
|
|
|
|
503
|
|
|
// Mode: modify aka. don't delete. |
|
504
|
|
|
if (isset($this->_req->post->edit) || isset($this->_req->post->add)) |
|
505
|
|
|
{ |
|
506
|
|
|
$boardOptions = []; |
|
507
|
|
|
|
|
508
|
|
|
// Move this board to a new category? |
|
509
|
|
|
if (!empty($this->_req->post->new_cat)) |
|
510
|
|
|
{ |
|
511
|
|
|
$boardOptions['move_to'] = 'bottom'; |
|
512
|
|
|
$boardOptions['target_category'] = (int) $this->_req->post->new_cat; |
|
513
|
|
|
} |
|
514
|
|
|
// Change the boardorder of this board? |
|
515
|
|
|
elseif (!empty($this->_req->post->placement) && !empty($this->_req->post->board_order)) |
|
516
|
|
|
{ |
|
517
|
|
|
if (!in_array($this->_req->post->placement, ['before', 'after', 'child'])) |
|
518
|
|
|
{ |
|
519
|
|
|
throw new Exception('mangled_post', false); |
|
520
|
|
|
} |
|
521
|
|
|
|
|
522
|
|
|
$boardOptions['move_to'] = $this->_req->post->placement; |
|
523
|
|
|
$boardOptions['target_board'] = (int) $this->_req->post->board_order; |
|
524
|
|
|
} |
|
525
|
|
|
|
|
526
|
|
|
// Checkboxes.... |
|
527
|
|
|
$boardOptions['posts_count'] = isset($this->_req->post->count); |
|
528
|
|
|
$boardOptions['old_posts'] = isset($this->_req->post->old_posts); |
|
529
|
|
|
$boardOptions['override_theme'] = isset($this->_req->post->override_theme); |
|
530
|
|
|
$boardOptions['board_theme'] = (int) $this->_req->post->boardtheme; |
|
531
|
|
|
$boardOptions['access_groups'] = []; |
|
532
|
|
|
$boardOptions['deny_groups'] = []; |
|
533
|
|
|
|
|
534
|
|
|
if (!empty($this->_req->post->groups)) |
|
535
|
|
|
{ |
|
536
|
|
|
foreach ($this->_req->post->groups as $group => $action) |
|
537
|
|
|
{ |
|
538
|
|
|
if ($action === 'allow') |
|
539
|
|
|
{ |
|
540
|
|
|
$boardOptions['access_groups'][] = (int) $group; |
|
541
|
|
|
} |
|
542
|
|
|
elseif ($action === 'deny') |
|
543
|
|
|
{ |
|
544
|
|
|
$boardOptions['deny_groups'][] = (int) $group; |
|
545
|
|
|
} |
|
546
|
|
|
} |
|
547
|
|
|
} |
|
548
|
|
|
|
|
549
|
|
|
if (strlen(implode(',', $boardOptions['access_groups'])) > 255 || strlen(implode(',', $boardOptions['deny_groups'])) > 255) |
|
550
|
|
|
{ |
|
551
|
|
|
throw new Exception('too_many_groups', false); |
|
552
|
|
|
} |
|
553
|
|
|
|
|
554
|
|
|
// Change '1 & 2' to '1 & 2', but not '&' to '&amp;'... |
|
555
|
|
|
$boardOptions['board_name'] = preg_replace('~[&]([^;]{8}|[^;]{0,8}$)~', '&$1', $this->_req->post->board_name); |
|
556
|
|
|
|
|
557
|
|
|
// Convert any html to bbc |
|
558
|
|
|
$parser = new Html2BBC($this->_req->post->desc); |
|
559
|
|
|
$boardOptions['board_description'] = Util::htmlspecialchars($parser->get_bbc()); |
|
560
|
|
|
preparsecode($boardOptions['board_description']); |
|
561
|
|
|
|
|
562
|
|
|
$boardOptions['moderator_string'] = $this->_req->post->moderators; |
|
563
|
|
|
|
|
564
|
|
|
if (isset($this->_req->post->moderator_list) && is_array($this->_req->post->moderator_list)) |
|
565
|
|
|
{ |
|
566
|
|
|
$moderators = []; |
|
567
|
|
|
foreach ($this->_req->post->moderator_list as $moderator) |
|
568
|
|
|
{ |
|
569
|
|
|
$moderators[(int) $moderator] = (int) $moderator; |
|
570
|
|
|
} |
|
571
|
|
|
|
|
572
|
|
|
$boardOptions['moderators'] = $moderators; |
|
573
|
|
|
} |
|
574
|
|
|
|
|
575
|
|
|
// Are they doing redirection? |
|
576
|
|
|
$boardOptions['redirect'] = $this->_req->comparePost('redirect_address', '', 'trim') ? '' : $this->_req->get('redirect_address'); |
|
577
|
|
|
|
|
578
|
|
|
// Profiles... |
|
579
|
|
|
$boardOptions['profile'] = $this->_req->post->profile; |
|
580
|
|
|
$boardOptions['inherit_permissions'] = (int) $this->_req->post->profile === -1; |
|
581
|
|
|
|
|
582
|
|
|
// We need to know what used to be case in terms of redirection. |
|
583
|
|
|
if (!empty($board_id)) |
|
584
|
|
|
{ |
|
585
|
|
|
$properties = getBoardProperties($board_id); |
|
586
|
|
|
|
|
587
|
|
|
// If we're turning redirection on check the board doesn't have posts in it - if it does don't make it a redirection board. |
|
588
|
|
|
if ($boardOptions['redirect'] && empty($properties['oldRedirect']) && $properties['numPosts']) |
|
589
|
|
|
{ |
|
590
|
|
|
unset($boardOptions['redirect']); |
|
591
|
|
|
} |
|
592
|
|
|
// Reset the redirection count when switching on/off. |
|
593
|
|
|
elseif (empty($boardOptions['redirect']) !== empty($properties['oldRedirect'])) |
|
594
|
|
|
{ |
|
595
|
|
|
$boardOptions['num_posts'] = 0; |
|
596
|
|
|
} |
|
597
|
|
|
// Resetting the count? |
|
598
|
|
|
elseif ($boardOptions['redirect'] && !empty($this->_req->post->reset_redirect)) |
|
599
|
|
|
{ |
|
600
|
|
|
$boardOptions['num_posts'] = 0; |
|
601
|
|
|
} |
|
602
|
|
|
} |
|
603
|
|
|
|
|
604
|
|
|
call_integration_hook('integrate_save_board', [$board_id, &$boardOptions]); |
|
605
|
|
|
|
|
606
|
|
|
// Create a new board... |
|
607
|
|
|
if (isset($this->_req->post->add)) |
|
608
|
|
|
{ |
|
609
|
|
|
// New boards by default go to the bottom of the category. |
|
610
|
|
|
if (empty($this->_req->post->new_cat)) |
|
611
|
|
|
{ |
|
612
|
|
|
$boardOptions['target_category'] = $this->_req->getPost('cur_cat', 'intval', 0); |
|
613
|
|
|
} |
|
614
|
|
|
|
|
615
|
|
|
if (!isset($boardOptions['move_to'])) |
|
616
|
|
|
{ |
|
617
|
|
|
$boardOptions['move_to'] = 'bottom'; |
|
618
|
|
|
} |
|
619
|
|
|
|
|
620
|
|
|
createBoard($boardOptions); |
|
621
|
|
|
} |
|
622
|
|
|
// ...or update an existing board. |
|
623
|
|
|
else |
|
624
|
|
|
{ |
|
625
|
|
|
modifyBoard($board_id, $boardOptions); |
|
626
|
|
|
} |
|
627
|
|
|
} |
|
628
|
|
|
elseif (isset($this->_req->post->delete) && !isset($this->_req->post->confirmation) && !isset($this->_req->post->no_children)) |
|
629
|
|
|
{ |
|
630
|
|
|
if ($posts) |
|
631
|
|
|
{ |
|
632
|
|
|
throw new Exception('mboards_delete_board_has_posts'); |
|
633
|
|
|
} |
|
634
|
|
|
$this->action_board(); |
|
635
|
|
|
|
|
636
|
|
|
return; |
|
637
|
|
|
} |
|
638
|
|
|
elseif (isset($this->_req->post->delete)) |
|
639
|
|
|
{ |
|
640
|
|
|
$boardTree = new BoardsTree(database()); |
|
641
|
|
|
// First, check if our board still has posts or topics. |
|
642
|
|
|
if ($posts) |
|
643
|
|
|
{ |
|
644
|
|
|
throw new Exception('mboards_delete_board_has_posts'); |
|
645
|
|
|
} |
|
646
|
|
|
|
|
647
|
|
|
if ($this->_req->comparePost('delete_action', 1, 'intval')) |
|
648
|
|
|
{ |
|
649
|
|
|
// Check if we are moving all the current sub-boards first - before we start deleting! |
|
650
|
|
|
if (empty($this->_req->post->board_to)) |
|
651
|
|
|
{ |
|
652
|
|
|
throw new Exception('mboards_delete_board_error'); |
|
653
|
|
|
} |
|
654
|
|
|
$boardTree->deleteBoards([$board_id], $this->_req->getPost('board_to', 'intval')); |
|
655
|
|
|
} |
|
656
|
|
|
else |
|
657
|
|
|
{ |
|
658
|
|
|
$boardTree->deleteBoards([$board_id], 0); |
|
659
|
|
|
} |
|
660
|
|
|
} |
|
661
|
|
|
|
|
662
|
|
|
if ($this->_req->compareQuery('rid', 'permissions', 'trim')) |
|
663
|
|
|
{ |
|
664
|
|
|
redirectexit('action=admin;area=permissions;sa=board;' . $context['session_var'] . '=' . $context['session_id']); |
|
665
|
|
|
} |
|
666
|
|
|
else |
|
667
|
|
|
{ |
|
668
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
669
|
|
|
} |
|
670
|
|
|
} |
|
671
|
|
|
|
|
672
|
|
|
/** |
|
673
|
|
|
* Modify a specific board... |
|
674
|
|
|
* |
|
675
|
|
|
* What it does |
|
676
|
|
|
* - screen for editing and repositioning a board. |
|
677
|
|
|
* - called by ?action=admin;area=manageboards;sa=board |
|
678
|
|
|
* - also used to show the confirm deletion of category screen (sub-template confirm_board_delete). |
|
679
|
|
|
* - requires manage_boards permission. |
|
680
|
|
|
* |
|
681
|
|
|
* @event integrate_edit_board |
|
682
|
|
|
* @uses the modify_board sub-template of the ManageBoards template. |
|
683
|
|
|
* @uses ManagePermissions language |
|
684
|
|
|
*/ |
|
685
|
|
|
public function action_board(): void |
|
686
|
|
|
{ |
|
687
|
|
|
global $txt, $context, $modSettings; |
|
688
|
|
|
|
|
689
|
|
|
theme()->getTemplates()->load('ManageBoards'); |
|
690
|
|
|
require_once(SUBSDIR . '/Boards.subs.php'); |
|
691
|
|
|
require_once(SUBSDIR . '/Post.subs.php'); |
|
692
|
|
|
$boardTree = new BoardsTree(database()); |
|
693
|
|
|
|
|
694
|
|
|
// For editing the profile we'll need this. |
|
695
|
|
|
Txt::load('ManagePermissions'); |
|
696
|
|
|
require_once(SUBSDIR . '/ManagePermissions.subs.php'); |
|
697
|
|
|
loadPermissionProfiles(); |
|
698
|
|
|
|
|
699
|
|
|
// id_board must be a number.... |
|
700
|
|
|
$this->boardid = $this->_req->getQuery('boardid', 'intval', 0); |
|
701
|
|
|
if ($boardTree->boardExists($this->boardid) === false) |
|
702
|
|
|
{ |
|
703
|
|
|
$this->boardid = 0; |
|
704
|
|
|
$this->_req->query->sa = 'newboard'; |
|
705
|
|
|
} |
|
706
|
|
|
|
|
707
|
|
|
if ($this->_req->compareQuery('sa', 'newboard', 'trim')) |
|
708
|
|
|
{ |
|
709
|
|
|
$this->cat = $this->_req->getQuery('cat', 'intval', 0); |
|
710
|
|
|
|
|
711
|
|
|
// Category doesn't exist, man... sorry. |
|
712
|
|
|
if (empty($this->cat)) |
|
713
|
|
|
{ |
|
714
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
715
|
|
|
} |
|
716
|
|
|
|
|
717
|
|
|
// Some things that need to be setup for a new board. |
|
718
|
|
|
$curBoard = [ |
|
719
|
|
|
'member_groups' => [0, -1], |
|
720
|
|
|
'deny_groups' => [], |
|
721
|
|
|
'category' => $this->cat |
|
722
|
|
|
]; |
|
723
|
|
|
$context['board_order'] = []; |
|
724
|
|
|
$context['board'] = [ |
|
725
|
|
|
'is_new' => true, |
|
726
|
|
|
'id' => 0, |
|
727
|
|
|
'name' => $txt['mboards_new_board_name'], |
|
728
|
|
|
'description' => '', |
|
729
|
|
|
'count_posts' => 1, |
|
730
|
|
|
'old_posts' => 1, |
|
731
|
|
|
'posts' => 0, |
|
732
|
|
|
'topics' => 0, |
|
733
|
|
|
'theme' => 0, |
|
734
|
|
|
'profile' => 1, |
|
735
|
|
|
'override_theme' => 0, |
|
736
|
|
|
'redirect' => '', |
|
737
|
|
|
'category' => $this->cat, |
|
738
|
|
|
'no_children' => true, |
|
739
|
|
|
]; |
|
740
|
|
|
} |
|
741
|
|
|
else |
|
742
|
|
|
{ |
|
743
|
|
|
// Just some easy shortcuts. |
|
744
|
|
|
$curBoard = $boardTree->getBoardById($this->boardid); |
|
745
|
|
|
$context['board'] = $curBoard; |
|
746
|
|
|
$context['board']['name'] = htmlspecialchars(strtr($context['board']['name'], ['&' => '&']), ENT_COMPAT, 'UTF-8'); |
|
747
|
|
|
$context['board']['description'] = un_preparsecode($context['board']['description']); |
|
748
|
|
|
$context['board']['no_children'] = empty($curBoard['tree']['children']); |
|
749
|
|
|
$context['board']['is_recycle'] = !empty($modSettings['recycle_enable']) && !empty($modSettings['recycle_board']) && $modSettings['recycle_board'] == $context['board']['id']; |
|
750
|
|
|
} |
|
751
|
|
|
|
|
752
|
|
|
// As we may have come from the permissions screen keep track of where we should go on save. |
|
753
|
|
|
$context['redirect_location'] = $this->_req->compareQuery('rid', 'permissions', 'trim') ? 'permissions' : 'boards'; |
|
754
|
|
|
|
|
755
|
|
|
// We might need this to hide links to certain areas. |
|
756
|
|
|
$context['can_manage_permissions'] = allowedTo('manage_permissions'); |
|
757
|
|
|
|
|
758
|
|
|
// Default membergroups. |
|
759
|
|
|
$context['groups'] = [ |
|
760
|
|
|
-1 => [ |
|
761
|
|
|
'id' => '-1', |
|
762
|
|
|
'name' => $txt['parent_guests_only'], |
|
763
|
|
|
'allow' => in_array('-1', $curBoard['member_groups']), |
|
764
|
|
|
'deny' => in_array('-1', $curBoard['deny_groups']), |
|
765
|
|
|
'is_post_group' => false, |
|
766
|
|
|
], |
|
767
|
|
|
0 => [ |
|
768
|
|
|
'id' => '0', |
|
769
|
|
|
'name' => $txt['parent_members_only'], |
|
770
|
|
|
'allow' => in_array('0', $curBoard['member_groups']), |
|
771
|
|
|
'deny' => in_array('0', $curBoard['deny_groups']), |
|
772
|
|
|
'is_post_group' => false, |
|
773
|
|
|
] |
|
774
|
|
|
]; |
|
775
|
|
|
|
|
776
|
|
|
$context['groups'] += getOtherGroups($curBoard, $this->_req->compareQuery('sa', 'newboard')); |
|
777
|
|
|
|
|
778
|
|
|
// Category doesn't exist, man... sorry. |
|
779
|
|
|
if ($boardTree->categoryExists($curBoard['category']) === false) |
|
780
|
|
|
{ |
|
781
|
|
|
redirectexit('action=admin;area=manageboards'); |
|
782
|
|
|
} |
|
783
|
|
|
|
|
784
|
|
|
$catBoards = $boardTree->getBoardsInCat($curBoard['category']); |
|
785
|
|
|
foreach ($catBoards as $boardid) |
|
786
|
|
|
{ |
|
787
|
|
|
$thisBoard = $boardTree->getBoardById($boardid); |
|
788
|
|
|
if ($boardid === $this->boardid) |
|
789
|
|
|
{ |
|
790
|
|
|
$context['board_order'][] = [ |
|
791
|
|
|
'id' => $boardid, |
|
792
|
|
|
'name' => str_repeat('-', $thisBoard['level']) . ' (' . $txt['mboards_current_position'] . ')', |
|
793
|
|
|
'children' => $thisBoard['tree']['children'], |
|
794
|
|
|
'no_children' => empty($thisBoard['tree']['children']), |
|
795
|
|
|
'is_child' => false, |
|
796
|
|
|
'selected' => true |
|
797
|
|
|
]; |
|
798
|
|
|
} |
|
799
|
|
|
else |
|
800
|
|
|
{ |
|
801
|
|
|
$context['board_order'][] = [ |
|
802
|
|
|
'id' => $boardid, |
|
803
|
|
|
'name' => str_repeat('-', $thisBoard['level']) . ' ' . $thisBoard['name'], |
|
804
|
|
|
'is_child' => !empty($this->boardid) && $boardTree->isChildOf($boardid, $this->boardid), |
|
805
|
|
|
'selected' => false |
|
806
|
|
|
]; |
|
807
|
|
|
} |
|
808
|
|
|
} |
|
809
|
|
|
|
|
810
|
|
|
// Are there any places to move sub-boards to in the case where we are confirming a delete? |
|
811
|
|
|
if (!empty($this->boardid)) |
|
812
|
|
|
{ |
|
813
|
|
|
$context['can_move_children'] = false; |
|
814
|
|
|
$context['children'] = $curBoard['tree']['children']; |
|
815
|
|
|
foreach ($context['board_order'] as $board) |
|
816
|
|
|
{ |
|
817
|
|
|
if ($board['is_child'] !== false) |
|
818
|
|
|
{ |
|
819
|
|
|
continue; |
|
820
|
|
|
} |
|
821
|
|
|
|
|
822
|
|
|
if ($board['selected'] !== false) |
|
823
|
|
|
{ |
|
824
|
|
|
continue; |
|
825
|
|
|
} |
|
826
|
|
|
|
|
827
|
|
|
$context['can_move_children'] = true; |
|
828
|
|
|
} |
|
829
|
|
|
} |
|
830
|
|
|
|
|
831
|
|
|
// Get other available categories. |
|
832
|
|
|
$context['categories'] = []; |
|
833
|
|
|
$cat_tree = $boardTree->getCategories(); |
|
834
|
|
|
foreach ($cat_tree as $catID => $tree) |
|
835
|
|
|
{ |
|
836
|
|
|
$context['categories'][] = [ |
|
837
|
|
|
'id' => $catID === $curBoard['category'] ? 0 : $catID, |
|
838
|
|
|
'name' => $tree['node']['name'], |
|
839
|
|
|
'selected' => $catID === $curBoard['category'] |
|
840
|
|
|
]; |
|
841
|
|
|
} |
|
842
|
|
|
|
|
843
|
|
|
$context['board']['moderators'] = getBoardModerators($this->boardid); |
|
844
|
|
|
$context['board']['moderator_list'] = empty($context['board']['moderators']) ? '' : '"' . implode('", "', $context['board']['moderators']) . '"'; |
|
845
|
|
|
|
|
846
|
|
|
if (!empty($context['board']['moderators'])) |
|
847
|
|
|
{ |
|
848
|
|
|
[$context['board']['last_moderator_id']] = array_slice(array_keys($context['board']['moderators']), -1); |
|
849
|
|
|
} |
|
850
|
|
|
|
|
851
|
|
|
$context['themes'] = getAllThemes(); |
|
852
|
|
|
|
|
853
|
|
|
if (!isset($this->_req->query->delete)) |
|
854
|
|
|
{ |
|
855
|
|
|
$context['sub_template'] = 'modify_board'; |
|
856
|
|
|
$context['page_title'] = $txt['boardsEdit']; |
|
857
|
|
|
loadJavascriptFile('suggest.js', ['defer' => true]); |
|
858
|
|
|
} |
|
859
|
|
|
else |
|
860
|
|
|
{ |
|
861
|
|
|
$context['sub_template'] = 'confirm_board_delete'; |
|
862
|
|
|
$context['page_title'] = $txt['mboards_delete_board']; |
|
863
|
|
|
} |
|
864
|
|
|
|
|
865
|
|
|
// Create a special token. |
|
866
|
|
|
createToken('admin-be-' . $this->boardid); |
|
867
|
|
|
|
|
868
|
|
|
call_integration_hook('integrate_edit_board'); |
|
869
|
|
|
} |
|
870
|
|
|
|
|
871
|
|
|
/** |
|
872
|
|
|
* A screen to display and allow to set a few general board and category settings. |
|
873
|
|
|
* |
|
874
|
|
|
* @event integrate_save_board_settings called during manage board settings |
|
875
|
|
|
* @uses modify_general_settings sub-template. |
|
876
|
|
|
*/ |
|
877
|
|
|
public function action_boardSettings_display(): void |
|
878
|
|
|
{ |
|
879
|
|
|
global $context, $txt; |
|
880
|
|
|
|
|
881
|
|
|
// Initialize the form |
|
882
|
|
|
$settingsForm = new SettingsForm(SettingsForm::DB_ADAPTER); |
|
883
|
|
|
|
|
884
|
|
|
// Initialize it with our settings |
|
885
|
|
|
$settingsForm->setConfigVars($this->_settings()); |
|
886
|
|
|
|
|
887
|
|
|
// Add some javascript stuff for the recycle box. |
|
888
|
|
|
theme()->addInlineJavascript(' |
|
889
|
|
|
document.getElementById("recycle_board").disabled = !document.getElementById("recycle_enable").checked;', true); |
|
890
|
|
|
|
|
891
|
|
|
// Get the needed template bits |
|
892
|
|
|
theme()->getTemplates()->load('ManageBoards'); |
|
893
|
|
|
$context['page_title'] = $txt['boards_and_cats'] . ' - ' . $txt['settings']; |
|
894
|
|
|
$context['sub_template'] = 'show_settings'; |
|
895
|
|
|
$context['post_url'] = getUrl('admin', ['action' => 'admin', 'area' => 'manageboards', 'sa' => 'settings', 'save']); |
|
896
|
|
|
|
|
897
|
|
|
// Warn the admin against selecting the recycle topic without selecting a board. |
|
898
|
|
|
$context['force_form_onsubmit'] = "if(document.getElementById('recycle_enable').checked && document.getElementById('recycle_board').value == 0) { return confirm('" . $txt['recycle_board_unselected_notice'] . "');} return true;"; |
|
899
|
|
|
|
|
900
|
|
|
// Doing a save? |
|
901
|
|
|
if (isset($this->_req->query->save)) |
|
902
|
|
|
{ |
|
903
|
|
|
checkSession(); |
|
904
|
|
|
|
|
905
|
|
|
call_integration_hook('integrate_save_board_settings'); |
|
906
|
|
|
|
|
907
|
|
|
$settingsForm->setConfigValues((array) $this->_req->post); |
|
908
|
|
|
$settingsForm->save(); |
|
909
|
|
|
redirectexit('action=admin;area=manageboards;sa=settings'); |
|
910
|
|
|
} |
|
911
|
|
|
|
|
912
|
|
|
// Prepare the settings... |
|
913
|
|
|
$settingsForm->prepare(); |
|
914
|
|
|
} |
|
915
|
|
|
|
|
916
|
|
|
/** |
|
917
|
|
|
* Retrieve and return all admin settings for boards management. |
|
918
|
|
|
* |
|
919
|
|
|
* @event integrate_modify_board_settings add config settings to boards management |
|
920
|
|
|
*/ |
|
921
|
|
|
private function _settings() |
|
922
|
|
|
{ |
|
923
|
|
|
global $txt; |
|
924
|
|
|
|
|
925
|
4 |
|
// We need to borrow a string from here |
|
926
|
|
|
Txt::load('ManagePermissions'); |
|
927
|
4 |
|
|
|
928
|
|
|
// Load the boards list - for the recycle bin! |
|
929
|
|
|
require_once(SUBSDIR . '/Boards.subs.php'); |
|
930
|
4 |
|
$boards = getBoardList(['override_permissions' => true, 'not_redirection' => true], true); |
|
931
|
|
|
$recycle_boards = ['']; |
|
932
|
|
|
foreach ($boards as $board) |
|
933
|
4 |
|
{ |
|
934
|
4 |
|
$recycle_boards[$board['id_board']] = $board['cat_name'] . ' - ' . $board['board_name']; |
|
935
|
4 |
|
} |
|
936
|
4 |
|
|
|
937
|
|
|
// Here and the board settings... |
|
938
|
4 |
|
$config_vars = [ |
|
939
|
|
|
['title', 'settings'], |
|
940
|
|
|
// Inline permissions. |
|
941
|
|
|
['permissions', 'manage_boards', 'helptext' => $txt['permissionhelp_manage_boards'], 'collapsed' => true], |
|
942
|
|
|
'', |
|
943
|
4 |
|
// Other board settings. |
|
944
|
|
|
['check', 'countChildPosts'], |
|
945
|
4 |
|
['check', 'recycle_enable', 'onclick' => "document.getElementById('recycle_board').disabled = !this.checked;"], |
|
946
|
4 |
|
['select', 'recycle_board', $recycle_boards], |
|
947
|
|
|
['check', 'allow_ignore_boards'], |
|
948
|
|
|
['check', 'deny_boards_access'], |
|
949
|
|
|
]; |
|
950
|
4 |
|
|
|
951
|
|
|
// Add new settings with a nice hook, makes them available for admin settings search as well |
|
952
|
|
|
call_integration_hook('integrate_modify_board_settings', [&$config_vars]); |
|
953
|
|
|
|
|
954
|
|
|
return $config_vars; |
|
955
|
|
|
} |
|
956
|
4 |
|
|
|
957
|
|
|
/** |
|
958
|
4 |
|
* Return the form settings for use in admin search |
|
959
|
|
|
*/ |
|
960
|
|
|
public function settings_search() |
|
961
|
|
|
{ |
|
962
|
|
|
return $this->_settings(); |
|
963
|
|
|
} |
|
964
|
|
|
} |
|
965
|
|
|
|