Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

Опубликовано:
  • Автор

@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

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

Опубликовано:
  • Автор

@newbie,

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

  • 1 год спустя...
Опубликовано:

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

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

Опубликовано:

@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"; не нужно добавлять.

Опубликовано:

Извиняюсь, до меня потом дошло, что нужно было логи показать :)

 

С новой правкой тоже не работает, выдает такую же ошибку:..

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Date: Mon, 23 Jan 2017 10:55:59 +0300
Error: 1054 - Unknown column 'm.topics_started' in 'field list'
IP Address: 127.0.0.1 - /index.php?/members/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT m.member_id, (FLOOR(m.posts/10) + FLOOR(m.topics_started/10) + FLOOR(m.tutorials_articles/3) + FLOOR(pp.pp_reputation_points/10)) AS grating FROM members m WHERE m.members_l_display_name !='' AND m.members_l_display_name  IS NOT NULL  AND m.member_group_id NOT IN(5) AND m.member_banned=0 AND ( ! ( members_bitoptions & 1 ) != 0) ORDER BY members_l_display_name asc LIMIT 0,20
.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| File                                                                       | Function                                                                      | Line No.          |
|----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------|
| C:\OpenServer\domains\test-34.ru\admin\sources\base\ipsController.php      | [public_members_list_view].doExecute                                          | 306               |
'----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------'
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Date: Mon, 23 Jan 2017 10:56:45 +0300
Error: 1054 - Unknown column 'pp.pp_reputation_points' in 'field list'
IP Address: 127.0.0.1 - /index.php?/members/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT m.member_id, (FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating FROM members m WHERE m.members_l_display_name !='' AND m.members_l_display_name  IS NOT NULL  AND m.member_group_id NOT IN(5) AND m.member_banned=0 AND ( ! ( members_bitoptions & 1 ) != 0) ORDER BY members_l_display_name asc LIMIT 0,20
.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| File                                                                       | Function                                                                      | Line No.          |
|----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------|
| C:\OpenServer\domains\test-34.ru\admin\sources\base\ipsController.php      | [public_members_list_view].doExecute                                          | 306               |
'----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------'
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Date: Mon, 23 Jan 2017 10:57:17 +0300
Error: 1054 - Unknown column 'm.topics_started' in 'field list'
IP Address: 127.0.0.1 - /index.php?/members/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT m.member_id, (FLOOR(m.posts/10) + FLOOR(m.topics_started/10) + FLOOR(m.tutorials_articles/3) + FLOOR(pp.pp_reputation_points/10)) AS grating FROM members m WHERE m.members_l_display_name !='' AND m.members_l_display_name  IS NOT NULL  AND m.member_group_id NOT IN(5) AND m.member_banned=0 AND ( ! ( members_bitoptions & 1 ) != 0) ORDER BY members_l_display_name asc LIMIT 0,20
.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| File                                                                       | Function                                                                      | Line No.          |
|----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------|
| C:\OpenServer\domains\test-34.ru\admin\sources\base\ipsController.php      | [public_members_list_view].doExecute                                          | 306               |
'----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------'
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Date: Mon, 23 Jan 2017 10:58:39 +0300
Error: 1054 - Unknown column 'm.topics_started' in 'field list'
IP Address: 127.0.0.1 - /index.php?/members/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT m.member_id, (FLOOR(m.posts/10) + FLOOR(m.topics_started/10) + FLOOR(m.tutorials_articles/3) + FLOOR(pp.pp_reputation_points/10)) AS grating FROM members m WHERE m.members_l_display_name !='' AND m.members_l_display_name  IS NOT NULL  AND m.member_group_id NOT IN(5) AND m.member_banned=0 AND ( ! ( members_bitoptions & 1 ) != 0) ORDER BY members_l_display_name asc LIMIT 0,20
.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| File                                                                       | Function                                                                      | Line No.          |
|----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------|
| C:\OpenServer\domains\test-34.ru\admin\sources\base\ipsController.php      | [public_members_list_view].doExecute                                          | 306               |
'----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------'

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

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.