LiveStreet = немогу запустить эвент

Доброго времени суток!
Модернизирую движок наткнулся на очередную проблему. Но об этом чуть позже, для начала как я к ней пришел. Для сайта хочу сделать вывод список блогов, но несколько иной, который уже есть в движке по адресу url_сайта/blogs/. Хотелось отдельно вывести список коллективных блогов и отдельно персональных.

Добавил меню, создал для этого «menu.blogs.tpl, внес необходимые изменения. По сути дела продублировал туда „menu.blog.tpl“. Тока пунктов меньше. Т.е.:

»Список блогов" ->«Коллективные» (и фильтрация все, хорошие, плохие, новые)
«Список блогов» ->«Персональные» (и фильтрация все, новые) Сюда ставить «хорошие »,«плохие» смысла нету, поскольку у персональных блогов нету рейтинга.

Сделал нужные изменения в Blog.class.php и в Blog.mapper.class.php, т.е. добавил новый метод сделал с нужным запросом и добавил изменения в blog_list.tpl.

После первого этапа все работало на ура. Появилось меню (пока без фильтрации). При переходе
«Список блогов» ->«Коллективные» (http://url_сайта/blogs/collective/)
или
«Список блогов» ->«Персональные» (http://url_сайта/blogs/personal/)
все работало как хотелось. Эванты для них прикручивал так:

$this->AddEventPreg("/^personal$/i",'EventPersonal');
$this->AddEventPreg("/^collective$/i",'EventСollective');
в public function Init() установил, что
$this->SetDefaultEvent('collective');

Список блогов отображался, даже пейджер работал. Но дело дошло до фильтров. Добавил новые эвонты в protected function RegisterEvent():
$this->AddEventPreg("/^new$/i",'EventNew');
$this->AddEventPreg("/^bad$/i",'EventBad');
$this->AddEventPreg("/^all$/i",'EventAll');

Которые по идеи должны были сработать при переходе по ссылке
url_сайта/blogs/collective/all/
url_сайта/blogs/collective/new/
url_сайта/blogs/collective/bad/

Тут у меня сходу появился вопрос а как быть с:
url_сайта/blogs/personal/all/
url_сайта/blogs/personal/new/
поскольку значения совпадают.
Но не стал на этом зацикливаться, может быть это и есть ошибка, но все же пошел дальше.

Добавил новые методы с соответствующим названием.

protected function EventNew()
protected function EventAll()
protected function EventBad()

Метод для фильтра «Хорошие» не стал добавлять. Оно будет запускаться по умолчанию, т.е.
url_сайта/blogs/collective/ — это и будет список «хороших» блогов (метод EventСollective).

И тут все встало. Переключение между «Коллективные» и «Персональные» работает, а вот фильтр нет. Запускается эвент EventСollective.

Побывал по разному «колдовать» не помогло. Прошу титанов помочь, в чем я лоханулся сам пока не смог разобраться.

PS: не знаю важно ли
Все действия делались в ActionBlogs.class.php

12 комментариев

avatar
Параметры в AddEventPreg начинаются с эвента, дальше идут параметры УРЛа, т.е. должно быть что то вроде этого:
$this->AddEventPreg("/^collective$/i","/^$/i",'EventСollective');
$this->AddEventPreg("/^collective$/i","/^new$/i",'EventNew');

рекомендую к прочтению trac.lsdev.ru/livestreet/wiki/DeveloperDoc/Action
  • ort
  • 0
avatar
сделал как показали, отлично работает, спасибо. и за ссылку отдельное спасибо.
жаль плюсануть не могу, еще силы не те :)
avatar
А можно по подробней рассказать о том как разделили список блогов на персональные и коллективные, мне впринципе не нать фильтры, достаточно просто разделение блогов, а то уже третьи сутки мучаюсь ну ни в какую не идут… персональные не показывает и все тут…
avatar
Очень подробно сейчас не могу, времени мало, проект надо сдавать, а коротко так:

все изменения в ActionBlogs.class.php делал. Там есть эвент EventShowBlogs, который вызывает метод GetBlogsRatingAll из Blog.class.php, тот в свою очередь вызывает метод GetBlogsRatingAll из Blog.mapper.class.php, а тот уже вытаскивает все коллективные блоги, сортируя по рейтингу.

Значит если идти по самому простому способу, то нужно продублировать 2 раза все эванты и методы, дать каждому соответствующие название, вызвать в нужном месте, и в задать условие в маппере для одного b.blog_type=’personal’ a для другого b.blog_type<>’personal’

попробуйте, если не получиться на выходных попробую найти время и написать подробнее.
avatar
спасибо огромное. буду пробовать ваш метод.
я то уже проект практически сдал, только вот попросили разделить блоги и вот тут сел в тупик…
буду пробовать, о результатах расскажу…
avatar
попробовал… сделал как вы и сказали… на мой взгляд метод верный и должен работать… но вот упрямо не хочет показывать список…
добавил в Blog.mapper.class.php
public function GetPersBlogsRating(&$iCount,$iCurrPage,$iPerPage) {
		$iCurrentUserId=-1;
		if (is_object($this->oUserCurrent)) {
			$iCurrentUserId=$this->oUserCurrent->getId();
		}
		$sql = "SELECT 
					b.*,					
					u.user_profile_avatar as user_profile_avatar,
					u.user_profile_avatar_type as user_profile_avatar_type,
					u.user_login as user_login,
					IF(bu.blog_id IS NULL,0,1) as current_user_is_join													
				FROM 
					".DB_TABLE_BLOG." as b
					
					LEFT JOIN (
						SELECT
							blog_id																			
						FROM ".DB_TABLE_BLOG_USER." 
						WHERE user_id = ?d
					) AS bu ON  b.blog_id = bu.blog_id,
										
					".DB_TABLE_USER." as u					 
				WHERE 									
					b.blog_type='personal'
					AND		
					b.user_owner_id=u.user_id								
				ORDER by b.blog_rating desc
				LIMIT ?d, ?d 
				;	
					";		
		$aReturn=array();
		if ($aRows=$this->oDb->selectPage($iCount,$sql,$iCurrentUserId,($iCurrPage-1)*$iPerPage, $iPerPage)) {
			foreach ($aRows as $aRow) {
				$aReturn[]=new BlogEntity_Blog($aRow);
			}
		}
		return $aReturn;
	}

Изменив <> на = там где 'personal' и переименовав

Затем в Blog.class.php добавил
public function GetPersBlogsRating($iCurrPage,$iPerPage) { 
		$s1=-1;		
		if ($this->oUserCurrent) {
			$s1=$this->oUserCurrent->getId();
		}
		if (false === ($data = $this->Cache_Get("blog_rating_{$iCurrPage}_{$iPerPage}_$s1"))) {				
			$data = array('collection'=>$this->oMapperBlog->GetPersBlogsRating($iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
			$this->Cache_Set($data, "blog_rating_{$iCurrPage}_{$iPerPage}_$s1", array("blog_update","blog_new"), 60*15);
		}
		return $data;	

И тоже в нужном месте переименовал на GetPersBlogsRating и переименовал сам метод на GetPersBlogsRating

Далее открыл ActionBlogs.class.php
и добавил
protected function EventShowPersBlogs() {		
		/**
		 * Передан ли номер страницы
		 */			
		$iPage=	preg_match("/^\d+$/i",$this->GetEventMatch(2)) ? $this->GetEventMatch(2) : 1;
		/**
		 * Получаем список блогов
		 */
		$aPersResult=$this->Blog_GetPersBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aPersBlogs=$aPersResult['collection'];				
		/**
		 * Формируем постраничность
		 */		
		$aPaging=$this->Viewer_MakePaging($aPersResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);	
		/**
		 * Загружаем переменные в шаблон
		 */					
		$this->Viewer_Assign('aPaging',$aPaging);					
		$this->Viewer_Assign("aPersBlogs",$aPersBlogs);
		$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_menu_all_list'));
		/**
		 * Устанавливаем шаблон вывода
		 */
		$this->SetTemplateAction('index');				
	}

Соответственно переименовав сам евент… на EventShowPersBlogs() и EventShowBlogs() на EventShowPersBlogs(), и по аналогии aPersBlogs

Вроде все должно работать… но список не показывает…
В качестве шаблона использовал из шаблона blog_list.tpl сделав там соответствующие изменения.

Но результат оказался нулевой списка нет. Может что упустил???
avatar
Не стал анализировать ваш код. Пардон за ленивость, вот мой:
Регистрация эвента
$this->AddEventPreg("/^personal$/i","/^page(\d+)$/i",'EventPersonal');


Сам эвент
protected function EventPersonal() {
	$this->sMenuItemSelect='personal';

	$this->sMenuSubItemSelect='all';		
	/**
	 * Передан ли номер страницы
	 */
	if (preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch)){			
		$iPage=$aMatch[1];
		} else {
		$iPage=1;
	}
	/**
	 * Получаем список блогов
	 */
	$aResult=$this->Blog_GetBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
	$aBlogs=$aResult['collection'];				
	/**
	 * Формируем постраничность
	 */
		 		
	$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS.'/personal');	
	/**
	 * Загружаем переменные в шаблон
	 */
	$this->Viewer_Assign('aPaging',$aPaging);					
	$this->Viewer_Assign("aBlogs",$aBlogs);
	$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_menu_personal_all_list'));
	/**
	 * Устанавливаем шаблон вывода
	 */
	$this->SetTemplateAction('index');				
}


Метод в Blog.class.php
public function GetBlogsRating($iCurrPage,$iPerPage) { 
	$s1=-1;		
	if ($this->oUserCurrent) {
		$s1=$this->oUserCurrent->getId();
	}
	if (false === ($data = $this->Cache_Get("blog_rating_{$iCurrPage}_{$iPerPage}_$s1"))) {				
		$data = array('collection'=>$this->oMapperBlog->GetBlogsRating($iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
		$this->Cache_Set($data, "blog_rating_{$iCurrPage}_{$iPerPage}_$s1", array("blog_update","blog_new"), 60*15);
	}
	return $data;
}


Метод Blog.mapper.class.php
public function GetBlogsRating(&$iCount,$iCurrPage,$iPerPage) {
	$iCurrentUserId=-1;
	if (is_object($this->oUserCurrent)) {
		$iCurrentUserId=$this->oUserCurrent->getId();
	}
	$sql = "SELECT 
				b.*,					
				u.user_profile_avatar as user_profile_avatar,
				u.user_profile_avatar_type as user_profile_avatar_type,
				u.user_login as user_login,
				IF(bu.blog_id IS NULL,0,1) as current_user_is_join													
			FROM 
				".DB_TABLE_BLOG." as b
				
				LEFT JOIN (
					SELECT
						blog_id																			
					FROM ".DB_TABLE_BLOG_USER." 
					WHERE user_id = ?d
				) AS bu ON  b.blog_id = bu.blog_id,
								
				".DB_TABLE_USER." as u					 
			WHERE 									
				b.blog_type='personal'								
				AND		
				b.user_owner_id=u.user_id								
			ORDER by b.blog_rating desc
			LIMIT ?d, ?d 
			;	
				";		
	$aReturn=array();
	if ($aRows=$this->oDb->selectPage($iCount,$sql,$iCurrentUserId,($iCurrPage-1)*$iPerPage, $iPerPage)) {
		foreach ($aRows as $aRow) {
			$aReturn[]=new BlogEntity_Blog($aRow);
		}
	}
	return $aReturn;
}


Шаблон у меня сильно изменен, но исходный тоже подходит.
Попробуйте, если опять будет пусто то попробуйте а маппере перед return $aReturn; сделать:


echo "<pre>";
print_r($aReturn);
echo "</pre>";


можно будет посмотреть, что из базы идет.
avatar
т.е. у вас создана два евента Персонал и Коллектив и в шаблоне в ActionsBlogs есть два tpl файла соответствующего названия?
avatar
Нет там тока один шаблон index.tpl. А там так:

{include file='header.tpl' menu='blogs'}
<div class="page people top-blogs">	
{if $sMenuItemSelect=='collectiv'}
{include file='blog_collectiv_list.tpl'}
{/if}
{if $sMenuItemSelect=='personal'}
{include file='blog_personal_list.tpl'}
{/if}
</div>
{include file='paging.tpl' aPaging=`$aPaging`}
{include file='footer.tpl'}


blog_collectiv_list.tpl и blog_personal_list.tpl можно сказать, что клон blog_list.tpl. Но с изменениями, например, для персональных нет вилки для подключения к блогу.
avatar
так это же можно и дальше развить… и преобразовать в целый Хак…
если в базе добавить в таблицу некоторые записи, то получится что коллективные блоги можно разбить на разные части… останется только дописывать blog_----_list.tpl…

а вообще странно… у меня по прежнему не хочет персональные показывать… хотя повторил в точности как вы описали… что-то все равно упускаю…
avatar
Я уже иду в этом направлении: livestreet.ru/blog/3990.html

А на счет того, что не работает, то не могу что то конкретное сказать. Может фрагмент кода покажите?
avatar
Вот я так и подумал что нужно просто сразу идти в этом направлении… спасибо за подсказки…
пойду изучать ваш метод…
чтобы потом в итоге двойную работу не делать…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.