Как вынести количество публикаций каждого пользователя на страницу пользователей

FAQ
Нужно в файле сущности пользователя \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 т.к. в примере мы текстовки не прятали в языковый файл и кириллица прописана прямо в шаблоне. Если не использовать такую кодировку, то у вас возможно все что угодно: начиная от криво отображаемого сайта (верстка) и заканчивая молчаливым белым экраном.
2 комментария
lifecom
Подскажите можно ли устроить сортировку по этому полю?
Serge Pustovit
Для пользователей? Нет, подставить напрямую в запрос это поле нельзя. Нужно джоинить таблицы, что приведет к значительному росту нагрузки.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.