Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Haktar

Общий цифровой рейтинг

Recommended Posts

Хотелось бы создать так сказать общий цифровой рейтинг пользователя на основании количества сообщений, тем, репутации, очков рейтинга в профиле, и других цифровых показателей пользователя. Скажем 100 сообщений это 1 балл рейтинга, 10 тем - тоже 1 балл, и так далее, и что бы общий показатель выводить в тему.

Возможно ли такое реализовать?

  • Upvote 1

Share this post


Link to post
Share on other sites

Возможно ли такое реализовать?

Возможно.

Но не все перечисленные данные есть по умолчанию. Например, нет деления на посты и темы. В этом случае можно посмотреть в сторону хука "Number Of Topics Started".

А так - это чистая математика.

Share this post


Link to post
Share on other sites

А в чем проблема? Все данные есть (за исключения тем), вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n.

Share this post


Link to post
Share on other sites

А в чем проблема? Все данные есть (за исключения тем), вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n.

А не напишите как это реализовать подробно?

 

(за исключения тем)

Темы тоже есть. Стоит хук Количество созданных тем

Вывожу информацию о них посредством {$author['topics_started']}

 

 

В этом случае можно посмотреть в сторону хука "Number Of Topics Started".

Да, давно стоит.

Share this post


Link to post
Share on other sites
А не напишите как это реализовать подробно?
Что Вам не понятно? :)

 

вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n

"общее количество" - $author['topics_started'], $author['posts'] и т.д.

"за какое количество" - 100 сообщений, 10 тем и т.д.

"n" - та же самая формула floor( общее количество / за какое количество ).

Если давать не по 1 баллу, то формула будет выглядеть floor( общее количество / за какое количество ) * X. X - количество баллов.

 

Пример для тем и сообщений.

{parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"}

 

Не знаю, после установки вышеуказанного хука $author['posts'] - чисто сообщения или как и по дефолту вместе с темами.

Если последнее, то $author['posts'] / 100 замените на ($author['posts'] - $author['topics_started']) / 100

  • Upvote 2

Share this post


Link to post
Share on other sites

@newbie,

Ух ты - отлично, работает на ура! Большое спасибо.

 

Не знаю, после установки вышеуказанного хука $author['posts'] - чисто сообщения или как и по дефолту вместе с темами.

Нет, работает отдельно, не зависит от сообщений.

Share this post


Link to post
Share on other sites

И ещё. Как добавить выборку по рейтингу в Список пользователей - http://ipbskins.ru/forum/index.php?app=members (колонку с количеством рейтинга я уже туда добавил)? То есть кнопку вроде Имя пользователя, Количество сообщений, Дата регистрации.

Share this post


Link to post
Share on other sites

То есть кнопку вроде Имя пользователя, Количество сообщений, Дата регистрации.

Кнопку добавляйте в шаблон member_list_show.

			<li <if test="$this->request['sort_key'] == 'grating'">class='active'</if>>
			<a href='{parse url="app=members&module=list&{$url}&sort_key=grating&sort_order=desc" template="members_list" base="public" seotitle="false"}' title='Сортировка по рейтингу'>По рейтингу</a>
		</li>

 

Также нужно будет отредактировать файл admin/applications/members/modules_public/list/view.php

1. Ниже

										'members_profile_views'		=> 'm_dd_views',

Добавляете

										'grating'					=> 'sort_by_grating',

2. Выше

			$this->DB->build( array( 'select'	 =>' m.member_id',

Добавляете

			$grating = "(FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating";

Тут сами определите, что Вам надо.

3.

			$this->DB->build( array( 'select'	 =>' m.member_id',

заменяете на

			$this->DB->build( array( 'select'	 => "m.member_id, {$grating}",

4. Ниже находите

									 'order'	 => 'm.' . $this->sort_key . ' ' . $this->sort_order,

и заменяете на

									 'order'	 => $this->sort_key . ' ' . $this->sort_order,

5. Добавляете языковую фразу для выпадающего меню.

Приложение - Пользователи

Набор слов - public_list

Ключ - sort_by_grating

Текст по умолчанию - по рейтингу

  • Upvote 3

Share this post


Link to post
Share on other sites

@newbie,

Большое спасибо. Всё получилось!

Share this post


Link to post
Share on other sites

Подскажите, пожалуйста, как адаптировать этот метод под версию 3.4.9? Делаю все по инструкции из поста #8, при переходе в список пользователей выбивает ошибку базы данных :(

 

И еще, с таким кодом вывода рейтинга в шаблоны рушится верстка почему то (и на тестовой версии 3.1.4 тоже):

 

{parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"}

Работает только с таким кодом:

 

{parse expression="floor( $author['posts'] / 100 )"}

Т.е. не работает с несколькими floor + почему-то...

Edited by Strategius

Share this post


Link to post
Share on other sites

Функция floor() просто округляет результат деления и, естественно, не имеет отношения к вашим проблемам. В шаблонaх "userInfoPane" и "post" можете для вычисления интегрального рейтинга взять, помимо $author['posts'] ( для шаблона "post" это переменная $post['author']['posts'] ), значения переменных $author['pp_rating_value'] - средний рейтинг профиля, $author['pp_rating_hits'] - количество оценок профиля и $author['pp_reputation_points'] - репутация.

 

Переменную $author['topics_started'] с количеством открытых автором топиков можно вернуть правкой в файле /admin/applications/forums/modules_public/forums/topics.php, по-идее, но это увеличит число запросов к базе, в зависимости от количества ответов на странице.

После:

			$row['member_id']     = $row['mid'];

Добавить:

			$count = $this->DB->buildAndFetch( array( 'select' => 'count(*) as tstarted', 'from' => 'topics', 'where' => 'starter_id='.$row['member_id'] ) );
		$row['topics_started'] = $count['tstarted'];

 

P.S. Если Вы сделали эту правку, то код с использованием переменной $author['topics_started'] помещайте в условие вида:

<if test="$this->request['app'] == 'forums'">{parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"}</if>

Иначе будут ошибки на страницах личных сообщений и других страницах, где используется этот шаблон.

  • Upvote 1

Share this post


Link to post
Share on other sites

@Dmitriy427, проблему с floor() удалось решить, за переменные большое спасибо!

 

Осталась проблема с несовместимостью правки файла admin/applications/members/modules_public/list/view.php из поста #8 (правка для версии 3.1.4, а для 3.4 не подходит), при открытии списка пользователей выбивает ошибку базы данных...

 

Методом тыка определил, что проблема в строке

 

$this->DB->build( array( 'select'    => "m.member_id, {$grating}",

Не хочет работать из-за {$grating}...

Edited by Strategius

Share this post


Link to post
Share on other sites

при открытии списка пользователей выбивает ошибку базы данных...

которые логируются.

Share this post


Link to post
Share on other sites
которые логируются

А возможно ли как-нибудь сделать сортировку по рейтингу в 3.4? Очень нужна эта кнопка, хотел по умолчанию ее сделать вместо сортировки по имени :(

Share this post


Link to post
Share on other sites

Я Вам про логи, Вы мне про ...

Не хотите смотреть логи, сами посмотрим.

 

Найти

		if ( $_queryPP )

Заменить на

		if ( $_queryPP or 1==1 )

 

Или заменить на

		if ( $_queryPP or $this->sort_key == 'grating')

а

$this->DB->build( array( 'select'	 => ' m.member_id',

заменить на

$this->DB->build( array( 'select'	 => 'm.member_id' . (($this->sort_key == 'grating') ? ", (FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating" : ''),

Тогда $grating = "(FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating"; не нужно добавлять.

  • Upvote 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...