1<?php 2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project 3// 4// All Rights Reserved. See copyright.txt for details and a complete list of authors. 5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. 6// $Id$ 7 8/* {user_selector 9 * user = $user 10 * select = 'user_tobe_selected' 11 * group = 'all' 12 * groupIds = '' 13 * name = 'user' 14 * id = user_selector_XX 15 * size = '' 16 * contact = 'false' 17 * multiple = 'false' 18 * editable = $tiki_p_admin 19 * allowNone = 'n' 20 * realnames = 'y' 21 * } 22 * 23 * Display a drop down menu of all users or 24 * an input box with autocomplete if there are more users 25 * than $prefs['user_selector_threshold'] 26 */ 27function smarty_function_user_selector($params, $smarty) 28{ 29 global $prefs, $user, $tiki_p_admin; 30 $tikilib = TikiLib::lib('tiki'); 31 $headerlib = TikiLib::lib('header'); 32 $userlib = TikiLib::lib('user'); 33 $smarty->loadPlugin('smarty_modifier_username'); 34 35 static $iUserSelector = 0; 36 $iUserSelector++; 37 38 $defaults = [ 39 'user' => $user, 40 'group' => 'all', 41 'groupIds' => '', 42 'contact' => 'false', 43 'name' => 'user', 44 'id' => 'user_selector_' . $iUserSelector, 45 'multiple' => 'false', 46 'mustmatch' => 'true', 47 'style' => '' , 48 'editable' => $tiki_p_admin, 49 'user_selector_threshold' => $prefs['user_selector_threshold'], 50 'allowNone' => 'n', 51 'noneLabel' => 'None', 52 'realnames' => 'y', 53 'class' => 'form-control', 54 ]; 55 56 $params = array_merge($defaults, $params); 57 if (isset($params['size'])) { 58 $sz = ' size="' . $params['size'] . '"'; 59 } else { 60 $sz = ''; 61 } 62 if ($params['editable'] != 'y') { 63 $ed = ' disabled="disabled"'; 64 } else { 65 $ed = ''; 66 } 67 if ($params['multiple'] === 'true') { 68 $mt = ' multiple="multiple"'; 69 } else { 70 $mt = ''; 71 } 72 73 if (! empty($params['class'])) { 74 $class = ' class="' . $params['class'] . '"'; 75 } else { 76 $class = ''; 77 } 78 79 $groupNames = []; 80 if (is_array($params['groupIds'])) { 81 foreach ($params['groupIds'] as $k => $groupId) { 82 if ($groupId <= 0) { 83 unset($params['groupIds'][$k]); 84 } 85 } 86 if (! empty($params['groupIds'])) { 87 $groupIds = $params['groupIds']; 88 } 89 } elseif (! empty($params['groupIds'])) { 90 $groupIds = explode('|', $params['groupIds']); 91 } 92 if (! empty($groupIds)) { 93 foreach ($groupIds as $groupId) { 94 $group_info = $userlib->get_groupId_info($groupId); 95 $groupNames[] = $group_info['groupName']; 96 } 97 } 98 99 $users = []; 100 $ret = ''; 101 if (! empty($groupNames)) { 102 $ucant = $userlib->count_users_consolidated($groupNames); 103 } else { 104 $ucant = $userlib->count_users(''); 105 } 106 107 if ($prefs['feature_jquery_autocomplete'] == 'y' && ($ucant > $prefs['user_selector_threshold'] or $ucant > $params['user_selector_threshold'])) { 108 $ret .= '<input id="' . $params['id'] . '" type="text" name="' . $params['name'] . '" value="' . htmlspecialchars($params['user']) . '"' . $sz . $ed . ' style="' . $params['style'] . '"' . $class . ' />'; 109 if (($params['contact'] == 'true')) { 110 $mode = ('usersandcontacts'); 111 } elseif ($prefs['user_show_realnames'] === 'y' && $params['realnames'] === 'y') { 112 $mode = ('userrealname'); 113 } else { 114 $mode = ('username'); 115 } 116 $headerlib->add_jq_onready('$("#' . $params['id'] . '").tiki("autocomplete", "' . $mode . '", {mustMatch: ' . $params['mustmatch'] . ', multiple: ' . $params['multiple'] . ' });'); 117 } else { 118 // get the user list 119 if ($params['group'] !== 'all') { 120 $groupNames[] = $params['group']; 121 } 122 123 // NOTE: if groupIds are present, the list of users is limited to those groups regardless of group == 'all' 124 if (! empty($groupNames)) { 125 $groupNames = array_unique($groupNames); 126 $usrs = []; 127 foreach ($groupNames as $groupName) { 128 $group_users = $userlib->get_group_users($groupName); 129 $usrs = array_merge($usrs, $group_users); 130 } 131 $usrs = array_unique($usrs); 132 foreach ($usrs as $usr) { 133 $users["$usr"] = $params['realnames'] === 'y' ? smarty_modifier_username($usr) : $usr; 134 } 135 } 136 137 if ($params['group'] == 'all' && empty($params['groupIds'])) { 138 $usrs = $tikilib->list_users(0, -1, 'login_asc'); 139 foreach ($usrs['data'] as $usr) { 140 $users["{$usr['login']}"] = $params['realnames'] === 'y' ? smarty_modifier_username($usr['login']) : $usr['login']; 141 } 142 } 143 144 if ($params['realnames'] === 'y') { 145 $dupes = []; 146 foreach (array_count_values($users) as $usr => $c) { 147 if ($c > 1) { 148 $dupes[] = $usr; 149 } 150 } 151 foreach ($users as $usr => & $uname) { 152 if (in_array($uname, $dupes)) { 153 if ($prefs['login_is_email'] === 'y' && $prefs['login_is_email_obscure'] === 'y') { 154 $added = ' (' . substr($usr, strpos($usr, '@')) . ')'; 155 } else { 156 $added = " ($usr)"; 157 } 158 $uname .= $added; 159 } 160 } 161 } 162 163 asort($users, SORT_NATURAL | SORT_FLAG_CASE); 164 165 if ($params['multiple'] === 'true' && $params['allowNone'] === 'y') { 166 $ret .= '<input type="hidden" name="' . $params['name'] . '[]" value="">'; 167 } 168 169 $ret .= '<select name="' . $params['name'] . ( $params['multiple'] === 'true' ? '[]' : '' ) . '" id="' . $params['id'] . '"' . $sz . $ed . $mt . ' style="' . $params['style'] . '" class="form-control">'; 170 if ($params['allowNone'] === 'y') { 171 $ret .= '<option value=""' . (empty($params['user']) ? ' selected="selected"' : '') . ' >' . tra($params['noneLabel']) . '</option>'; 172 } 173 foreach ($users as $usr => $usersname) { 174 $selected = isset($params['select']) && ( $params['select'] === $usr || (is_array($params['select']) && in_array($usr, $params['select'])) ); 175 if ($params['editable'] == 'y' || $usr == $params['user'] || $selected) { 176 if (isset($params['select'])) { 177 $ret .= '<option value="' . htmlspecialchars($usr) . '"' . ($selected ? ' selected="selected"' : '') . ' >' . $usersname . '</option>'; 178 } else { 179 $ret .= '<option value="' . htmlspecialchars($usr) . '"' . ($usr == $params['user'] ? ' selected="selected"' : '') . ' >' . $usersname . '</option>'; 180 } 181 } 182 } 183 $ret .= '</select>'; 184 } 185 return $ret; 186} 187