Сортировка топиков по последним действиям. для 0.3.1
Сделано было давно, специально для проекта cgvault.ru , потому могу что-то пропустить или забыть написать. ищем баги и тд. поправлю)
Итак. Сортировка топиков по последним действиям, что это означает? Это значит, что топики сортируются по последним комментариям, а если комментариев нет, то по дате добавления. Итак на нужно будет добавить одно поле в таблицу и поправить несколько файлов
1) добавляем поле в таблицу
2) в ActionIndex.class.php меняем
3) в modules/topic/Topic.class.php Добавляем
а также
4) в mapper/Topic.mapper.class.php копируем GetTopics, переименовываем в GetTopicsByUpdate. в последней строчке меняем
функцию AddTopic меняем на следущую
5) идем в comment/mapper/TopicComment.mapper.class.php
меняем AddComment на
6) ???
7) ПРОФИТ!
Итак. Сортировка топиков по последним действиям, что это означает? Это значит, что топики сортируются по последним комментариям, а если комментариев нет, то по дате добавления. Итак на нужно будет добавить одно поле в таблицу и поправить несколько файлов
1) добавляем поле в таблицу
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL ;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`
2) в ActionIndex.class.php меняем
$aResult=$this->Topic_GetTopicsByUpdate($iPage,BLOG_TOPIC_PER_PAGE);
3) в modules/topic/Topic.class.php Добавляем
public function GetTopicsByUpdate($iPage,$iPerPage) {
$aFilter=array(
'blog_type' => array(
'personal',
'open',
),
'topic_publish' => 1,
'topic_rating' => array(
'value' => BLOG_INDEX_LIMIT_GOOD,
'type' => 'top',
'publish_index' => 1,
),
);
return $this->GetTopicsByFilterUpdate($aFilter,$iPage,$iPerPage);
}
а также
protected function GetTopicsByFilterUpdate($aFilter,$iPage,$iPerPage) {
$s=serialize($aFilter);
$s2=-1;
if ($this->oUserCurrent) {
$s2=$this->oUserCurrent->getId();
}
if (false === ($data = $this->Cache_Get("topic_filter_{$s}_{$s2}_{$iPage}_{$iPerPage}"))) {
$data = array('collection'=>$this->oMapperTopic->GetTopicsByUpdate($aFilter,$iCount,$iPage,$iPerPage),'count'=>$iCount);
$this->Cache_Set($data, "topic_filter_{$s}_{$s2}_{$iPage}_{$iPerPage}", array('comment_new','topic_update','topic_new'), 60*5);
}
return $data;
}
4) в mapper/Topic.mapper.class.php копируем GetTopics, переименовываем в GetTopicsByUpdate. в последней строчке меняем
order by t_fast.topic_last_update desc
функцию AddTopic меняем на следущую
public function AddTopic(TopicEntity_Topic $oTopic) {
$sql = "INSERT INTO ".DB_TABLE_TOPIC."
(blog_id,
user_id,
topic_type,
topic_title,
topic_tags,
topic_date_add,
topic_last_update,
topic_user_ip,
topic_publish,
topic_publish_draft,
topic_publish_index,
topic_cut_text,
topic_forbid_comment,
topic_text_hash
)
VALUES(?d, ?d, ?, ?, ?, ?, ?, ?, ?d, ?d, ?d, ?, ?, ?)
";
if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash()))
{
$oTopic->setId($iId);
$this->AddTopicContent($oTopic);
return $iId;
}
return false;
}
5) идем в comment/mapper/TopicComment.mapper.class.php
меняем AddComment на
public function AddComment(CommentEntity_TopicComment $oComment) {
$sql2="
UPDATE ".DB_TABLE_TOPIC."
SET
topic_last_update = ?
WHERE
topic_id = ?d
";
$sql = " INSERT INTO ".DB_TABLE_TOPIC_COMMENT."
(comment_pid,
topic_id,
user_id,
comment_text,
comment_date,
comment_user_ip,
comment_text_hash
)
VALUES(?, ?d, ?d, ?, ?, ?, ?)
";
if ($iId=$this->oDb->query($sql2,$oComment->getDate(),$oComment->getTopicId())){
if ($iId=$this->oDb->query($sql,$oComment->getPid(),$oComment->getTopicId(),$oComment->getUserId(),$oComment->getText(),$oComment->getDate(),$oComment->getUserIp(),$oComment->getTextHash()))
{
return $iId;
}
return false;
}}
6) ???
7) ПРОФИТ!
17 комментариев
?
у кого-нибудь получилось? сам не могу проверить, ибо если что-то нагнется, то мне голову отвернут(
если нужно для всех-всех-всех страниц такую сортировку то нужно просто для пункта 4 не скопировать, а внести изменения прямо в GetTopics. и соотвественно пункта 2 и 3 не будет