Файл: concrete5.7.5.6/concrete/src/Legacy/UserList.php
Строк: 130
<?php
namespace ConcreteCoreLegacy;
use ConcreteCoreLegacyDatabaseItemList;
use UserAttributeKey;
use UserInfo;
use Core;
use Database;
use Group;
/**
* An object that allows a filtered list of users to be returned.
* @package Files
* @author Tony Trupp <tony@concrete5.org>
* @category Concrete
* @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org)
* @license http://www.concrete5.org/license/ MIT License
*/
class UserList extends DatabaseItemList
{
protected $attributeFilters = array();
protected $autoSortColumns = array('uName', 'uEmail', 'uDateAdded', 'uLastLogin', 'uNumLogins', 'uLastOnline');
protected $itemsPerPage = 10;
protected $attributeClass = 'UserAttributeKey';
public $showInactiveUsers;
public $showInvalidatedUsers = 0;
public $searchAgainstEmail = 0;
//Filter by uName
public function filterByUserName($username)
{
$this->filter('u.uName', $username, '=');
}
public function filterByKeywords($keywords)
{
$db = Database::connection();
$qkeywords = $db->quote('%' . $keywords . '%');
$keys = UserAttributeKey::getSearchableIndexedList();
$emailSearchStr = ' OR u.uEmail like '.$qkeywords.' ';
$attribsStr = '';
foreach ($keys as $ak) {
$cnt = $ak->getController();
$attribsStr .= ' OR ' . $cnt->searchKeywords($keywords);
}
$this->filter(false, '( u.uName like ' . $qkeywords . $emailSearchStr . $attribsStr . ')');
}
/**
* Filters the user list for only users within the provided group. Accepts an instance of a group object or a string group name.
*
* @param Group|string $group
* @param bool $inGroup
*/
public function filterByGroup($group = '', $inGroup = true)
{
if (!$group instanceof Group) {
$group = Group::getByName($group);
}
$tbl = 'ug_'.$group->getGroupID();
$this->addToQuery("left join UserGroups $tbl on {$tbl}.uID = u.uID ");
if ($inGroup) {
$this->filter(false, "{$tbl}.gID=".intval($group->getGroupID()));
} else {
$this->filter(false, "{$tbl}.gID is null");
}
}
public function excludeUsers($uo)
{
if (is_object($uo)) {
$uID = $uo->getUserID();
} else {
$uID = $uo;
}
$this->filter('u.uID', $uID, '!=');
}
public function filterByGroupID($gID)
{
if (!Core::make('helper/validation/numbers')->integer($gID)) {
$gID = 0;
}
$tbl = 'ug_'.$gID;
$this->addToQuery("left join UserGroups $tbl on {$tbl}.uID = u.uID ");
$this->filter(false, "{$tbl}.gID=".$gID);
}
public function filterByDateAdded($date, $comparison = '=')
{
$this->filter('u.uDateAdded', $date, $comparison);
}
/**
* Returns an array of userInfo objects based on current filter settings.
*
* @return UserInfo[]
*/
public function get($itemsToGet = 100, $offset = 0)
{
$userInfos = array();
$this->createQuery();
$r = parent::get($itemsToGet, intval($offset));
foreach ($r as $row) {
$ui = UserInfo::getByID($row['uID']);
$userInfos[] = $ui;
}
return $userInfos;
}
/**
* Similar to get except it returns an array of userIDs.
* Much faster than getting a UserInfo object for each result if all you need is the user's id.
*
* @return array $userIDs
*/
public function getUserIDs($itemsToGet = 100, $offset = 0)
{
$this->createQuery();
$userIDs = array();
$r = parent::get($itemsToGet, intval($offset));
foreach ($r as $row) {
$userIDs[] = $row['uID'];
}
return $userIDs;
}
public function getTotal()
{
$this->createQuery();
return parent::getTotal();
}
public function filterByIsActive($val)
{
$this->showInactiveUsers = $val;
$this->filter('u.uIsActive', $val);
}
//this was added because calling both getTotal() and get() was duplicating some of the query components
protected function createQuery()
{
if (!$this->queryCreated) {
$this->setBaseQuery();
if (!isset($this->showInactiveUsers)) {
$this->filter('u.uIsActive', 1);
}
if (!$this->showInvalidatedUsers) {
$this->filter('u.uIsValidated', 0, '!=');
}
$this->setupAttributeFilters("left join UserSearchIndexAttributes on (UserSearchIndexAttributes.uID = u.uID)");
$this->queryCreated = 1;
}
}
protected function setBaseQuery()
{
$this->setQuery('SELECT DISTINCT u.uID, u.uName FROM Users u ');
}
/* magic method for filtering by page attributes. */
public function __call($nm, $a)
{
if (substr($nm, 0, 8) == 'filterBy') {
$txt = Core::make('helper/text');
$attrib = $txt->uncamelcase(substr($nm, 8));
if (count($a) == 2) {
$this->filterByAttribute($attrib, $a[0], $a[1]);
} else {
$this->filterByAttribute($attrib, $a[0]);
}
}
}
}