Просмотр топиков личного блога
Только начала разбираться с LiveStreet. Отдельной строкой спасибо разработчикам за такой полезный движок.
Возникла необходимость сделать просмотр личных блогов.
Я поискала решения, но таковых отчего то не нашла. Попробовала своими силами — по аналогии. Все
То что у меня вышло — явно нарушает архитектуру — неправильно изменять основные классы из за такой мелочи. Поэтому прошу мне подсказать, как это надо было сделать правильно.
Итак, что вышло.
нужны функции для получения списка топиков и их количества
в classes\module\topic\Topic.class.php
добавляем GetTopicsPersOnlyByUser
вызов в Action
По логике вещей, личный блог должен быть в Публикациях пользователя, и называться «блог», а публикации — отдельно.
В файле classes\actions\ActionMy.class.php
в функции function RegisterEvent() добавим регистрацию, заменив строчку
на
и добавляем функцию EventMyTopics() полученную методом копи-паст из EventTopics()
функция EventTopics()теперь будет работать по команде 'blog', поэтому надо поменять URL для листалки
в функции protected function EventTopics()
после комментария
/**
* Формируем постраничность
*/
заменить строчку — добавляем в адрес «blog»
на
еще понадобится выводить количество постов в шаблонах.
в функцию function EventShutdown()добавим строки
теперь небольшие изменения в темплейтах — в меню нужна дополнительная ссылка на все публикации
в файле шаблона menu.profile.tpl
Работает.
Повторяю вопрос знатокам — как, в двух словах, надо было правильно вносить изменения, не нарушая архитектуру?
Возникла необходимость сделать просмотр личных блогов.
Я поискала решения, но таковых отчего то не нашла. Попробовала своими силами — по аналогии. Все
То что у меня вышло — явно нарушает архитектуру — неправильно изменять основные классы из за такой мелочи. Поэтому прошу мне подсказать, как это надо было сделать правильно.
Итак, что вышло.
нужны функции для получения списка топиков и их количества
в classes\module\topic\Topic.class.php
добавляем GetTopicsPersOnlyByUser
/**
* Получает список топиков по юзеру только в персональном блоге
*
* @param unknown_type $sUserId
* @param unknown_type $iPublish
* @param unknown_type $iCount
* @param unknown_type $iPage
* @param unknown_type $iPerPage
* @return unknown
*/
public function GetTopicsPersOnlyByUser($sUserId,$iPublish,$iCount,$iPage,$iPerPage) {
$aFilter=array(
'blog_type' => array(
'personal',
),
'topic_publish' => $iPublish,
'user_id' => $sUserId,
);
return $this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}
/**
* Возвращает количество топиков которые создал юзер в своем блоге
*
* @param unknown_type $sUserId
* @param unknown_type $iPublish
* @return unknown
*/
public function GetCountTopicsPersOnlyByUser($sUserId,$iPublish) {
$aFilter=array(
'blog_type' => array(
'personal',
),
'topic_publish' => $iPublish,
'user_id' => $sUserId,
);
$s=serialize($aFilter);
if (false === ($data = $this->Cache_Get("topic_count_user_{$s}"))) {
$data = $this->oMapperTopic->GetCountTopics($aFilter);
$this->Cache_Set($data, "topic_p_count_user_{$s}", array("topic_update_user_{$sUserId}","topic_new_user_{$sUserId}"), 60*5);
}
return $data;
}
вызов в Action
По логике вещей, личный блог должен быть в Публикациях пользователя, и называться «блог», а публикации — отдельно.
В файле classes\actions\ActionMy.class.php
в функции function RegisterEvent() добавим регистрацию, заменив строчку
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i','EventTopics');
на
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i','EventMyTopics');
и добавляем функцию EventMyTopics() полученную методом копи-паст из EventTopics()
/**
* Выводит список топиков которые написал юзер в свой блог
*
*/
protected function EventMyTopics() {
/**
* Получаем логин из УРЛа
*/
$sUserLogin=$this->sCurrentEvent;
/**
* Проверяем есть ли такой юзер
*/
if (!($this->oUserProfile=$this->User_GetUserByLogin($sUserLogin))) {
return parent::EventNotFound();
}
/**
* Передан ли номер страницы
*/
if ($this->GetParamEventMatch(0,0)=='blog') {
$iPage=$this->GetParamEventMatch(1,2) ? $this->GetParamEventMatch(1,2) : 1;
} else {
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
}
/**
* Получаем список топиков
*/
$iCount=0;
$aResult=$this->Topic_GetTopicsPersOnlyByUser($this->oUserProfile->getId(),1,$iCount,$iPage,BLOG_TOPIC_PER_PAGE);
$aTopics=$aResult['collection'];
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->oUserProfile->getLogin());
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign('aTopics',$aTopics);
$this->Viewer_AddHtmlTitle($this->Lang_Get('user_menu_publication').' '.$this->oUserProfile->getLogin());
$this->Viewer_AddHtmlTitle($this->Lang_Get('user_menu_publication_blog'));
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/log/'.$this->oUserProfile->getLogin().'/',$this->oUserProfile->getLogin());
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('blog');
}
функция EventTopics()теперь будет работать по команде 'blog', поэтому надо поменять URL для листалки
в функции protected function EventTopics()
после комментария
/**
* Формируем постраничность
*/
заменить строчку — добавляем в адрес «blog»
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->oUserProfile->getLogin());
на
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_MY.'/'.$this->oUserProfile->getLogin().'/blog');
еще понадобится выводить количество постов в шаблонах.
в функцию function EventShutdown()добавим строки
$iCountTopicPUser=$this->Topic_GetCountTopicsPersOnlyByUser($this->oUserProfile->getId(),1);
$this->Viewer_Assign('iCountTopicPUser',$iCountTopicPUser);
теперь небольшие изменения в темплейтах — в меню нужна дополнительная ссылка на все публикации
в файле шаблона menu.profile.tpl
<li {if $aParams[0]==''}class="active"{/if}><div><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_MY}/{$oUserProfile->getLogin()}/">{$aLang.user_menu_publication_blog}</a>{if $iCountTopicPUser}({$iCountTopicPUser}){/if}</div></li>
<li {if $aParams[0]=='blog'}class="active"{/if}><div><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_MY}/{$oUserProfile->getLogin()}/blog">Все публикации</a>{if $iCountTopicUser}({$iCountTopicUser}){/if}</div></li>
Работает.
Повторяю вопрос знатокам — как, в двух словах, надо было правильно вносить изменения, не нарушая архитектуру?
3 комментария
Но, огромное спасибо, мне это как раз очень надо было.
Плюсануть к сожалению, не могу, не хватает силы (((