Сортировка топиков по последним действиям. для 0.3.1

Сделано было давно, специально для проекта cgvault.ru, потому могу что-то пропустить или забыть написать. ищем баги и тд. поправлю)

Итак. Сортировка топиков по последним действиям, что это означает? Это значит, что топики сортируются по последним комментариям, а если комментариев нет, то по дате добавления. Итак на нужно будет добавить одно поле в таблицу и поправить несколько файлов
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 комментариев

avatar
а что значит:
5) ???
?

у кого-нибудь получилось? сам не могу проверить, ибо если что-то нагнется, то мне голову отвернут(
avatar
я проверю, когда денвер себе на комп поставлю. пока возможности нет и подозреваю, что где-то здесь все таки есть косяк
avatar
Кто уже ставил? Отпишитесь есть косяки или нет
avatar
поправил. только что воспроизвел для localhost. все работает
avatar
Благодарю.Сейчас проверим
avatar
Сделал все, но при добавлении комментария топик не подымается на вверх.Можеш залить измененные файлы или может более точную установку написать? Если не тяжело
avatar
точнее и быть не может :) точно все по порядку сделали? заменили функцию addcomment?
avatar
Та да… Сначала на локалке, а потом на хосте.Эффекта нет.
avatar
вопрос. а где вы то смотрите? просто этот хак реализован только для главной странице для «хороших» топиков.
avatar
Возможно я не совсем понял смысла хака, но разве новость не должна подымать при добавлении комментария?
avatar
а тут дело не в новости, а в сортировке. в данном хаке реализовано только для одной страницы, потому что нам так удобнее было.
если нужно для всех-всех-всех страниц такую сортировку то нужно просто для пункта 4 не скопировать, а внести изменения прямо в GetTopics. и соотвественно пункта 2 и 3 не будет
avatar
Спасибо)Значит мне этот хак не надо… Зря ставил
avatar
а вам то что нужно конкретно?
avatar
Чтобы при написании комментария в «любом» посте он становился 1м в списке.
avatar
В каком бы блоге он не находился.
avatar
Со второй страницы, к примеру, топики не поднимаются на первую. Подскажите пожайлуста как сделать так, чтобы недавно откомментированные топики поднимались наверх, на главную страницу.
avatar
сделали по мануалу? кэширование включено? посмотрите, даты topic_last_update нормально обновляются?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.