1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-30 21:45:01 +03:00
ifhub.club/application/classes/modules/favourite/mapper/Favourite.mapper.class.php
2015-11-23 17:05:14 +07:00

596 lines
18 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.favourite
* @since 1.0
*/
class ModuleFavourite_MapperFavourite extends Mapper
{
/**
* Добавляет таргет в избранное
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function AddFavourite(ModuleFavourite_EntityFavourite $oFavourite)
{
$sql = "
INSERT INTO " . Config::Get('db.table.favourite') . "
( target_id, target_type, user_id, tags )
VALUES
(?d, ?, ?d, ?)
";
if ($this->oDb->query(
$sql,
$oFavourite->getTargetId(),
$oFavourite->getTargetType(),
$oFavourite->getUserId(),
$oFavourite->getTags()
) === 0
) {
return true;
}
return false;
}
/**
* Обновляет запись об избранном
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function UpdateFavourite(ModuleFavourite_EntityFavourite $oFavourite)
{
$sql = "
UPDATE " . Config::Get('db.table.favourite') . "
SET tags = ? WHERE user_id = ?d and target_id = ?d and target_type = ?
";
if ($this->oDb->query(
$sql,
$oFavourite->getTags(),
$oFavourite->getUserId(),
$oFavourite->getTargetId(),
$oFavourite->getTargetType()
) !== false
) {
return true;
}
return false;
}
/**
* Получить список избранного по списку айдишников
*
* @param array $aArrayId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouritesByArray($aArrayId, $sTargetType, $sUserId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT *
FROM " . Config::Get('db.table.favourite') . "
WHERE
user_id = ?d
AND
target_id IN(?a)
AND
target_type = ? ";
$aFavourites = array();
if ($aRows = $this->oDb->select($sql, $sUserId, $aArrayId, $sTargetType)) {
foreach ($aRows as $aRow) {
$aFavourites[] = Engine::GetEntity('Favourite', $aRow);
}
}
return $aFavourites;
}
/**
* Удаляет таргет из избранного
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteFavourite(ModuleFavourite_EntityFavourite $oFavourite)
{
$sql = "
DELETE FROM " . Config::Get('db.table.favourite') . "
WHERE
user_id = ?d
AND
target_id = ?d
AND
target_type = ?
";
$res = $this->oDb->query(
$sql,
$oFavourite->getUserId(),
$oFavourite->getTargetId(),
$oFavourite->getTargetType()
);
return $this->IsSuccessful($res);
}
/**
* Удаляет теги
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteTags($oFavourite)
{
$sql = "
DELETE FROM " . Config::Get('db.table.favourite_tag') . "
WHERE
user_id = ?d
AND
target_type = ?
AND
target_id = ?d
";
$res = $this->oDb->query(
$sql,
$oFavourite->getUserId(),
$oFavourite->getTargetType(),
$oFavourite->getTargetId()
);
return $this->IsSuccessful($res);
}
/**
* Добавляет тег
*
* @param ModuleFavourite_EntityTag $oTag Объект тега
* @return bool
*/
public function AddTag($oTag)
{
$sql = "
INSERT INTO " . Config::Get('db.table.favourite_tag') . "
SET target_id = ?d, target_type = ?, user_id = ?d, is_user = ?d, text =?
";
if ($this->oDb->query(
$sql,
$oTag->getTargetId(),
$oTag->getTargetType(),
$oTag->getUserId(),
$oTag->getIsUser(),
$oTag->getText()
) === 0
) {
return true;
}
return false;
}
/**
* Меняет параметры публикации у таргета
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $iPublish Флаг публикации
* @return bool
*/
public function SetFavouriteTargetPublish($aTargetId, $sTargetType, $iPublish)
{
$sql = "
UPDATE " . Config::Get('db.table.favourite') . "
SET
target_publish = ?d
WHERE
target_id IN(?a)
AND
target_type = ?
";
$res = $this->oDb->query($sql, $iPublish, $aTargetId, $sTargetType);
return $this->IsSuccessful($res);
}
/**
* Получает список таргетов из избранного
*
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetFavouritesByUserId(
$sUserId,
$sTargetType,
&$iCount,
$iCurrPage,
$iPerPage,
$aExcludeTarget = array()
) {
$sql = "
SELECT target_id
FROM " . Config::Get('db.table.favourite') . "
WHERE
user_id = ?
AND
target_publish = 1
AND
target_type = ?
{ AND target_id NOT IN (?a) }
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites = array();
if ($aRows = $this->oDb->selectPage(
$iCount,
$sql,
$sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
($iCurrPage - 1) * $iPerPage,
$iPerPage
)
) {
foreach ($aRows as $aFavourite) {
$aFavourites[] = $aFavourite['target_id'];
}
}
return $aFavourites;
}
/**
* Возвращает число таргетов определенного типа в избранном по ID пользователя
*
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetCountFavouritesByUserId($sUserId, $sTargetType, $aExcludeTarget)
{
$sql = "SELECT
count(target_id) as count
FROM
" . Config::Get('db.table.favourite') . "
WHERE
user_id = ?
AND
target_publish = 1
AND
target_type = ?
{ AND target_id NOT IN (?a) }
;";
return ($aRow = $this->oDb->selectRow(
$sql, $sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP)
)
)
? $aRow['count']
: false;
}
/**
* Получает список комментариев к записям открытых блогов
* из избранного указанного пользователя
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenCommentsByUserId($sUserId, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "
SELECT f.target_id
FROM
" . Config::Get('db.table.favourite') . " AS f,
" . Config::Get('db.table.comment') . " AS c,
" . Config::Get('db.table.topic') . " AS t,
" . Config::Get('db.table.blog') . " AS b
WHERE
f.user_id = ?d
AND
f.target_publish = 1
AND
f.target_type = 'comment'
AND
f.target_id = c.comment_id
AND
c.target_id = t.topic_id
AND
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites = array();
if ($aRows = $this->oDb->selectPage(
$iCount, $sql, $sUserId,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aFavourite) {
$aFavourites[] = $aFavourite['target_id'];
}
}
return $aFavourites;
}
/**
* Возвращает число комментариев к открытым блогам в избранном по ID пользователя
*
* @param int $sUserId ID пользователя
* @return array
*/
public function GetCountFavouriteOpenCommentsByUserId($sUserId)
{
$sql = "SELECT
count(f.target_id) as count
FROM
" . Config::Get('db.table.favourite') . " AS f,
" . Config::Get('db.table.comment') . " AS c,
" . Config::Get('db.table.topic') . " AS t,
" . Config::Get('db.table.blog') . " AS b
WHERE
f.user_id = ?d
AND
f.target_publish = 1
AND
f.target_type = 'comment'
AND
f.target_id = c.comment_id
AND
c.target_id = t.topic_id
AND
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
;";
return ($aRow = $this->oDb->selectRow($sql, $sUserId))
? $aRow['count']
: false;
}
/**
* Получает список топиков из открытых блогов
* из избранного указанного пользователя
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenTopicsByUserId($sUserId, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "
SELECT f.target_id
FROM
" . Config::Get('db.table.favourite') . " AS f,
" . Config::Get('db.table.topic') . " AS t,
" . Config::Get('db.table.blog') . " AS b
WHERE
f.user_id = ?d
AND
f.target_publish = 1
AND
f.target_type = 'topic'
AND
f.target_id = t.topic_id
AND
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites = array();
if ($aRows = $this->oDb->selectPage(
$iCount, $sql, $sUserId,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aFavourite) {
$aFavourites[] = $aFavourite['target_id'];
}
}
return $aFavourites;
}
/**
* Возвращает число топиков в открытых блогах из избранного по ID пользователя
*
* @param string $sUserId ID пользователя
* @return array
*/
public function GetCountFavouriteOpenTopicsByUserId($sUserId)
{
$sql = "SELECT
count(f.target_id) as count
FROM
" . Config::Get('db.table.favourite') . " AS f,
" . Config::Get('db.table.topic') . " AS t,
" . Config::Get('db.table.blog') . " AS b
WHERE
f.user_id = ?d
AND
f.target_publish = 1
AND
f.target_type = 'topic'
AND
f.target_id = t.topic_id
AND
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
;";
return ($aRow = $this->oDb->selectRow($sql, $sUserId))
? $aRow['count']
: false;
}
/**
* Удаляет избранное по списку идентификаторов таргетов
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteFavouriteByTargetId($aTargetId, $sTargetType)
{
$sql = "
DELETE FROM " . Config::Get('db.table.favourite') . "
WHERE
target_id IN(?a)
AND
target_type = ? ";
$res = $this->oDb->query($sql, $aTargetId, $sTargetType);
return $this->IsSuccessful($res);
}
/**
* Удаление тегов по таргету
*
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteTagByTarget($aTargetId, $sTargetType)
{
$sql = "
DELETE FROM " . Config::Get('db.table.favourite_tag') . "
WHERE
target_type = ?
AND
target_id IN(?a)
";
$res = $this->oDb->query($sql, $sTargetType, $aTargetId);
return $this->IsSuccessful($res);
}
/**
* Возвращает наиболее часто используемые теги
*
* @param int $iUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param bool $bIsUser Возвращает все теги ли только пользовательские
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupTags($iUserId, $sTargetType, $bIsUser, $iLimit)
{
$sql = "SELECT
text,
user_id,
count(text) as count
FROM
" . Config::Get('db.table.favourite_tag') . "
WHERE
1=1
{AND user_id = ?d }
{AND target_type = ? }
{AND is_user = ?d }
GROUP BY
text
ORDER BY
count desc
LIMIT 0, ?d
";
$aReturn = array();
$aReturnSort = array();
if ($aRows = $this->oDb->select($sql, $iUserId, $sTargetType, is_null($bIsUser) ? DBSIMPLE_SKIP : $bIsUser,
$iLimit)
) {
foreach ($aRows as $aRow) {
$aReturn[mb_strtolower($aRow['text'], 'UTF-8')] = $aRow;
}
ksort($aReturn);
foreach ($aReturn as $aRow) {
$aReturnSort[] = Engine::GetEntity('ModuleFavourite_EntityTag', $aRow);
}
}
return $aReturnSort;
}
/**
* Возвращает список тегов по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTags($aFilter, $aOrder, &$iCount, $iCurrPage, $iPerPage)
{
$aOrderAllow = array('target_id', 'user_id', 'is_user');
$sOrder = '';
foreach ($aOrder as $key => $value) {
if (!in_array($key, $aOrderAllow)) {
unset($aOrder[$key]);
} elseif (in_array($value, array('asc', 'desc'))) {
$sOrder .= " {$key} {$value},";
}
}
$sOrder = trim($sOrder, ',');
if ($sOrder == '') {
$sOrder = ' target_id desc ';
}
$sql = "SELECT
*
FROM
" . Config::Get('db.table.favourite_tag') . "
WHERE
1 = 1
{ AND user_id = ?d }
{ AND target_type = ? }
{ AND target_id = ?d }
{ AND is_user = ?d }
{ AND text = ? }
ORDER by {$sOrder}
LIMIT ?d, ?d ;
";
$aResult = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql,
isset($aFilter['user_id']) ? $aFilter['user_id'] : DBSIMPLE_SKIP,
isset($aFilter['target_type']) ? $aFilter['target_type'] : DBSIMPLE_SKIP,
isset($aFilter['target_id']) ? $aFilter['target_id'] : DBSIMPLE_SKIP,
isset($aFilter['is_user']) ? $aFilter['is_user'] : DBSIMPLE_SKIP,
isset($aFilter['text']) ? $aFilter['text'] : DBSIMPLE_SKIP,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aResult[] = Engine::GetEntity('ModuleFavourite_EntityTag', $aRow);
}
}
return $aResult;
}
}