Люди — Отделение пользователей от администраторов (модификация)

Иногда бывает очень полезным отделить мух от котлет, то есть пользователей от администраторов. Поскольку Livestreet выделяет зарегистрированных участников с положительной и отрицательной «кармой», то я решил взяться за написание небольшой модификации (здесь не нашёл). Делюсь со всеми. Вдруг кому пригодится?

1. Внесём изменения в ./classes/actions/ActionPeople.class.php

Регистрируем событие (event). Ищем функцию RegisterEvent, внутрь неё помещаем следующее:
$this->AddEvent('admins','EventAdmins');

Создаём новое событие (event). Например, после EventBad добавляем следующее:
/**
 * Показываем администраторов
 *
 */
protected function EventAdmins() {
	/**
	 * Получаем статистику
	 */
	$this->GetStats();
	/**
	 * Получаем администраторов
	 */
	$this->GetUserAdmins();
	/**
	 * Устанавливаем шаблон вывода
	 */		
	$this->SetTemplateAction('index');
}

Добавим функцию получения списка администраторов.
За основу я брал функцию GetUserRating. Сразу после EventAdmins:
/**
* Получаем список администраторов 
*
*/
protected function GetUserAdmins() {
	/**
	 * Передан ли номер страницы
	 */
	if (preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch)) {			
		$iPage=$aMatch[1];
	} else {
		$iPage=1;
	}		
	/**
	 * Получаем список администраторов
	 */
	$iCount=0;		
	$aResult=$this->User_GetUsersAdmins($iCount,$iPage,USER_PER_PAGE);	
	$aUsersAdmins=$aResult['collection'];	
	/**
	 * Формируем постраничность
	 */			
	$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,USER_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_PEOPLE.'/'.$this->sCurrentEvent);
	/**
	 * Загружаем переменные в шаблон
	 */
	if ($aUsersAdmins) {
		$this->Viewer_Assign('aPaging',$aPaging);			
	}	
	$this->Viewer_Assign('aUsersAdmins',$aUsersAdmins);
}

2. Изменяем ./classes/modules/user/User.class.php
После функции GetUsersRating добавляем следующее:
/**
 * Получить список администраторов
 *
 * @param unknown_type $iCount
 * @param unknown_type $iPage
 * @param unknown_type $iPerPage
 * @return unknown
 */
public function GetUsersAdmins($iCount,$iPage,$iPerPage) {		
	if (false === ($data = $this->Cache_Get("user_admins_{$iPage}_{$iPerPage}"))){						
		$data = array('collection'=>$this->oMapper->GetUsersAdmins($iCount,$iPage,$iPerPage),'count'=>$iCount);
		$this->Cache_Set($data, "user_admins_{$iPage}_{$iPerPage}", array("user_new","user_update"), 60*5);			
	}
	return $data;			
}

3. Правим ./classes/modules/user/mapper/User.mapper.class.php
Для выполнения SQL-запроса на базу данных, после функции GetUsersRating вставляем код:
public function GetUsersAdmins(&$iCount,$iCurrPage,$iPerPage) {	
	$sql = "SELECT * FROM ".DB_TABLE_USER.", ".DB_TABLE_USER_ADMINISTRATOR." 
			WHERE ".DB_TABLE_USER.".user_id = ".DB_TABLE_USER_ADMINISTRATOR.".user_id	
			LIMIT ?d, ?d				
			";	
	$aReturn=array();
	if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) 
		foreach ($aRows as $aRow) {
			$aReturn[]=new UserEntity_User($aRow);
		}
	}
	return $aReturn;
}

4. Добавляем фразу в ./templates/language/<ваш языковой пакет>.php
'user_admins' => 'Администраторы',

5. Изменяем шаблоны

Правим ./templates/skin/<ваш скин>/menu.people.tpl
Вместо:
<li {if $sEvent=='' || $sEvent=='good' || $sEvent=='bad'}class="active"{/if}><div><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/">{$aLang.people_menu_users_all}</a></div></li>

Используем:
<li {if $sEvent=='' || $sEvent=='good' || $sEvent=='bad' || $sEvent=='admins'}class="active"{/if}><div><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/">{$aLang.people_menu_users_all}</a></div></li>


Правим ./templates/skin/<ваш скин>/actions/ActionPeople/index.tpl
Заменить:

<ul class="block-nav">
	<li {if $sEvent=='good'}class="active"{/if}><strong></strong><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/good/">{$aLang.user_good}</a></li>
	<li {if $sEvent=='bad'}class="active"{/if}><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/bad/">{$aLang.user_bad}</a><em></em></li>
</ul>

Этим:

