Как вынести количество публикаций каждого пользователя на страницу пользователей
Данный топик — расширенный ответ на вопрос, заданный в этом топике т.к. мне уже не первый раз задают этот вопрос.
Нужно в файле сущности пользователя \classes\modules\user\entity\User.entity.class.php (например, после 453 строки) дописать метод:
После этого можно использовать данный метод в нужном месте вывода списка пользователей в \templates\skin\ваш_шаблон\user_list.tpl, например, возле вывода имени пользователя:
Внимание! Данный метод значительно увеличит количество запросов к БД (на каждого пользователя — два дополнительных запроса). На сильно нагруженных сайтах это может быть причиной тормозов при просмотре страницы с пользователями.
Чтобы решить эту задачу, нужно в эвенте списка пользователей одним запросом получать количество топиков и комментариев для списка ид пользователей, но код данного решения немного выходит из предлагаемой простоты реализации текущего способа.
Также напомню начинающим любителям ковырять шаблоны о необходимости использования кодировки utf-8 без bom т.к. в примере мы текстовки не прятали в языковый файл и кириллица прописана прямо в шаблоне. Если не использовать такую кодировку, то у вас возможно все что угодно: начиная от криво отображаемого сайта (верстка) и заканчивая молчаливым белым экраном.
Это кросспост из гида, текст которого успешно отправлен прямо на стол Яндекса для заверки оригинальности.
Нужно в файле сущности пользователя \classes\modules\user\entity\User.entity.class.php (например, после 453 строки) дописать метод:
/** * Возвращает количество созданных пользователем топиков и комментариев * * @return int */ public function getPublicationsCount() { $iCountTopicUser = $this->Topic_GetCountTopicsPersonalByUser($this->getId(), 1); $iCountCommentUser = $this->Comment_GetCountCommentsByUserId($this->getId(), 'topic'); return $iCountTopicUser + $iCountCommentUser; }
После этого можно использовать данный метод в нужном месте вывода списка пользователей в \templates\skin\ваш_шаблон\user_list.tpl, например, возле вывода имени пользователя:
{foreach from=$aUsersList item=oUserList} {assign var="oSession" value=$oUserList->getSession()} {assign var="oUserNote" value=$oUserList->getUserNote()} <tr> <td class="cell-name"> <a href="{$oUserList->getUserWebPath()}"><img src="{$oUserList->getProfileAvatarPath(48)}" alt="avatar" class="avatar" /></a> <div class="name {if !$oUserList->getProfileName()}no-realname{/if}"> <p class="username word-wrap"><a href="{$oUserList->getUserWebPath()}">{$oUserList->getLogin()}</a></p> {if $oUserList->getProfileName()}<p class="realname">{$oUserList->getProfileName()}</p>{/if} </div> </td> <td> {* начало вставки *} {$iCountUserCreated = $oUserList->getPublicationsCount()} {if $iCountUserCreated} <div> Количество публикаций: <a href="{$oUserList->getUserWebPath()}created/">{$iCountUserCreated}</a> </div> {/if} {* /конец вставки *} {if $oUserCurrent} {if $oUserNote} <button type="button" class="button button-action button-action-note js-infobox" title="{$oUserNote->getText()|escape:'html'}"><i class="icon-synio-comments-green"></i></button> {/if} <a href="{router page='talk'}add/?talk_users={$oUserList->getLogin()}"><button type="submit" class="button button-action button-action-send-message"><i class="icon-synio-send-message"></i><span>{$aLang.user_write_prvmsg}</span></button></a> {/if} </td> <td class="cell-skill">{$oUserList->getSkill()}</td> <td class="cell-rating {if $oUserList->getRating() < 0}negative{/if}"><strong>{$oUserList->getRating()}</strong></td> </tr> {/foreach}
Нагрузка
Внимание! Данный метод значительно увеличит количество запросов к БД (на каждого пользователя — два дополнительных запроса). На сильно нагруженных сайтах это может быть причиной тормозов при просмотре страницы с пользователями.
Чтобы решить эту задачу, нужно в эвенте списка пользователей одним запросом получать количество топиков и комментариев для списка ид пользователей, но код данного решения немного выходит из предлагаемой простоты реализации текущего способа.
О кодировке
Также напомню начинающим любителям ковырять шаблоны о необходимости использования кодировки utf-8 без bom т.к. в примере мы текстовки не прятали в языковый файл и кириллица прописана прямо в шаблоне. Если не использовать такую кодировку, то у вас возможно все что угодно: начиная от криво отображаемого сайта (верстка) и заканчивая молчаливым белым экраном.
Это кросспост из гида, текст которого успешно отправлен прямо на стол Яндекса для заверки оригинальности.
7 комментариев
getPublicationsCount
удалить получение к-ва топиков (1-я строка) и в концеreturn $iCountCommentUser;