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

1469 lines
46 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* 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>
*
*/
/**
* Маппер для работы с БД
*
* @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') . "
(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
user_password = ? ,
user_mail = ? ,
user_admin = ? ,
user_date_activate = ? ,
user_date_comment_last = ? ,
user_rating = ? ,
user_count_vote = ? ,
user_activate = ? ,
user_activate_key = ? ,
user_profile_name = ? ,
user_profile_sex = ? ,
user_profile_country = ? ,
user_profile_region = ? ,
user_profile_city = ? ,
user_profile_birthday = ? ,
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 = ?
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)
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
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
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') . "
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') . "
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
)
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') . "
WHERE
user_from = ?d
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
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
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
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
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 = ?
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;
}
}