1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-21 10:18:19 +03:00
ifhub.club/application/classes/modules/topic/mapper/Topic.mapper.class.php

1024 lines
32 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.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') . "
2008-09-21 09:36:57 +03:00
(blog_id,
blog_id2,
blog_id3,
blog_id4,
blog_id5,
2008-09-21 09:36:57 +03:00
user_id,
topic_type,
topic_title,
topic_slug,
2008-09-21 09:36:57 +03:00
topic_tags,
topic_date_add,
topic_date_publish,
2008-09-21 09:36:57 +03:00
topic_user_ip,
topic_publish,
topic_publish_draft,
topic_publish_index,
topic_skip_index,
topic_cut_text,
topic_forbid_comment,
topic_text_hash
2008-09-21 09:36:57 +03:00
)
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') . "
2008-09-21 09:36:57 +03:00
(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') . "
2008-09-21 09:36:57 +03:00
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
2009-05-29 18:32:37 +03:00
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
2009-05-29 18:32:37 +03:00
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
2009-05-24 14:02:34 +03:00
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
2008-09-21 09:36:57 +03:00
count(t.topic_id) as count
FROM
" . Config::Get('db.table.topic') . " as t,
" . Config::Get('db.table.blog') . " as b
2008-09-21 09:36:57 +03:00
WHERE
1=1
" . $sWhere . "
2008-09-21 09:36:57 +03:00
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
2009-05-24 14:02:34 +03:00
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
2009-05-24 14:02:34 +03:00
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
2008-09-21 09:36:57 +03:00
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) }
2008-09-21 09:36:57 +03:00
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 = "
2009-09-20 21:43:20 +03:00
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
2009-09-20 21:43:20 +03:00
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 <= ?
2009-09-20 21:43:20 +03:00
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') . "
2008-09-21 09:36:57 +03:00
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') . "
2008-09-21 09:36:57 +03:00
SET
blog_id= ?d,
blog_id2= ?d,
blog_id3= ?d,
blog_id4= ?d,
blog_id5= ?d,
topic_title= ?,
topic_slug= ?,
2008-09-21 09:36:57 +03:00
topic_tags= ?,
topic_date_add = ?,
2008-09-21 09:36:57 +03:00
topic_date_edit = ?,
topic_date_edit_content = ?,
topic_date_publish = ?,
2008-09-21 09:36:57 +03:00
topic_user_ip= ?,
topic_publish= ?d ,
topic_publish_draft= ?d ,
topic_publish_index= ?d,
topic_skip_index= ?d,
2008-09-21 09:36:57 +03:00
topic_rating= ?f,
topic_count_vote= ?d,
topic_count_vote_up= ?d,
topic_count_vote_down= ?d,
topic_count_vote_abstain= ?d,
2008-09-21 09:36:57 +03:00
topic_count_read= ?d,
topic_count_comment= ?d,
topic_count_favourite= ?d,
topic_cut_text = ? ,
topic_forbid_comment = ? ,
topic_text_hash = ?
2008-09-21 09:36:57 +03:00
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
2008-09-21 09:36:57 +03:00
topic_tag_text
FROM
" . Config::Get('db.table.topic_tag') . "
2008-09-21 09:36:57 +03:00
WHERE
topic_tag_text LIKE ?
2008-09-21 09:36:57 +03:00
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 = ? ,
2008-09-21 09:36:57 +03:00
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
2009-05-29 18:32:37 +03:00
t.*
FROM
" . Config::Get('db.table.topic_read') . " as t
2009-05-29 18:32:37 +03:00
WHERE
t.topic_id IN(?a)
2009-05-29 18:32:37 +03:00
AND
t.user_id = ?d
2009-05-29 18:32:37 +03:00
";
$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') . "
2010-04-17 20:55:22 +03:00
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;
}
}