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/blog/mapper/Blog.mapper.class.php

641 lines
20 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.blog
* @since 1.0
*/
class ModuleBlog_MapperBlog extends Mapper
{
/**
* Добавляет блог в БД
*
* @param ModuleBlog_EntityBlog $oBlog Объект блога
* @return int|bool
*/
public function AddBlog(ModuleBlog_EntityBlog $oBlog)
{
$sql = "INSERT INTO " . Config::Get('db.table.blog') . "
2008-09-21 09:36:57 +03:00
(user_owner_id,
blog_title,
blog_description,
blog_type,
2008-09-21 09:36:57 +03:00
blog_date_add,
blog_limit_rating_topic,
blog_url,
blog_skip_index,
blog_avatar
2008-09-21 09:36:57 +03:00
)
VALUES(?d, ?, ?, ?, ?, ?, ?, ?, ?)
";
if ($iId = $this->oDb->query($sql, $oBlog->getOwnerId(), $oBlog->getTitle(), $oBlog->getDescription(),
$oBlog->getType(), $oBlog->getDateAdd(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(),
$oBlog->getSkipIndex(), $oBlog->getAvatar())
) {
return $iId;
}
return false;
}
/**
* Обновляет блог в БД
*
* @param ModuleBlog_EntityBlog $oBlog Объект блога
* @return bool
*/
public function UpdateBlog(ModuleBlog_EntityBlog $oBlog)
{
$sql = "UPDATE " . Config::Get('db.table.blog') . "
2008-09-21 09:36:57 +03:00
SET
blog_title= ?,
blog_description= ?,
blog_type= ?,
blog_date_edit= ?,
blog_count_vote = ?d,
blog_count_user= ?d,
blog_count_topic= ?d,
2008-09-21 09:36:57 +03:00
blog_limit_rating_topic= ?f ,
blog_url= ?,
blog_skip_index= ?d,
blog_avatar= ?
2008-09-21 09:36:57 +03:00
WHERE
blog_id = ?d
";
$res = $this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(),
$oBlog->getDateEdit(), $oBlog->getCountVote(), $oBlog->getCountUser(),
$oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getSkipIndex(), $oBlog->getAvatar(),
$oBlog->getId());
return $this->IsSuccessful($res);
}
/**
* Получает список блогов по ID
*
* @param array $aArrayId Список ID блогов
* @param array|null $aOrder Сортировка блогов
* @return array
*/
public function GetBlogsByArrayId($aArrayId, $aOrder = null)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
if (!is_array($aOrder)) {
$aOrder = array($aOrder);
}
$sOrder = '';
foreach ($aOrder as $key => $value) {
$value = (string)$value;
if (!in_array($key,
array('blog_id', 'blog_title', 'blog_type', 'blog_count_user', 'blog_date_add'))
) {
unset($aOrder[$key]);
} elseif (in_array($value, array('asc', 'desc'))) {
$sOrder .= " {$key} {$value},";
}
}
$sOrder = trim($sOrder, ',');
$sql = "SELECT
*
2009-05-29 18:32:37 +03:00
FROM
" . Config::Get('db.table.blog') . "
2009-05-29 18:32:37 +03:00
WHERE
blog_id IN(?a)
ORDER BY
{ FIELD(blog_id,?a) } ";
if ($sOrder != '') {
$sql .= $sOrder;
}
$aBlogs = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $sOrder == '' ? $aArrayId : DBSIMPLE_SKIP)) {
foreach ($aRows as $aBlog) {
$aBlogs[] = Engine::GetEntity('Blog', $aBlog);
}
}
return $aBlogs;
}
/**
* Добавляет связь пользователя с блогом в БД
*
* @param ModuleBlog_EntityBlogUser $oBlogUser Объект отношения пользователя с блогом
* @return bool
*/
public function AddRelationBlogUser(ModuleBlog_EntityBlogUser $oBlogUser)
{
$sql = "INSERT INTO " . Config::Get('db.table.blog_user') . "
2008-09-21 09:36:57 +03:00
(blog_id,
user_id,
user_role
2008-09-21 09:36:57 +03:00
)
VALUES(?d, ?d, ?d)
";
if ($this->oDb->query($sql, $oBlogUser->getBlogId(), $oBlogUser->getUserId(), $oBlogUser->getUserRole()) === 0
) {
return true;
}
return false;
}
/**
* Удаляет отношение пользователя с блогом
*
* @param ModuleBlog_EntityBlogUser $oBlogUser Объект отношения пользователя с блогом
* @return bool
*/
public function DeleteRelationBlogUser(ModuleBlog_EntityBlogUser $oBlogUser)
{
$sql = "DELETE FROM " . Config::Get('db.table.blog_user') . "
2008-09-21 09:36:57 +03:00
WHERE
blog_id = ?d
AND
user_id = ?d
";
$res = $this->oDb->query($sql, $oBlogUser->getBlogId(), $oBlogUser->getUserId());
return $this->IsSuccessful($res);
}
/**
* Обновляет отношение пользователя с блогом
*
* @param ModuleBlog_EntityBlogUser $oBlogUser Объект отношения пользователя с блогом
* @return bool
*/
public function UpdateRelationBlogUser(ModuleBlog_EntityBlogUser $oBlogUser)
{
$sql = "UPDATE " . Config::Get('db.table.blog_user') . "
SET
user_role = ?d
WHERE
blog_id = ?d
AND
user_id = ?d
";
$res = $this->oDb->query($sql, $oBlogUser->getUserRole(), $oBlogUser->getBlogId(), $oBlogUser->getUserId());
return $this->IsSuccessful($res);
}
/**
* Получает список отношений пользователей с блогами
*
* @param array $aFilter Фильтр поиска отношений
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер текущейс страницы
* @param int $iPerPage Количество элементов на одну страницу
* @return array
*/
public function GetBlogUsers($aFilter, &$iCount = null, $iCurrPage = null, $iPerPage = null)
{
if (isset($aFilter['blog_id']) and !is_array($aFilter['blog_id'])) {
$aFilter['blog_id']=array($aFilter['blog_id']);
}
if (isset($aFilter['user_role']) and !is_array($aFilter['user_role'])) {
$aFilter['user_role']=array($aFilter['user_role']);
}
if (is_null($iCurrPage)) {
$iCurrPage=1;
}
if (is_null($iPerPage)) {
$iPerPage=1000;
}
$sql = "SELECT
bu.*
FROM
" . Config::Get('db.table.blog_user') . " as bu
WHERE
1=1
{ AND bu.blog_id IN (?a) }
{ AND bu.user_id = ?d }
{ AND bu.user_role IN (?a) }
{ AND bu.user_role > ?d }
LIMIT ?d, ?d
";
$aResult = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql,
(isset($aFilter['blog_id']) and count($aFilter['blog_id'])) ? $aFilter['blog_id'] : DBSIMPLE_SKIP,
isset($aFilter['user_id']) ? $aFilter['user_id'] : DBSIMPLE_SKIP,
(isset($aFilter['user_role']) and count($aFilter['user_role'])) ? $aFilter['user_role'] : DBSIMPLE_SKIP,
!isset($aFilter['user_role']) ? ModuleBlog::BLOG_USER_ROLE_GUEST : DBSIMPLE_SKIP,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aResult[] = Engine::GetEntity('Blog_BlogUser', $aRow);
}
}
return $aResult;
}
/**
* Получает список отношений пользователя к блогам
*
* @param array $aArrayId Список ID блогов
* @param int $sUserId ID блогов
* @return array
*/
public function GetBlogUsersByArrayBlog($aArrayId, $sUserId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
2009-06-02 22:29:05 +03:00
bu.*
FROM
" . Config::Get('db.table.blog_user') . " as bu
2009-06-02 22:29:05 +03:00
WHERE
bu.blog_id IN(?a)
2009-06-02 22:29:05 +03:00
AND
bu.user_id = ?d ";
$aBlogUsers = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $sUserId)) {
foreach ($aRows as $aUser) {
$aBlogUsers[] = Engine::GetEntity('Blog_BlogUser', $aUser);
}
}
return $aBlogUsers;
}
/**
* Получает ID персонального блога пользователя
*
* @param int $sUserId ID пользователя
* @return int|null
*/
public function GetPersonalBlogByUserId($sUserId)
{
$sql = "SELECT blog_id FROM " . Config::Get('db.table.blog') . " WHERE user_owner_id = ?d and blog_type='personal'";
if ($aRow = $this->oDb->selectRow($sql, $sUserId)) {
return $aRow['blog_id'];
}
return null;
}
/**
* Получает блог по названию
*
* @param string $sTitle Нащвание блога
* @return ModuleBlog_EntityBlog|null
*/
public function GetBlogByTitle($sTitle)
{
$sql = "SELECT blog_id FROM " . Config::Get('db.table.blog') . " WHERE blog_title = ? ";
if ($aRow = $this->oDb->selectRow($sql, $sTitle)) {
return $aRow['blog_id'];
}
return null;
}
/**
* Получает блог по URL
*
* @param string $sUrl URL блога
* @return ModuleBlog_EntityBlog|null
*/
public function GetBlogByUrl($sUrl)
{
$sql = "SELECT
2009-06-07 20:20:58 +03:00
b.blog_id
2008-09-21 09:36:57 +03:00
FROM
" . Config::Get('db.table.blog') . " as b
2008-09-21 09:36:57 +03:00
WHERE
2009-06-07 20:20:58 +03:00
b.blog_url = ?
2008-09-21 09:36:57 +03:00
";
if ($aRow = $this->oDb->selectRow($sql, $sUrl)) {
return $aRow['blog_id'];
}
return null;
}
/**
* Получить список блогов по хозяину
*
* @param int $sUserId ID пользователя
* @return array
*/
public function GetBlogsByOwnerId($sUserId)
{
$sql = "SELECT
2009-06-13 14:32:06 +03:00
b.blog_id
2008-09-21 09:36:57 +03:00
FROM
" . Config::Get('db.table.blog') . " as b
2008-09-21 09:36:57 +03:00
WHERE
b.user_owner_id = ?
AND
b.blog_type<>'personal'
";
$aBlogs = array();
if ($aRows = $this->oDb->select($sql, $sUserId)) {
foreach ($aRows as $aBlog) {
$aBlogs[] = $aBlog['blog_id'];
}
}
return $aBlogs;
}
/**
* Возвращает список всех не персональных блогов
*
* @return array
*/
public function GetBlogs()
{
$sql = "SELECT
2009-06-15 00:15:11 +03:00
b.blog_id
FROM
" . Config::Get('db.table.blog') . " as b
WHERE
b.blog_type<>'personal'
";
$aBlogs = array();
if ($aRows = $this->oDb->select($sql)) {
foreach ($aRows as $aBlog) {
$aBlogs[] = $aBlog['blog_id'];
}
}
return $aBlogs;
}
/**
* Возвращает список не персональных блогов с сортировкой по рейтингу
*
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер текущей страницы
* @param int $iPerPage Количество элементов на одну страницу
* @return array
*/
public function GetBlogsRating(&$iCount, $iCurrPage, $iPerPage)
{
$sql = "SELECT
2009-06-09 18:55:10 +03:00
b.blog_id
2008-09-21 09:36:57 +03:00
FROM
" . Config::Get('db.table.blog') . " as b
WHERE
b.blog_type<>'personal'
ORDER by b.blog_count_user desc
LIMIT ?d, ?d ";
$aReturn = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql, ($iCurrPage - 1) * $iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
$aReturn[] = $aRow['blog_id'];
}
}
return $aReturn;
}
/**
* Получает список блогов в которых состоит пользователь
*
* @param int $sUserId ID пользователя
* @param int $iLimit Ограничение на выборку элементов
* @return array
*/
public function GetBlogsRatingJoin($sUserId, $iLimit)
{
$sql = "SELECT
b.*
FROM
" . Config::Get('db.table.blog_user') . " as bu,
" . Config::Get('db.table.blog') . " as b
WHERE
bu.user_id = ?d
AND
bu.blog_id = b.blog_id
AND
b.blog_type<>'personal'
ORDER by b.blog_count_user desc
LIMIT 0, ?d
;
";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $sUserId, $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[] = Engine::GetEntity('Blog', $aRow);
}
}
return $aReturn;
}
/**
* Получает список блогов, которые создал пользователь
*
* @param int $sUserId ID пользователя
* @param int $iLimit Ограничение на выборку элементов
* @return array
*/
public function GetBlogsRatingSelf($sUserId, $iLimit)
{
$sql = "SELECT
b.*
FROM
" . Config::Get('db.table.blog') . " as b
WHERE
b.user_owner_id = ?d
AND
b.blog_type<>'personal'
ORDER by b.blog_count_user desc
LIMIT 0, ?d
;";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $sUserId, $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[] = Engine::GetEntity('Blog', $aRow);
}
}
return $aReturn;
}
/**
* Возвращает полный список закрытых блогов
*
* @return array
*/
public function GetCloseBlogs()
{
$sql = "SELECT b.blog_id
FROM " . Config::Get('db.table.blog') . " as b
WHERE b.blog_type='close'
;";
$aReturn = array();
if ($aRows = $this->oDb->select($sql)) {
foreach ($aRows as $aRow) {
$aReturn[] = $aRow['blog_id'];
}
}
return $aReturn;
}
/**
* Удаление блога из базы данных
*
* @param int $iBlogId ID блога
* @return bool
*/
public function DeleteBlog($iBlogId)
{
$sql = "
DELETE FROM " . Config::Get('db.table.blog') . "
WHERE blog_id = ?d
";
$res = $this->oDb->query($sql, $iBlogId);
return $this->IsSuccessful($res);
}
/**
* Удалить пользователей блога по идентификатору блога
*
* @param int $iBlogId ID блога
* @return bool
*/
public function DeleteBlogUsersByBlogId($iBlogId)
{
$sql = "
DELETE FROM " . Config::Get('db.table.blog_user') . "
WHERE blog_id = ?d
";
$res = $this->oDb->query($sql, $iBlogId);
return $this->IsSuccessful($res);
}
/**
* Пересчитывает число топиков в блогах
*
* @param int|null $iBlogId ID блога
* @return bool
*/
public function RecalculateCountTopic($iBlogId = null)
{
$sql = "
UPDATE " . Config::Get('db.table.blog') . " b
SET b.blog_count_topic = (
SELECT count(*)
FROM " . Config::Get('db.table.topic') . " t
WHERE
(
t.blog_id = b.blog_id OR
t.blog_id2 = b.blog_id OR
t.blog_id3 = b.blog_id OR
t.blog_id4 = b.blog_id OR
t.blog_id5 = b.blog_id
)
AND
t.topic_publish = 1
)
WHERE 1=1
{ and b.blog_id = ?d }
";
$res = $this->oDb->query($sql, is_null($iBlogId) ? DBSIMPLE_SKIP : $iBlogId);
return $this->IsSuccessful($res);
}
/**
* Получает список блогов по фильтру
*
* @param array $aFilter Фильтр выборки
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элментов
* @param int $iCurrPage Номер текущей страницы
* @param int $iPerPage Количество элементов на одну страницу
* @return array
*/
public function GetBlogsByFilter($aFilter, $aOrder, &$iCount, $iCurrPage, $iPerPage)
{
$aOrderAllow = array('blog_id', 'blog_title', 'blog_count_user', 'blog_count_topic');
$sOrder = '';
foreach ($aOrder as $key => $value) {
if (!in_array($key, $aOrderAllow)) {
unset($aOrder[$key]);
} elseif (in_array($value, array('asc', 'desc'))) {
2014-11-20 13:07:09 +02:00
$sOrder .= " b.{$key} {$value},";
}
}
$sOrder = trim($sOrder, ',');
if ($sOrder == '') {
2014-11-20 13:07:09 +02:00
$sOrder = ' b.blog_id desc ';
}
if (isset($aFilter['exclude_type']) and !is_array($aFilter['exclude_type'])) {
$aFilter['exclude_type'] = array($aFilter['exclude_type']);
}
if (isset($aFilter['type']) and !is_array($aFilter['type'])) {
$aFilter['type'] = array($aFilter['type']);
}
if (isset($aFilter['id']) and !is_array($aFilter['id'])) {
$aFilter['id'] = array($aFilter['id']);
}
$iUserCurrentId=0;
if (isset($aFilter['roles_user_id'])) {
$iUserCurrentId=$aFilter['roles_user_id'];
} elseif ($oUserCurrent=$this->User_GetUserCurrent()) {
2014-11-20 13:07:09 +02:00
$iUserCurrentId=$oUserCurrent->getId();
}
$sql = "SELECT
2014-11-20 13:07:09 +02:00
b.blog_id
FROM
2014-11-20 13:07:09 +02:00
" . Config::Get('db.table.blog') . " as b
{
JOIN " . Config::Get('db.table.blog_user') . " as bu
ON ( bu.blog_id = b.blog_id and bu.user_id = '{$iUserCurrentId}'
and bu.user_role in (?a)
)
}
WHERE
1 = 1
2014-11-20 13:07:09 +02:00
{ AND b.blog_id IN (?a) }
{ AND b.user_owner_id = ?d }
{ AND b.blog_type IN (?a) }
{ AND b.blog_type not IN (?a) }
{ AND b.blog_url = ? }
{ AND b.blog_title LIKE ? }
ORDER by {$sOrder}
LIMIT ?d, ?d ;
";
$aResult = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql,
2014-11-20 13:07:09 +02:00
(isset($aFilter['roles']) and count($aFilter['roles'])) ? $aFilter['roles'] : DBSIMPLE_SKIP,
(isset($aFilter['id']) and count($aFilter['id'])) ? $aFilter['id'] : DBSIMPLE_SKIP,
isset($aFilter['user_owner_id']) ? $aFilter['user_owner_id'] : DBSIMPLE_SKIP,
(isset($aFilter['type']) and count($aFilter['type'])) ? $aFilter['type'] : DBSIMPLE_SKIP,
(isset($aFilter['exclude_type']) and count($aFilter['exclude_type'])) ? $aFilter['exclude_type'] : DBSIMPLE_SKIP,
isset($aFilter['url']) ? $aFilter['url'] : DBSIMPLE_SKIP,
isset($aFilter['title']) ? $aFilter['title'] : DBSIMPLE_SKIP,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aResult[] = $aRow['blog_id'];
}
}
return $aResult;
}
}