%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/widgets/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/widgets/UserPicker.php |
<?php namespace humhub\modules\user\widgets; use Yii; use yii\helpers\Html; use \yii\helpers\Url; use humhub\modules\user\models\UserFilter; /** * UserPickerWidget displays a user picker instead of an input field. * * To use this widget, you may insert the following code in a view: * <pre> * $this->widget('application.modules_core.user.widgets.UserPickerWidget',array( * 'name'=>'users', * * // additional javascript options for the date picker plugin * 'options'=>array( * 'showAnim'=>'fold', * ), * 'htmlOptions'=>array( * 'style'=>'height:20px;' * ), * )); * </pre> * * By configuring the {@link options} property, you may specify the options * that need to be passed to the userpicker plugin. Please refer to * the documentation for possible options (name-value pairs). * * @package humhub.modules_core.user.widgets * @since 0.5 * @deprecated since 1.2 use UserPickerField widget for rendering a picker and \humhub\modules\user\models\UserPicker for search queries. * @author Luke */ class UserPicker extends \yii\base\Widget { /** * Id of input element which should replaced * * @var type */ public $inputId = ""; /** * JSON Search URL - defaults: search/json * * The token -keywordPlaceholder- will replaced by the current search query. * * @var String Url with -keywordPlaceholder- */ public $userSearchUrl = ""; /** * Maximum users * * @var type */ public $maxUsers = 50; /** * Set guid for the current user * * @var type string */ public $userGuid = ""; /** * Set focus to input or not * * @var type boolean */ public $focus = false; /** * @var CModel the data model associated with this widget. */ public $model = null; /** * @var string the attribute associated with this widget. * The name can contain square brackets (e.g. 'name[1]') which is used to collect tabular data input. */ public $attribute = null; /** * @var string for input placeholder attribute. */ public $placeholderText = ""; /** * Can be used to filter user roles like friends only * @var type */ public $userRole = null; /** * Used to transfer additional data to the server * @var type */ public $data = null; /** * Inits the User Picker * */ public function init() { // Default user search for all users if ($this->userSearchUrl == "") { // provide the space id if the widget is calling from a space if (Yii::$app->controller->id == 'space') { $spaceId = Yii::$app->controller->getSpace()->id; $this->userSearchUrl = Url::toRoute(['/user/search/json', 'keyword' => '-keywordPlaceholder-', 'space_id' => $spaceId]); } else { $this->userSearchUrl = Url::toRoute(['/user/search/json', 'keyword' => '-keywordPlaceholder-']); } } } /** * Displays / Run the Widgets */ public function run() { // Try to get current field value, when model & attribute attributes are specified. $currentValue = ""; if ($this->model != null && $this->attribute != null) { $attribute = $this->attribute; $currentValue = $this->model->$attribute; } return $this->render('userPicker', [ 'userSearchUrl' => $this->userSearchUrl, 'maxUsers' => $this->maxUsers, 'currentValue' => $currentValue, 'inputId' => $this->inputId, 'focus' => $this->focus, 'userGuid' => $this->userGuid, 'userRole' => $this->userRole, 'data' => json_encode($this->data), 'placeholderText' => $this->placeholderText, ]); } /** * Creates a json user array used in the userpicker js frontend. * The $cfg is used to specify the filter values the following values are available: * * query - (ActiveQuery) The initial query which is used to append additional filters. - default = User::find() * * active - (boolean) Specifies if only active user should be included in the result - default = true * * maxResults - (int) The max number of entries returned in the array - default = 10 * * keyword - (string) A keyword which filters user by username, firstname, lastname, email and title * * permission - (BasePermission) An additional permission filter * * fillQuery - (ActiveQuery) Can be used to fill the result array if the initial query does not return the maxResults, these results will have a lower priority * * fillUser - (boolean) When set to true and no fillQuery is given the result is filled with User::find() results * * disableFillUser - Specifies if the results of the fillQuery should be disabled in the userpicker results - default = true * * @param type $cfg filter configuration * @return type json representation used by the userpicker */ public static function filter($cfg = null) { $defaultCfg = [ 'active' => true, 'maxResult' => 10, 'disableFillUser' => true, 'keyword' => null, 'permission' => null, 'fillQuery' => null, 'fillUser' => false ]; $cfg = ($cfg == null) ? $defaultCfg : array_merge($defaultCfg, $cfg); if(!isset($cfg['query'])) { $cfg['query'] = UserFilter::find(); } //Filter the initial query and disable user without the given permission $user = UserFilter::filter($cfg['query'], $cfg['keyword'], $cfg['maxResult'], null, $cfg['active']); $jsonResult = self::asJSON($user, $cfg['permission'], 2); //Fill the result with additional users if it's allowed and the result count less than maxResult if(count($user) < $cfg['maxResult'] && (isset($cfg['fillQuery']) || $cfg['fillUser']) ) { //Filter out users by means of the fillQuery or default the fillQuery $fillQuery = (isset($cfg['fillQuery'])) ? $cfg['fillQuery'] : UserFilter::find(); UserFilter::addKeywordFilter($fillQuery, $cfg['keyword'], ($cfg['maxResult'] - count($user))); $fillQuery->andFilterWhere(['not in', 'id', self::getUserIdArray($user)]); $fillUser = $fillQuery->all(); //Either the additional users are disabled (by default) or we disable them by permission $disableCondition = (isset($cfg['permission'])) ? $cfg['permission'] : $cfg['disableFillUser']; $jsonResult = array_merge($jsonResult, UserPicker::asJSON($fillUser, $disableCondition, 1)); } return $jsonResult; } /** * Assambles all user Ids of the given $users into an array * * @param array $users array of user models * @return array user id array */ private static function getUserIdArray($users) { $result = []; foreach($users as $user) { $result[] = $user->id; } return $result; } /** * Creates an json result with user information arrays. A user will be marked * as disabled, if the permission check fails on this user. * * @param type $users * @param type $permission * @return type */ public static function asJSON($users, $permission = null, $priority = null) { if (is_array($users)) { $result = []; foreach ($users as $user) { if ($user != null) { $result[] = self::createJSONUserInfo($user, $permission, $priority); } } return $result; } else { return self::createJSONUserInfo($users, $permission, $priority); } } /** * Creates an single user-information array for a given user. A user will be marked * as disabled, if the permission check fails on this user. * * @param type $user * @param type $permission * @return type */ private static function createJSONUserInfo($user, $permission = null, $priority = null) { $disabled = false; if($permission != null && $permission instanceof \humhub\libs\BasePermission) { $disabled = !$user->getPermissionManager()->can($permission); } elseif($permission != null) { $disabled = $permission; } $priority = ($priority == null) ? 0 : $priority; $text = Html::encode($user->displayName); $userInfo = []; $userInfo['id'] = $user->id; $userInfo['guid'] = $user->guid; $userInfo['disabled'] = $disabled; // Deprecated since v1.2 used by old user picker implementation... $userInfo['displayName'] = $text; $userInfo['text'] = $text; $userInfo['image'] = $user->getProfileImage()->getUrl(); $userInfo['priority'] = $priority; $userInfo['link'] = $user->getUrl(); return $userInfo; } } ?>