Просмотр топиков личного блога

Только начала разбираться с LiveStreet. Отдельной строкой спасибо разработчикам за такой полезный движок.
Возникла необходимость сделать просмотр личных блогов.
Я поискала решения, но таковых отчего то не нашла. Попробовала своими силами — по аналогии. Все
То что у меня вышло — явно нарушает архитектуру — неправильно изменять основные классы из за такой мелочи. Поэтому прошу мне подсказать, как это надо было сделать правильно.
Итак, что вышло.
нужны функции для получения списка топиков и их количества
в 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 комментария

avatar
Помочь ничем не могу, т.к. не программист.
Но, огромное спасибо, мне это как раз очень надо было.
Плюсануть к сожалению, не могу, не хватает силы (((
  • qoox
  • 0
avatar
Речь о просмотре пользователем своего личного блога? Или где?
avatar
речь о просмотре личного блога везде — изменяется поведение ссылок вида livestreet.ru/my/avadim/ — по ним становится доступен список топиков только личного блога
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.