<ul class="block-nav">
	<li {if $sEvent=='good'}class="active"{/if}><strong></strong><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/good/">{$aLang.user_good}</a></li>
	<li {if $sEvent=='bad'}class="active"{/if}><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/bad/">{$aLang.user_bad}</a></li>
	<li {if $sEvent=='admins'}class="active"{/if}><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PEOPLE}/admins/">{$aLang.user_admins}</a><em></em></li>
</ul>


Заменить:

{if $aUsersRating}
	<table>
	<thead>
		<tr>
		<td class="user">{$aLang.user}</td>													
		<td class="strength">{$aLang.user_skill}</td>
		<td class="rating">{$aLang.user_rating}</td>
		</tr>
	</thead>
					
	<tbody>
	{foreach from=$aUsersRating item=oUser}
		<tr>
		<td class="user"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/"><img src="{$oUser->getProfileAvatarPath(24)}" alt="" /></a><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/" class="link">{$oUser->getLogin()}</a></td>														
		<td class="strength">{$oUser->getSkill()}</td>
		<td class="rating"><strong>{$oUser->getRating()}</strong></td>
		</tr>
	{/foreach}						
	</tbody>
	</table>
{else}
	{$aLang.user_empty}	
{/if}

Этим:

{if $aUsersRating}
	<table>
	<thead>
		<tr>
		<td class="user">{$aLang.user}</td>													
		<td class="strength">{$aLang.user_skill}</td>
		<td class="rating">{$aLang.user_rating}</td>
		</tr>
	</thead>
					
	<tbody>
	{foreach from=$aUsersRating item=oUser}
		<tr>
		<td class="user"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/"><img src="{$oUser->getProfileAvatarPath(24)}" alt="" /></a><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/" class="link">{$oUser->getLogin()}</a></td>														
		<td class="strength">{$oUser->getSkill()}</td>
		<td class="rating"><strong>{$oUser->getRating()}</strong></td>
		</tr>
	{/foreach}						
	</tbody>
	</table>
{else}
	{if $aUsersAdmins}
		<table>
		<thead>
			<tr>
			<td class="user">{$aLang.user}</td>													
			<td class="strength">{$aLang.user_skill}</td>
			<td class="rating">{$aLang.user_rating}</td>
			</tr>
		</thead>
		<tbody>
			{foreach from=$aUsersAdmins item=oUser}
				<tr>
				<td class="user"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/"><img src="{$oUser->getProfileAvatarPath(24)}" alt="" /></a><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/" class="link">{$oUser->getLogin()}</a></td>														
				<td class="strength">{$oUser->getSkill()}</td>
				<td class="rating"><strong>{$oUser->getRating()}</strong></td>
				</tr>
			{/foreach}
			</tbody>
			</table>
	{else}
		{$aLang.user_empty}	
	{/if}
{/if}

Результат
Всё, готово.

При обнаружении ошибок, оставлять комментарии. Спасибо за внимание.

UPD: Немного забыл. Сильно не пинайте бедного абитуриента, я старался.

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

avatar
ЖУЧУЮ! ЧСВ же!
  • ALF
  • -2
avatar
Спасибо за реализацию. Идея весьма интересная, но чаще всего на проекте фактически 1 администратор, остальные администраторы и создатели блогов, а так же модераторы блогов.
Мне кажется, актуальней было бы выводить так:

Администраторы проекта:
Admin
Gleb

Администраторы блогов: (создатели и админы)
Name1
Name2

Модерируют блоги:
name 1
name 2
avatar
Лень было писать создателей блогов, ограничился только модераторами.
1. Внесём изменения в ./classes/actions/ActionPeople.class.php
Изменяем функцию GetUserAdmins

/**
 * Получаем список модераторов и их блогов
 */
$aResult=$this->User_GetUsersModers($iCount,$iPage,USER_PER_PAGE);
$aUsersModers=$aResult['collection'];

Добавляем результат в Smarty
$this->Viewer_Assign('aUsersModers',$aUsersModers);

2. Изменяем ./classes/modules/user/User.class.php
Описываем функцию GetUsersModers.

/**
 * Получить список модераторов
 *
 * @param unknown_type $iCount
 * @param unknown_type $iPage
 * @param unknown_type $iPerPage
 * @return unknown
 */
public function GetUsersModers($iCount,$iPage,$iPerPage) {		
	if (false === ($data = $this->Cache_Get("user_moders_{$iPage}_{$iPerPage}"))) {						
		$data = array('collection'=>$this->oMapper->GetUsersModers($iCount,$iPage,$iPerPage),'count'=>$iCount);
		$this->Cache_Set($data, "user_moders_{$iPage}_{$iPerPage}", array("user_new","user_update"), 60*5);			
	}
	return $data;			
}

