Закрепление топика

1. Сделать запрос в базу (для создания новой строки topic_main)
ALTER TABLE prefix_topic ADD topic_main tinyint(1) default '0'

2. Открыть файл classes/modules/topic/entity/Topic.entity.class.php
а) После:
public function getTitle() {
        return $this->_aData['topic_title'];
    }
Добавить:
public function getMain() {
        return $this->_aData['topic_main'];
    }

б) В самом конце, перед
}
?>
Добавить:
public function setMain($data) {
        $this->_aData['topic_main']=$data;
    }

3. Открыть файл classes/modules/topic/mapper/Topic.mapper.class.php
а) на 375й строке заменить
ORDER by t.topic_date_add desc
На:
ORDER by topic_main desc, t.topic_date_add desc 

б) на 416й строке заменить
ORDER by t.topic_date_add desc
На:
ORDER by topic_main desc, t.topic_date_add desc

в) на 455й строке заменить
order by t_fast.topic_date_add desc 
На:
order by topic_main desc, t_fast.topic_date_add desc

г) заменить старый UpdateTopic на:
public function UpdateTopic(TopicEntity_Topic $oTopic) {                
                $sql = "UPDATE ".DB_TABLE_TOPIC." 
                        SET 
                                blog_id= ?d,
                                topic_title= ?,                         
                                topic_tags= ?,
                                topic_date_add = ?,
                                topic_date_edit = ?,
                                topic_user_ip= ?,
                                topic_publish= ?d ,
                                topic_publish_draft= ?d ,
                                topic_publish_index= ?d,
                                topic_rating= ?f,
                                topic_count_vote= ?d,
                                topic_count_read= ?d,
                                topic_count_comment= ?d, 
                                topic_cut_text = ? ,
                                topic_forbid_comment = ? ,
                                topic_text_hash = ?,
                                topic_main = ?d
                        WHERE
                                topic_id = ?d
                ";                      
                if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getMain(),$oTopic->getId())) {
                        $this->UpdateTopicContent($oTopic);
                        return true;
                }               
                return false;
        }

д) Заменить старый 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_user_ip,
                        topic_publish,
                        topic_publish_draft,
                        topic_publish_index,
                        topic_cut_text,
                        topic_forbid_comment,                   
                        topic_text_hash,
                        topic_main
                        )
                        VALUES(?d,  ?d, ?,      ?,      ?,  ?, ?, ?d, ?d, ?d, ?, ?, ?, ?d)
                ";                      
                if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
                        $oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getMain()))
                {
                        $oTopic->setId($iId);
                        $this->AddTopicContent($oTopic);
                        return $iId;
                }               
                return false;
        }

4. Открыть файл templates/skin/нужныйшаблон/actions/ActionTopic/add.tpl
После:
<p><label for="topic_publish_index"><input type="checkbox" id="topic_publish_index" name="topic_publish_index" class="input-checkbox" value="1" {if $_aRequest.topic_publish_index==1}checked{/if} /> 
        — {$aLang.topic_create_publish_index}</label>
        <span class="form-note">{$aLang.topic_create_publish_index_notice}</span></p>

Добавить:
{if $oUserCurrent->isAdministrator()}
                    <p><label for="topic_main"><input type="checkbox" id="topic_main" name="topic_main" class="input-checkbox" value="1" {if $_aRequest.topic_main==1}checked{/if} />
                      —Закрепить</label>
                    <span class="form-note">Закрепить</span></p>
                    {/if}

5. Открыть файл classes/actions/ActionTopic.class.php
а) После:
/**
         * Принудительный вывод на главную
         */
        $oTopic->setPublishIndex(0);
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_publish_index')) {
                $oTopic->setPublishIndex(1);
            } 
        }

Добавить:
/**
         * Закрепляем
         */
        $oTopic->setMain(0);
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_main')) {
                $oTopic->setMain(1);
            } 
        }

б) После:
/**
         * Принудительный вывод на главную
         */
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_publish')) {
                $oTopic->setPublishIndex(1);
            } else {
                $oTopic->setPublishIndex(0);
            }
        }

Добавить:
/**
         * Закреплен ли?
         */
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_main')) {
                $oTopic->setMain(1);
            } else {
                $oTopic->setMain(0);
            }
        }

в) После:
$_REQUEST['topic_forbid_comment']=$oTopic->getForbidComment();

Добавить:
$_REQUEST['topic_main']=$oTopic->getMain();

6. Отчистить папку Compiled и радоваться !

Огромное спасибо randomtoy за помощь в добавлении кнопки! :)

23 комментария

avatar
İzvinite za bestaktniy vopros,no cto takoe Закрепление топика?:-))
avatar
данная функция дает возможность закрепить выбранный вами топик на первой странице выше всех остальных.
avatar
обращайтесь в icq, подскажу :)
avatar
файл templates/skin/.../actions/ActionTopic/add.tpl
после
<p><label for="topic_publish_index"><input type="checkbox" id="topic_publish_index" name="topic_publish_index" class="input-checkbox" value="1" {if $_aRequest.topic_publish_index==1}checked{/if} /> 
        — {$aLang.topic_create_publish_index}</label>
        <span class="form-note">{$aLang.topic_create_publish_index_notice}</span></p>

