1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-04-29 23:49:21 +03:00
ifhub.club/application/classes/modules/topic/mapper/Topic.mapper.class.php

1024 lines
32 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.topic
* @since 1.0
*/
class ModuleTopic_MapperTopic extends Mapper
{
/**
* Добавляет топик
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return int|bool
*/
public function AddTopic(ModuleTopic_EntityTopic $oTopic)
{
$sql = "INSERT INTO " . Config::Get('db.table.topic') . "
(blog_id,
blog_id2,
blog_id3,
blog_id4,
blog_id5,
user_id,
topic_type,
topic_title,
topic_slug,
topic_tags,
topic_date_add,
topic_date_publish,
topic_user_ip,
topic_publish,
topic_publish_draft,
topic_publish_index,
topic_skip_index,
topic_cut_text,
topic_forbid_comment,
topic_text_hash
)
VALUES(?d, ?d, ?d, ?d, ?d, ?d, ?, ?, ?, ?, ?, ?, ?, ?d, ?d, ?d, ?d, ?, ?, ?)
";
if ($iId = $this->oDb->query($sql, $oTopic->getBlogId(), $oTopic->getBlogId2(), $oTopic->getBlogId3(),
$oTopic->getBlogId4(), $oTopic->getBlogId5(), $oTopic->getUserId(), $oTopic->getType(), $oTopic->getTitle(), $oTopic->getSlug(),
$oTopic->getTags(), $oTopic->getDateAdd(), $oTopic->getDatePublish(), $oTopic->getUserIp(), $oTopic->getPublish(),
$oTopic->getPublishDraft(), $oTopic->getPublishIndex(), $oTopic->getSkipIndex(), $oTopic->getCutText(),
$oTopic->getForbidComment(), $oTopic->getTextHash())
) {
$oTopic->setId($iId);
$this->AddTopicContent($oTopic);
return $iId;
}
return false;
}
/**
* Добавляет контент топика
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return int|bool
*/
public function AddTopicContent(ModuleTopic_EntityTopic $oTopic)
{
$sql = "INSERT INTO " . Config::Get('db.table.topic_content') . "
(topic_id,
topic_text,
topic_text_short,
topic_text_source,
topic_extra
)
VALUES(?d, ?, ?, ?, ? )
";
if ($iId = $this->oDb->query($sql, $oTopic->getId(), $oTopic->getText(),
$oTopic->getTextShort(), $oTopic->getTextSource(), $oTopic->getExtra())
) {
return $iId;
}
return false;
}
/**
* Добавление тега к топику
*
* @param ModuleTopic_EntityTopicTag $oTopicTag Объект тега топика
* @return int
*/
public function AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag)
{
$sql = "INSERT INTO " . Config::Get('db.table.topic_tag') . "
(topic_id,
user_id,
blog_id,
topic_tag_text
)
VALUES(?d, ?d, ?d, ?)
";
if ($iId = $this->oDb->query($sql, $oTopicTag->getTopicId(), $oTopicTag->getUserId(), $oTopicTag->getBlogId(),
$oTopicTag->getText())
) {
return $iId;
}
return false;
}
/**
* Удаление контента топика по его номеру
*
* @param int $iTopicId ID топика
* @return bool
*/
public function DeleteTopicContentByTopicId($iTopicId)
{
$sql = "DELETE FROM " . Config::Get('db.table.topic_content') . " WHERE topic_id = ?d ";
$res = $this->oDb->query($sql, $iTopicId);
return $this->IsSuccessful($res);
}
/**
* Удаляет теги у топика
*
* @param int $sTopicId ID топика
* @return bool
*/
public function DeleteTopicTagsByTopicId($sTopicId)
{
$sql = "DELETE FROM " . Config::Get('db.table.topic_tag') . "
WHERE
topic_id = ?d
";
$res = $this->oDb->query($sql, $sTopicId);
return $this->IsSuccessful($res);
}
/**
* Удаляет топик.
* Если тип таблиц в БД InnoDB, то удалятся всё связи по топику(комменты,голосования,избранное)
*
* @param int $sTopicId Объект топика или ID
* @return bool
*/
public function DeleteTopic($sTopicId)
{
$sql = "DELETE FROM " . Config::Get('db.table.topic') . "
WHERE
topic_id = ?d
";
$res = $this->oDb->query($sql, $sTopicId);
return $this->IsSuccessful($res);
}
/**
* Получает топик по уникальному хешу(текст топика)
*
* @param int $sUserId
* @param string $sHash
* @return int|null
*/
public function GetTopicUnique($sUserId, $sHash)
{
$sql = "SELECT topic_id FROM " . Config::Get('db.table.topic') . "
WHERE
topic_text_hash =?
AND
user_id = ?d
LIMIT 0,1
";
if ($aRow = $this->oDb->selectRow($sql, $sHash, $sUserId)) {
return $aRow['topic_id'];
}
return null;
}
/**
* Получить список топиков по списку айдишников
*
* @param array $aArrayId Список ID топиков
* @return array
*/
public function GetTopicsByArrayId($aArrayId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
t.*,
tc.*
FROM
" . Config::Get('db.table.topic') . " as t
JOIN " . Config::Get('db.table.topic_content') . " AS tc ON t.topic_id=tc.topic_id
WHERE
t.topic_id IN(?a)
ORDER BY FIELD(t.topic_id,?a) ";
$aTopics = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $aArrayId)) {
foreach ($aRows as $aTopic) {
$aTopics[] = Engine::GetEntity('Topic', $aTopic);
}
}
return $aTopics;
}
/**
* Список топиков по фильтру
*
* @param array $aFilter Фильтр
* @param int $iCount Возвращает общее число элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTopics($aFilter, &$iCount, $iCurrPage, $iPerPage)
{
$sWhere = $this->buildFilter($aFilter);
if (!isset($aFilter['order'])) {
$aFilter['order'] = 't.topic_date_publish desc';
}
if (!is_array($aFilter['order'])) {
$aFilter['order'] = array($aFilter['order']);
}
$sql = "SELECT
t.topic_id
FROM
" . Config::Get('db.table.topic') . " as t,
" . Config::Get('db.table.blog') . " as b
WHERE
1=1
" . $sWhere . "
AND
t.blog_id=b.blog_id
ORDER BY " .
implode(', ', $aFilter['order'])
. "
LIMIT ?d, ?d";
$aTopics = array();
if ($aRows = $this->oDb->selectPage($iCount, $sql, ($iCurrPage - 1) * $iPerPage, $iPerPage)) {
foreach ($aRows as $aTopic) {
$aTopics[] = $aTopic['topic_id'];
}
}
return $aTopics;
}
/**
* Количество топиков по фильтру
*
* @param array $aFilter Фильтр
* @return int
*/
public function GetCountTopics($aFilter)
{
$sWhere = $this->buildFilter($aFilter);
$sql = "SELECT
count(t.topic_id) as count
FROM
" . Config::Get('db.table.topic') . " as t,
" . Config::Get('db.table.blog') . " as b
WHERE
1=1
" . $sWhere . "
AND
t.blog_id=b.blog_id;";
if ($aRow = $this->oDb->selectRow($sql)) {
return $aRow['count'];
}
return false;
}
/**
* Возвращает все топики по фильтру
*
* @param array $aFilter Фильтр
* @return array
*/
public function GetAllTopics($aFilter)
{
$sWhere = $this->buildFilter($aFilter);
if (!isset($aFilter['order'])) {
$aFilter['order'] = 't.topic_id desc';
}
if (!is_array($aFilter['order'])) {
$aFilter['order'] = array($aFilter['order']);
}
$sql = "SELECT
t.topic_id
FROM
" . Config::Get('db.table.topic') . " as t,
" . Config::Get('db.table.blog') . " as b
WHERE
1=1
" . $sWhere . "
AND
t.blog_id=b.blog_id
ORDER by " . implode(', ', $aFilter['order']) . " ";
$aTopics = array();
if ($aRows = $this->oDb->select($sql)) {
foreach ($aRows as $aTopic) {
$aTopics[] = $aTopic['topic_id'];
}
}
return $aTopics;
}
/**
* Получает список топиков по тегу
*
* @param string $sTag Тег
* @param array $aExcludeBlog Список ID блогов для исключения
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTopicsByTag($sTag, $aExcludeBlog, &$iCount, $iCurrPage, $iPerPage)
{
$sql = "
SELECT
tt.topic_id
FROM
" . Config::Get('db.table.topic_tag') . " as tt,
" . Config::Get('db.table.topic') . " as t
WHERE
tt.topic_tag_text = ?
AND tt.topic_id = t.topic_id AND t.topic_publish = 1 AND t.topic_date_publish <= ?
{ AND tt.blog_id NOT IN (?a) }
ORDER BY tt.topic_id DESC
LIMIT ?d, ?d ";
$aTopics = array();
if ($aRows = $this->oDb->selectPage(
$iCount, $sql, $sTag, date('Y-m-d H:i:s'),
(is_array($aExcludeBlog) && count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
($iCurrPage - 1) * $iPerPage, $iPerPage
)
) {
foreach ($aRows as $aTopic) {
$aTopics[] = $aTopic['topic_id'];
}
}
return $aTopics;
}
/**
* Получает топики по рейтингу и дате
*
* @param string $sDate Дата
* @param int $iLimit Количество
* @param array $aExcludeBlog Список ID блогов для исключения
* @return array
*/
public function GetTopicsRatingByDate($sDate, $iLimit, $aExcludeBlog = array())
{
$sql = "SELECT
t.topic_id
FROM
" . Config::Get('db.table.topic') . " as t
WHERE
t.topic_publish = 1
AND
t.topic_date_publish >= ?
AND
t.topic_rating >= 0
{ AND t.blog_id NOT IN(?a) }
ORDER by t.topic_rating desc, t.topic_id desc
LIMIT 0, ?d ";
$aTopics = array();
if ($aRows = $this->oDb->select(
$sql, $sDate,
(is_array($aExcludeBlog) && count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
$iLimit
)
) {
foreach ($aRows as $aTopic) {
$aTopics[] = $aTopic['topic_id'];
}
}
return $aTopics;
}
/**
* Получает список тегов топиков
*
* @param int $iLimit Количество
* @param array $aExcludeTopic Список ID топиков для исключения
* @return array
*/
public function GetTopicTags($iLimit, $aExcludeTopic = array())
{
$sql = "SELECT
tt.topic_tag_text,
count(tt.topic_tag_text) as count
FROM
" . Config::Get('db.table.topic_tag') . " as tt,
" . Config::Get('db.table.topic') . " as t
WHERE
tt.topic_id = t.topic_id AND t.topic_publish = 1 AND t.topic_date_publish <= ?
{AND tt.topic_id NOT IN(?a) }
GROUP BY
tt.topic_tag_text
ORDER BY
count desc
LIMIT 0, ?d
";
$aReturn = array();
$aReturnSort = array();
if ($aRows = $this->oDb->select(
$sql, date('Y-m-d H:i:s'),
(is_array($aExcludeTopic) && count($aExcludeTopic)) ? $aExcludeTopic : DBSIMPLE_SKIP,
$iLimit
)
) {
foreach ($aRows as $aRow) {
$aReturn[mb_strtolower($aRow['topic_tag_text'], 'UTF-8')] = $aRow;
}
ksort($aReturn);
foreach ($aReturn as $aRow) {
$aReturnSort[] = Engine::GetEntity('Topic_TopicTag', $aRow);
}
}
return $aReturnSort;
}
/**
* Получает список тегов из топиков открытых блогов (open,personal)
*
* @param int $iLimit Количество
* @param int|null $iUserId ID пользователя, чью теги получаем
* @return array
*/
public function GetOpenTopicTags($iLimit, $iUserId = null)
{
$sql = "
SELECT
tt.topic_tag_text,
count(tt.topic_tag_text) as count
FROM
" . Config::Get('db.table.topic_tag') . " as tt,
" . Config::Get('db.table.blog') . " as b,
" . Config::Get('db.table.topic') . " as t
WHERE
1 = 1
{ AND tt.user_id = ?d }
AND
tt.blog_id = b.blog_id
AND
b.blog_type <> 'close'
AND
tt.topic_id = t.topic_id AND t.topic_publish = 1 AND t.topic_date_publish <= ?
GROUP BY
tt.topic_tag_text
ORDER BY
count desc
LIMIT 0, ?d
";
$aReturn = array();
$aReturnSort = array();
if ($aRows = $this->oDb->select($sql, is_null($iUserId) ? DBSIMPLE_SKIP : $iUserId, date('Y-m-d H:i:s'), $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[mb_strtolower($aRow['topic_tag_text'], 'UTF-8')] = $aRow;
}
ksort($aReturn);
foreach ($aReturn as $aRow) {
$aReturnSort[] = Engine::GetEntity('Topic_TopicTag', $aRow);
}
}
return $aReturnSort;
}
/**
* Увеличивает у топика число комментов
*
* @param int $sTopicId ID топика
* @return bool
*/
public function increaseTopicCountComment($sTopicId)
{
$sql = "UPDATE " . Config::Get('db.table.topic') . "
SET
topic_count_comment=topic_count_comment+1
WHERE
topic_id = ?
";
$res = $this->oDb->query($sql, $sTopicId);
return $this->IsSuccessful($res);
}
/**
* Обновляет топик
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return bool
*/
public function UpdateTopic(ModuleTopic_EntityTopic $oTopic)
{
$sql = "UPDATE " . Config::Get('db.table.topic') . "
SET
blog_id= ?d,
blog_id2= ?d,
blog_id3= ?d,
blog_id4= ?d,
blog_id5= ?d,
topic_title= ?,
topic_slug= ?,
topic_tags= ?,
topic_date_add = ?,
topic_date_edit = ?,
topic_date_edit_content = ?,
topic_date_publish = ?,
topic_user_ip= ?,
topic_publish= ?d ,
topic_publish_draft= ?d ,
topic_publish_index= ?d,
topic_skip_index= ?d,
topic_rating= ?f,
topic_count_vote= ?d,
topic_count_vote_up= ?d,
topic_count_vote_down= ?d,
topic_count_vote_abstain= ?d,
topic_count_read= ?d,
topic_count_comment= ?d,
topic_count_favourite= ?d,
topic_cut_text = ? ,
topic_forbid_comment = ? ,
topic_text_hash = ?
WHERE
topic_id = ?d
";
$res = $this->oDb->query($sql, $oTopic->getBlogId(), $oTopic->getBlogId2(), $oTopic->getBlogId3(),
$oTopic->getBlogId4(), $oTopic->getBlogId5(), $oTopic->getTitle(), $oTopic->getSlug(), $oTopic->getTags(),
$oTopic->getDateAdd(), $oTopic->getDateEdit(), $oTopic->getDateEditContent(), $oTopic->getDatePublish(), $oTopic->getUserIp(),
$oTopic->getPublish(), $oTopic->getPublishDraft(), $oTopic->getPublishIndex(), $oTopic->getSkipIndex(),
$oTopic->getRating(), $oTopic->getCountVote(), $oTopic->getCountVoteUp(), $oTopic->getCountVoteDown(),
$oTopic->getCountVoteAbstain(), $oTopic->getCountRead(), $oTopic->getCountComment(),
$oTopic->getCountFavourite(), $oTopic->getCutText(), $oTopic->getForbidComment(), $oTopic->getTextHash(),
$oTopic->getId());
if ($res !== false and !is_null($res)) {
$this->UpdateTopicContent($oTopic);
return true;
}
return false;
}
/**
* Обновляет контент топика
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return bool
*/
public function UpdateTopicContent(ModuleTopic_EntityTopic $oTopic)
{
$sql = "UPDATE " . Config::Get('db.table.topic_content') . "
SET
topic_text= ?,
topic_text_short= ?,
topic_text_source= ?,
topic_extra= ?
WHERE
topic_id = ?d
";
$res = $this->oDb->query($sql, $oTopic->getText(), $oTopic->getTextShort(), $oTopic->getTextSource(),
$oTopic->getExtra(), $oTopic->getId());
return $this->IsSuccessful($res);
}
/**
* Строит строку условий для SQL запроса топиков
*
* @param array $aFilter Фильтр
* @return string
*/
protected function buildFilter($aFilter)
{
$sDateNow = date('Y-m-d H:i:s');
$sWhere = '';
if (isset($aFilter['topic_date_more'])) {
$sWhere .= " AND t.topic_date_publish > " . $this->oDb->escape($aFilter['topic_date_more']);
}
if (isset($aFilter['topic_slug'])) {
$sWhere .= " AND t.topic_slug = " . $this->oDb->escape($aFilter['topic_slug']);
}
if (isset($aFilter['topic_publish'])) {
$sWhere .= " AND t.topic_publish = " . (int)$aFilter['topic_publish'] . " AND t.topic_date_publish <= '{$sDateNow}' ";
}
if (isset($aFilter['topic_publish_only'])) {
$sWhere .= " AND t.topic_publish = " . (int)$aFilter['topic_publish_only'] . " ";
}
if (isset($aFilter['topic_rating']) and is_array($aFilter['topic_rating'])) {
$sPublishIndex = '';
if (isset($aFilter['topic_rating']['publish_index']) and $aFilter['topic_rating']['publish_index'] == 1) {
$sPublishIndex = " or topic_publish_index = 1 ) and ( topic_skip_index = 0 and b.blog_skip_index = 0 ";
}
if ($aFilter['topic_rating']['type'] == 'top') {
$sWhere .= " AND ( t.topic_rating >= " . (float)$aFilter['topic_rating']['value'] . " {$sPublishIndex} ) ";
} else {
$sWhere .= " AND ( t.topic_rating < " . (float)$aFilter['topic_rating']['value'] . " ) ";
}
}
if (isset($aFilter['topic_new'])) {
$sWhere .= " AND t.topic_date_publish >= '" . $aFilter['topic_new'] . "'";
}
if (isset($aFilter['user_id'])) {
$sWhere .= is_array($aFilter['user_id'])
? " AND t.user_id IN(" . implode(', ', $aFilter['user_id']) . ")"
: " AND t.user_id = " . (int)$aFilter['user_id'];
}
if (isset($aFilter['blog_id'])) {
if (!is_array($aFilter['blog_id'])) {
$aFilter['blog_id'] = array($aFilter['blog_id']);
}
$sBlogList = join("','", $aFilter['blog_id']);
$sWhere .= " AND ( t.blog_id IN ('{$sBlogList}') ";
$sWhere .= " OR t.blog_id2 IN ('{$sBlogList}') ";
$sWhere .= " OR t.blog_id3 IN ('{$sBlogList}') ";
$sWhere .= " OR t.blog_id4 IN ('{$sBlogList}') ";
$sWhere .= " OR t.blog_id5 IN ('{$sBlogList}') ) ";
}
if (isset($aFilter['blog_type']) and is_array($aFilter['blog_type'])) {
$aBlogTypes = array();
foreach ($aFilter['blog_type'] as $sType => $aBlogId) {
/**
* Позиция вида 'type'=>array('id1', 'id2')
*/
if (!is_array($aBlogId) && is_string($sType)) {
$aBlogId = array($aBlogId);
}
/**
* Позиция вида 'type'
*/
if (is_string($aBlogId) && is_int($sType)) {
$sType = $aBlogId;
$aBlogId = array();
}
$aBlogTypes[] = (count($aBlogId) == 0)
? "(b.blog_type='" . $sType . "')"
: "(b.blog_type='" . $sType . "' AND t.blog_id IN ('" . join("','", $aBlogId) . "'))";
}
$sWhere .= " AND (" . join(" OR ", (array)$aBlogTypes) . ")";
}
if (isset($aFilter['topic_type'])) {
if (!is_array($aFilter['topic_type'])) {
$aFilter['topic_type'] = array($aFilter['topic_type']);
}
$sWhere .= " AND t.topic_type IN (" . join(",",
array_map(array($this->oDb, 'escape'), $aFilter['topic_type'])) . ")";
}
return $sWhere;
}
/**
* Получает список тегов по первым буквам тега
*
* @param string $sTag Тэг
* @param int $iLimit Количество
* @return bool
*/
public function GetTopicTagsByLike($sTag, $iLimit)
{
$sTag = mb_strtolower($sTag, "UTF-8");
$sql = "SELECT
topic_tag_text
FROM
" . Config::Get('db.table.topic_tag') . "
WHERE
topic_tag_text LIKE ?
GROUP BY
topic_tag_text
LIMIT 0, ?d
";
$aReturn = array();
if ($aRows = $this->oDb->select($sql, $sTag . '%', $iLimit)) {
foreach ($aRows as $aRow) {
$aReturn[] = Engine::GetEntity('Topic_TopicTag', $aRow);
}
}
return $aReturn;
}
/**
* Обновляем дату прочтения топика
*
* @param ModuleTopic_EntityTopicRead $oTopicRead Объект факта чтения топика
* @return int
*/
public function UpdateTopicRead(ModuleTopic_EntityTopicRead $oTopicRead)
{
$sql = "UPDATE " . Config::Get('db.table.topic_read') . "
SET
comment_count_last = ? ,
comment_id_last = ? ,
date_read = ?
WHERE
topic_id = ?
AND
user_id = ?
";
$res = $this->oDb->query($sql, $oTopicRead->getCommentCountLast(), $oTopicRead->getCommentIdLast(),
$oTopicRead->getDateRead(), $oTopicRead->getTopicId(), $oTopicRead->getUserId());
return $this->IsSuccessful($res);
}
/**
* Устанавливаем дату прочтения топика
*
* @param ModuleTopic_EntityTopicRead $oTopicRead Объект факта чтения топика
* @return bool
*/
public function AddTopicRead(ModuleTopic_EntityTopicRead $oTopicRead)
{
$sql = "INSERT INTO " . Config::Get('db.table.topic_read') . "
SET
comment_count_last = ? ,
comment_id_last = ? ,
date_read = ? ,
topic_id = ? ,
user_id = ?
";
return $this->oDb->query($sql, $oTopicRead->getCommentCountLast(), $oTopicRead->getCommentIdLast(),
$oTopicRead->getDateRead(), $oTopicRead->getTopicId(), $oTopicRead->getUserId());
}
/**
* Удаляет записи о чтении записей по списку идентификаторов
*
* @param array $aTopicId Список ID топиков
* @return bool
*/
public function DeleteTopicReadByArrayId($aTopicId)
{
$sql = "
DELETE FROM " . Config::Get('db.table.topic_read') . "
WHERE
topic_id IN(?a)
";
$res = $this->oDb->query($sql, $aTopicId);
return $this->IsSuccessful($res);
}
/**
* Получить список просмотром/чтения топиков по списку айдишников
*
* @param array $aArrayId Список ID топиков
* @param int $sUserId ID пользователя
* @return array
*/
public function GetTopicsReadByArray($aArrayId, $sUserId)
{
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return array();
}
$sql = "SELECT
t.*
FROM
" . Config::Get('db.table.topic_read') . " as t
WHERE
t.topic_id IN(?a)
AND
t.user_id = ?d
";
$aReads = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $sUserId)) {
foreach ($aRows as $aRow) {
$aReads[] = Engine::GetEntity('Topic_TopicRead', $aRow);
}
}
return $aReads;
}
/**
* Перемещает топики в другой блог
*
* @param int $sBlogId ID старого блога
* @param int $sBlogIdNew ID нового блога
* @return bool
*/
public function MoveTopics($sBlogId, $sBlogIdNew)
{
$aFields = array('blog_id', 'blog_id2', 'blog_id3', 'blog_id4', 'blog_id5');
foreach ($aFields as $sField) {
$sql = "UPDATE " . Config::Get('db.table.topic') . "
SET
{$sField} = ?d
WHERE
{$sField} = ?d
";
$this->oDb->query($sql, $sBlogIdNew, $sBlogId);
}
return true;
}
/**
* Перемещает теги топиков в другой блог
*
* @param int $sBlogId ID старого блога
* @param int $sBlogIdNew ID нового блога
* @return bool
*/
public function MoveTopicsTags($sBlogId, $sBlogIdNew)
{
$sql = "UPDATE " . Config::Get('db.table.topic_tag') . "
SET
blog_id= ?d
WHERE
blog_id = ?d
";
$res = $this->oDb->query($sql, $sBlogIdNew, $sBlogId);
return $this->IsSuccessful($res);
}
/**
* Пересчитывает счетчик избранных топиков
*
* @return bool
*/
public function RecalculateFavourite()
{
$sql = "
UPDATE " . Config::Get('db.table.topic') . " t
SET t.topic_count_favourite = (
SELECT count(f.user_id)
FROM " . Config::Get('db.table.favourite') . " f
WHERE
f.target_id = t.topic_id
AND
f.target_publish = 1
AND
f.target_type = 'topic'
)
";
$res = $this->oDb->query($sql);
return $this->IsSuccessful($res);
}
/**
* Пересчитывает счетчики голосований
*
* @return bool
*/
public function RecalculateVote()
{
$sql = "
UPDATE " . Config::Get('db.table.topic') . " t
SET t.topic_count_vote_up = (
SELECT count(*)
FROM " . Config::Get('db.table.vote') . " v
WHERE
v.target_id = t.topic_id
AND
v.vote_direction = 1
AND
v.target_type = 'topic'
), t.topic_count_vote_down = (
SELECT count(*)
FROM " . Config::Get('db.table.vote') . " v
WHERE
v.target_id = t.topic_id
AND
v.vote_direction = -1
AND
v.target_type = 'topic'
), t.topic_count_vote_abstain = (
SELECT count(*)
FROM " . Config::Get('db.table.vote') . " v
WHERE
v.target_id = t.topic_id
AND
v.vote_direction = 0
AND
v.target_type = 'topic'
)
";
$res = $this->oDb->query($sql);
return $this->IsSuccessful($res);
}
public function GetTopicTypeByCode($sCode)
{
$sql = 'SELECT * FROM ' . Config::Get('db.table.topic_type') . ' WHERE code = ?';
if ($aRow = $this->oDb->selectRow($sql, $sCode)) {
return Engine::GetEntity('ModuleTopic_EntityTopicType', $aRow);
}
return null;
}
public function GetTopicTypeById($iId)
{
$sql = 'SELECT * FROM ' . Config::Get('db.table.topic_type') . ' WHERE id = ?d';
if ($aRow = $this->oDb->selectRow($sql, $iId)) {
return Engine::GetEntity('ModuleTopic_EntityTopicType', $aRow);
}
return null;
}
public function AddTopicType($oType)
{
$sql = "INSERT INTO " . Config::Get('db.table.topic_type') . "
(name,
name_many,
code,
allow_remove,
date_create,
state,
params
)
VALUES(?, ?, ?, ?d, ?, ?d, ?)
";
if ($iId = $this->oDb->query($sql, $oType->getName(), $oType->getNameMany(), $oType->getCode(),
$oType->getAllowRemove(),
$oType->getDateCreate(), $oType->getState(), $oType->getParams())
) {
return $iId;
}
return false;
}
public function GetTopicTypeItems($aFilter = array())
{
if (isset($aFilter['code_not']) and !is_array($aFilter['code_not'])) {
$aFilter['code_not'] = array($aFilter['code_not']);
}
$sql = "SELECT
*
FROM
" . Config::Get('db.table.topic_type') . "
WHERE
1 = 1
{ and `state` = ?d }
{ and `code` not IN (?a) }
ORDER BY sort desc
LIMIT 0, 500
";
$aReturn = array();
if ($aRows = $this->oDb->select($sql,
isset($aFilter['state']) ? $aFilter['state'] : DBSIMPLE_SKIP,
(isset($aFilter['code_not']) and $aFilter['code_not']) ? $aFilter['code_not'] : DBSIMPLE_SKIP
)
) {
foreach ($aRows as $aRow) {
$aReturn[] = Engine::GetEntity('ModuleTopic_EntityTopicType', $aRow);
}
}
return $aReturn;
}
public function UpdateTopicType($oType)
{
$sql = "UPDATE " . Config::Get('db.table.topic_type') . "
SET
name= ?,
name_many= ?,
code= ?,
state= ?d,
sort= ?d,
params= ?
WHERE
id = ?d
";
$res = $this->oDb->query($sql, $oType->getName(), $oType->getNameMany(), $oType->getCode(), $oType->getState(),
$oType->getSort(), $oType->getParams(), $oType->getId());
return $this->IsSuccessful($res);
}
public function DeleteTopicType($sTypeId)
{
$sql = "DELETE FROM " . Config::Get('db.table.topic_type') . "
WHERE
id = ?d
";
$res = $this->oDb->query($sql, $sTypeId);
return $this->IsSuccessful($res);
}
public function UpdateTopicByType($sType, $sTypeNew)
{
$sql = "UPDATE
" . Config::Get('db.table.topic') . "
SET topic_type = ?
WHERE
topic_type = ?
";
if ($this->oDb->query($sql, $sTypeNew, $sType) !== false) {
return true;
}
return false;
}
public function GetNextTopicDatePublish()
{
$sql = 'SELECT min(topic_date_publish) FROM ' . Config::Get('db.table.topic') . ' WHERE topic_date_publish > ? and topic_publish = 1';
if ($sDate = $this->oDb->selectCell($sql, date('Y-m-d H:i:s'))) {
return $sDate;
}
return null;
}
}