Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Trotor

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

Рекомендованные сообщения

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

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

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

Возможно.

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

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

 

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

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

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

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
А не напишите как это реализовать подробно?
Что Вам не понятно? :)

 

вычисляйте рейтингу по формуле 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

Поделиться сообщением


Ссылка на сообщение

@newbie,

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

 

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Кнопку добавляйте в шаблон 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

Поделиться сообщением


Ссылка на сообщение

@newbie,

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

Поделиться сообщением


Ссылка на сообщение
01/22/17 13:50 (изменено)

Подскажите, пожалуйста, как адаптировать этот метод под версию 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 + почему-то...

Изменено пользователем Strategius

Поделиться сообщением


Ссылка на сообщение

Функция 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

Поделиться сообщением


Ссылка на сообщение
01/22/17 22:31 (изменено)

@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}...

Изменено пользователем Strategius

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение
которые логируются

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

Поделиться сообщением


Ссылка на сообщение

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

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

 

Найти

		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

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...