добавить
<p><label for="topic_main"><input type="checkbox" id="topic_main" name="topic_main" class="input-checkbox" value="1" {if $_aRequest.topic_main==1}checked{/if} /> 
        —Закрепить</label>
        <span class="form-note">Закрепить</span></p>


файл /classes/actions/ActionTopic.class.php

после
/**
         * Принудительный вывод на главную
         */
        $oTopic->setPublishIndex(0);
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_publish_index')) {
                $oTopic->setPublishIndex(1);
            } 
        }

добавить
/**
         * Закрепляем
         */
        $oTopic->setMain(0);
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_main')) {
                $oTopic->setMain(1);
            } 
        }

после
/**
         * Принудительный вывод на главную
         */
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_publish')) {
                $oTopic->setPublishIndex(1);
            } else {
                $oTopic->setPublishIndex(0);
            }
        }

добавить
/**
         * Закреплен ли?
         */
        if ($this->oUserCurrent->isAdministrator())    {
            if (getRequest('topic_main')) {
                $oTopic->setMain(1);
            } else {
                $oTopic->setMain(0);
            }
        }


после
$_REQUEST['topic_forbid_comment']=$oTopic->getForbidComment();

добавить
$_REQUEST['topic_main']=$oTopic->getMain();


чистим папку компилед, получаем профит
avatar
сделал все по списку, однако ж ничего не происходит.
avatar
не забываем поправить в маппере UpdateTopic типа такого
public function UpdateTopic(TopicEntity_Topic $oTopic) {		
		$sql = "UPDATE ".DB_TABLE_TOPIC." 
			SET 
				blog_id= ?d,
				topic_title= ?,				
				topic_tags= ?,
				topic_date_add = ?,
				topic_date_edit = ?,
				topic_user_ip= ?,
				topic_publish= ?d ,
				topic_publish_draft= ?d ,
				topic_publish_index= ?d,
				topic_rating= ?f,
				topic_count_vote= ?d,
				topic_count_read= ?d,
				topic_count_comment= ?d, 
				topic_cut_text = ? ,
				topic_forbid_comment = ? ,
				topic_text_hash = ?,
                                topic_main = ?d
			WHERE
				topic_id = ?d
		";			
		if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getMain(),$oTopic->getId())) {
			$this->UpdateTopicContent($oTopic);
			return true;
		}		
		return false;
	}

и 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_user_ip,
			topic_publish,
			topic_publish_draft,
			topic_publish_index,
			topic_cut_text,
			topic_forbid_comment,			
			topic_text_hash,
                        topic_main
			)
			VALUES(?d,  ?d,	?,	?,	?,  ?, ?, ?d, ?d, ?d, ?, ?, ?, ?d)
		";			
		if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
			$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getMain()))
		{
			$oTopic->setId($iId);
			$this->AddTopicContent($oTopic);
			return $iId;
		}		
		return false;
	}
avatar
Спасибо! Нет пока времени проверить, но очень нуждался в этой функции!
avatar
Проверят и не нужно, все работает на ура. Ещё раз спасибо randomtoy за помощь с кнопкой. Мои пользователи этого очень ждали, но через базу мог только я один сделать :)
avatar
Все отлично получилось и прекрасно работает. Но как бы сделать так, что бы не только с текстовыми топиками можно было проделывать тоже самое, но и с опросом тоже самое? А то если создаёшь опрос и он для тебя крайне важен, то он по любому уходит всё дальше и дальще, когда люди пишут всё больше. Да так, что люди, на которых был ориентирован этот самый опрос не долистывают до него…
avatar
если меняли prefix у таблиц, то не забудьте поменять его перед шагом 1 в prefix_topic
avatar
в четвертом шаге второе слово «Закрепить» исправить на что-нить другое, например:
в топе
выше всех
вверху
наверху
avatar
Будет ли работать при такой же установке на версии 0.4?
avatar
нет
avatar
Как насчёт доработки модуля до версии 0.4? Модуль то необходимый)
avatar
В 0.4 ещё не разбирался, но попробую :)
avatar
пишите вечером :) сделаем для 0.4
avatar
http://livestreet.ru/blog/4125.html тестируем, у меня все сработало :)
avatar
ошибка 404
avatar
А как насчёт прикрутить к прикреплённому топику другой стиль, чтоб он ещё и выделенным был? Подскажите, где проверку поставить.
avatar
Оберните код внутри topic_list.tpl в div'ы, примерно так:
<div {if $oTopic->getMain()}id="topicmain"{/if}> 
     код topic_list
</div>
В css добавляете topicmain и редактируете как нужно. Я например делал рамку. Добавлял три таких div'a с разными id.
avatar
аналогично в topic.tpl
avatar
Плз! уважаемое сообщество, очень нужно для версии 0.4.2
avatar
на первый взгляд должно подойти и для 0.4.2
но столько правок — перебор, имхо
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.