1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-05 07:54:24 +03:00
ifhub.club/application/classes/modules/user/mapper/User.mapper.class.php

1469 lines
46 KiB
PHP
Raw Normal View History

<?php
2014-10-08 08:20:29 +03:00
/*
* LiveStreet CMS
* Copyright © 2013 OOO "ЛС-СОФТ"
*
* ------------------------------------------------------
*
* Official site: www.livestreetcms.com
* Contact e-mail: office@livestreetcms.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* ------------------------------------------------------
*
* @link http://www.livestreetcms.com
* @copyright 2013 OOO "ЛС-СОФТ"
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
*
*/
2008-09-21 09:36:57 +03:00
/**
* Маппер для работы с БД
*
2014-10-08 08:20:29 +03:00
* @package application.modules.user
* @since 1.0
*/
class ModuleUser_MapperUser extends Mapper
{
/**
* Добавляет юзера
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return int|bool
*/
public function Add(ModuleUser_EntityUser $oUser)
{
$sql = "INSERT INTO " . Config::Get('db.table.user') . "
2008-09-21 09:36:57 +03:00
(user_login,
user_password,
user_mail,
user_date_register,
user_ip_register,
user_activate,
user_activate_key
)
VALUES(?, ?, ?, ?, ?, ?, ?)
";
if ($iId = $this->oDb->query($sql, $oUser->getLogin(), $oUser->getPassword(), $oUser->getMail(),
$oUser->getDateRegister(), $oUser->getIpRegister(), $oUser->getActivate(), $oUser->getActivateKey())
) {
return $iId;
}
return false;
}
/**
* Обновляет юзера
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return bool
*/
public function Update(ModuleUser_EntityUser $oUser)
{
$sql = "UPDATE " . Config::Get('db.table.user') . "
SET
2008-09-21 09:36:57 +03:00
user_password = ? ,
user_mail = ? ,
user_admin = ? ,
2008-09-21 09:36:57 +03:00
user_date_activate = ? ,
user_date_comment_last = ? ,
2008-09-21 09:36:57 +03:00
user_rating = ? ,
user_count_vote = ? ,
user_activate = ? ,
2012-06-13 11:46:40 +03:00
user_activate_key = ? ,
user_profile_name = ? ,
user_profile_sex = ? ,
user_profile_country = ? ,
user_profile_region = ? ,
user_profile_city = ? ,
user_profile_birthday = ? ,
2008-09-21 09:36:57 +03:00
user_profile_about = ? ,
user_profile_date = ? ,
user_profile_avatar = ? ,
user_profile_foto = ? ,
user_settings_notice_new_topic = ? ,
user_settings_notice_new_comment = ? ,
user_settings_notice_new_talk = ? ,
user_settings_notice_reply_comment = ? ,
user_settings_notice_new_friend = ? ,
user_settings_timezone = ?
2008-09-21 09:36:57 +03:00
WHERE user_id = ?
";
$res = $this->oDb->query($sql, $oUser->getPassword(),
$oUser->getMail(),
$oUser->getAdmin(),
$oUser->getDateActivate(),
$oUser->getDateCommentLast(),
$oUser->getRating(),
$oUser->getCountVote(),
$oUser->getActivate(),
$oUser->getActivateKey(),
$oUser->getProfileName(),
$oUser->getProfileSex(),
$oUser->getProfileCountry(),
$oUser->getProfileRegion(),
$oUser->getProfileCity(),
$oUser->getProfileBirthday(),
$oUser->getProfileAbout(),
$oUser->getProfileDate(),
$oUser->getProfileAvatar(),
$oUser->getProfileFoto(),
$oUser->getSettingsNoticeNewTopic(),
$oUser->getSettingsNoticeNewComment(),
$oUser->getSettingsNoticeNewTalk(),
$oUser->getSettingsNoticeReplyComment(),
$oUser->getSettingsNoticeNewFriend(),
$oUser->getSettingsTimezone(),
$oUser->getId());
return $this->IsSuccessful($res);
}
/**
* Получить юзера по ключу сессии
*
* @param string $sKey Сессионный ключ
* @return int|null
*/
public function GetUserBySessionKey($sKey)
{
$sql = "SELECT
s.user_id
FROM
" . Config::Get('db.table.session') . " as s
WHERE
s.session_key = ?
";
if ($aRow = $this->oDb->selectRow($sql, $sKey)) {
return $aRow['user_id'];
}
return null;
}
public function GetSessionByKey($sKey)
{
$sql = "SELECT
s.*
FROM
" . Config::Get('db.table.session') . " as s
WHERE
s.session_key = ?
";
if ($aRow = $this->oDb->selectRow($sql, $sKey)) {
return Engine::GetEntity('User_Session', $aRow);
}
return null;
}
public function GetSessionsByUserId($iUserId, $bOnlyNotClose = true)
{
$sql = "SELECT
s.*
FROM
" . Config::Get('db.table.session') . " as s
WHERE
s.user_id = ?d
{ and 1=?d and s.session_date_close is null }
ORDER BY session_date_last desc
";
$aRes = array();
if ($aRows = $this->oDb->select($sql, $iUserId, $bOnlyNotClose ? 1 : DBSIMPLE_SKIP)) {
foreach ($aRows as $aRow) {
$aRes[] = Engine::GetEntity('User_Session', $aRow);
}
}
return $aRes;
}
/**
* Создание пользовательской сессии
*
* @param ModuleUser_EntitySession $oSession
* @return bool
*/
public function CreateSession(ModuleUser_EntitySession $oSession)
{
$sql = "REPLACE INTO " . Config::Get('db.table.session') . "
SET
session_key = ? ,
user_id = ? ,
session_ip_create = ? ,
session_ip_last = ? ,
session_date_create = ? ,
session_date_last = ? ,
session_extra = ?
";
return $this->oDb->query($sql, $oSession->getKey(), $oSession->getUserId(), $oSession->getIpCreate(),
$oSession->getIpLast(), $oSession->getDateCreate(), $oSession->getDateLast(), $oSession->getExtra());
}
/**
* Обновление данных сессии
*
* @param ModuleUser_EntitySession $oSession
* @return int|bool
*/
public function UpdateSession(ModuleUser_EntitySession $oSession)
{
$sql = "UPDATE " . Config::Get('db.table.session') . "
SET
session_ip_last = ? ,
session_date_last = ?,
session_date_close = ?
WHERE session_key = ?
";
$res = $this->oDb->query($sql, $oSession->getIpLast(), $oSession->getDateLast(), $oSession->getDateClose(),
$oSession->getKey());
return $this->IsSuccessful($res);
}
/**
* Удаление сессии
*
* @param ModuleUser_EntitySession $oSession
* @return int|bool
*/
public function DeleteSession(ModuleUser_EntitySession $oSession)
{
$sql = "DELETE FROM " . Config::Get('db.table.session') . "
WHERE session_key = ?
";
$res = $this->oDb->query($sql, $oSession->getKey());
return $this->IsSuccessful($res);
}
/**
* Список сессий юзеров по ID
*
* @param array $aArrayId Список ID пользователей
* @return array
*/
public function GetSessionsByArrayId($aArrayId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
s.*
FROM
(
SELECT
user_id, max(session_date_last) as max_date_last
FROM
" . Config::Get('db.table.session') . "
WHERE
user_id IN (?a)
GROUP BY user_id
) as s2,
" . Config::Get('db.table.session') . " as s
WHERE
s2.user_id = s.user_id and s2.max_date_last = s.session_date_last
";
$aRes = array();
if ($aRows = $this->oDb->select($sql, $aArrayId)) {
foreach ($aRows as $aRow) {
$aRes[] = Engine::GetEntity('User_Session', $aRow);
}
}
return $aRes;
}
/**
* Список юзеров по ID
*
* @param array $aArrayId Список ID пользователей
* @return array
*/
public function GetUsersByArrayId($aArrayId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
u.*
FROM
" . Config::Get('db.table.user') . " as u
WHERE
u.user_id IN(?a)
2009-05-29 18:32:37 +03:00
ORDER BY FIELD(u.user_id,?a) ";
$aUsers = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $aArrayId)) {
foreach ($aRows as $aUser) {
$aUsers[] = Engine::GetEntity('User', $aUser);
}
}
return $aUsers;
}
/**
* Получить юзера по ключу активации
*
* @param string $sKey Ключ активации
* @return int|null
*/
public function GetUserByActivateKey($sKey)
{
$sql = "SELECT
2009-05-29 18:32:37 +03:00
u.user_id
FROM
" . Config::Get('db.table.user') . " as u
WHERE u.user_activate_key = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sKey)) {
return $aRow['user_id'];
}
return null;
}
/**
* Получить юзера по мылу
*
* @param string $sMail Емайл
* @return int|null
*/
public function GetUserByMail($sMail)
{
$sql = "SELECT
2009-05-29 18:32:37 +03:00
u.user_id
FROM
" . Config::Get('db.table.user') . " as u
WHERE u.user_mail = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sMail)) {
return $aRow['user_id'];
}
return null;
}
/**
* Получить юзера по логину
*
* @param string $sLogin Логин пользователя
* @return int|null
*/
public function GetUserByLogin($sLogin)
{
$sql = "SELECT
u.user_id
FROM
" . Config::Get('db.table.user') . " as u
WHERE
u.user_login = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sLogin)) {
return $aRow['user_id'];
}
return null;
}
/**
* Получить список юзеров по дате регистрации
*
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByDateRegister($iLimit)
{
$sql = "SELECT
user_id
FROM
" . Config::Get('db.table.user') . "
2008-09-21 09:36:57 +03:00
WHERE
user_activate = 1
ORDER BY
user_id DESC
LIMIT 0, ?d
";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[] = $aRow['user_id'];
}
}
return $aReturn;
}
/**
* Возвращает количество пользователй
*
* @return int
*/
public function GetCountUsers()
{
$sql = "SELECT count(*) as count FROM " . Config::Get('db.table.user') . " WHERE user_activate = 1";
$result = $this->oDb->selectRow($sql);
return $result['count'];
}
/**
* Возвращает количество активных пользователей
*
* @param string $sDateActive Дата
* @return mixed
*/
public function GetCountUsersActive($sDateActive)
{
$sql = "SELECT DISTINCT user_id FROM " . Config::Get('db.table.session') . " WHERE session_date_last >= ? ";
$result = $this->oDb->select($sql, $sDateActive);
return $result ? count($result) : 0;
}
/**
* Возвращает количество пользователей в разрезе полов
*
* @return array
*/
public function GetCountUsersSex()
{
$sql = "SELECT user_profile_sex AS ARRAY_KEY, count(*) as count FROM " . Config::Get('db.table.user') . " WHERE user_activate = 1 GROUP BY user_profile_sex ";
$result = $this->oDb->select($sql);
return $result;
}
/**
* Получить список юзеров по первым буквам логина
*
* @param string $sUserLogin Логин
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByLoginLike($sUserLogin, $iLimit)
{
$sql = "SELECT
user_id
FROM
" . Config::Get('db.table.user') . "
2008-09-21 09:36:57 +03:00
WHERE
user_activate = 1
and
user_login LIKE ?
LIMIT 0, ?d
";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $sUserLogin . '%', $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[] = $aRow['user_id'];
}
}
return $aReturn;
}
/**
* Добавляет друга
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function AddFriend(ModuleUser_EntityFriend $oFriend)
{
$sql = "INSERT INTO " . Config::Get('db.table.friend') . "
(user_from,
user_to,
status_from,
status_to
2008-09-21 09:36:57 +03:00
)
VALUES(?d, ?d, ?d, ?d)
";
if (
$this->oDb->query(
$sql,
$oFriend->getUserFrom(),
$oFriend->getUserTo(),
$oFriend->getStatusFrom(),
$oFriend->getStatusTo()
) === 0
) {
return true;
}
return false;
}
/**
* Удаляет информацию о дружбе из базы данных
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function EraseFriend(ModuleUser_EntityFriend $oFriend)
{
$sql = "DELETE FROM " . Config::Get('db.table.friend') . "
2008-09-21 09:36:57 +03:00
WHERE
user_from = ?d
2008-09-21 09:36:57 +03:00
AND
user_to = ?d
";
$res = $this->oDb->query($sql, $oFriend->getUserFrom(), $oFriend->getUserTo());
return $this->IsSuccessful($res);
}
/**
* Обновляет информацию о друге
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function UpdateFriend(ModuleUser_EntityFriend $oFriend)
{
$sql = "
UPDATE " . Config::Get('db.table.friend') . "
SET
status_from = ?d,
status_to = ?d
WHERE
user_from = ?d
AND
user_to = ?d
";
$res = $this->oDb->query(
$sql,
$oFriend->getStatusFrom(),
$oFriend->getStatusTo(),
$oFriend->getUserFrom(),
$oFriend->getUserTo()
);
return $this->IsSuccessful($res);
}
/**
* Получить список отношений друзей
*
* @param array $aArrayId Список ID пользователей проверяемых на дружбу
* @param int $sUserId ID пользователя у которого проверяем друзей
* @return array
*/
public function GetFriendsByArrayId($aArrayId, $sUserId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
*
FROM
" . Config::Get('db.table.friend') . "
WHERE
( `user_from`=?d AND `user_to` IN(?a) )
OR
( `user_from` IN(?a) AND `user_to`=?d )
";
$aRows = $this->oDb->select(
$sql,
$sUserId, $aArrayId,
$aArrayId, $sUserId
);
$aRes = array();
if ($aRows) {
foreach ($aRows as $aRow) {
$aRow['user'] = $sUserId;
$aRes[] = Engine::GetEntity('User_Friend', $aRow);
}
}
return $aRes;
}
/**
* Получает список друзей
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUsersFriend($sUserId, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "SELECT
uf.user_from,
uf.user_to
FROM
" . Config::Get('db.table.friend') . " as uf
WHERE
( uf.user_from = ?d
OR
uf.user_to = ?d )
AND
( uf.status_from + uf.status_to = ?d
2010-03-06 23:17:40 +02:00
OR
(uf.status_from = ?d AND uf.status_to = ?d )
)
LIMIT ?d, ?d ;";
$aUsers = array();
if ($aRows = $this->oDb->selectPage(
$iCount,
$sql,
$sUserId,
$sUserId,
ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_OFFER,
ModuleUser::USER_FRIEND_ACCEPT,
ModuleUser::USER_FRIEND_ACCEPT,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aUser) {
$aUsers[] = ($aUser['user_from'] == $sUserId)
? $aUser['user_to']
: $aUser['user_from'];
}
}
rsort($aUsers, SORT_NUMERIC);
return array_unique($aUsers);
}
/**
* Получает количество друзей
*
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountUsersFriend($sUserId)
{
$sql = "SELECT
count(*) as c
FROM
" . Config::Get('db.table.friend') . " as uf
WHERE
( uf.user_from = ?d
OR
uf.user_to = ?d )
AND
( uf.status_from + uf.status_to = ?d
OR
(uf.status_from = ?d AND uf.status_to = ?d )
)";
if ($aRow = $this->oDb->selectRow(
$sql,
$sUserId,
$sUserId,
ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_OFFER,
ModuleUser::USER_FRIEND_ACCEPT,
ModuleUser::USER_FRIEND_ACCEPT
)
) {
return $aRow['c'];
}
return 0;
}
/**
* Получить список заявок на добавление в друзья от указанного пользователя
*
* @param string $sUserId
* @param int $iStatus Статус запроса со стороны добавляемого
* @return array
*/
public function GetUsersFriendOffer($sUserId, $iStatus = ModuleUser::USER_FRIEND_NULL)
{
$sql = "SELECT
uf.user_to
FROM
" . Config::Get('db.table.friend') . " as uf
WHERE
uf.user_from = ?d
AND
uf.status_from = ?d
AND
uf.status_to = ?d
;";
$aUsers = array();
if ($aRows = $this->oDb->select(
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
) {
foreach ($aRows as $aUser) {
$aUsers[] = $aUser['user_to'];
}
}
return $aUsers;
}
/**
* Получить список заявок на добавление в друзья от указанного пользователя
*
* @param string $sUserId
* @param int $iStatus Статус запроса со стороны самого пользователя
* @return array
*/
public function GetUserSelfFriendOffer($sUserId, $iStatus = ModuleUser::USER_FRIEND_NULL)
{
$sql = "SELECT
uf.user_from
FROM
" . Config::Get('db.table.friend') . " as uf
WHERE
uf.user_to = ?d
AND
uf.status_from = ?d
AND
uf.status_to = ?d
;";
$aUsers = array();
if ($aRows = $this->oDb->select(
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
) {
foreach ($aRows as $aUser) {
$aUsers[] = $aUser['user_from'];
}
}
return $aUsers;
}
/**
* Получает инвайт по его коду
*
* @param string $sCode Код инвайта
* @param int $iUsed Флаг испольщования инвайта
* @return ModuleUser_EntityInvite|null
*/
public function GetInviteByCode($sCode, $iUsed = 0)
{
$sql = "SELECT * FROM " . Config::Get('db.table.invite') . " WHERE invite_code = ? and invite_used = ?d ";
if ($aRow = $this->oDb->selectRow($sql, $sCode, $iUsed)) {
return Engine::GetEntity('User_Invite', $aRow);
}
return null;
}
/**
* Добавляет новый инвайт
*
* @param ModuleUser_EntityInvite $oInvite Объект инвайта
* @return int|bool
*/
public function AddInvite(ModuleUser_EntityInvite $oInvite)
{
$sql = "INSERT INTO " . Config::Get('db.table.invite') . "
(invite_code,
user_from_id,
invite_date_add
)
VALUES(?, ?, ?)
";
if ($iId = $this->oDb->query($sql, $oInvite->getCode(), $oInvite->getUserFromId(), $oInvite->getDateAdd())) {
return $iId;
}
return false;
}
/**
* Обновляет инвайт
*
* @param ModuleUser_EntityInvite $oInvite бъект инвайта
* @return bool
*/
public function UpdateInvite(ModuleUser_EntityInvite $oInvite)
{
$sql = "UPDATE " . Config::Get('db.table.invite') . "
SET
user_to_id = ? ,
invite_date_used = ? ,
invite_used =?
WHERE invite_id = ?
";
$res = $this->oDb->query($sql, $oInvite->getUserToId(), $oInvite->getDateUsed(), $oInvite->getUsed(),
$oInvite->getId());
return $this->IsSuccessful($res);
}
/**
* Получает число использованых приглашений юзером за определенную дату
*
* @param int $sUserIdFrom ID пользователя
* @param string $sDate Дата
* @return int
*/
public function GetCountInviteUsedByDate($sUserIdFrom, $sDate)
{
$sql = "SELECT count(invite_id) as count FROM " . Config::Get('db.table.invite') . " WHERE user_from_id = ?d and invite_date_add >= ? ";
if ($aRow = $this->oDb->selectRow($sql, $sUserIdFrom, $sDate)) {
return $aRow['count'];
}
return 0;
}
/**
* Получает полное число использованных приглашений юзера
*
* @param int $sUserIdFrom ID пользователя
* @return int
*/
public function GetCountInviteUsed($sUserIdFrom)
{
$sql = "SELECT count(invite_id) as count FROM " . Config::Get('db.table.invite') . " WHERE user_from_id = ?d";
if ($aRow = $this->oDb->selectRow($sql, $sUserIdFrom)) {
return $aRow['count'];
}
return 0;
}
/**
* Получает список приглашенных юзеров
*
* @param int $sUserId ID пользователя
* @return array
*/
public function GetUsersInvite($sUserId)
{
$sql = "SELECT
i.user_to_id
FROM
" . Config::Get('db.table.invite') . " as i
WHERE
2009-06-13 14:32:06 +03:00
i.user_from_id = ?d ";
$aUsers = array();
if ($aRows = $this->oDb->select($sql, $sUserId)) {
foreach ($aRows as $aUser) {
$aUsers[] = $aUser['user_to_id'];
}
}
return $aUsers;
}
/**
* Получает юзера который пригласил
*
* @param int $sUserIdTo ID пользователя
* @return int|null
*/
public function GetUserInviteFrom($sUserIdTo)
{
$sql = "SELECT
i.user_from_id
FROM
" . Config::Get('db.table.invite') . " as i
WHERE
i.user_to_id = ?d
LIMIT 0,1;
";
if ($aRow = $this->oDb->selectRow($sql, $sUserIdTo)) {
return $aRow['user_from_id'];
}
return null;
}
/**
* Добавляем воспоминание(восстановление) пароля
*
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function AddReminder(ModuleUser_EntityReminder $oReminder)
{
$sql = "REPLACE " . Config::Get('db.table.reminder') . "
SET
reminder_code = ? ,
user_id = ? ,
reminder_date_add = ? ,
reminder_date_used = ? ,
reminder_date_expire = ? ,
reminde_is_used = ?
";
return $this->oDb->query($sql, $oReminder->getCode(), $oReminder->getUserId(), $oReminder->getDateAdd(),
$oReminder->getDateUsed(), $oReminder->getDateExpire(), $oReminder->getIsUsed());
}
/**
* Сохраняем воспомнинание(восстановление) пароля
*
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function UpdateReminder(ModuleUser_EntityReminder $oReminder)
{
return $this->AddReminder($oReminder);
}
/**
* Получаем запись восстановления пароля по коду
*
* @param string $sCode Код восстановления пароля
* @return ModuleUser_EntityReminder|null
*/
public function GetReminderByCode($sCode)
{
$sql = "SELECT
*
FROM
" . Config::Get('db.table.reminder') . "
WHERE
reminder_code = ?";
if ($aRow = $this->oDb->selectRow($sql, $sCode)) {
return Engine::GetEntity('User_Reminder', $aRow);
}
return null;
}
/**
* Получить дополнительные поля профиля пользователя
*
* @param array|null $aType Типы полей, null - все типы
* @return array
*/
public function getUserFields($aType)
{
if (!is_null($aType) and !is_array($aType)) {
$aType = array($aType);
}
$sql = 'SELECT * FROM ' . Config::Get('db.table.user_field') . ' WHERE 1=1 { and type IN (?a) }';
$aFields = $this->oDb->select($sql, (is_null($aType) or !count($aType)) ? DBSIMPLE_SKIP : $aType);
if (!count($aFields)) {
return array();
}
$aResult = array();
foreach ($aFields as $aField) {
$aResult[$aField['id']] = Engine::GetEntity('User_Field', $aField);
}
return $aResult;
}
/**
* Получить по имени поля его значение дял определённого пользователя
*
* @param int $iUserId ID пользователя
* @param string $sName Имя поля
* @return string
*/
public function getUserFieldValueByName($iUserId, $sName)
{
$sql = 'SELECT value FROM ' . Config::Get('db.table.user_field_value') . ' WHERE
2012-06-13 11:46:40 +03:00
user_id = ?d
AND
field_id = (SELECT id FROM ' . Config::Get('db.table.user_field') . ' WHERE name =?)';
$ret = $this->oDb->selectCol($sql, $iUserId, $sName);
return $ret[0];
}
/**
* Получить значения дополнительных полей профиля пользователя
*
* @param int $iUserId ID пользователя
* @param bool $bOnlyNoEmpty Загружать только непустые поля
* @param array $aType Типы полей, null - все типы
* @return array
*/
public function getUserFieldsValues($iUserId, $bOnlyNoEmpty, $aType)
{
if (!is_null($aType) and !is_array($aType)) {
$aType = array($aType);
}
/**
* Если запрашиваем без типа, то необходимо вернуть ВСЕ возможные поля с этим типом в не звависимости указал ли их пользователь у себя в профили или нет
* Выглядит костыльно
*/
if (is_array($aType) and count($aType) == 1 and $aType[0] == '') {
$sql = 'SELECT f.*, v.value FROM ' . Config::Get('db.table.user_field') . ' as f LEFT JOIN ' . Config::Get('db.table.user_field_value') . ' as v ON f.id = v.field_id WHERE v.user_id = ?d and f.type IN (?a)';
} else {
$sql = 'SELECT v.value, f.* FROM ' . Config::Get('db.table.user_field_value') . ' as v, ' . Config::Get('db.table.user_field') . ' as f
WHERE v.user_id = ?d AND v.field_id = f.id { and f.type IN (?a) }';
}
$aResult = array();
if ($aRows = $this->oDb->select($sql, $iUserId, (is_null($aType) or !count($aType)) ? DBSIMPLE_SKIP : $aType)) {
foreach ($aRows as $aRow) {
if ($bOnlyNoEmpty and !$aRow['value']) {
continue;
}
$aResult[] = Engine::GetEntity('User_Field', $aRow);
}
}
return $aResult;
}
/**
* Установить значения дополнительных полей профиля пользователя
*
* @param int $iUserId ID пользователя
* @param array $aFields Ассоциативный массив полей id => value
* @param int $iCountMax Максимальное количество одинаковых полей
* @return bool
*/
public function setUserFieldsValues($iUserId, $aFields, $iCountMax)
{
if (!count($aFields)) {
return;
}
foreach ($aFields as $iId => $sValue) {
$sql = 'SELECT count(*) as c FROM ' . Config::Get('db.table.user_field_value') . ' WHERE user_id = ?d AND field_id = ?';
$aRow = $this->oDb->selectRow($sql, $iUserId, $iId);
$iCount = isset($aRow['c']) ? $aRow['c'] : 0;
if ($iCount < $iCountMax) {
$sql = 'INSERT INTO ' . Config::Get('db.table.user_field_value') . ' SET value = ?, user_id = ?d, field_id = ?';
} elseif ($iCount == $iCountMax and $iCount == 1) {
$sql = 'UPDATE ' . Config::Get('db.table.user_field_value') . ' SET value = ? WHERE user_id = ?d AND field_id = ?';
} else {
continue;
}
$this->oDb->query($sql, $sValue, $iUserId, $iId);
}
}
/**
* Добавить поле
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function addUserField($oField)
{
$sql = 'INSERT INTO ' . Config::Get('db.table.user_field') . ' SET
name = ?, title = ?, pattern = ?, type = ?';
return $this->oDb->query($sql, $oField->getName(), $oField->getTitle(), $oField->getPattern(),
$oField->getType());
}
/**
* Удалить поле
*
* @param int $iId ID пользовательского поля
* @return bool
*/
public function deleteUserField($iId)
{
$sql = 'DELETE FROM ' . Config::Get('db.table.user_field_value') . ' WHERE field_id = ?d';
$this->oDb->query($sql, $iId);
$sql = 'DELETE FROM ' . Config::Get('db.table.user_field') . ' WHERE
2011-07-05 10:18:54 +03:00
id = ?d';
$this->oDb->query($sql, $iId);
return true;
}
/**
* Изменить поле
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function updateUserField($oField)
{
$sql = 'UPDATE ' . Config::Get('db.table.user_field') . ' SET
name = ?, title = ?, pattern = ?, type = ?
2011-07-05 10:18:54 +03:00
WHERE id = ?d';
$res = $this->oDb->query($sql, $oField->getName(), $oField->getTitle(), $oField->getPattern(),
$oField->getType(), $oField->getId());
return $this->IsSuccessful($res);
}
/**
* Проверяет существует ли поле с таким именем
*
* @param string $sName Имя поля
* @param int|null $iId ID поля
* @return bool
*/
public function userFieldExistsByName($sName, $iId)
{
$sql = 'SELECT id FROM ' . Config::Get('db.table.user_field') . ' WHERE name = ? {AND id != ?d}';
return $this->oDb->select($sql, $sName, $iId ? $iId : DBSIMPLE_SKIP);
}
/**
* Проверяет существует ли поле с таким ID
*
* @param int $iId ID поля
* @return bool
*/
public function userFieldExistsById($iId)
{
$sql = 'SELECT id FROM ' . Config::Get('db.table.user_field') . ' WHERE id = ?d';
return $this->oDb->select($sql, $iId);
}
/**
* Удаляет у пользователя значения полей
*
* @param int $iUserId ID пользователя
* @param array|null $aType Список типов для удаления
* @return bool
*/
public function DeleteUserFieldValues($iUserId, $aType)
{
if (!is_null($aType) and !is_array($aType)) {
$aType = array($aType);
}
$sql = 'DELETE FROM ' . Config::Get('db.table.user_field_value') . '
WHERE user_id = ?d AND field_id IN (
SELECT id FROM ' . Config::Get('db.table.user_field') . ' WHERE 1=1 { and type IN (?a) }
)';
$res = $this->oDb->query($sql, $iUserId, (is_null($aType) or !count($aType)) ? DBSIMPLE_SKIP : $aType);
return $this->IsSuccessful($res);
}
/**
* Возвращает список заметок пользователя
*
* @param int $iUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUserNotesByUserId($iUserId, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "
SELECT *
FROM
" . Config::Get('db.table.user_note') . "
WHERE
user_id = ?d
ORDER BY id DESC
LIMIT ?d, ?d ";
$aReturn = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql, $iUserId, ($iCurrPage - 1) * $iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
$aReturn[] = Engine::GetEntity('ModuleUser_EntityNote', $aRow);
}
}
return $aReturn;
}
/**
* Возвращает список ID пользователей к которым юзер оставлял заметки
*
* @param int $iUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUsersByNoteAndUserId($iUserId, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "
SELECT target_user_id
FROM
" . Config::Get('db.table.user_note') . "
WHERE
user_id = ?d
ORDER BY id DESC
LIMIT ?d, ?d ";
$aReturn = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql, $iUserId, ($iCurrPage - 1) * $iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
$aReturn[] = $aRow['target_user_id'];
}
}
return $aReturn;
}
/**
* Возвращает количество заметок у пользователя
*
* @param int $iUserId ID пользователя
* @return int
*/
public function GetCountUserNotesByUserId($iUserId)
{
$sql = "
SELECT count(*) as c
FROM
" . Config::Get('db.table.user_note') . "
WHERE
user_id = ?d
";
if ($aRow = $this->oDb->selectRow($sql, $iUserId)) {
return $aRow['c'];
}
return 0;
}
/**
* Возвращет заметку по автору и пользователю
*
* @param int $iTargetUserId ID пользователя о ком заметка
* @param int $iUserId ID пользователя автора заметки
* @return ModuleUser_EntityNote|null
*/
public function GetUserNote($iTargetUserId, $iUserId)
{
$sql = "SELECT * FROM " . Config::Get('db.table.user_note') . " WHERE target_user_id = ?d and user_id = ?d ";
if ($aRow = $this->oDb->selectRow($sql, $iTargetUserId, $iUserId)) {
return Engine::GetEntity('ModuleUser_EntityNote', $aRow);
}
return null;
}
/**
* Возвращает заметку по ID
*
* @param int $iId ID заметки
* @return ModuleUser_EntityNote|null
*/
public function GetUserNoteById($iId)
{
$sql = "SELECT * FROM " . Config::Get('db.table.user_note') . " WHERE id = ?d ";
if ($aRow = $this->oDb->selectRow($sql, $iId)) {
return Engine::GetEntity('ModuleUser_EntityNote', $aRow);
}
return null;
}
/**
* Возвращает список заметок пользователя по ID целевых юзеров
*
* @param array $aArrayId Список ID целевых пользователей
* @param int $sUserId ID пользователя, кто оставлял заметки
* @return array
*/
public function GetUserNotesByArrayUserId($aArrayId, $sUserId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
*
FROM
" . Config::Get('db.table.user_note') . "
WHERE target_user_id IN (?a) and user_id = ?d
";
$aRows = $this->oDb->select($sql, $aArrayId, $sUserId);
$aRes = array();
if ($aRows) {
foreach ($aRows as $aRow) {
$aRes[] = Engine::GetEntity('ModuleUser_EntityNote', $aRow);
}
}
return $aRes;
}
/**
* Удаляет заметку по ID
*
* @param int $iId ID заметки
* @return bool
*/
public function DeleteUserNoteById($iId)
{
$sql = "DELETE FROM " . Config::Get('db.table.user_note') . " WHERE id = ?d ";
$res = $this->oDb->query($sql, $iId);
return $this->IsSuccessful($res);
}
/**
* Добавляет заметку
*
* @param ModuleUser_EntityNote $oNote Объект заметки
* @return int|null
*/
public function AddUserNote($oNote)
{
$sql = "INSERT INTO " . Config::Get('db.table.user_note') . " SET ?a ";
if ($iId = $this->oDb->query($sql, $oNote->_getData())) {
return $iId;
}
return false;
}
/**
* Обновляет заметку
*
* @param ModuleUser_EntityNote $oNote Объект заметки
* @return int
*/
public function UpdateUserNote($oNote)
{
$sql = "UPDATE " . Config::Get('db.table.user_note') . "
SET
text = ?
WHERE id = ?d
";
$res = $this->oDb->query($sql, $oNote->getText(),
$oNote->getId());
return $this->IsSuccessful($res);
}
/**
* Добавляет жалобу
*
* @param ModuleUser_EntityComplaint $oComplaint
*
* @return int|bool
*/
public function AddComplaint($oComplaint)
{
$sql = "INSERT INTO " . Config::Get('db.table.user_complaint') . " SET ?a ";
if ($iId = $this->oDb->query($sql,
$oComplaint->_getData(array('type', 'target_user_id', 'user_id', 'text', 'date_add', 'state')))
) {
return $iId;
}
return false;
}
/**
* Добавляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return int|null
*/
public function AddUserChangemail($oChangemail)
{
$sql = "INSERT INTO " . Config::Get('db.table.user_changemail') . " SET ?a ";
if ($iId = $this->oDb->query($sql, $oChangemail->_getData())) {
return $iId;
}
return false;
}
/**
* Обновляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return int
*/
public function UpdateUserChangemail($oChangemail)
{
$sql = "UPDATE " . Config::Get('db.table.user_changemail') . "
SET
date_used = ?,
confirm_from = ?d,
confirm_to = ?d
WHERE id = ?d
";
$res = $this->oDb->query($sql, $oChangemail->getDateUsed(), $oChangemail->getConfirmFrom(),
$oChangemail->getConfirmTo(), $oChangemail->getId());
return $this->IsSuccessful($res);
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeFrom($sCode)
{
$sql = "SELECT * FROM " . Config::Get('db.table.user_changemail') . " WHERE code_from = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sCode)) {
return Engine::GetEntity('ModuleUser_EntityChangemail', $aRow);
}
return null;
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeTo($sCode)
{
$sql = "SELECT * FROM " . Config::Get('db.table.user_changemail') . " WHERE code_to = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sCode)) {
return Engine::GetEntity('ModuleUser_EntityChangemail', $aRow);
}
return null;
}
/**
* Возвращает список пользователей по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элментов на страницу
* @return array
*/
public function GetUsersByFilter($aFilter, $aOrder, &$iCount, $iCurrPage, $iPerPage)
{
$aOrderAllow = array(
'user_id',
'user_login',
'user_date_register',
'user_rating',
'user_profile_name'
);
$sOrder = '';
foreach ($aOrder as $key => $value) {
if (!in_array($key, $aOrderAllow)) {
unset($aOrder[$key]);
} elseif (in_array($value, array('asc', 'desc'))) {
$sOrder .= " u.{$key} {$value},";
}
}
$sOrder = trim($sOrder, ',');
if ($sOrder == '') {
$sOrder = ' u.user_id desc ';
}
$sql = "SELECT
DISTINCT u.user_id
FROM
" . Config::Get('db.table.user') . " as u
{ JOIN " . Config::Get('db.table.geo_target') . " as g ON ( u.user_id=g.target_id and g.country_id = ? ) }
{ JOIN " . Config::Get('db.table.geo_target') . " as g ON ( u.user_id=g.target_id and g.region_id = ? ) }
{ JOIN " . Config::Get('db.table.geo_target') . " as g ON ( u.user_id=g.target_id and g.city_id = ? ) }
LEFT JOIN " . Config::Get('db.table.session') . " as s ON u.user_id=s.user_id
WHERE
1 = 1
{ AND s.session_date_last >= ? }
{ AND u.user_id = ?d }
{ AND u.user_mail = ? }
{ AND u.user_password = ? }
{ AND u.user_ip_register = ? }
{ AND u.user_activate = ?d }
{ AND u.user_activate_key = ? }
{ AND u.user_profile_sex = ? }
{ AND u.user_login LIKE ? }
{ AND u.user_profile_name LIKE ? }
ORDER by {$sOrder}
LIMIT ?d, ?d ;
";
$aResult = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql,
isset($aFilter['geo_country']) ? $aFilter['geo_country'] : DBSIMPLE_SKIP,
isset($aFilter['geo_region']) ? $aFilter['geo_region'] : DBSIMPLE_SKIP,
isset($aFilter['geo_city']) ? $aFilter['geo_city'] : DBSIMPLE_SKIP,
isset($aFilter['date_last_more']) ? $aFilter['date_last_more'] : DBSIMPLE_SKIP,
isset($aFilter['id']) ? $aFilter['id'] : DBSIMPLE_SKIP,
isset($aFilter['mail']) ? $aFilter['mail'] : DBSIMPLE_SKIP,
isset($aFilter['password']) ? $aFilter['password'] : DBSIMPLE_SKIP,
isset($aFilter['ip_register']) ? $aFilter['ip_register'] : DBSIMPLE_SKIP,
isset($aFilter['activate']) ? $aFilter['activate'] : DBSIMPLE_SKIP,
isset($aFilter['activate_key']) ? $aFilter['activate_key'] : DBSIMPLE_SKIP,
isset($aFilter['profile_sex']) ? $aFilter['profile_sex'] : DBSIMPLE_SKIP,
isset($aFilter['login']) ? $aFilter['login'] : DBSIMPLE_SKIP,
isset($aFilter['profile_name']) ? $aFilter['profile_name'] : DBSIMPLE_SKIP,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aResult[] = $aRow['user_id'];
}
}
return $aResult;
}
/**
* Возвращает список префиксов логинов пользователей (для алфавитного указателя)
*
* @param int $iPrefixLength Длина префикса
* @return array
*/
public function GetGroupPrefixUser($iPrefixLength = 1)
{
$sql = "
SELECT SUBSTRING(`user_login` FROM 1 FOR ?d ) as prefix
FROM
" . Config::Get('db.table.user') . "
WHERE
user_activate = 1
GROUP BY prefix
ORDER BY prefix ";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $iPrefixLength)) {
foreach ($aRows as $aRow) {
$aReturn[] = mb_strtoupper($aRow['prefix'], 'utf-8');
}
}
return $aReturn;
}
}