Changeset 25194 for trunk/admin
- Timestamp:
- Oct 28, 2013, 5:25:46 PM (10 years ago)
- Location:
- trunk/admin
- Files:
-
- 2 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/admin/themes/default/template/user_list.tpl
r12887 r25194 1 {combine_script id='common' load='footer' path='admin/themes/default/js/common.js'} 2 3 {combine_script id='jquery.dataTables' load='footer' path='themes/default/js/plugins/jquery.dataTables.js'} 4 {combine_css path="themes/default/js/plugins/datatables/css/jquery.dataTables.css"} 5 6 {footer_script} 7 var selectedMessage_pattern = "{'%d of %d photos selected'|@translate}"; 8 var selectedMessage_none = "{'No photo selected, %d photos in current set'|@translate}"; 9 var selectedMessage_all = "{'All %d photos are selected'|@translate}"; 10 var applyOnDetails_pattern = "{'on the %d selected users'|@translate}"; 11 var missingConfirm = "{'You need to confirm deletion'|translate}"; 12 13 var allUsers = [{$all_users}]; 14 var selection = [{$selection}]; 15 {/footer_script} 16 17 {footer_script}{literal} 18 jQuery(document).ready(function() { 19 /* first column must be prefixed with the open/close icon */ 20 var aoColumns = [ 21 { 22 'bVisible':false 23 }, 24 { 25 "mRender": function(data, type, full) { 26 return '<label><input type="checkbox" data-user_id="'+full[0]+'"> '+data+'</label>'; 27 } 28 } 29 ]; 30 31 for (i=2; i<jQuery("#userList thead tr th").length; i++) { 32 aoColumns.push(null); 33 } 34 35 var oTable = jQuery('#userList').dataTable({ 36 "iDisplayLength": 10, 37 "bDeferRender": true, 38 "bProcessing": true, 39 "bServerSide": true, 40 "sAjaxSource": "admin/user_list_backend.php", 41 "fnDrawCallback": function( oSettings ) { 42 jQuery("#userList input[type=checkbox]").each(function() { 43 var user_id = jQuery(this).data("user_id"); 44 jQuery(this).prop('checked', (selection.indexOf(user_id) != -1)); 45 }); 46 }, 47 "aoColumns": aoColumns 48 }); 49 50 /** 51 * Selection management 52 */ 53 function checkSelection() { 54 if (selection.length > 0) { 55 jQuery("#forbidAction").hide(); 56 jQuery("#permitAction").show(); 57 58 jQuery("#applyOnDetails").text( 59 sprintf( 60 applyOnDetails_pattern, 61 selection.length 62 ) 63 ); 64 65 if (selection.length == allUsers.length) { 66 jQuery("#selectedMessage").text( 67 sprintf( 68 selectedMessage_all, 69 allUsers.length 70 ) 71 ); 72 } 73 else { 74 jQuery("#selectedMessage").text( 75 sprintf( 76 selectedMessage_pattern, 77 selection.length, 78 allUsers.length 79 ) 80 ); 81 } 82 } 83 else { 84 jQuery("#forbidAction").show(); 85 jQuery("#permitAction").hide(); 86 87 jQuery("#selectedMessage").text( 88 sprintf( 89 selectedMessage_none, 90 allUsers.length 91 ) 92 ); 93 } 94 95 jQuery("#applyActionBlock .infos").hide(); 96 } 97 98 jQuery(document).on('change', '#userList input[type=checkbox]', function() { 99 var user_id = jQuery(this).data("user_id"); 100 101 array_delete(selection, user_id); 102 103 if (jQuery(this).is(":checked")) { 104 selection.push(user_id); 105 } 106 107 checkSelection(); 108 }); 109 110 jQuery("#selectAll").click(function () { 111 selection = allUsers; 112 jQuery("#userList input[type=checkbox]").prop('checked', true); 113 checkSelection(); 114 return false; 115 }); 116 117 jQuery("#selectNone").click(function () { 118 selection = []; 119 jQuery("#userList input[type=checkbox]").prop('checked', false); 120 checkSelection(); 121 return false; 122 }); 123 124 jQuery("#selectInvert").click(function () { 125 var newSelection = []; 126 for(var i in allUsers) 127 { 128 if (selection.indexOf(allUsers[i]) == -1) { 129 newSelection.push(allUsers[i]); 130 } 131 } 132 selection = newSelection; 133 134 jQuery("#userList input[type=checkbox]").each(function() { 135 var user_id = jQuery(this).data("user_id"); 136 jQuery(this).prop('checked', (selection.indexOf(user_id) != -1)); 137 }); 138 139 checkSelection(); 140 return false; 141 }); 142 143 /** 144 * Action management 145 */ 146 jQuery("[id^=action_]").hide(); 147 148 jQuery("select[name=selectAction]").change(function () { 149 jQuery("#applyActionBlock .infos").hide(); 150 151 jQuery("[id^=action_]").hide(); 152 153 jQuery("#action_"+$(this).prop("value")).show(); 154 155 if (jQuery(this).val() != -1) { 156 jQuery("#applyActionBlock").show(); 157 } 158 else { 159 jQuery("#applyActionBlock").hide(); 160 } 161 }); 162 163 jQuery("#permitAction input, #permitAction select").click(function() { 164 jQuery("#applyActionBlock .infos").hide(); 165 }); 166 167 jQuery("#applyAction").click(function() { 168 var action = jQuery("select[name=selectAction]").prop("value"); 169 var method = null; 170 var data = { 171 user_id: selection 172 }; 173 174 switch (action) { 175 case 'delete': 176 if (!jQuery("input[name=confirm_deletion]").is(':checked')) { 177 alert(missingConfirm); 178 return false; 179 } 180 method = 'pwg.users.delete'; 181 break; 182 case 'group_associate': 183 method = 'pwg.groups.addUser'; 184 data.group_id = jQuery("select[name=associate]").prop("value"); 185 break; 186 case 'group_dissociate': 187 method = 'pwg.groups.deleteUser'; 188 data.group_id = jQuery("select[name=dissociate]").prop("value"); 189 break; 190 } 191 192 jQuery.ajax({ 193 url: "ws.php?format=json&method="+method, 194 type:"POST", 195 data: data, 196 beforeSend: function() { 197 jQuery("#applyActionLoading").show(); 198 }, 199 success:function(data) { 200 oTable.fnDraw(); 201 jQuery("#applyActionLoading").hide(); 202 jQuery("#applyActionBlock .infos").show(); 203 204 if (action == 'delete') { 205 var allUsers_new = []; 206 for(var i in allUsers) 207 { 208 if (selection.indexOf(allUsers[i]) == -1) { 209 allUsers_new.push(allUsers[i]); 210 } 211 } 212 allUsers = allUsers_new; 213 console.log('allUsers_new.length = '+allUsers_new.length); 214 selection = []; 215 checkSelection(); 216 } 217 }, 218 error:function(XMLHttpRequest, textStatus, errorThrows) { 219 jQuery("#applyActionLoading").hide(); 220 } 221 }); 222 223 return false; 224 }); 225 226 }); 227 {/literal}{/footer_script} 228 229 {literal} 230 <style> 231 .dataTables_wrapper, .dataTables_info {clear:none;} 232 table.dataTable {clear:right;padding-top:10px;} 233 .bulkAction {margin-top:10px;} 234 .actionButtons {margin-left:0;} 235 #applyActionBlock .infos {background-image:none; padding:2px 5px; margin:0;border-radius:5px;} 236 </style> 237 {/literal} 238 1 239 <div class="titrePage"> 2 240 <h2>{'User list'|@translate}</h2> 3 241 </div> 4 242 5 <form class="filter" method="post" name="add_user" action="{$F_ADD_ACTION}">243 <form style="display:none" class="filter" method="post" name="add_user" action="{$F_ADD_ACTION}"> 6 244 <fieldset> 7 245 <legend>{'Add a user'|@translate}</legend> … … 19 257 </form> 20 258 21 <form class="filter" method="get" name="filter" action="{$F_FILTER_ACTION}">22 <fieldset>23 <legend>{'Filter'|@translate}</legend>24 <input type="hidden" name="page" value="user_list">25 26 <label>{'Username'|@translate} <input type="text" name="username" value="{$F_USERNAME}"></label>27 28 <label>29 {'status'|@translate}30 {html_options name=status options=$status_options selected=$status_selected}31 </label>32 33 <label>34 {'Group'|@translate}35 {html_options name=group options=$group_options selected=$group_selected}36 </label>37 38 <label>39 {'Sort by'|@translate}40 {html_options name=order_by options=$order_options selected=$order_selected}41 </label>42 43 <label>44 {'Sort order'|@translate}45 {html_options name=direction options=$direction_options selected=$direction_selected}46 </label>47 48 <label>49 50 <input class="submit" type="submit" value="{'Submit'|@translate}">51 </label>52 53 </fieldset>54 55 </form>56 57 259 <form method="post" name="preferences" action=""> 58 260 59 {if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} 60 61 <table class="table2" width="97%"> 261 <table id="userList"> 62 262 <thead> 63 <tr class="throw"> 64 <td> </td> 65 <td>{'Username'|@translate}</td> 66 <td>{'User status'|@translate}</td> 67 <td>{'Email address'|@translate}</td> 68 <td>{'Groups'|@translate}</td> 69 <td>{'Properties'|@translate}</td> 70 {if not empty($plugin_user_list_column_titles)} 71 {foreach from=$plugin_user_list_column_titles item=title} 72 <td>{$title}</td> 73 {/foreach} 74 {/if} 75 <td>{'Actions'|@translate}</td> 263 <tr> 264 <th>id</th> 265 <th>{'Username'|@translate}</th> 266 <th>{'Status'|@translate}</th> 267 <th>{'Email address'|@translate}</th> 76 268 </tr> 77 269 </thead> 78 79 {foreach from=$users item=user name=users_loop}80 <tr class="{if $smarty.foreach.users_loop.index is odd}row1{else}row2{/if}">81 <td><input type="checkbox" name="selection[]" value="{$user.ID}" {$user.CHECKED} id="selection-{$user.ID}"></td>82 <td><label for="selection-{$user.ID}">{$user.USERNAME}</label></td>83 <td>{$user.STATUS}</td>84 <td>{$user.EMAIL}</td>85 <td>{$user.GROUPS}</td>86 <td>{$user.PROPERTIES}</td>87 {foreach from=$user.plugin_columns item=data}88 <td>{$data}</td>89 {/foreach}90 <td style="text-align:center;">91 <a href="{$user.U_PERM}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/permissions.png" style="border:none" alt="{'Permissions'|@translate}" title="{'Permissions'|@translate}"></a>92 <a href="{$user.U_PROFILE}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/edit_s.png" style="border:none" alt="{'Profile'|@translate}" title="{'Profile'|@translate}"></a>93 {foreach from=$user.plugin_actions item=data}94 {$data}95 {/foreach}96 </td>97 </tr>98 {/foreach}99 270 </table> 100 271 101 {if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} 102 103 {* delete the selected users ? *} 104 <fieldset> 105 <legend>{'Deletions'|@translate}</legend> 106 <label><input type="checkbox" name="confirm_deletion" value="1"> {'confirm'|@translate}</label> 107 <input class="submit" type="submit" value="{'Delete selected users'|@translate}" name="delete"> 108 </fieldset> 109 110 <fieldset> 111 <legend>{'Status'|@translate}</legend> 112 113 <table> 114 <tr> 115 <td>{'Status'|@translate}</td> 116 <td> 117 <label><input type="radio" name="status_action" value="leave" checked="checked"> {'leave'|@translate}</label> 118 <label><input type="radio" name="status_action" value="set" id="status_action_set"> {'set to'|@translate}</label> 119 <select onchange="document.getElementById('status_action_set').checked = true;" name="status" size="1"> 120 {html_options options=$pref_status_options selected=$pref_status_selected} 121 </select> 122 </td> 123 </tr> 124 </table> 125 </fieldset> 126 127 {* form to set properties for many users at once *} 128 <fieldset> 129 <legend>{'Groups'|@translate}</legend> 130 131 <table> 132 133 <tr> 134 <td>{'associate to group'|@translate}</td> 135 <td> 272 <div style="clear:right"></div> 273 274 <p class="checkActions"> 275 {'Select:'|@translate} 276 <a href="#" id="selectAll">{'All'|@translate}</a>, 277 <a href="#" id="selectNone">{'None'|@translate}</a>, 278 <a href="#" id="selectInvert">{'Invert'|@translate}</a> 279 280 <span id="selectedMessage"></span> 281 </p> 282 283 <fieldset id="action"> 284 <legend>{'Action'|@translate}</legend> 285 286 <div id="forbidAction"{if count($selection) != 0} style="display:none"{/if}>{'No user selected, no action possible.'|@translate}</div> 287 <div id="permitAction"{if count($selection) == 0} style="display:none"{/if}> 288 289 <select name="selectAction"> 290 <option value="-1">{'Choose an action'|@translate}</option> 291 <option disabled="disabled">------------------</option> 292 <option value="delete" class="icon-trash">{'Delete selected users'|@translate}</option> 293 <option value="status">{'Status'|@translate}</option> 294 <option value="group_associate">{'associate to group'|translate}</option> 295 <option value="group_dissociate">{'dissociate from group'|@translate}</option> 296 <option value="enabled_high">{'High definition enabled'|@translate}</option> 297 <option value="level">{'Privacy level'|@translate}</option> 298 <option value="nb_image_page">{'Number of photos per page'|@translate}</option> 299 <option value="theme">{'Interface theme'|@translate}</option> 300 <option value="language">{'Language'|@translate}</option> 301 <option value="recent_period">{'Recent period'|@translate}</option> 302 <option value="expand">{'Expand all albums'|@translate}</option> 303 {if $ACTIVATE_COMMENTS} 304 <option value="show_nb_comments">{'Show number of comments'|@translate}</option> 305 {/if} 306 <option value="show_nb_hits">{'Show number of hits'|@translate}</option> 307 </select> 308 309 {* delete *} 310 <div id="action_delete" class="bulkAction"> 311 <p><label><input type="checkbox" name="confirm_deletion" value="1"> {'Are you sure?'|@translate}</label></p> 312 </div> 313 314 {* status *} 315 <div id="action_status" class="bulkAction"> 316 <select name="status"> 317 {html_options options=$pref_status_options selected=$pref_status_selected} 318 </select> 319 </div> 320 321 {* group_associate *} 322 <div id="action_group_associate" class="bulkAction"> 136 323 {html_options name=associate options=$association_options selected=$associate_selected} 137 </td> 138 </tr> 139 140 <tr> 141 <td>{'dissociate from group'|@translate}</td> 142 <td> 324 </div> 325 326 {* group_dissociate *} 327 <div id="action_group_dissociate" class="bulkAction"> 143 328 {html_options name=dissociate options=$association_options selected=$dissociate_selected} 144 </td> 145 </tr> 146 147 </table> 148 149 </fieldset> 150 151 {* Properties *} 152 <fieldset> 153 <legend>{'Properties'|@translate}</legend> 154 155 <table> 156 157 <tr> 158 <td>{'High definition enabled'|@translate}</td> 159 <td> 160 <label><input type="radio" name="enabled_high" value="leave" checked="checked"> {'leave'|@translate}</label> 161 / {'set to'|@translate} 162 <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label> 163 <label><input type="radio" name="enabled_high" value="false">{'No'|@translate}</label> 164 </td> 165 </tr> 166 167 <tr> 168 <td>{'Privacy level'|@translate}</td> 169 <td> 170 <label><input type="radio" name="level_action" value="leave" checked="checked">{'leave'|@translate}</label> 171 <label><input type="radio" name="level_action" value="set" id="level_action_set">{'set to'|@translate}</label> 172 <select onchange="document.getElementById('level_action_set').checked = true;" name="level" size="1"> 173 {html_options options=$level_options selected=$level_selected} 174 </select> 175 </td> 176 </tr> 177 </table> 178 179 </fieldset> 180 181 {* preference *} 182 <fieldset> 183 <legend>{'Preferences'|@translate}</legend> 184 185 <table> 186 <tr> 187 <td>{'Number of photos per page'|@translate}</td> 188 <td> 189 <label><input type="radio" name="nb_image_page_action" value="leave" checked="checked"> {'leave'|@translate}</label> 190 <label><input type="radio" name="nb_image_page_action" value="set" id="nb_image_page_action_set"> {'set to'|@translate}</label> 191 <input onmousedown="document.getElementById('nb_image_page_action_set').checked = true;" 192 size="4" maxlength="3" type="text" name="nb_image_page" value="{$NB_IMAGE_PAGE}"> 193 </td> 194 </tr> 195 196 <tr> 197 <td>{'Interface theme'|@translate}</td> 198 <td> 199 <label><input type="radio" name="theme_action" value="leave" checked="checked"> {'leave'|@translate}</label> 200 <label><input type="radio" name="theme_action" value="set" id="theme_action_set"> {'set to'|@translate}</label> 201 <select onchange="document.getElementById('theme_action_set').checked = true;" name="theme" size="1"> 329 </div> 330 331 {* enabled_high *} 332 <div id="action_enabled_high" class="bulkAction"> 333 <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label> 334 <label><input type="radio" name="enabled_high" value="false">{'No'|@translate}</label> 335 </div> 336 337 {* level *} 338 <div id="action_level" class="bulkAction"> 339 <select name="level" size="1"> 340 {html_options options=$level_options selected=$level_selected} 341 </select> 342 </div> 343 344 {* nb_image_page *} 345 <div id="action_nb_image_page" class="bulkAction"> 346 <input size="4" maxlength="3" type="text" name="nb_image_page" value="{$NB_IMAGE_PAGE}"> 347 </div> 348 349 {* theme *} 350 <div id="action_theme" class="bulkAction"> 351 <select name="theme" size="1"> 202 352 {html_options options=$theme_options selected=$theme_selected} 203 353 </select> 204 </td> 205 </tr> 206 207 <tr> 208 <td>{'Language'|@translate}</td> 209 <td> 210 <label><input type="radio" name="language_action" value="leave" checked="checked"> {'leave'|@translate}</label> 211 <label><input type="radio" name="language_action" value="set" id="language_action_set"> {'set to'|@translate}</label> 212 <select onchange="document.getElementById('language_action_set').checked = true;" name="language" size="1"> 354 </div> 355 356 {* language *} 357 <div id="action_language" class="bulkAction"> 358 <select name="language" size="1"> 213 359 {html_options options=$language_options selected=$language_selected} 214 360 </select> 215 </td> 216 </tr> 217 218 <tr> 219 <td>{'Recent period'|@translate}</td> 220 <td> 221 <label><input type="radio" name="recent_period_action" value="leave" checked="checked"> {'leave'|@translate}</label> 222 <label><input type="radio" name="recent_period_action" value="set" id="recent_period_action_set"> {'set to'|@translate}</label> 223 <input onmousedown="document.getElementById('recent_period_action_set').checked = true;" 224 type="text" size="3" maxlength="2" name="recent_period" value="{$RECENT_PERIOD}"> 225 </td> 226 </tr> 227 228 <tr> 229 <td>{'Expand all albums'|@translate}</td> 230 <td> 231 <label><input type="radio" name="expand" value="leave" checked="checked"> {'leave'|@translate}</label> 232 / {'set to'|@translate} 361 </div> 362 363 {* recent_period *} 364 <div id="action_recent_period" class="bulkAction"> 365 <input type="text" size="3" maxlength="2" name="recent_period" value="{$RECENT_PERIOD}"> 366 </div> 367 368 {* expand *} 369 <div id="action_expand" class="bulkAction"> 233 370 <label><input type="radio" name="expand" value="true">{'Yes'|@translate}</label> 234 371 <label><input type="radio" name="expand" value="false">{'No'|@translate}</label> 235 </td> 236 </tr> 237 238 {if $ACTIVATE_COMMENTS} 239 <tr> 240 <td>{'Show number of comments'|@translate}</td> 241 <td> 242 <label><input type="radio" name="show_nb_comments" value="leave" checked="checked"> {'leave'|@translate}</label> 243 / {'set to'|@translate} 372 </div> 373 374 {* show_nb_comments *} 375 <div id="action_show_nb_comments" class="bulkAction"> 244 376 <label><input type="radio" name="show_nb_comments" value="true">{'Yes'|@translate}</label> 245 377 <label><input type="radio" name="show_nb_comments" value="false">{'No'|@translate}</label> 246 </td> 247 </tr> 248 {/if} 249 250 <tr> 251 <td>{'Show number of hits'|@translate}</td> 252 <td> 253 <label><input type="radio" name="show_nb_hits" value="leave" checked="checked"> {'leave'|@translate}</label> 254 / {'set to'|@translate} 378 </div> 379 380 {* show_nb_hits *} 381 <div id="action_show_nb_hits" class="bulkAction"> 255 382 <label><input type="radio" name="show_nb_hits" value="true">{'Yes'|@translate}</label> 256 383 <label><input type="radio" name="show_nb_hits" value="false">{'No'|@translate}</label> 257 </td> 258 </tr> 259 260 </table> 261 384 </div> 385 386 <p id="applyActionBlock" style="display:none" class="actionButtons"> 387 <input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span> 388 <span id="applyActionLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span> 389 <span class="infos" style="display:none">✔ Users modified</span> 390 </p> 391 392 </div> {* #permitAction *} 262 393 </fieldset> 263 394 264 <p> 265 {'target'|@translate} 266 <label><input type="radio" name="target" value="all"> {'all'|@translate}</label> 267 <label><input type="radio" name="target" value="selection" checked="checked"> {'selection'|@translate}</label> 268 </p> 269 270 <p> 271 <input class="submit" type="submit" value="{'Submit'|@translate}" name="pref_submit"> 272 <input class="submit" type="reset" value="{'Reset'|@translate}" name="pref_reset"> 273 </p> 274 275 </form> 276 277 <script type="text/javascript">// <![CDATA[{literal} 278 jQuery("form:last").submit( function() { 279 if ( jQuery("input[name=target][value=selection]:checked", this).length > 0 ) 280 if ( jQuery("input[name='selection[]']:checked", this).length == 0) 281 { 282 alert( {/literal}"{'Select at least one user'|@translate|escape:javascript}"{literal} ); 283 return false; 284 } 285 return true; 286 } 287 );{/literal} 288 // ]]> 289 </script> 290 395 </form> -
trunk/admin/user_list.php
r25121 r25194 27 27 28 28 // +-----------------------------------------------------------------------+ 29 // | functions |30 // +-----------------------------------------------------------------------+31 32 /**33 * returns a list of users depending on page filters (in $_GET)34 *35 * Each user comes with his related informations : id, username, mail36 * address, list of groups.37 *38 * @return array39 */40 function get_filtered_user_list()41 {42 global $conf, $page;43 44 $users = array();45 46 // filter47 $filter = array();48 49 if (isset($_GET['username']) and !empty($_GET['username']))50 {51 $username = str_replace('*', '%', $_GET['username']);52 $filter['username'] = pwg_db_real_escape_string($username);53 }54 55 if (isset($_GET['group'])56 and -1 != $_GET['group']57 and is_numeric($_GET['group']))58 {59 $filter['group'] = $_GET['group'];60 }61 62 if (isset($_GET['status'])63 and in_array($_GET['status'], get_enums(USER_INFOS_TABLE, 'status')))64 {65 $filter['status'] = $_GET['status'];66 }67 68 // how to order the list?69 $order_by = 'id';70 if (isset($_GET['order_by'])71 and in_array($_GET['order_by'], array_keys($page['order_by_items'])))72 {73 $order_by = $_GET['order_by'];74 }75 76 $direction = 'ASC';77 if (isset($_GET['direction'])78 and in_array($_GET['direction'], array_keys($page['direction_items'])))79 {80 $direction = strtoupper($_GET['direction']);81 }82 83 // search users depending on filters and order84 $query = '85 SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,86 u.'.$conf['user_fields']['username'].' AS username,87 u.'.$conf['user_fields']['email'].' AS email,88 ui.status,89 ui.enabled_high,90 ui.level91 FROM '.USERS_TABLE.' AS u92 INNER JOIN '.USER_INFOS_TABLE.' AS ui93 ON u.'.$conf['user_fields']['id'].' = ui.user_id94 LEFT JOIN '.USER_GROUP_TABLE.' AS ug95 ON u.'.$conf['user_fields']['id'].' = ug.user_id96 WHERE u.'.$conf['user_fields']['id'].' > 0';97 if (isset($filter['username']))98 {99 $query.= '100 AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';101 }102 if (isset($filter['group']))103 {104 $query.= '105 AND ug.group_id = '.$filter['group'];106 }107 if (isset($filter['status']))108 {109 $query.= '110 AND ui.status = \''.$filter['status']."'";111 }112 $query.= '113 ORDER BY '.$order_by.' '.$direction.'114 ;';115 116 $result = pwg_query($query);117 while ($row = pwg_db_fetch_assoc($result))118 {119 $user = $row;120 $user['groups'] = array();121 122 $users[] = $user;123 }124 125 // add group lists126 $user_ids = array();127 foreach ($users as $i => $user)128 {129 $user_ids[$i] = $user['id'];130 }131 $user_nums = array_flip($user_ids);132 133 if (count($user_ids) > 0)134 {135 $query = '136 SELECT user_id, group_id137 FROM '.USER_GROUP_TABLE.'138 WHERE user_id IN ('.implode(',', $user_ids).')139 ;';140 $result = pwg_query($query);141 while ($row = pwg_db_fetch_assoc($result))142 {143 $users[ $user_nums[ $row['user_id'] ] ]['groups'][] = $row['group_id'];144 }145 }146 147 return $users;148 }149 150 // +-----------------------------------------------------------------------+151 // | initialization |152 // +-----------------------------------------------------------------------+153 154 if (!defined('PHPWG_ROOT_PATH'))155 {156 die('Hacking attempt!');157 }158 159 include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');160 161 // +-----------------------------------------------------------------------+162 // | Check Access and exit when user status is not ok |163 // +-----------------------------------------------------------------------+164 check_status(ACCESS_ADMINISTRATOR);165 166 $page['order_by_items'] = array(167 'id' => l10n('registration date'),168 'username' => l10n('Username'),169 'level' => l10n('Privacy level'),170 'Language' => l10n('Language'),171 'email' => l10n('Email address'),172 );173 174 $page['direction_items'] = array(175 'asc' => l10n('ascending'),176 'desc' => l10n('descending')177 );178 179 // +-----------------------------------------------------------------------+180 // | add a user |181 // +-----------------------------------------------------------------------+182 183 // Check for config_default var - If True : Using double password type else single password type184 // This feature is discussed on Piwigo's english forum185 if ($conf['double_password_type_in_admin'] == true)186 {187 if (isset($_POST['submit_add']))188 {189 if(empty($_POST['password']))190 {191 $page['errors'][] = l10n('Password is missing. Please enter the password.');192 }193 else if(empty($_POST['password_conf']))194 {195 $page['errors'][] = l10n('Password confirmation is missing. Please confirm the chosen password.');196 }197 else if ($_POST['password'] != $_POST['password_conf'])198 {199 $page['errors'][] = l10n('The passwords do not match');200 }201 else202 {203 register_user($_POST['login'],204 $_POST['password'],205 $_POST['email'],206 false,207 $page['errors']);208 209 if (count($page['errors']) == 0)210 {211 $page['infos'][] = l10n('user "%s" added', $_POST['login']);212 }213 }214 }215 }216 else if ($conf['double_password_type_in_admin'] == false)217 {218 if (isset($_POST['submit_add']))219 {220 register_user($_POST['login'],221 $_POST['password'],222 $_POST['email'],223 false,224 $page['errors']);225 226 if (count($page['errors']) == 0)227 {228 $page['infos'][] = l10n('user "%s" added', stripslashes($_POST['login']));229 }230 }231 }232 233 // email notification234 if (235 isset($_POST['submit_add'])236 and count($page['errors']) == 0237 and !empty($_POST['email'])238 and isset($_POST['send_password_by_mail'])239 )240 {241 include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');242 243 $keyargs_content = array(244 get_l10n_args('Hello %s,', $_POST['login']),245 get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),246 get_l10n_args('', ''),247 get_l10n_args('Here are your connection settings', ''),248 get_l10n_args('Username: %s', $_POST['login']),249 get_l10n_args('Password: %s', $_POST['password']),250 get_l10n_args('Email: %s', $_POST['email']),251 get_l10n_args('', ''),252 get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),253 );254 255 pwg_mail(256 $_POST['email'],257 array(258 'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),259 'content' => l10n_args($keyargs_content),260 'content_format' => 'text/plain',261 )262 );263 }264 265 // +-----------------------------------------------------------------------+266 // | user list |267 // +-----------------------------------------------------------------------+268 269 $page['filtered_users'] = get_filtered_user_list();270 271 // +-----------------------------------------------------------------------+272 // | selected users |273 // +-----------------------------------------------------------------------+274 275 if (isset($_POST['delete']) or isset($_POST['pref_submit']))276 {277 $collection = array();278 279 switch ($_POST['target'])280 {281 case 'all' :282 {283 foreach($page['filtered_users'] as $local_user)284 {285 $collection[] = $local_user['id'];286 }287 break;288 }289 case 'selection' :290 {291 if (isset($_POST['selection']))292 {293 $collection = $_POST['selection'];294 }295 break;296 }297 }298 299 if (count($collection) == 0)300 {301 $page['errors'][] = l10n('Select at least one user');302 }303 }304 305 // +-----------------------------------------------------------------------+306 // | delete users |307 // +-----------------------------------------------------------------------+308 if (isset($_POST['delete']) and count($collection) > 0)309 {310 if (in_array($conf['guest_id'], $collection))311 {312 $page['errors'][] = l10n('Guest cannot be deleted');313 }314 if (($conf['guest_id'] != $conf['default_user_id']) and315 in_array($conf['default_user_id'], $collection))316 {317 $page['errors'][] = l10n('Default user cannot be deleted');318 }319 if (in_array($conf['webmaster_id'], $collection))320 {321 $page['errors'][] = l10n('Webmaster cannot be deleted');322 }323 if (in_array($user['id'], $collection))324 {325 $page['errors'][] = l10n('You cannot delete your account');326 }327 328 if (count($page['errors']) == 0)329 {330 if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])331 {332 foreach ($collection as $user_id)333 {334 delete_user($user_id);335 }336 337 $page['infos'][] = l10n_dec(338 '%d user deleted', '%d users deleted',339 count($collection)340 );341 342 foreach ($page['filtered_users'] as $filter_key => $filter_user)343 {344 if (in_array($filter_user['id'], $collection))345 {346 unset($page['filtered_users'][$filter_key]);347 }348 }349 }350 else351 {352 $page['errors'][] = l10n('You need to confirm deletion');353 }354 }355 }356 357 // +-----------------------------------------------------------------------+358 // | preferences form submission |359 // +-----------------------------------------------------------------------+360 361 if (isset($_POST['pref_submit']) and count($collection) > 0)362 {363 if (-1 != $_POST['associate'])364 {365 $datas = array();366 367 $query = '368 SELECT user_id369 FROM '.USER_GROUP_TABLE.'370 WHERE group_id = '.$_POST['associate'].'371 ;';372 $associated = array_from_query($query, 'user_id');373 374 $associable = array_diff($collection, $associated);375 376 if (count($associable) > 0)377 {378 foreach ($associable as $item)379 {380 $datas[] = array(381 'group_id' => $_POST['associate'],382 'user_id' => $item383 );384 }385 386 mass_inserts(USER_GROUP_TABLE,387 array('group_id', 'user_id'),388 $datas);389 }390 }391 392 if (-1 != $_POST['dissociate'])393 {394 $query = '395 DELETE FROM '.USER_GROUP_TABLE.'396 WHERE group_id = '.$_POST['dissociate'].'397 AND user_id IN ('.implode(',', $collection).')398 ';399 pwg_query($query);400 }401 402 // properties to set for the collection (a user list)403 $datas = array();404 $dbfields = array('primary' => array('user_id'), 'update' => array());405 406 $formfields = array(407 'nb_image_page', 'theme', 'language',408 'recent_period', 'expand', 'show_nb_hits',409 'status', 'enabled_high', 'level'410 );411 412 $true_false_fields = array('expand', 'show_nb_hits', 'enabled_high');413 414 if ($conf['activate_comments'])415 {416 $formfields[] = 'show_nb_comments';417 $true_false_fields[] = 'show_nb_comments';418 }419 420 foreach ($formfields as $formfield)421 {422 // special for true/false fields423 if (in_array($formfield, $true_false_fields))424 {425 $test = $formfield;426 }427 else428 {429 $test = $formfield.'_action';430 }431 432 if ($_POST[$test] != 'leave')433 {434 $dbfields['update'][] = $formfield;435 }436 }437 438 // updating elements is useful only if needed...439 if (count($dbfields['update']) > 0)440 {441 $datas = array();442 443 foreach ($collection as $user_id)444 {445 $data = array();446 $data['user_id'] = $user_id;447 448 // TODO : verify if submited values are semanticaly correct449 foreach ($dbfields['update'] as $dbfield)450 {451 // if the action is 'unset', the key won't be in row and452 // mass_updates function will set this field to NULL453 if (in_array($dbfield, $true_false_fields)454 or 'set' == $_POST[$dbfield.'_action'])455 {456 $data[$dbfield] = $_POST[$dbfield];457 }458 }459 460 // if the status is getting greater or equal to "admin", then level461 // automatically switches to "admin" (8), unless the level is also462 // defined in the same batch action.463 if (isset($data['status']) and in_array($data['status'], array('webmaster', 'admin')))464 {465 if (!isset($data['level']))466 {467 $data['level'] = 8;468 if (!in_array('level', $dbfields['update']))469 {470 $dbfields['update'][] = 'level';471 }472 }473 }474 475 // special users checks476 if477 (478 ($conf['webmaster_id'] == $user_id) or479 ($conf['guest_id'] == $user_id) or480 ($conf['default_user_id'] == $user_id)481 )482 {483 // status must not be changed484 if (isset($data['status']))485 {486 if ($conf['webmaster_id'] == $user_id)487 {488 $data['status'] = 'webmaster';489 }490 else491 {492 $data['status'] = 'guest';493 }494 }495 }496 497 $datas[] = $data;498 }499 500 mass_updates(USER_INFOS_TABLE, $dbfields, $datas);501 }502 503 redirect(504 get_root_url().505 'admin.php'.506 get_query_string_diff(array(), false)507 );508 }509 510 // +-----------------------------------------------------------------------+511 29 // | groups list | 512 30 // +-----------------------------------------------------------------------+ 513 31 514 $groups [-1] = '------------';32 $groups = array(); 515 33 516 34 $query = ' … … 527 45 528 46 // +-----------------------------------------------------------------------+ 529 // | template init|47 // | template | 530 48 // +-----------------------------------------------------------------------+ 531 49 532 50 $template->set_filenames(array('user_list'=>'user_list.tpl')); 533 51 534 $base_url = PHPWG_ROOT_PATH.'admin.php?page=user_list'; 52 $query = ' 53 SELECT 54 DISTINCT u.'.$conf['user_fields']['id'].' AS id, 55 u.'.$conf['user_fields']['username'].' AS username, 56 u.'.$conf['user_fields']['email'].' AS email, 57 ui.status, 58 ui.enabled_high, 59 ui.level 60 FROM '.USERS_TABLE.' AS u 61 INNER JOIN '.USER_INFOS_TABLE.' AS ui ON u.'.$conf['user_fields']['id'].' = ui.user_id 62 WHERE u.'.$conf['user_fields']['id'].' > 0 63 ;'; 535 64 536 if (isset($_GET['start']) and is_numeric($_GET['start'])) 65 $result = pwg_query($query); 66 while ($row = pwg_db_fetch_assoc($result)) 537 67 { 538 $start = $_GET['start']; 539 } 540 else 541 { 542 $start = 0; 68 $users[] = $row; 69 $user_ids[] = $row['id']; 543 70 } 544 71 545 72 $template->assign( 546 73 array( 547 'U_HELP' => get_root_url().'admin/popuphelp.php?page=user_list', 74 'users' => $users, 75 'all_users' => join(',', $user_ids), 76 ) 77 ); 548 78 549 'F_ADD_ACTION' => $base_url, 550 'F_USERNAME' => @htmlentities($_GET['username'], ENT_COMPAT, 'UTF-8'), 551 'F_FILTER_ACTION' => get_root_url().'admin.php', 552 553 'ACTIVATE_COMMENTS' => $conf['activate_comments'], 554 )); 79 // echo '<pre>'; print_r($users); echo '</pre>'; 555 80 556 // Display or Hide double password type 557 $template->assign('Double_Password', $conf['double_password_type_in_admin'] ); 81 $default_user = get_default_user_info(true); 558 82 559 // Filter status options 560 $status_options[-1] = '------------'; 561 foreach (get_enums(USER_INFOS_TABLE, 'status') as $status) 562 { 563 $status_options[$status] = l10n('user_status_'.$status); 564 } 565 $template->assign('status_options', $status_options); 566 $template->assign('status_selected', 567 isset($_GET['status']) ? $_GET['status'] : ''); 568 569 // Filter group options 570 $template->assign('group_options', $groups); 571 $template->assign('group_selected', 572 isset($_GET['group']) ? $_GET['group'] : ''); 573 574 // Filter order options 575 $template->assign('order_options', $page['order_by_items']); 576 $template->assign('order_selected', 577 isset($_GET['order_by']) ? $_GET['order_by'] : ''); 578 579 // Filter direction options 580 $template->assign('direction_options', $page['direction_items']); 581 $template->assign('direction_selected', 582 isset($_GET['direction']) ? $_GET['direction'] : ''); 583 584 585 if (isset($_POST['pref_submit'])) 586 { 587 $template->assign( 588 array( 589 'NB_IMAGE_PAGE' => $_POST['nb_image_page'], 590 'RECENT_PERIOD' => $_POST['recent_period'], 591 )); 592 } 593 else 594 { 595 $default_user = get_default_user_info(true); 596 $template->assign( 597 array( 598 'NB_IMAGE_PAGE' => $default_user['nb_image_page'], 599 'RECENT_PERIOD' => $default_user['recent_period'], 600 )); 601 } 602 603 // Template Options 604 $template->assign('theme_options', get_pwg_themes()); 605 $template->assign('theme_selected', 606 isset($_POST['pref_submit']) ? $_POST['theme'] : get_default_theme()); 607 608 // Language options 609 $template->assign('language_options', get_languages()); 610 $template->assign('language_selected', 611 isset($_POST['pref_submit']) ? $_POST['language'] : get_default_language()); 83 $template->assign( 84 array( 85 'NB_IMAGE_PAGE' => $default_user['nb_image_page'], 86 'RECENT_PERIOD' => $default_user['recent_period'], 87 'theme_options' => get_pwg_themes(), 88 'theme_selected' => get_default_theme(), 89 'language_options' => get_languages(), 90 'language_selected' => get_default_language(), 91 'association_options' => $groups, 92 ) 93 ); 612 94 613 95 // Status options … … 621 103 } 622 104 $template->assign('pref_status_options', $pref_status_options); 623 $template->assign('pref_status_selected', 624 isset($_POST['pref_submit']) ? $_POST['status'] : 'normal'); 625 626 // associate and dissociate options 627 $template->assign('association_options', $groups); 628 $template->assign('associate_selected', 629 isset($_POST['pref_submit']) ? $_POST['associate'] : ''); 630 $template->assign('dissociate_selected', 631 isset($_POST['pref_submit']) ? $_POST['dissociate'] : ''); 632 105 $template->assign('pref_status_selected', 'normal'); 633 106 634 107 // user level options … … 638 111 } 639 112 $template->assign('level_options', $level_options); 640 $template->assign('level_selected', 641 isset($_POST['pref_submit']) ? $_POST['level'] : $default_user['level']); 113 $template->assign('level_selected', $default_user['level']); 114 642 115 643 116 // +-----------------------------------------------------------------------+ 644 // | navigation bar | 645 // +-----------------------------------------------------------------------+ 646 647 $url = PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start')); 648 649 $navbar = create_navigation_bar( 650 $url, 651 count($page['filtered_users']), 652 $start, 653 $conf['users_page'] 654 ); 655 656 $template->assign('navbar', $navbar); 657 658 // +-----------------------------------------------------------------------+ 659 // | user list | 660 // +-----------------------------------------------------------------------+ 661 662 $profile_url = get_root_url().'admin.php?page=profile&user_id='; 663 $perm_url = get_root_url().'admin.php?page=user_perm&user_id='; 664 665 $visible_user_list = array(); 666 foreach ($page['filtered_users'] as $num => $local_user) 667 { 668 // simulate LIMIT $start, $conf['users_page'] 669 if ($num < $start) 670 { 671 continue; 672 } 673 if ($num >= $start + $conf['users_page']) 674 { 675 break; 676 } 677 678 $visible_user_list[] = $local_user; 679 } 680 681 // allow plugins to fill template var plugin_user_list_column_titles and 682 // plugin_columns/plugin_actions for each user in the list 683 $visible_user_list = trigger_event('loc_visible_user_list', $visible_user_list); 684 685 foreach ($visible_user_list as $local_user) 686 { 687 $groups_string = preg_replace( 688 '/(\d+)/e', 689 "\$groups['$1']", 690 implode( 691 ', ', 692 $local_user['groups'] 693 ) 694 ); 695 696 if (isset($_POST['pref_submit']) 697 and isset($_POST['selection']) 698 and in_array($local_user['id'], $_POST['selection'])) 699 { 700 $checked = 'checked="checked"'; 701 } 702 else 703 { 704 $checked = ''; 705 } 706 707 $properties = array(); 708 if ( $local_user['level'] != 0 ) 709 { 710 $properties[] = l10n( sprintf('Level %d', $local_user['level']) ); 711 } 712 $properties[] = 713 (isset($local_user['enabled_high']) and ($local_user['enabled_high'] == 'true')) 714 ? l10n('High definition') : l10n(''); 715 716 $template->append( 717 'users', 718 array( 719 'ID' => $local_user['id'], 720 'CHECKED' => $checked, 721 'U_PROFILE' => $profile_url.$local_user['id'], 722 'U_PERM' => $perm_url.$local_user['id'], 723 'USERNAME' => stripslashes($local_user['username']) 724 .($local_user['id'] == $conf['guest_id'] 725 ? '<br>['.l10n('guest').']' : '') 726 .($local_user['id'] == $conf['default_user_id'] 727 ? '<br>['.l10n('default values').']' : ''), 728 'STATUS' => l10n('user_status_'.$local_user['status']), 729 'EMAIL' => get_email_address_as_display_text($local_user['email']), 730 'GROUPS' => $groups_string, 731 'PROPERTIES' => implode( ', ', $properties), 732 'plugin_columns' => isset($local_user['plugin_columns']) ? $local_user['plugin_columns'] : array(), 733 'plugin_actions' => isset($local_user['plugin_actions']) ? $local_user['plugin_actions'] : array(), 734 ) 735 ); 736 } 737 738 // +-----------------------------------------------------------------------+ 739 // | html code display | 117 // | html code display | 740 118 // +-----------------------------------------------------------------------+ 741 119
Note: See TracChangeset
for help on using the changeset viewer.