Unpublish для топика CMS Livestreet

Недавно познакомился с отличной CMS для создания простой соцсети, коллективных блогов — Livestreet. Система очень гибкая, построена грамотно, по сути — это framework, и позволяет достаточно легко расширить функционал. Планирую периодически писать в блоге заметки об этой системе.

Итак, понадобилось мне помимо удаления/редактирования топика — просто снимать его с публикации, при просмотре списка или единичной записи. \classes\actions\ActionTopic.class.php

Добавляем эвент unpublish

$this->AddEvent('unpublish','EventUnpublish');
/**
* Регистрируем евенты
*
*/
protected function RegisterEvent() {
$this->AddEvent('add','EventAdd');
$this->AddEventPreg('/^published$/i','/^(page(\d+))?$/i','EventShowTopics');
$this->AddEventPreg('/^saved$/i','/^(page(\d+))?$/i','EventShowTopics');
$this->AddEvent('edit','EventEdit');
$this->AddEvent('unpublish','EventUnpublish');
$this->AddEvent('delete','EventDelete');
}


Реализуем сам метод EventUnpublish()

protected function EventUnpublish() {
$this->Security_ValidateSendForm();
/**
* Получаем номер топика из УРЛ и проверяем существует ли он
*/
$sTopicId=$this->GetParam(0);
if (!($oTopic=$this->Topic_GetTopicById($sTopicId))) {
return parent::EventNotFound();
}
/**
* проверяем есть ли право на удаление топика
*/
if (!$this->ACL_IsAllowDeleteTopic($oTopic,$this->oUserCurrent)) {
return parent::EventNotFound();
}$oTopic->setPublish(0);
if ($this->Topic_UpdateTopic($oTopic)) {
if (!$oTopic->getPublish() and !$this->oUserCurrent->isAdministrator() and $this->oUserCurrent->getId()!=$oTopic->getUserId()) {
Router::Location($oBlog->getUrlFull());
}
Router::Location($oTopic->getUrl());
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return Router::Action('error');
}
/**
* Перенаправляем на страницу со списком топиков из блога этого топика
*/
Router::Location($oTopic->getBlog()->getUrlFull());
}

Готово!

Теперь в файлах темы можно добавить ссылку на снятие с публикации

/templates/skin/new/topic.tpl /templates/skin/new/topic_list.tpl

<ul>
<li><a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape:'html'}</a>&nbsp;&nbsp;</li>
{if $oUserCurrent and ($oUserCurrent->getId()==$oTopic->getUserId() or $oUserCurrent->isAdministrator() or $oBlog->getUserIsAdministrator() or $oBlog->getUserIsModerator() or $oBlog->getOwnerId()==$oUserCurrent->getId())}
<li><a href="{cfg name='path.root.web'}/{$oTopic->getType()}/edit/{$oTopic->getId()}/" title="{$aLang.topic_edit}">{$aLang.topic_edit}</a></li>
{/if}
{if $oUserCurrent and ($oUserCurrent->isAdministrator() or $oBlog->getUserIsAdministrator() or $oBlog->getOwnerId()==$oUserCurrent->getId())}
<li><a href="{router page='topic'}delete/{$oTopic->getId()}/?security_ls_key={$LIVESTREET_SECURITY_KEY}" title="{$aLang.topic_delete}" onclick="return confirm('{$aLang.topic_delete_confirm}');">{$aLang.topic_delete}</a></li>
{/if}
{if $oUserCurrent and ($oUserCurrent->isAdministrator() or $oBlog->getUserIsAdministrator() or $oBlog->getOwnerId()==$oUserCurrent->getId())}
<li><a href="{router page='topic'}unpublish/{$oTopic->getId()}/?security_ls_key={$LIVESTREET_SECURITY_KEY}" title="unpublish">Unpublish</a></li>
{/if}
</ul>