Chris@76
|
1 <?php
|
Chris@76
|
2
|
Chris@76
|
3 /**
|
Chris@76
|
4 * Simple Machines Forum (SMF)
|
Chris@76
|
5 *
|
Chris@76
|
6 * @package SMF
|
Chris@76
|
7 * @author Simple Machines http://www.simplemachines.org
|
Chris@76
|
8 * @copyright 2011 Simple Machines
|
Chris@76
|
9 * @license http://www.simplemachines.org/about/smf/license.php BSD
|
Chris@76
|
10 *
|
Chris@76
|
11 * @version 2.0
|
Chris@76
|
12 */
|
Chris@76
|
13
|
Chris@76
|
14 if (!defined('SMF'))
|
Chris@76
|
15 die('Hacking attempt...');
|
Chris@76
|
16
|
Chris@76
|
17 /* This file is concerned with anything in the Manage Membergroups screen.
|
Chris@76
|
18
|
Chris@76
|
19 void ModifyMembergroups()
|
Chris@76
|
20 - entrance point of the 'Manage Membergroups' center.
|
Chris@76
|
21 - called by ?action=admin;area=membergroups.
|
Chris@76
|
22 - loads the ManageMembergroups template.
|
Chris@76
|
23 - loads the MangeMembers language file.
|
Chris@76
|
24 - requires the manage_membergroups or the admin_forum permission.
|
Chris@76
|
25 - calls a function based on the given subaction.
|
Chris@76
|
26 - defaults to sub action 'index' or without manage_membergroup
|
Chris@76
|
27 permissions to 'settings'.
|
Chris@76
|
28
|
Chris@76
|
29 void MembergroupIndex()
|
Chris@76
|
30 - shows an overview of the current membergroups.
|
Chris@76
|
31 - called by ?action=admin;area=membergroups.
|
Chris@76
|
32 - requires the manage_membergroups permission.
|
Chris@76
|
33 - uses the main ManageMembergroups template.
|
Chris@76
|
34 - splits the membergroups in regular ones and post count based groups.
|
Chris@76
|
35 - also counts the number of members part of each membergroup.
|
Chris@76
|
36
|
Chris@76
|
37 void AddMembergroup()
|
Chris@76
|
38 - allows to add a membergroup and set some initial properties.
|
Chris@76
|
39 - called by ?action=admin;area=membergroups;sa=add.
|
Chris@76
|
40 - requires the manage_membergroups permission.
|
Chris@76
|
41 - uses the new_group sub template of ManageMembergroups.
|
Chris@76
|
42 - allows to use a predefined permission profile or copy one from
|
Chris@76
|
43 another group.
|
Chris@76
|
44 - redirects to action=admin;area=membergroups;sa=edit;group=x.
|
Chris@76
|
45
|
Chris@76
|
46 void DeleteMembergroup()
|
Chris@76
|
47 - deletes a membergroup by URL.
|
Chris@76
|
48 - called by ?action=admin;area=membergroups;sa=delete;group=x;session_var=y.
|
Chris@76
|
49 - requires the manage_membergroups permission.
|
Chris@76
|
50 - redirects to ?action=admin;area=membergroups.
|
Chris@76
|
51
|
Chris@76
|
52 void EditMembergroup()
|
Chris@76
|
53 - screen to edit a specific membergroup.
|
Chris@76
|
54 - called by ?action=admin;area=membergroups;sa=edit;group=x.
|
Chris@76
|
55 - requires the manage_membergroups permission.
|
Chris@76
|
56 - uses the edit_group sub template of ManageMembergroups.
|
Chris@76
|
57 - also handles the delete button of the edit form.
|
Chris@76
|
58 - redirects to ?action=admin;area=membergroups.
|
Chris@76
|
59
|
Chris@76
|
60 void ModifyMembergroupsettings()
|
Chris@76
|
61 - set some general membergroup settings and permissions.
|
Chris@76
|
62 - called by ?action=admin;area=membergroups;sa=settings
|
Chris@76
|
63 - requires the admin_forum permission (and manage_permissions for
|
Chris@76
|
64 changing permissions)
|
Chris@76
|
65 - uses membergroup_settings sub template of ManageMembergroups.
|
Chris@76
|
66 - redirects to itself.
|
Chris@76
|
67 */
|
Chris@76
|
68
|
Chris@76
|
69 // The entrance point for all 'Manage Membergroup' actions.
|
Chris@76
|
70 function ModifyMembergroups()
|
Chris@76
|
71 {
|
Chris@76
|
72 global $context, $txt, $scripturl, $sourcedir;
|
Chris@76
|
73
|
Chris@76
|
74 $subActions = array(
|
Chris@76
|
75 'add' => array('AddMembergroup', 'manage_membergroups'),
|
Chris@76
|
76 'delete' => array('DeleteMembergroup', 'manage_membergroups'),
|
Chris@76
|
77 'edit' => array('EditMembergroup', 'manage_membergroups'),
|
Chris@76
|
78 'index' => array('MembergroupIndex', 'manage_membergroups'),
|
Chris@76
|
79 'members' => array('MembergroupMembers', 'manage_membergroups', 'Groups.php'),
|
Chris@76
|
80 'settings' => array('ModifyMembergroupsettings', 'admin_forum'),
|
Chris@76
|
81 );
|
Chris@76
|
82
|
Chris@76
|
83 // Default to sub action 'index' or 'settings' depending on permissions.
|
Chris@76
|
84 $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('manage_membergroups') ? 'index' : 'settings');
|
Chris@76
|
85
|
Chris@76
|
86 // Is it elsewhere?
|
Chris@76
|
87 if (isset($subActions[$_REQUEST['sa']][2]))
|
Chris@76
|
88 require_once($sourcedir . '/' . $subActions[$_REQUEST['sa']][2]);
|
Chris@76
|
89
|
Chris@76
|
90 // Do the permission check, you might not be allowed her.
|
Chris@76
|
91 isAllowedTo($subActions[$_REQUEST['sa']][1]);
|
Chris@76
|
92
|
Chris@76
|
93 // Language and template stuff, the usual.
|
Chris@76
|
94 loadLanguage('ManageMembers');
|
Chris@76
|
95 loadTemplate('ManageMembergroups');
|
Chris@76
|
96
|
Chris@76
|
97 // Setup the admin tabs.
|
Chris@76
|
98 $context[$context['admin_menu_name']]['tab_data'] = array(
|
Chris@76
|
99 'title' => $txt['membergroups_title'],
|
Chris@76
|
100 'help' => 'membergroups',
|
Chris@76
|
101 'description' => $txt['membergroups_description'],
|
Chris@76
|
102 );
|
Chris@76
|
103
|
Chris@76
|
104 // Call the right function.
|
Chris@76
|
105 $subActions[$_REQUEST['sa']][0]();
|
Chris@76
|
106 }
|
Chris@76
|
107
|
Chris@76
|
108 // An overview of the current membergroups.
|
Chris@76
|
109 function MembergroupIndex()
|
Chris@76
|
110 {
|
Chris@76
|
111 global $txt, $scripturl, $context, $settings, $smcFunc, $sourcedir;
|
Chris@76
|
112
|
Chris@76
|
113 $context['page_title'] = $txt['membergroups_title'];
|
Chris@76
|
114
|
Chris@76
|
115 // The first list shows the regular membergroups.
|
Chris@76
|
116 $listOptions = array(
|
Chris@76
|
117 'id' => 'regular_membergroups_list',
|
Chris@76
|
118 'title' => $txt['membergroups_regular'],
|
Chris@76
|
119 'base_href' => $scripturl . '?action=admin;area=membergroups' . (isset($_REQUEST['sort2']) ? ';sort2=' . urlencode($_REQUEST['sort2']) : ''),
|
Chris@76
|
120 'default_sort_col' => 'name',
|
Chris@76
|
121 'get_items' => array(
|
Chris@76
|
122 'file' => $sourcedir . '/Subs-Membergroups.php',
|
Chris@76
|
123 'function' => 'list_getMembergroups',
|
Chris@76
|
124 'params' => array(
|
Chris@76
|
125 'regular',
|
Chris@76
|
126 ),
|
Chris@76
|
127 ),
|
Chris@76
|
128 'columns' => array(
|
Chris@76
|
129 'name' => array(
|
Chris@76
|
130 'header' => array(
|
Chris@76
|
131 'value' => $txt['membergroups_name'],
|
Chris@76
|
132 ),
|
Chris@76
|
133 'data' => array(
|
Chris@76
|
134 'function' => create_function('$rowData', '
|
Chris@76
|
135 global $scripturl;
|
Chris@76
|
136
|
Chris@76
|
137 // Since the moderator group has no explicit members, no link is needed.
|
Chris@76
|
138 if ($rowData[\'id_group\'] == 3)
|
Chris@76
|
139 $group_name = $rowData[\'group_name\'];
|
Chris@76
|
140 else
|
Chris@76
|
141 {
|
Chris@76
|
142 $color_style = empty($rowData[\'online_color\']) ? \'\' : sprintf(\' style="color: %1$s;"\', $rowData[\'online_color\']);
|
Chris@76
|
143 $group_name = sprintf(\'<a href="%1$s?action=admin;area=membergroups;sa=members;group=%2$d"%3$s>%4$s</a>\', $scripturl, $rowData[\'id_group\'], $color_style, $rowData[\'group_name\']);
|
Chris@76
|
144 }
|
Chris@76
|
145
|
Chris@76
|
146 // Add a help option for moderator and administrator.
|
Chris@76
|
147 if ($rowData[\'id_group\'] == 1)
|
Chris@76
|
148 $group_name .= sprintf(\' (<a href="%1$s?action=helpadmin;help=membergroup_administrator" onclick="return reqWin(this.href);">?</a>)\', $scripturl);
|
Chris@76
|
149 elseif ($rowData[\'id_group\'] == 3)
|
Chris@76
|
150 $group_name .= sprintf(\' (<a href="%1$s?action=helpadmin;help=membergroup_moderator" onclick="return reqWin(this.href);">?</a>)\', $scripturl);
|
Chris@76
|
151
|
Chris@76
|
152 return $group_name;
|
Chris@76
|
153 '),
|
Chris@76
|
154 ),
|
Chris@76
|
155 'sort' => array(
|
Chris@76
|
156 'default' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, group_name',
|
Chris@76
|
157 'reverse' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, group_name DESC',
|
Chris@76
|
158 ),
|
Chris@76
|
159 ),
|
Chris@76
|
160 'stars' => array(
|
Chris@76
|
161 'header' => array(
|
Chris@76
|
162 'value' => $txt['membergroups_stars'],
|
Chris@76
|
163 ),
|
Chris@76
|
164 'data' => array(
|
Chris@76
|
165 'function' => create_function('$rowData', '
|
Chris@76
|
166 global $settings;
|
Chris@76
|
167
|
Chris@76
|
168 $stars = explode(\'#\', $rowData[\'stars\']);
|
Chris@76
|
169
|
Chris@76
|
170 // In case no stars are setup, return with nothing
|
Chris@76
|
171 if (empty($stars[0]) || empty($stars[1]))
|
Chris@76
|
172 return \'\';
|
Chris@76
|
173
|
Chris@76
|
174 // Otherwise repeat the image a given number of times.
|
Chris@76
|
175 else
|
Chris@76
|
176 {
|
Chris@76
|
177 $image = sprintf(\'<img src="%1$s/%2$s" alt="*" />\', $settings[\'images_url\'], $stars[1]);
|
Chris@76
|
178 return str_repeat($image, $stars[0]);
|
Chris@76
|
179 }
|
Chris@76
|
180 '),
|
Chris@76
|
181
|
Chris@76
|
182 ),
|
Chris@76
|
183 'sort' => array(
|
Chris@76
|
184 'default' => 'stars',
|
Chris@76
|
185 'reverse' => 'stars DESC',
|
Chris@76
|
186 )
|
Chris@76
|
187 ),
|
Chris@76
|
188 'members' => array(
|
Chris@76
|
189 'header' => array(
|
Chris@76
|
190 'value' => $txt['membergroups_members_top'],
|
Chris@76
|
191 ),
|
Chris@76
|
192 'data' => array(
|
Chris@76
|
193 'function' => create_function('$rowData', '
|
Chris@76
|
194 global $txt;
|
Chris@76
|
195
|
Chris@76
|
196 // No explicit members for the moderator group.
|
Chris@76
|
197 return $rowData[\'id_group\'] == 3 ? $txt[\'membergroups_guests_na\'] : $rowData[\'num_members\'];
|
Chris@76
|
198 '),
|
Chris@76
|
199 'style' => 'text-align: center',
|
Chris@76
|
200 ),
|
Chris@76
|
201 'sort' => array(
|
Chris@76
|
202 'default' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, 1',
|
Chris@76
|
203 'reverse' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, 1 DESC',
|
Chris@76
|
204 ),
|
Chris@76
|
205 ),
|
Chris@76
|
206 'modify' => array(
|
Chris@76
|
207 'header' => array(
|
Chris@76
|
208 'value' => $txt['modify'],
|
Chris@76
|
209 ),
|
Chris@76
|
210 'data' => array(
|
Chris@76
|
211 'sprintf' => array(
|
Chris@76
|
212 'format' => '<a href="' . $scripturl . '?action=admin;area=membergroups;sa=edit;group=%1$d">' . $txt['membergroups_modify'] . '</a>',
|
Chris@76
|
213 'params' => array(
|
Chris@76
|
214 'id_group' => false,
|
Chris@76
|
215 ),
|
Chris@76
|
216 ),
|
Chris@76
|
217 'style' => 'text-align: center',
|
Chris@76
|
218 ),
|
Chris@76
|
219 ),
|
Chris@76
|
220 ),
|
Chris@76
|
221 'additional_rows' => array(
|
Chris@76
|
222 array(
|
Chris@76
|
223 'position' => 'below_table_data',
|
Chris@76
|
224 'value' => '[<a href="' . $scripturl . '?action=admin;area=membergroups;sa=add;generalgroup">' . $txt['membergroups_add_group'] . '</a>]',
|
Chris@76
|
225 ),
|
Chris@76
|
226 ),
|
Chris@76
|
227 );
|
Chris@76
|
228
|
Chris@76
|
229 require_once($sourcedir . '/Subs-List.php');
|
Chris@76
|
230 createList($listOptions);
|
Chris@76
|
231
|
Chris@76
|
232 // The second list shows the post count based groups.
|
Chris@76
|
233 $listOptions = array(
|
Chris@76
|
234 'id' => 'post_count_membergroups_list',
|
Chris@76
|
235 'title' => $txt['membergroups_post'],
|
Chris@76
|
236 'base_href' => $scripturl . '?action=admin;area=membergroups' . (isset($_REQUEST['sort']) ? ';sort=' . urlencode($_REQUEST['sort']) : ''),
|
Chris@76
|
237 'default_sort_col' => 'required_posts',
|
Chris@76
|
238 'request_vars' => array(
|
Chris@76
|
239 'sort' => 'sort2',
|
Chris@76
|
240 'desc' => 'desc2',
|
Chris@76
|
241 ),
|
Chris@76
|
242 'get_items' => array(
|
Chris@76
|
243 'file' => $sourcedir . '/Subs-Membergroups.php',
|
Chris@76
|
244 'function' => 'list_getMembergroups',
|
Chris@76
|
245 'params' => array(
|
Chris@76
|
246 'post_count',
|
Chris@76
|
247 ),
|
Chris@76
|
248 ),
|
Chris@76
|
249 'columns' => array(
|
Chris@76
|
250 'name' => array(
|
Chris@76
|
251 'header' => array(
|
Chris@76
|
252 'value' => $txt['membergroups_name'],
|
Chris@76
|
253 ),
|
Chris@76
|
254 'data' => array(
|
Chris@76
|
255 'function' => create_function('$rowData', '
|
Chris@76
|
256 global $scripturl;
|
Chris@76
|
257
|
Chris@76
|
258 $colorStyle = empty($rowData[\'online_color\']) ? \'\' : sprintf(\' style="color: %1$s;"\', $rowData[\'online_color\']);
|
Chris@76
|
259 return sprintf(\'<a href="%1$s?action=moderate;area=viewgroups;sa=members;group=%2$d"%3$s>%4$s</a>\', $scripturl, $rowData[\'id_group\'], $colorStyle, $rowData[\'group_name\']);
|
Chris@76
|
260 '),
|
Chris@76
|
261 ),
|
Chris@76
|
262 'sort' => array(
|
Chris@76
|
263 'default' => 'group_name',
|
Chris@76
|
264 'reverse' => 'group_name DESC',
|
Chris@76
|
265 ),
|
Chris@76
|
266 ),
|
Chris@76
|
267 'stars' => array(
|
Chris@76
|
268 'header' => array(
|
Chris@76
|
269 'value' => $txt['membergroups_stars'],
|
Chris@76
|
270 ),
|
Chris@76
|
271 'data' => array(
|
Chris@76
|
272 'function' => create_function('$rowData', '
|
Chris@76
|
273 global $settings;
|
Chris@76
|
274
|
Chris@76
|
275 $stars = explode(\'#\', $rowData[\'stars\']);
|
Chris@76
|
276
|
Chris@76
|
277 if (empty($stars[0]) || empty($stars[1]))
|
Chris@76
|
278 return \'\';
|
Chris@76
|
279 else
|
Chris@76
|
280 {
|
Chris@76
|
281 $star_image = sprintf(\'<img src="%1$s/%2$s" alt="*" />\', $settings[\'images_url\'], $stars[1]);
|
Chris@76
|
282 return str_repeat($star_image, $stars[0]);
|
Chris@76
|
283 }
|
Chris@76
|
284 '),
|
Chris@76
|
285 ),
|
Chris@76
|
286 'sort' => array(
|
Chris@76
|
287 'default' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, stars',
|
Chris@76
|
288 'reverse' => 'CASE WHEN id_group < 4 THEN id_group ELSE 4 END, stars DESC',
|
Chris@76
|
289 )
|
Chris@76
|
290 ),
|
Chris@76
|
291 'members' => array(
|
Chris@76
|
292 'header' => array(
|
Chris@76
|
293 'value' => $txt['membergroups_members_top'],
|
Chris@76
|
294 ),
|
Chris@76
|
295 'data' => array(
|
Chris@76
|
296 'db' => 'num_members',
|
Chris@76
|
297 'style' => 'text-align: center',
|
Chris@76
|
298 ),
|
Chris@76
|
299 'sort' => array(
|
Chris@76
|
300 'default' => '1 DESC',
|
Chris@76
|
301 'reverse' => '1',
|
Chris@76
|
302 ),
|
Chris@76
|
303 ),
|
Chris@76
|
304 'required_posts' => array(
|
Chris@76
|
305 'header' => array(
|
Chris@76
|
306 'value' => $txt['membergroups_min_posts'],
|
Chris@76
|
307 ),
|
Chris@76
|
308 'data' => array(
|
Chris@76
|
309 'db' => 'min_posts',
|
Chris@76
|
310 'style' => 'text-align: center',
|
Chris@76
|
311 ),
|
Chris@76
|
312 'sort' => array(
|
Chris@76
|
313 'default' => 'min_posts',
|
Chris@76
|
314 'reverse' => 'min_posts DESC',
|
Chris@76
|
315 ),
|
Chris@76
|
316 ),
|
Chris@76
|
317 'modify' => array(
|
Chris@76
|
318 'header' => array(
|
Chris@76
|
319 'value' => $txt['modify'],
|
Chris@76
|
320 ),
|
Chris@76
|
321 'data' => array(
|
Chris@76
|
322 'sprintf' => array(
|
Chris@76
|
323 'format' => '<a href="' . $scripturl . '?action=admin;area=membergroups;sa=edit;group=%1$d">' . $txt['membergroups_modify'] . '</a>',
|
Chris@76
|
324 'params' => array(
|
Chris@76
|
325 'id_group' => false,
|
Chris@76
|
326 ),
|
Chris@76
|
327 ),
|
Chris@76
|
328 'style' => 'text-align: center',
|
Chris@76
|
329 ),
|
Chris@76
|
330 ),
|
Chris@76
|
331 ),
|
Chris@76
|
332 'additional_rows' => array(
|
Chris@76
|
333 array(
|
Chris@76
|
334 'position' => 'below_table_data',
|
Chris@76
|
335 'value' => '[<a href="' . $scripturl . '?action=admin;area=membergroups;sa=add;postgroup">' . $txt['membergroups_add_group'] . '</a>]',
|
Chris@76
|
336 ),
|
Chris@76
|
337 ),
|
Chris@76
|
338 );
|
Chris@76
|
339
|
Chris@76
|
340 createList($listOptions);
|
Chris@76
|
341 }
|
Chris@76
|
342
|
Chris@76
|
343 // Add a membergroup.
|
Chris@76
|
344 function AddMembergroup()
|
Chris@76
|
345 {
|
Chris@76
|
346 global $context, $txt, $sourcedir, $modSettings, $smcFunc;
|
Chris@76
|
347
|
Chris@76
|
348 // A form was submitted, we can start adding.
|
Chris@76
|
349 if (!empty($_POST['group_name']))
|
Chris@76
|
350 {
|
Chris@76
|
351 checkSession();
|
Chris@76
|
352
|
Chris@76
|
353 $postCountBasedGroup = isset($_POST['min_posts']) && (!isset($_POST['postgroup_based']) || !empty($_POST['postgroup_based']));
|
Chris@76
|
354 $_POST['group_type'] = !isset($_POST['group_type']) || $_POST['group_type'] < 0 || $_POST['group_type'] > 3 || ($_POST['group_type'] == 1 && !allowedTo('admin_forum')) ? 0 : (int) $_POST['group_type'];
|
Chris@76
|
355
|
Chris@76
|
356 // !!! Check for members with same name too?
|
Chris@76
|
357
|
Chris@76
|
358 $request = $smcFunc['db_query']('', '
|
Chris@76
|
359 SELECT MAX(id_group)
|
Chris@76
|
360 FROM {db_prefix}membergroups',
|
Chris@76
|
361 array(
|
Chris@76
|
362 )
|
Chris@76
|
363 );
|
Chris@76
|
364 list ($id_group) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
365 $smcFunc['db_free_result']($request);
|
Chris@76
|
366 $id_group++;
|
Chris@76
|
367
|
Chris@76
|
368 $smcFunc['db_insert']('',
|
Chris@76
|
369 '{db_prefix}membergroups',
|
Chris@76
|
370 array(
|
Chris@76
|
371 'id_group' => 'int', 'description' => 'string', 'group_name' => 'string-80', 'min_posts' => 'int',
|
Chris@76
|
372 'stars' => 'string', 'online_color' => 'string', 'group_type' => 'int',
|
Chris@76
|
373 ),
|
Chris@76
|
374 array(
|
Chris@76
|
375 $id_group, '', $_POST['group_name'], ($postCountBasedGroup ? (int) $_POST['min_posts'] : '-1'),
|
Chris@76
|
376 '1#star.gif', '', $_POST['group_type'],
|
Chris@76
|
377 ),
|
Chris@76
|
378 array('id_group')
|
Chris@76
|
379 );
|
Chris@76
|
380
|
Chris@76
|
381 // Update the post groups now, if this is a post group!
|
Chris@76
|
382 if (isset($_POST['min_posts']))
|
Chris@76
|
383 updateStats('postgroups');
|
Chris@76
|
384
|
Chris@76
|
385 // You cannot set permissions for post groups if they are disabled.
|
Chris@76
|
386 if ($postCountBasedGroup && empty($modSettings['permission_enable_postgroups']))
|
Chris@76
|
387 $_POST['perm_type'] = '';
|
Chris@76
|
388
|
Chris@76
|
389 if ($_POST['perm_type'] == 'predefined')
|
Chris@76
|
390 {
|
Chris@76
|
391 // Set default permission level.
|
Chris@76
|
392 require_once($sourcedir . '/ManagePermissions.php');
|
Chris@76
|
393 setPermissionLevel($_POST['level'], $id_group, 'null');
|
Chris@76
|
394 }
|
Chris@76
|
395 // Copy or inherit the permissions!
|
Chris@76
|
396 elseif ($_POST['perm_type'] == 'copy' || $_POST['perm_type'] == 'inherit')
|
Chris@76
|
397 {
|
Chris@76
|
398 $copy_id = $_POST['perm_type'] == 'copy' ? (int) $_POST['copyperm'] : (int) $_POST['inheritperm'];
|
Chris@76
|
399
|
Chris@76
|
400 // Are you a powerful admin?
|
Chris@76
|
401 if (!allowedTo('admin_forum'))
|
Chris@76
|
402 {
|
Chris@76
|
403 $request = $smcFunc['db_query']('', '
|
Chris@76
|
404 SELECT group_type
|
Chris@76
|
405 FROM {db_prefix}membergroups
|
Chris@76
|
406 WHERE id_group = {int:copy_from}
|
Chris@76
|
407 LIMIT {int:limit}',
|
Chris@76
|
408 array(
|
Chris@76
|
409 'copy_from' => $copy_id,
|
Chris@76
|
410 'limit' => 1,
|
Chris@76
|
411 )
|
Chris@76
|
412 );
|
Chris@76
|
413 list ($copy_type) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
414 $smcFunc['db_free_result']($request);
|
Chris@76
|
415
|
Chris@76
|
416 // Protected groups are... well, protected!
|
Chris@76
|
417 if ($copy_type == 1)
|
Chris@76
|
418 fatal_lang_error('membergroup_does_not_exist');
|
Chris@76
|
419 }
|
Chris@76
|
420
|
Chris@76
|
421 // Don't allow copying of a real priviledged person!
|
Chris@76
|
422 require_once($sourcedir . '/ManagePermissions.php');
|
Chris@76
|
423 loadIllegalPermissions();
|
Chris@76
|
424
|
Chris@76
|
425 $request = $smcFunc['db_query']('', '
|
Chris@76
|
426 SELECT permission, add_deny
|
Chris@76
|
427 FROM {db_prefix}permissions
|
Chris@76
|
428 WHERE id_group = {int:copy_from}',
|
Chris@76
|
429 array(
|
Chris@76
|
430 'copy_from' => $copy_id,
|
Chris@76
|
431 )
|
Chris@76
|
432 );
|
Chris@76
|
433 $inserts = array();
|
Chris@76
|
434 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
435 {
|
Chris@76
|
436 if (empty($context['illegal_permissions']) || !in_array($row['permission'], $context['illegal_permissions']))
|
Chris@76
|
437 $inserts[] = array($id_group, $row['permission'], $row['add_deny']);
|
Chris@76
|
438 }
|
Chris@76
|
439 $smcFunc['db_free_result']($request);
|
Chris@76
|
440
|
Chris@76
|
441 if (!empty($inserts))
|
Chris@76
|
442 $smcFunc['db_insert']('insert',
|
Chris@76
|
443 '{db_prefix}permissions',
|
Chris@76
|
444 array('id_group' => 'int', 'permission' => 'string', 'add_deny' => 'int'),
|
Chris@76
|
445 $inserts,
|
Chris@76
|
446 array('id_group', 'permission')
|
Chris@76
|
447 );
|
Chris@76
|
448
|
Chris@76
|
449 $request = $smcFunc['db_query']('', '
|
Chris@76
|
450 SELECT id_profile, permission, add_deny
|
Chris@76
|
451 FROM {db_prefix}board_permissions
|
Chris@76
|
452 WHERE id_group = {int:copy_from}',
|
Chris@76
|
453 array(
|
Chris@76
|
454 'copy_from' => $copy_id,
|
Chris@76
|
455 )
|
Chris@76
|
456 );
|
Chris@76
|
457 $inserts = array();
|
Chris@76
|
458 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
459 $inserts[] = array($id_group, $row['id_profile'], $row['permission'], $row['add_deny']);
|
Chris@76
|
460 $smcFunc['db_free_result']($request);
|
Chris@76
|
461
|
Chris@76
|
462 if (!empty($inserts))
|
Chris@76
|
463 $smcFunc['db_insert']('insert',
|
Chris@76
|
464 '{db_prefix}board_permissions',
|
Chris@76
|
465 array('id_group' => 'int', 'id_profile' => 'int', 'permission' => 'string', 'add_deny' => 'int'),
|
Chris@76
|
466 $inserts,
|
Chris@76
|
467 array('id_group', 'id_profile', 'permission')
|
Chris@76
|
468 );
|
Chris@76
|
469
|
Chris@76
|
470 // Also get some membergroup information if we're copying and not copying from guests...
|
Chris@76
|
471 if ($copy_id > 0 && $_POST['perm_type'] == 'copy')
|
Chris@76
|
472 {
|
Chris@76
|
473 $request = $smcFunc['db_query']('', '
|
Chris@76
|
474 SELECT online_color, max_messages, stars
|
Chris@76
|
475 FROM {db_prefix}membergroups
|
Chris@76
|
476 WHERE id_group = {int:copy_from}
|
Chris@76
|
477 LIMIT 1',
|
Chris@76
|
478 array(
|
Chris@76
|
479 'copy_from' => $copy_id,
|
Chris@76
|
480 )
|
Chris@76
|
481 );
|
Chris@76
|
482 $group_info = $smcFunc['db_fetch_assoc']($request);
|
Chris@76
|
483 $smcFunc['db_free_result']($request);
|
Chris@76
|
484
|
Chris@76
|
485 // ...and update the new membergroup with it.
|
Chris@76
|
486 $smcFunc['db_query']('', '
|
Chris@76
|
487 UPDATE {db_prefix}membergroups
|
Chris@76
|
488 SET
|
Chris@76
|
489 online_color = {string:online_color},
|
Chris@76
|
490 max_messages = {int:max_messages},
|
Chris@76
|
491 stars = {string:stars}
|
Chris@76
|
492 WHERE id_group = {int:current_group}',
|
Chris@76
|
493 array(
|
Chris@76
|
494 'max_messages' => $group_info['max_messages'],
|
Chris@76
|
495 'current_group' => $id_group,
|
Chris@76
|
496 'online_color' => $group_info['online_color'],
|
Chris@76
|
497 'stars' => $group_info['stars'],
|
Chris@76
|
498 )
|
Chris@76
|
499 );
|
Chris@76
|
500 }
|
Chris@76
|
501 // If inheriting say so...
|
Chris@76
|
502 elseif ($_POST['perm_type'] == 'inherit')
|
Chris@76
|
503 {
|
Chris@76
|
504 $smcFunc['db_query']('', '
|
Chris@76
|
505 UPDATE {db_prefix}membergroups
|
Chris@76
|
506 SET id_parent = {int:copy_from}
|
Chris@76
|
507 WHERE id_group = {int:current_group}',
|
Chris@76
|
508 array(
|
Chris@76
|
509 'copy_from' => $copy_id,
|
Chris@76
|
510 'current_group' => $id_group,
|
Chris@76
|
511 )
|
Chris@76
|
512 );
|
Chris@76
|
513 }
|
Chris@76
|
514 }
|
Chris@76
|
515
|
Chris@76
|
516 // Make sure all boards selected are stored in a proper array.
|
Chris@76
|
517 $_POST['boardaccess'] = empty($_POST['boardaccess']) || !is_array($_POST['boardaccess']) ? array() : $_POST['boardaccess'];
|
Chris@76
|
518 foreach ($_POST['boardaccess'] as $key => $value)
|
Chris@76
|
519 $_POST['boardaccess'][$key] = (int) $value;
|
Chris@76
|
520
|
Chris@76
|
521 // Only do this if they have special access requirements.
|
Chris@76
|
522 if (!empty($_POST['boardaccess']))
|
Chris@76
|
523 $smcFunc['db_query']('', '
|
Chris@76
|
524 UPDATE {db_prefix}boards
|
Chris@76
|
525 SET member_groups = CASE WHEN member_groups = {string:blank_string} THEN {string:group_id_string} ELSE CONCAT(member_groups, {string:comma_group}) END
|
Chris@76
|
526 WHERE id_board IN ({array_int:board_list})',
|
Chris@76
|
527 array(
|
Chris@76
|
528 'board_list' => $_POST['boardaccess'],
|
Chris@76
|
529 'blank_string' => '',
|
Chris@76
|
530 'group_id_string' => (string) $id_group,
|
Chris@76
|
531 'comma_group' => ',' . $id_group,
|
Chris@76
|
532 )
|
Chris@76
|
533 );
|
Chris@76
|
534
|
Chris@76
|
535 // If this is joinable then set it to show group membership in people's profiles.
|
Chris@76
|
536 if (empty($modSettings['show_group_membership']) && $_POST['group_type'] > 1)
|
Chris@76
|
537 updateSettings(array('show_group_membership' => 1));
|
Chris@76
|
538
|
Chris@76
|
539 // Rebuild the group cache.
|
Chris@76
|
540 updateSettings(array(
|
Chris@76
|
541 'settings_updated' => time(),
|
Chris@76
|
542 ));
|
Chris@76
|
543
|
Chris@76
|
544 // We did it.
|
Chris@76
|
545 logAction('add_group', array('group' => $_POST['group_name']), 'admin');
|
Chris@76
|
546
|
Chris@76
|
547 // Go change some more settings.
|
Chris@76
|
548 redirectexit('action=admin;area=membergroups;sa=edit;group=' . $id_group);
|
Chris@76
|
549 }
|
Chris@76
|
550
|
Chris@76
|
551 // Just show the 'add membergroup' screen.
|
Chris@76
|
552 $context['page_title'] = $txt['membergroups_new_group'];
|
Chris@76
|
553 $context['sub_template'] = 'new_group';
|
Chris@76
|
554 $context['post_group'] = isset($_REQUEST['postgroup']);
|
Chris@76
|
555 $context['undefined_group'] = !isset($_REQUEST['postgroup']) && !isset($_REQUEST['generalgroup']);
|
Chris@76
|
556 $context['allow_protected'] = allowedTo('admin_forum');
|
Chris@76
|
557
|
Chris@76
|
558 $result = $smcFunc['db_query']('', '
|
Chris@76
|
559 SELECT id_group, group_name
|
Chris@76
|
560 FROM {db_prefix}membergroups
|
Chris@76
|
561 WHERE (id_group > {int:moderator_group} OR id_group = {int:global_mod_group})' . (empty($modSettings['permission_enable_postgroups']) ? '
|
Chris@76
|
562 AND min_posts = {int:min_posts}' : '') . (allowedTo('admin_forum') ? '' : '
|
Chris@76
|
563 AND group_type != {int:is_protected}') . '
|
Chris@76
|
564 ORDER BY min_posts, id_group != {int:global_mod_group}, group_name',
|
Chris@76
|
565 array(
|
Chris@76
|
566 'moderator_group' => 3,
|
Chris@76
|
567 'global_mod_group' => 2,
|
Chris@76
|
568 'min_posts' => -1,
|
Chris@76
|
569 'is_protected' => 1,
|
Chris@76
|
570 )
|
Chris@76
|
571 );
|
Chris@76
|
572 $context['groups'] = array();
|
Chris@76
|
573 while ($row = $smcFunc['db_fetch_assoc']($result))
|
Chris@76
|
574 $context['groups'][] = array(
|
Chris@76
|
575 'id' => $row['id_group'],
|
Chris@76
|
576 'name' => $row['group_name']
|
Chris@76
|
577 );
|
Chris@76
|
578 $smcFunc['db_free_result']($result);
|
Chris@76
|
579
|
Chris@76
|
580 $result = $smcFunc['db_query']('', '
|
Chris@76
|
581 SELECT id_board, name, child_level
|
Chris@76
|
582 FROM {db_prefix}boards
|
Chris@76
|
583 ORDER BY board_order',
|
Chris@76
|
584 array(
|
Chris@76
|
585 )
|
Chris@76
|
586 );
|
Chris@76
|
587 $context['boards'] = array();
|
Chris@76
|
588 while ($row = $smcFunc['db_fetch_assoc']($result))
|
Chris@76
|
589 $context['boards'][] = array(
|
Chris@76
|
590 'id' => $row['id_board'],
|
Chris@76
|
591 'name' => $row['name'],
|
Chris@76
|
592 'child_level' => $row['child_level'],
|
Chris@76
|
593 'selected' => false
|
Chris@76
|
594 );
|
Chris@76
|
595 $smcFunc['db_free_result']($result);
|
Chris@76
|
596 }
|
Chris@76
|
597
|
Chris@76
|
598 // Deleting a membergroup by URL (not implemented).
|
Chris@76
|
599 function DeleteMembergroup()
|
Chris@76
|
600 {
|
Chris@76
|
601 global $sourcedir;
|
Chris@76
|
602
|
Chris@76
|
603 checkSession('get');
|
Chris@76
|
604
|
Chris@76
|
605 require_once($sourcedir . '/Subs-Membergroups.php');
|
Chris@76
|
606 deleteMembergroups((int) $_REQUEST['group']);
|
Chris@76
|
607
|
Chris@76
|
608 // Go back to the membergroup index.
|
Chris@76
|
609 redirectexit('action=admin;area=membergroups;');
|
Chris@76
|
610 }
|
Chris@76
|
611
|
Chris@76
|
612 // Editing a membergroup.
|
Chris@76
|
613 function EditMembergroup()
|
Chris@76
|
614 {
|
Chris@76
|
615 global $context, $txt, $sourcedir, $modSettings, $smcFunc;
|
Chris@76
|
616
|
Chris@76
|
617 $_REQUEST['group'] = isset($_REQUEST['group']) && $_REQUEST['group'] > 0 ? (int) $_REQUEST['group'] : 0;
|
Chris@76
|
618
|
Chris@76
|
619 // Make sure this group is editable.
|
Chris@76
|
620 if (!empty($_REQUEST['group']))
|
Chris@76
|
621 {
|
Chris@76
|
622 $request = $smcFunc['db_query']('', '
|
Chris@76
|
623 SELECT id_group
|
Chris@76
|
624 FROM {db_prefix}membergroups
|
Chris@76
|
625 WHERE id_group = {int:current_group}' . (allowedTo('admin_forum') ? '' : '
|
Chris@76
|
626 AND group_type != {int:is_protected}') . '
|
Chris@76
|
627 LIMIT {int:limit}',
|
Chris@76
|
628 array(
|
Chris@76
|
629 'current_group' => $_REQUEST['group'],
|
Chris@76
|
630 'is_protected' => 1,
|
Chris@76
|
631 'limit' => 1,
|
Chris@76
|
632 )
|
Chris@76
|
633 );
|
Chris@76
|
634 list ($_REQUEST['group']) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
635 $smcFunc['db_free_result']($request);
|
Chris@76
|
636 }
|
Chris@76
|
637
|
Chris@76
|
638 // Now, do we have a valid id?
|
Chris@76
|
639 if (empty($_REQUEST['group']))
|
Chris@76
|
640 fatal_lang_error('membergroup_does_not_exist', false);
|
Chris@76
|
641
|
Chris@76
|
642 // The delete this membergroup button was pressed.
|
Chris@76
|
643 if (isset($_POST['delete']))
|
Chris@76
|
644 {
|
Chris@76
|
645 checkSession();
|
Chris@76
|
646
|
Chris@76
|
647 require_once($sourcedir . '/Subs-Membergroups.php');
|
Chris@76
|
648 deleteMembergroups($_REQUEST['group']);
|
Chris@76
|
649
|
Chris@76
|
650 redirectexit('action=admin;area=membergroups;');
|
Chris@76
|
651 }
|
Chris@76
|
652 // A form was submitted with the new membergroup settings.
|
Chris@76
|
653 elseif (isset($_POST['submit']))
|
Chris@76
|
654 {
|
Chris@76
|
655 // Validate the session.
|
Chris@76
|
656 checkSession();
|
Chris@76
|
657
|
Chris@76
|
658 // Can they really inherit from this group?
|
Chris@76
|
659 if ($_POST['group_inherit'] != -2 && !allowedTo('admin_forum'))
|
Chris@76
|
660 {
|
Chris@76
|
661 $request = $smcFunc['db_query']('', '
|
Chris@76
|
662 SELECT group_type
|
Chris@76
|
663 FROM {db_prefix}membergroups
|
Chris@76
|
664 WHERE id_group = {int:inherit_from}
|
Chris@76
|
665 LIMIT {int:limit}',
|
Chris@76
|
666 array(
|
Chris@76
|
667 'inherit_from' => $_POST['group_inherit'],
|
Chris@76
|
668 'limit' => 1,
|
Chris@76
|
669 )
|
Chris@76
|
670 );
|
Chris@76
|
671 list ($inherit_type) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
672 $smcFunc['db_free_result']($request);
|
Chris@76
|
673 }
|
Chris@76
|
674
|
Chris@76
|
675 // Set variables to their proper value.
|
Chris@76
|
676 $_POST['max_messages'] = isset($_POST['max_messages']) ? (int) $_POST['max_messages'] : 0;
|
Chris@76
|
677 $_POST['min_posts'] = isset($_POST['min_posts']) && isset($_POST['group_type']) && $_POST['group_type'] == -1 && $_REQUEST['group'] > 3 ? abs($_POST['min_posts']) : ($_REQUEST['group'] == 4 ? 0 : -1);
|
Chris@76
|
678 $_POST['stars'] = (empty($_POST['star_count']) || $_POST['star_count'] < 0) ? '' : min((int) $_POST['star_count'], 99) . '#' . $_POST['star_image'];
|
Chris@76
|
679 $_POST['group_desc'] = isset($_POST['group_desc']) && ($_REQUEST['group'] == 1 || (isset($_POST['group_type']) && $_POST['group_type'] != -1)) ? trim($_POST['group_desc']) : '';
|
Chris@76
|
680 $_POST['group_type'] = !isset($_POST['group_type']) || $_POST['group_type'] < 0 || $_POST['group_type'] > 3 || ($_POST['group_type'] == 1 && !allowedTo('admin_forum')) ? 0 : (int) $_POST['group_type'];
|
Chris@76
|
681 $_POST['group_hidden'] = empty($_POST['group_hidden']) || $_POST['min_posts'] != -1 || $_REQUEST['group'] == 3 ? 0 : (int) $_POST['group_hidden'];
|
Chris@76
|
682 $_POST['group_inherit'] = $_REQUEST['group'] > 1 && $_REQUEST['group'] != 3 && (empty($inherit_type) || $inherit_type != 1) ? (int) $_POST['group_inherit'] : -2;
|
Chris@76
|
683
|
Chris@76
|
684 // !!! Don't set online_color for the Moderators group?
|
Chris@76
|
685
|
Chris@76
|
686 // Do the update of the membergroup settings.
|
Chris@76
|
687 $smcFunc['db_query']('', '
|
Chris@76
|
688 UPDATE {db_prefix}membergroups
|
Chris@76
|
689 SET group_name = {string:group_name}, online_color = {string:online_color},
|
Chris@76
|
690 max_messages = {int:max_messages}, min_posts = {int:min_posts}, stars = {string:stars},
|
Chris@76
|
691 description = {string:group_desc}, group_type = {int:group_type}, hidden = {int:group_hidden},
|
Chris@76
|
692 id_parent = {int:group_inherit}
|
Chris@76
|
693 WHERE id_group = {int:current_group}',
|
Chris@76
|
694 array(
|
Chris@76
|
695 'max_messages' => $_POST['max_messages'],
|
Chris@76
|
696 'min_posts' => $_POST['min_posts'],
|
Chris@76
|
697 'group_type' => $_POST['group_type'],
|
Chris@76
|
698 'group_hidden' => $_POST['group_hidden'],
|
Chris@76
|
699 'group_inherit' => $_POST['group_inherit'],
|
Chris@76
|
700 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
701 'group_name' => $_POST['group_name'],
|
Chris@76
|
702 'online_color' => $_POST['online_color'],
|
Chris@76
|
703 'stars' => $_POST['stars'],
|
Chris@76
|
704 'group_desc' => $_POST['group_desc'],
|
Chris@76
|
705 )
|
Chris@76
|
706 );
|
Chris@76
|
707
|
Chris@76
|
708 // Time to update the boards this membergroup has access to.
|
Chris@76
|
709 if ($_REQUEST['group'] == 2 || $_REQUEST['group'] > 3)
|
Chris@76
|
710 {
|
Chris@76
|
711 $_POST['boardaccess'] = empty($_POST['boardaccess']) || !is_array($_POST['boardaccess']) ? array() : $_POST['boardaccess'];
|
Chris@76
|
712 foreach ($_POST['boardaccess'] as $key => $value)
|
Chris@76
|
713 $_POST['boardaccess'][$key] = (int) $value;
|
Chris@76
|
714
|
Chris@76
|
715 // Find all board this group is in, but shouldn't be in.
|
Chris@76
|
716 $request = $smcFunc['db_query']('', '
|
Chris@76
|
717 SELECT id_board, member_groups
|
Chris@76
|
718 FROM {db_prefix}boards
|
Chris@76
|
719 WHERE FIND_IN_SET({string:current_group}, member_groups) != 0' . (empty($_POST['boardaccess']) ? '' : '
|
Chris@76
|
720 AND id_board NOT IN ({array_int:board_access_list})'),
|
Chris@76
|
721 array(
|
Chris@76
|
722 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
723 'board_access_list' => $_POST['boardaccess'],
|
Chris@76
|
724 )
|
Chris@76
|
725 );
|
Chris@76
|
726 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
727 $smcFunc['db_query']('', '
|
Chris@76
|
728 UPDATE {db_prefix}boards
|
Chris@76
|
729 SET member_groups = {string:member_group_access}
|
Chris@76
|
730 WHERE id_board = {int:current_board}',
|
Chris@76
|
731 array(
|
Chris@76
|
732 'current_board' => $row['id_board'],
|
Chris@76
|
733 'member_group_access' => implode(',', array_diff(explode(',', $row['member_groups']), array($_REQUEST['group']))),
|
Chris@76
|
734 )
|
Chris@76
|
735 );
|
Chris@76
|
736 $smcFunc['db_free_result']($request);
|
Chris@76
|
737
|
Chris@76
|
738 // Add the membergroup to all boards that hadn't been set yet.
|
Chris@76
|
739 if (!empty($_POST['boardaccess']))
|
Chris@76
|
740 $smcFunc['db_query']('', '
|
Chris@76
|
741 UPDATE {db_prefix}boards
|
Chris@76
|
742 SET member_groups = CASE WHEN member_groups = {string:blank_string} THEN {string:group_id_string} ELSE CONCAT(member_groups, {string:comma_group}) END
|
Chris@76
|
743 WHERE id_board IN ({array_int:board_list})
|
Chris@76
|
744 AND FIND_IN_SET({int:current_group}, member_groups) = 0',
|
Chris@76
|
745 array(
|
Chris@76
|
746 'board_list' => $_POST['boardaccess'],
|
Chris@76
|
747 'blank_string' => '',
|
Chris@76
|
748 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
749 'group_id_string' => (string) (int) $_REQUEST['group'],
|
Chris@76
|
750 'comma_group' => ',' . $_REQUEST['group'],
|
Chris@76
|
751 )
|
Chris@76
|
752 );
|
Chris@76
|
753 }
|
Chris@76
|
754
|
Chris@76
|
755 // Remove everyone from this group!
|
Chris@76
|
756 if ($_POST['min_posts'] != -1)
|
Chris@76
|
757 {
|
Chris@76
|
758 $smcFunc['db_query']('', '
|
Chris@76
|
759 UPDATE {db_prefix}members
|
Chris@76
|
760 SET id_group = {int:regular_member}
|
Chris@76
|
761 WHERE id_group = {int:current_group}',
|
Chris@76
|
762 array(
|
Chris@76
|
763 'regular_member' => 0,
|
Chris@76
|
764 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
765 )
|
Chris@76
|
766 );
|
Chris@76
|
767
|
Chris@76
|
768 $request = $smcFunc['db_query']('', '
|
Chris@76
|
769 SELECT id_member, additional_groups
|
Chris@76
|
770 FROM {db_prefix}members
|
Chris@76
|
771 WHERE FIND_IN_SET({string:current_group}, additional_groups) != 0',
|
Chris@76
|
772 array(
|
Chris@76
|
773 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
774 )
|
Chris@76
|
775 );
|
Chris@76
|
776 $updates = array();
|
Chris@76
|
777 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
778 $updates[$row['additional_groups']][] = $row['id_member'];
|
Chris@76
|
779 $smcFunc['db_free_result']($request);
|
Chris@76
|
780
|
Chris@76
|
781 foreach ($updates as $additional_groups => $memberArray)
|
Chris@76
|
782 updateMemberData($memberArray, array('additional_groups' => implode(',', array_diff(explode(',', $additional_groups), array((int) $_REQUEST['group'])))));
|
Chris@76
|
783 }
|
Chris@76
|
784 elseif ($_REQUEST['group'] != 3)
|
Chris@76
|
785 {
|
Chris@76
|
786 // Making it a hidden group? If so remove everyone with it as primary group (Actually, just make them additional).
|
Chris@76
|
787 if ($_POST['group_hidden'] == 2)
|
Chris@76
|
788 {
|
Chris@76
|
789 $request = $smcFunc['db_query']('', '
|
Chris@76
|
790 SELECT id_member, additional_groups
|
Chris@76
|
791 FROM {db_prefix}members
|
Chris@76
|
792 WHERE id_group = {int:current_group}
|
Chris@76
|
793 AND FIND_IN_SET({int:current_group}, additional_groups) = 0',
|
Chris@76
|
794 array(
|
Chris@76
|
795 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
796 )
|
Chris@76
|
797 );
|
Chris@76
|
798 $updates = array();
|
Chris@76
|
799 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
800 $updates[$row['additional_groups']][] = $row['id_member'];
|
Chris@76
|
801 $smcFunc['db_free_result']($request);
|
Chris@76
|
802
|
Chris@76
|
803 foreach ($updates as $additional_groups => $memberArray)
|
Chris@76
|
804 updateMemberData($memberArray, array('additional_groups' => implode(',', array_merge(explode(',', $additional_groups), array((int) $_REQUEST['group'])))));
|
Chris@76
|
805
|
Chris@76
|
806 $smcFunc['db_query']('', '
|
Chris@76
|
807 UPDATE {db_prefix}members
|
Chris@76
|
808 SET id_group = {int:regular_member}
|
Chris@76
|
809 WHERE id_group = {int:current_group}',
|
Chris@76
|
810 array(
|
Chris@76
|
811 'regular_member' => 0,
|
Chris@76
|
812 'current_group' => $_REQUEST['group'],
|
Chris@76
|
813 )
|
Chris@76
|
814 );
|
Chris@76
|
815 }
|
Chris@76
|
816
|
Chris@76
|
817 // Either way, let's check our "show group membership" setting is correct.
|
Chris@76
|
818 $request = $smcFunc['db_query']('', '
|
Chris@76
|
819 SELECT COUNT(*)
|
Chris@76
|
820 FROM {db_prefix}membergroups
|
Chris@76
|
821 WHERE group_type > {int:non_joinable}',
|
Chris@76
|
822 array(
|
Chris@76
|
823 'non_joinable' => 1,
|
Chris@76
|
824 )
|
Chris@76
|
825 );
|
Chris@76
|
826 list ($have_joinable) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
827 $smcFunc['db_free_result']($request);
|
Chris@76
|
828
|
Chris@76
|
829 // Do we need to update the setting?
|
Chris@76
|
830 if ((empty($modSettings['show_group_membership']) && $have_joinable) || (!empty($modSettings['show_group_membership']) && !$have_joinable))
|
Chris@76
|
831 updateSettings(array('show_group_membership' => $have_joinable ? 1 : 0));
|
Chris@76
|
832 }
|
Chris@76
|
833
|
Chris@76
|
834 // Do we need to set inherited permissions?
|
Chris@76
|
835 if ($_POST['group_inherit'] != -2 && $_POST['group_inherit'] != $_POST['old_inherit'])
|
Chris@76
|
836 {
|
Chris@76
|
837 require_once($sourcedir . '/ManagePermissions.php');
|
Chris@76
|
838 updateChildPermissions($_POST['group_inherit']);
|
Chris@76
|
839 }
|
Chris@76
|
840
|
Chris@76
|
841 // Finally, moderators!
|
Chris@76
|
842 $moderator_string = isset($_POST['group_moderators']) ? trim($_POST['group_moderators']) : '';
|
Chris@76
|
843 $smcFunc['db_query']('', '
|
Chris@76
|
844 DELETE FROM {db_prefix}group_moderators
|
Chris@76
|
845 WHERE id_group = {int:current_group}',
|
Chris@76
|
846 array(
|
Chris@76
|
847 'current_group' => $_REQUEST['group'],
|
Chris@76
|
848 )
|
Chris@76
|
849 );
|
Chris@76
|
850 if ((!empty($moderator_string) || !empty($_POST['moderator_list'])) && $_POST['min_posts'] == -1 && $_REQUEST['group'] != 3)
|
Chris@76
|
851 {
|
Chris@76
|
852 // Get all the usernames from the string
|
Chris@76
|
853 if (!empty($moderator_string))
|
Chris@76
|
854 {
|
Chris@76
|
855 $moderator_string = strtr(preg_replace('~&#(\d{4,5}|[2-9]\d{2,4}|1[2-9]\d);~', '&#$1;', htmlspecialchars($moderator_string), ENT_QUOTES), array('"' => '"'));
|
Chris@76
|
856 preg_match_all('~"([^"]+)"~', $moderator_string, $matches);
|
Chris@76
|
857 $moderators = array_merge($matches[1], explode(',', preg_replace('~"[^"]+"~', '', $moderator_string)));
|
Chris@76
|
858 for ($k = 0, $n = count($moderators); $k < $n; $k++)
|
Chris@76
|
859 {
|
Chris@76
|
860 $moderators[$k] = trim($moderators[$k]);
|
Chris@76
|
861
|
Chris@76
|
862 if (strlen($moderators[$k]) == 0)
|
Chris@76
|
863 unset($moderators[$k]);
|
Chris@76
|
864 }
|
Chris@76
|
865
|
Chris@76
|
866 // Find all the id_member's for the member_name's in the list.
|
Chris@76
|
867 $group_moderators = array();
|
Chris@76
|
868 if (!empty($moderators))
|
Chris@76
|
869 {
|
Chris@76
|
870 $request = $smcFunc['db_query']('', '
|
Chris@76
|
871 SELECT id_member
|
Chris@76
|
872 FROM {db_prefix}members
|
Chris@76
|
873 WHERE member_name IN ({array_string:moderators}) OR real_name IN ({array_string:moderators})
|
Chris@76
|
874 LIMIT ' . count($moderators),
|
Chris@76
|
875 array(
|
Chris@76
|
876 'moderators' => $moderators,
|
Chris@76
|
877 )
|
Chris@76
|
878 );
|
Chris@76
|
879 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
880 $group_moderators[] = $row['id_member'];
|
Chris@76
|
881 $smcFunc['db_free_result']($request);
|
Chris@76
|
882 }
|
Chris@76
|
883 }
|
Chris@76
|
884 else
|
Chris@76
|
885 {
|
Chris@76
|
886 $moderators = array();
|
Chris@76
|
887 foreach ($_POST['moderator_list'] as $moderator)
|
Chris@76
|
888 $moderators[] = (int) $moderator;
|
Chris@76
|
889
|
Chris@76
|
890 $group_moderators = array();
|
Chris@76
|
891 if (!empty($moderators))
|
Chris@76
|
892 {
|
Chris@76
|
893 $request = $smcFunc['db_query']('', '
|
Chris@76
|
894 SELECT id_member
|
Chris@76
|
895 FROM {db_prefix}members
|
Chris@76
|
896 WHERE id_member IN ({array_int:moderators})
|
Chris@76
|
897 LIMIT {int:num_moderators}',
|
Chris@76
|
898 array(
|
Chris@76
|
899 'moderators' => $moderators,
|
Chris@76
|
900 'num_moderators' => count($moderators),
|
Chris@76
|
901 )
|
Chris@76
|
902 );
|
Chris@76
|
903 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
904 $group_moderators[] = $row['id_member'];
|
Chris@76
|
905 $smcFunc['db_free_result']($request);
|
Chris@76
|
906 }
|
Chris@76
|
907 }
|
Chris@76
|
908
|
Chris@76
|
909 // Found some?
|
Chris@76
|
910 if (!empty($group_moderators))
|
Chris@76
|
911 {
|
Chris@76
|
912 $mod_insert = array();
|
Chris@76
|
913 foreach ($group_moderators as $moderator)
|
Chris@76
|
914 $mod_insert[] = array($_REQUEST['group'], $moderator);
|
Chris@76
|
915
|
Chris@76
|
916 $smcFunc['db_insert']('insert',
|
Chris@76
|
917 '{db_prefix}group_moderators',
|
Chris@76
|
918 array('id_group' => 'int', 'id_member' => 'int'),
|
Chris@76
|
919 $mod_insert,
|
Chris@76
|
920 array('id_group', 'id_member')
|
Chris@76
|
921 );
|
Chris@76
|
922 }
|
Chris@76
|
923 }
|
Chris@76
|
924
|
Chris@76
|
925 // There might have been some post group changes.
|
Chris@76
|
926 updateStats('postgroups');
|
Chris@76
|
927 // We've definetely changed some group stuff.
|
Chris@76
|
928 updateSettings(array(
|
Chris@76
|
929 'settings_updated' => time(),
|
Chris@76
|
930 ));
|
Chris@76
|
931
|
Chris@76
|
932 // Log the edit.
|
Chris@76
|
933 logAction('edited_group', array('group' => $_POST['group_name']), 'admin');
|
Chris@76
|
934
|
Chris@76
|
935 redirectexit('action=admin;area=membergroups');
|
Chris@76
|
936 }
|
Chris@76
|
937
|
Chris@76
|
938 // Fetch the current group information.
|
Chris@76
|
939 $request = $smcFunc['db_query']('', '
|
Chris@76
|
940 SELECT group_name, description, min_posts, online_color, max_messages, stars, group_type, hidden, id_parent
|
Chris@76
|
941 FROM {db_prefix}membergroups
|
Chris@76
|
942 WHERE id_group = {int:current_group}
|
Chris@76
|
943 LIMIT 1',
|
Chris@76
|
944 array(
|
Chris@76
|
945 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
946 )
|
Chris@76
|
947 );
|
Chris@76
|
948 if ($smcFunc['db_num_rows']($request) == 0)
|
Chris@76
|
949 fatal_lang_error('membergroup_does_not_exist', false);
|
Chris@76
|
950 $row = $smcFunc['db_fetch_assoc']($request);
|
Chris@76
|
951 $smcFunc['db_free_result']($request);
|
Chris@76
|
952
|
Chris@76
|
953 $row['stars'] = explode('#', $row['stars']);
|
Chris@76
|
954
|
Chris@76
|
955 $context['group'] = array(
|
Chris@76
|
956 'id' => $_REQUEST['group'],
|
Chris@76
|
957 'name' => $row['group_name'],
|
Chris@76
|
958 'description' => htmlspecialchars($row['description']),
|
Chris@76
|
959 'editable_name' => htmlspecialchars($row['group_name']),
|
Chris@76
|
960 'color' => $row['online_color'],
|
Chris@76
|
961 'min_posts' => $row['min_posts'],
|
Chris@76
|
962 'max_messages' => $row['max_messages'],
|
Chris@76
|
963 'star_count' => (int) $row['stars'][0],
|
Chris@76
|
964 'star_image' => isset($row['stars'][1]) ? $row['stars'][1] : '',
|
Chris@76
|
965 'is_post_group' => $row['min_posts'] != -1,
|
Chris@76
|
966 'type' => $row['min_posts'] != -1 ? 0 : $row['group_type'],
|
Chris@76
|
967 'hidden' => $row['min_posts'] == -1 ? $row['hidden'] : 0,
|
Chris@76
|
968 'inherited_from' => $row['id_parent'],
|
Chris@76
|
969 'allow_post_group' => $_REQUEST['group'] == 2 || $_REQUEST['group'] > 4,
|
Chris@76
|
970 'allow_delete' => $_REQUEST['group'] == 2 || $_REQUEST['group'] > 4,
|
Chris@76
|
971 'allow_protected' => allowedTo('admin_forum'),
|
Chris@76
|
972 );
|
Chris@76
|
973
|
Chris@76
|
974 // Get any moderators for this group
|
Chris@76
|
975 $request = $smcFunc['db_query']('', '
|
Chris@76
|
976 SELECT mem.id_member, mem.real_name
|
Chris@76
|
977 FROM {db_prefix}group_moderators AS mods
|
Chris@76
|
978 INNER JOIN {db_prefix}members AS mem ON (mem.id_member = mods.id_member)
|
Chris@76
|
979 WHERE mods.id_group = {int:current_group}',
|
Chris@76
|
980 array(
|
Chris@76
|
981 'current_group' => $_REQUEST['group'],
|
Chris@76
|
982 )
|
Chris@76
|
983 );
|
Chris@76
|
984 $context['group']['moderators'] = array();
|
Chris@76
|
985 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
986 $context['group']['moderators'][$row['id_member']] = $row['real_name'];
|
Chris@76
|
987 $smcFunc['db_free_result']($request);
|
Chris@76
|
988
|
Chris@76
|
989 $context['group']['moderator_list'] = empty($context['group']['moderators']) ? '' : '"' . implode('", "', $context['group']['moderators']) . '"';
|
Chris@76
|
990
|
Chris@76
|
991 if (!empty($context['group']['moderators']))
|
Chris@76
|
992 list ($context['group']['last_moderator_id']) = array_slice(array_keys($context['group']['moderators']), -1);
|
Chris@76
|
993
|
Chris@76
|
994 // Get a list of boards this membergroup is allowed to see.
|
Chris@76
|
995 $context['boards'] = array();
|
Chris@76
|
996 if ($_REQUEST['group'] == 2 || $_REQUEST['group'] > 3)
|
Chris@76
|
997 {
|
Chris@76
|
998 $result = $smcFunc['db_query']('', '
|
Chris@76
|
999 SELECT id_board, name, child_level, FIND_IN_SET({string:current_group}, member_groups) != 0 AS can_access
|
Chris@76
|
1000 FROM {db_prefix}boards
|
Chris@76
|
1001 ORDER BY board_order',
|
Chris@76
|
1002 array(
|
Chris@76
|
1003 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
1004 )
|
Chris@76
|
1005 );
|
Chris@76
|
1006 while ($row = $smcFunc['db_fetch_assoc']($result))
|
Chris@76
|
1007 $context['boards'][] = array(
|
Chris@76
|
1008 'id' => $row['id_board'],
|
Chris@76
|
1009 'name' => $row['name'],
|
Chris@76
|
1010 'child_level' => $row['child_level'],
|
Chris@76
|
1011 'selected' => !(empty($row['can_access']) || $row['can_access'] == 'f'),
|
Chris@76
|
1012 );
|
Chris@76
|
1013 $smcFunc['db_free_result']($result);
|
Chris@76
|
1014 }
|
Chris@76
|
1015
|
Chris@76
|
1016 // Finally, get all the groups this could be inherited off.
|
Chris@76
|
1017 $request = $smcFunc['db_query']('', '
|
Chris@76
|
1018 SELECT id_group, group_name
|
Chris@76
|
1019 FROM {db_prefix}membergroups
|
Chris@76
|
1020 WHERE id_group != {int:current_group}' .
|
Chris@76
|
1021 (empty($modSettings['permission_enable_postgroups']) ? '
|
Chris@76
|
1022 AND min_posts = {int:min_posts}' : '') . (allowedTo('admin_forum') ? '' : '
|
Chris@76
|
1023 AND group_type != {int:is_protected}') . '
|
Chris@76
|
1024 AND id_group NOT IN (1, 3)
|
Chris@76
|
1025 AND id_parent = {int:not_inherited}',
|
Chris@76
|
1026 array(
|
Chris@76
|
1027 'current_group' => (int) $_REQUEST['group'],
|
Chris@76
|
1028 'min_posts' => -1,
|
Chris@76
|
1029 'not_inherited' => -2,
|
Chris@76
|
1030 'is_protected' => 1,
|
Chris@76
|
1031 )
|
Chris@76
|
1032 );
|
Chris@76
|
1033 $context['inheritable_groups'] = array();
|
Chris@76
|
1034 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
1035 $context['inheritable_groups'][$row['id_group']] = $row['group_name'];
|
Chris@76
|
1036 $smcFunc['db_free_result']($request);
|
Chris@76
|
1037
|
Chris@76
|
1038 $context['sub_template'] = 'edit_group';
|
Chris@76
|
1039 $context['page_title'] = $txt['membergroups_edit_group'];
|
Chris@76
|
1040 }
|
Chris@76
|
1041
|
Chris@76
|
1042 // Set general membergroup settings.
|
Chris@76
|
1043 function ModifyMembergroupsettings()
|
Chris@76
|
1044 {
|
Chris@76
|
1045 global $context, $sourcedir, $scripturl, $modSettings, $txt;
|
Chris@76
|
1046
|
Chris@76
|
1047 $context['sub_template'] = 'show_settings';
|
Chris@76
|
1048 $context['page_title'] = $txt['membergroups_settings'];
|
Chris@76
|
1049
|
Chris@76
|
1050 // Needed for the settings functions.
|
Chris@76
|
1051 require_once($sourcedir . '/ManageServer.php');
|
Chris@76
|
1052
|
Chris@76
|
1053 // Don't allow assignment of guests.
|
Chris@76
|
1054 $context['permissions_excluded'] = array(-1);
|
Chris@76
|
1055
|
Chris@76
|
1056 // Only one thing here!
|
Chris@76
|
1057 $config_vars = array(
|
Chris@76
|
1058 array('permissions', 'manage_membergroups'),
|
Chris@76
|
1059 );
|
Chris@76
|
1060
|
Chris@76
|
1061 if (isset($_REQUEST['save']))
|
Chris@76
|
1062 {
|
Chris@76
|
1063 checkSession();
|
Chris@76
|
1064
|
Chris@76
|
1065 // Yeppers, saving this...
|
Chris@76
|
1066 saveDBSettings($config_vars);
|
Chris@76
|
1067 redirectexit('action=admin;area=membergroups;sa=settings');
|
Chris@76
|
1068 }
|
Chris@76
|
1069
|
Chris@76
|
1070 // Some simple context.
|
Chris@76
|
1071 $context['post_url'] = $scripturl . '?action=admin;area=membergroups;save;sa=settings';
|
Chris@76
|
1072 $context['settings_title'] = $txt['membergroups_settings'];
|
Chris@76
|
1073
|
Chris@76
|
1074 prepareDBSettingContext($config_vars);
|
Chris@76
|
1075 }
|
Chris@76
|
1076
|
Chris@76
|
1077 ?> |