Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

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

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

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

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

Все работает, спасибо большое!

  • 8 месяцев спустя...

А возможно ли добавить этот рейтинг в форум как репутацию, чтобы он кэшировался в базе данных и по его переменной можно было создавать условия доступа к функциям форума?

 

Например:

 

<if test="$member['grating'] > 1">Отображение кнопки, если рейтинг больше единицы</if>

А возможно ли добавить этот рейтинг в форум как репутацию, чтобы он кэшировался в базе данных и по его переменной можно было создавать условия доступа к функциям форума?

Не всегда и не везде доступны данные.

Например:

 

Вообще можно так

Отображение кнопки, если рейтинг больше единицы

Не всегда и не везде доступны данные.

А нельзя сделать, чтобы рейтинг один раз рассчитался и хранился в таблице, и данные будут браться из нее?

 

<if test="(floor($member['posts']/100) + floor($member['pp_reputation_points']/10)) > 1">Отображение кнопки, если рейтинг больше единицы</if>

Так конечно можно, но это много где необходимо будет исправлять.

А нельзя сделать, чтобы рейтинг один раз рассчитался и хранился в таблице, и данные будут браться из нее?

Так это же переменная величина, которая зависит от постов и репутации.

Так конечно можно, но это много где необходимо будет исправлять.

Добавьте функцию, например, в класс IPSMember.

Так это же переменная величина, которая зависит от постов и репутации.

Понял. Да, это слишком сложно получается.

 

Добавьте функцию, например, в класс IPSMember.

А как это сделать, не подскажете?

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

А как это сделать, не подскажете?

 

Открываете admin/sources/base/ipsMember.php

И добавляете что-то типа

	public static function rating($member)
{
	if (isset($member['posts']) and isset($member['pp_reputation_points']))
	{
		return (floor($member['posts']/100) + floor($member['pp_reputation_points']/10));
	}

	return 0;
}

Далее в шаблоне используете

<if test="IPSMember::rating($member) > 1">Отображение кнопки, если рейтинг больше единицы</if>

@newbie, а Вы не подскажете, как добавить к Вашему методу из поста #15 дополнительные выборки в виде сортировки по репутации и статьям (компонент установлен).

 

Добавляю эти выборки в выпадающий список (что в расширенных фильтрах поиска), но почему-то работает только выборка по $grating.

 

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

меняю на:

 

$grating = "(FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating";
		$reputation = "(FLOOR(pp.pp_reputation_points)) AS reputation";
		$articles = "(FLOOR(m.tutorials_articles)) AS articles";
		$this->DB->build( array( 'select'    => "m.member_id, {$grating}, {$reputation}, {$articles}",

А эта строка:

 

if ( $_queryPP )

Заменена на:

 

if ( $_queryPP or 1==1 )

Но выборка в выпадающем списке работает только по $grating, по репутации и статьям выдает ошибку базы данных. Подозреваю, что из-за обращения к не существующим полям в таблице members, но по рейтингу-то работает...

 

Лог ошибки:

 

mySQL query error: SELECT m.member_id FROM members m  LEFT JOIN pfields_content p ON ( p.member_id=m.member_id ) 
LEFT JOIN profile_portal pp ON ( pp.pp_member_id=m.member_id )   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 articles desc LIMIT 0,20

Лог ошибки:

Тут только запрос. Где сама ошибка?

Тут только запрос. Где сама ошибка?

Вот, все что было в файле...

 

Date: Mon, 16 Oct 2017 09:02:38 +0000
Error: 1054 - Unknown column 'articles' in 'order clause'
IP Address: /index.php?app=members&module=list
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT m.member_id FROM members m  LEFT JOIN pfields_content p ON ( p.member_id=m.member_id ) 
LEFT JOIN profile_portal pp ON ( pp.pp_member_id=m.member_id )   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 articles desc LIMIT 0,20
.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| File                                                                       | Function                                                                      | Line No.          |
|----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------|
| test.ru\admin\sources\base\ipsController.php    | [public_members_list_view].doExecute                                          | 306               |
'----------------------------------------------------------------------------+-------------------------------------------------------------------------------+-------------------'

Вот ошибка

Unknown column 'articles' in 'order clause'

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

@newbie, а, понял. Значит, всё-таки в статьях ошибка закопалась?

Вот, это тот файл, с которым тестировал: view.php

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

Обратите внимание на select.

Когда сортировка идет по grating, то select выглядит как

SELECT m.member_id, (FLOOR(m.posts/100) + FLOOR(m.topics_started/10) + FLOOR(m.tutorials_articles/5) + FLOOR(pp.pp_reputation_points/20)) AS grating

Во всех остальных случаях

SELECT m.member_id

А в order используется $this->sort_key, значение которого при вышеуказанной ошибке равно articles. Естественно данного поля нет.

@newbie, если честно, не понял... Строка

 

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

У меня отвечает за кнопку выборки по рейтингу, она работает, а список сортировок, который не работает находится в строке ниже, с ней и проблема...

 

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

Исправил, как Вы написали, но все равно не работает.

У меня отвечает за кнопку выборки по рейтингу,

За кнопку отвечает html.

А здесь идет выборка пользователей.

Вообще у нас 2 похожих запроса

 

		if ( $notInMembers > 0 OR $this->sort_key != 'members_l_display_name' OR $this->request['request_method'] == 'post' )
	{
		$_max = $this->DB->buildAndFetch( array( 'select'	 => 'COUNT( * ) as cnt',
								 				 'from'		 => array( 'members' => 'm' ),
												 'where'	 => implode( " AND ", $query ),
												 'add_join'	 => $joins ) );

		$this->DB->build( array( 'select'	 =>' m.member_id',
								 'from'		 => array( 'members' => 'm' ),
								 'where'	 => implode( " AND ", $query ),
								 'order'	 => 'm.' . $this->sort_key . ' ' . $this->sort_order,
								 'limit'	 => array( $this->first, $this->max_results ),
								 'add_join'	 => $joins ) );
	}
	else
	{
		$_max = $this->DB->buildAndFetch( array( 'select'	 => 'COUNT( * ) as cnt',
								 				 'from'		 => 'members m',
												 'where'	 => implode( " AND ", $query ) ) );

		$this->DB->build( array( 'select'	 => 'm.member_id',
								 'from'		 => array( 'members' => 'm' ),
								 'where'	 => implode( " AND ", $query ),
								 'order'	 => 'm.' . $this->sort_key . ' ' . $this->sort_order,
								 'limit'	 => array( $this->first, $this->max_results ) ) );
	}

 

и править нужно оба.

А точнее только первый, т.к. в else мы никогда не попадем.

А у Вас в первом чуть-чуть изменено, и во втором чуть-чуть.

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.