3. Правим ./classes/modules/user/mapper/User.mapper.class.php
Описываем функцию GetUsersModers.

public function GetUsersModers(&$iCount,$iCurrPage,$iPerPage) {

	$sql = "SELECT 
		*

		FROM 
		`".DB_TABLE_BLOG_USER."` , `".DB_TABLE_BLOG."` , `".DB_TABLE_USER."` 

		WHERE 
		".DB_TABLE_BLOG_USER.".is_moderator = 1
		AND ".DB_TABLE_BLOG_USER.".blog_id = ".DB_TABLE_BLOG.".blog_id
		AND ".DB_TABLE_USER.".user_id = ".DB_TABLE_BLOG_USER.".user_id

		GROUP BY 
		".DB_TABLE_USER.".user_login

		ORDER BY 
		".DB_TABLE_BLOG_USER.".is_moderator
				
		LIMIT ?d, ?d				
		";	
	$aReturn=array();
	if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) {
	foreach ($aRows as $aRow) {
		$aReturn[]=new UserEntity_User($aRow);
	}
	}
	return $aReturn;
}

4. Изменяем шаблон ./templates/skin/<ваш скин>/menu.people.tpl

			<thead>
				<tr>
					<td class="user">{$aLang.blog_user_moderators}</td>												
					<td class="strength">{$aLang.user_skill}</td>
					<td class="rating">{$aLang.user_rating}</td>
				</tr>
			</thead>
			{foreach from=$aUsersModers item=oUser}
				<tr>
					<td class="user"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/"><img src="{$oUser->getProfileAvatarPath(24)}" alt="" /></a><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oUser->getLogin()}/" class="link">{$oUser->getLogin()}</a></td>														
					<td class="strength">{$oUser->getSkill()}</td>
					<td class="rating"><strong>{$oUser->getRating()}</strong></td>
				</tr>
			{/foreach}

Вроде как-то так.
avatar
Спасибо большое! Очень полезный хак!
avatar
Противоречит концепции самизнаетекакой. Ну ладно, web 2.0
avatar
Все вроде бы равны, но хочется же быть кому-то ровнее. А регаться на таком сайте, или нет — решают сами пользователи. Если пользователям нравятся админы с ЧСВ, то это их дело. Мазохизм это такое психическое заболевание передающиеся половым путём, тут уж ничего нельзя изменить — это не лечится.
avatar
ALF, поддерживаю мысль. Однако я предполагал, что это покажется удобным средством для поиска людей, руководящих проектом. Иногда требуется связаться с администрацией.

avatar
Да я всё прекрасно понимаю, и на Вас Уважаемый Gleb «батон не крошу» — рано или поздно такие хаки и модули всё равно будут появляться, и дело тут не в том кто эти модули и хаки пишет (или напишет), а в том кто их пользовать будет.
avatar
Вы мой идол. Я вас обожаю.
avatar
прикольно, пока что не реализовывал, но добавил в избранное.
  • F-5
  • 0
avatar
у меня такая ошибка((
Parse error: syntax error, unexpected T_RETURN, expecting T_FUNCTION in /bhome/part3/03/itskun/itskun.ru/www/classes/modules/user/mapper/User.mapper.class.php on line 303
avatar
Проверяем ф-ию GetUsersAdmins
avatar
я просто скопировал как в инструкции по установке. не пойму в чем может быть ошибка
avatar
Напишите мне. Постараемся решить проблему.
avatar
В файле ./classes/modules/user/mapper/User.mapper.class.php
В функции GetUsersAdmins
в конце строки
if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage))

нехватает {

Из-за этого и вываливается ваша ошибка.
avatar
а как переделать так, чтобы показывало отдельной вкладкой всех девушек проекта?
avatar
bestguys, практически, всё то же самое. Что именно не получается?
  • Gleb
  • 0
avatar
подскажите пожалуйста как сделать выборку из базы с параметром девушки
avatar
Разобрался уже сам, чтобы выбрать пользователей мужского пола надо вставить в пункте 3
ublic function GetUsersMan(&$iCount,$iCurrPage,$iPerPage) { 
        $sql = "SELECT  * FROM `".DB_TABLE_USER."`  WHERE  ".DB_TABLE_USER.".user_profile_sex = 1 LIMIT ?d, ?d ";      
        $aReturn=array();
        if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) {
        foreach ($aRows as $aRow) {
                $aReturn[]=new UserEntity_User($aRow);
        }
        }
        return $aReturn;
}
предварительно изменив и другие файлы
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.