/** * This tool renders a user avatar * * @param {array} $options An associative array of parameters, containing: * @param {string} [$options.userId] * The user's id. Defaults to id of the logged-in user, if any. * Can be '' for a blank-looking avatar. * @param {boolean} [options.short] * Optional. Renders the short version of the display name. * @param {boolean|integer} [options.icon=false] * Optional. Pass the size in pixels of the (square) icon to render * before the username. Or pass true to render the default size. * @param {array} [options.iconAttributes] * Optional. Array of attributes to render for the icon. * @param {boolean|array} [options.editable=false] * Optional. Whether to provide an interface for editing the user's info. Can be array containing one or more of "icon", "name". * @param {boolean} [$options.show] The parts of the name to show. Can have the letters "f", "l", "u" in any order. * @param {boolean} [options.cacheBust=null] * Number of milliseconds to use for Q_Uri::cacheBust for combating unintended caching on some environments. * @param {boolean} [options.renderOnClient] * If true, only the html container is rendered, so the client will do the rest. */ function Users_avatar_tool($options) { $defaults = array('icon' => false, 'short' => false, 'cacheBust' => null, 'editable' => false); $options = array_merge($defaults, $options); Q_Response::addStylesheet('plugins/Users/css/Users.css'); $loggedInUser = Users::loggedInUser(); $loggedInUserId = $loggedInUser ? $loggedInUser->id : ""; if (empty($options['userId'])) { $options['userId'] = $loggedInUserId; } unset($options['iconAttributes']); if (empty($options['editable'])) { $options['editable'] = array(); } else { if (is_string($options['editable'])) { $options['editable'] = array($options['editable']); } else { if ($options['editable'] === true) { $options['editable'] = array('icon', 'name'); } } } Q_Response::setToolOptions($options); if (!empty($options['renderOnClient'])) { return ''; } $avatar = Streams_Avatar::fetch($loggedInUserId, $options['userId']); if (!$avatar) { return ''; } $result = ''; if ($icon = $options['icon']) { if ($icon === true) { $icon = Q_Config::get('Users', 'icon', 'defaultSize', 40); } $attributes = isset($options['iconAttributes']) ? $options['iconAttributes'] : array(); $class = "Users_avatar_icon Users_avatar_icon_{$icon}"; $attributes['class'] = isset($attributes['class']) ? $attributes['class'] . ' ' . $class : $class; if (isset($options['cacheBust'])) { $attributes['cacheBust'] = $options['cacheBust']; } $result .= Q_Html::img(Users::iconUrl($avatar->icon, "{$icon}.png"), 'user icon', $attributes); } $o = $options['short'] ? array('short' => true) : array(); $o['html'] = true; if (in_array('name', $options['editable'])) { $o['show'] = 'fl'; $streams = Streams::fetch(null, $options['userId'], array('Streams/user/firstName', 'Streams/user/lastName', 'Streams/user/username')); foreach ($streams as $s) { $s->addPreloaded(); } } if (!empty($options['show'])) { $o['show'] = $options['show']; } $displayName = $avatar->displayName($o, 'Someone'); $result .= "<span class='Users_avatar_name'>{$displayName}</span>"; return $result; }
function Streams_avatar_response() { $prefix = $limit = $userIds = $batch = $public = null; extract($_REQUEST, EXTR_IF_EXISTS); $user = Users::loggedInUser(); $asUserId = $user ? $user->id : ""; if (isset($prefix)) { $avatars = Streams_Avatar::fetchByPrefix($asUserId, $prefix, compact('limit', 'public')); } else { if (isset($batch)) { $batch = json_decode($batch, true); if (!isset($batch)) { throw new Q_Exception_WrongValue(array('field' => 'batch', 'range' => '{userIds: [userId1, userId2, ...]}')); } if (!isset($batch['userIds'])) { throw new Q_Exception_RequiredField(array('field' => 'userIds')); } $userIds = $batch['userIds']; } if (!isset($userIds)) { throw new Q_Exception_RequiredField(array('field' => 'userIds')); } if (is_string($userIds)) { $userIds = explode(",", $userIds); } $avatars = Streams_Avatar::fetch($asUserId, $userIds); } $avatars = Db::exportArray($avatars); if (isset($batch)) { $result = array(); foreach ($userIds as $userId) { $result[] = array('slots' => array('avatar' => isset($avatars[$userId]) ? $avatars[$userId] : null)); } Q_Response::setSlot('batch', $result); } else { Q_Response::setSlot('avatars', $avatars); } return $avatars; }
/** * Produce user's display name * @method displayName * @static * @param {string|Users_User} $userId * Can be Users_User object or a string containing a user id * @param {array} $streams=null * An array of streams fetched for this user. * If it is null, we fetch them as the logged-in user. * @param {array} $options=array() * Associative array of options, which can include:<br/> * "fullAccess" => Ignore the access restrictions for the name<br/> * "short" => Only display the first name<br/> * "html" => If true, encloses the first and last name in span tags<br/> * "escape" => If true, does HTML escaping of the retrieved fields * @param {string|null} $default * What to return if there is no info to get displayName from. * @return {string|null} */ static function displayName($userId, $options = array(), $default = null) { if ($userId instanceof Users_User) { $userId = $userId->id; } if (!empty($options['fullAccess'])) { $asUserId = $userId; } else { $asUser = Users::loggedInUser(); $asUserId = $asUser ? $asUser->id : ""; } $avatar = Streams_Avatar::fetch($asUserId, $userId); return $avatar ? $avatar->displayName($options, $default) : $default; }
/** * Access tool * @class Streams access * @constructor * @param {array} $options Options for the tool * @param {string} [$options.publisherId] the id of the user who is publishing the stream * @param {string} [$options.streamName] the name of the stream for which to edit access levels * @param {array} [$options.tabs] array of tab name => title. Defaults to read, write, admin tabs. * @param {array} [$options.ranges] associative array with keys "read", "write", "admin" and values as associative arrays of ($min, $max) for the displayed levels. * @param {boolean} [$options.controls] optionally set this to true to render only the controls */ function Streams_access_tool($options) { $tabs = array('read' => 'visible to', 'write' => 'editable by', 'admin' => 'members'); extract($options); $user = Users::loggedInUser(true); /** * @var string $streamName */ if (empty($streamName)) { $streamName = Streams::requestedName(true); } if (empty($publisherId)) { $publisherId = Streams::requestedPublisherId(); if (empty($publisherId)) { $publisherId = $user->id; } } reset($tabs); $tab = Q::ifset($_REQUEST, 'tab', key($tabs)); $stream = Streams::fetchOne($user->id, $publisherId, $streamName); if (!$stream) { throw new Q_Exception_MissingRow(array('table' => 'stream', 'criteria' => 'with that name')); } $stream->addPreloaded($user->id); if (!$stream->testAdminLevel('own')) { throw new Users_Exception_NotAuthorized(); } $access_array = Streams_Access::select('*')->where(array('publisherId' => $stream->publisherId, 'streamName' => $stream->name))->andWhere("{$tab}Level != -1")->fetchDbRows(); $labelRows = Users_Label::fetch($stream->publisherId, '', true); $labels = array(); $icons = array(); foreach ($labelRows as $label => $row) { $labels[$label] = $row->title; $icons[$label] = "labels/{$label}"; } $userId_list = array(); foreach ($access_array as $a) { if ($a->ofUserId) { $userId_list[] = $a->ofUserId; } } $avatar_array = empty($userId_list) ? array() : Streams_Avatar::fetch($user->id, $userId_list); switch ($tab) { case 'read': $levels = Q_Config::get('Streams', 'readLevelOptions', array()); break; case 'write': $levels = Q_Config::get('Streams', 'writeLevelOptions', array()); break; case 'admin': $levels = Q_Config::get('Streams', 'adminLevelOptions', array()); break; } if (isset($ranges[$tab])) { $range_min = reset($ranges[$tab]); $range_max = end($ranges[$tab]); foreach ($levels as $k => $v) { if ($k < $range_min) { unset($levels[$k]); } if ($k > $range_max) { unset($levels[$k]); } } } $accessActionUrl = Q_Uri::url("Streams/access?publisherId={$publisherId}&streamName={$streamName}"); $dir = Q_Config::get('Users', 'paths', 'icons', 'files/Users/icons'); $accessArray = Db::exportArray($access_array); $avatarArray = Db::exportArray($avatar_array); if (empty($controls)) { Q_Response::addScript("plugins/Streams/js/Streams.js"); Q_Response::addScript("plugins/Streams/js/tools/access.js"); Q_Response::setToolOptions(compact('accessArray', 'avatarArray', 'labels', 'icons', 'tab', 'publisherId', 'streamName')); } else { Q_Response::setSlot('extra', array('stream' => $stream->exportArray(), 'accessArray' => $accessArray, 'avatarArray' => $avatarArray, 'labels' => $labels, 'icons' => $icons)); } return Q::view('Streams/tool/access.php', compact('stream', 'tabs', 'tab', 'labels', 'icons', 'levels', 'dir', 'publisherId', 'streamName', 'accessActionUrl', 'controls')); }