Перейти к контенту
  • 0

Вопрос о дополнительном поле в профиле. (Активность)


simko

Вопрос

Не знала куда примкнуть тему. Как зделать так что б у пользовтеля на форуме росла активность? и это отображалось у него в профиле в темах. Это какой то мод?
Ссылка на комментарий
Поделиться на других сайтах

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

  • 0
А что вы представляете под "активностью"? В конечном счете, это какое-то число, или проценты, или еще что-то? И на основании чего оно определяется? По количеству просмотров страниц форума, количеству сообщений?
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Я вобще сама "чайник")) Я думаю что в количестве посещений форума, открытия страниц... вобще не знаю по этому и спрашиваю)
Ссылка на комментарий
Поделиться на других сайтах

  • 0
В таких делах 90% успеха -- придумать алгоритм, по которому будет рассчитываться этот показатель. Технически это реализуется относительно просто.
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Как бы это сделал я:

 

1. Добавил бы в таблицу ibf_members поле visit_hits:

ALTER TABLE `ibf_members` ADD `visit_hits` BIGINT NOT NULL DEFAULT '0'

 

2. В конец файла /sources/classes/class_display.php до строки

		if ( ! USE_SHUTDOWN )

Добавил бы:

		if($this->ipsclass->member["id"] > 0){
		$this->ipsclass->DB->query("UPDATE `ibf_members` SET visit_hits = visit_hits + 1 WHERE id =".$this->ipsclass->member["id"]);
		  $this->ipsclass->DB->simple_exec();	
	}

 

3. Теперь у нас есть все данные для анализа активности пользователя. Давайте построим ее как standalone-скрипт, чтобы не ковырять лишний раз форум. Для этого создадим папку "activity", в которую положим следюущее:

  • картинки индикаторов с именами level_0.png ... level_12.png,
  • скрипт level.php,

 

Листинг скрипта

/activity/level.php

<?php

include("../conf_global.php");

$link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']) or die();
mysql_select_db($INFO['sql_database'], $link);
mysql_query("SET NAMES ".$INFO['mysql_codepage'], $link);

$uid = (is_numeric(@$_GET["id"])) ? $_GET["id"] : 0;
if($uid == 0) die();

$act = (isset($_GET["act"])) ? $_GET["act"] : "";

switch($act){
 case "work":
	$query = "SELECT MAX(posts) as cnt FROM ibf_members";
	if(!($num1 = mysql_fetch_object(mysql_query($query)))) die();
	$query = "SELECT posts as cnt FROM ibf_members WHERE id = ".$uid;
	if(!($num2 = mysql_fetch_object(mysql_query($query)))) die();
break; 
 case "activity":
	$query = "SELECT MAX(visit_hits) as cnt FROM ibf_members";
	if(!($num1 = mysql_fetch_object(mysql_query($query)))) die();
	$query = "SELECT visit_hits as cnt FROM ibf_members WHERE id = ".$uid;
	if(!($num2 = mysql_fetch_object(mysql_query($query)))) die();
break;	
 case "stage":
	$query = "SELECT MIN(joined) as cnt FROM ibf_members";
	if(!($num1_1 = mysql_fetch_object(mysql_query($query)))) die();
	$query = "SELECT MAX(joined) as cnt FROM ibf_members";
	if(!($num1_2 = mysql_fetch_object(mysql_query($query)))) die();
	$query = "SELECT joined as cnt FROM ibf_members WHERE id = ".$uid;
	if(!($num2 = mysql_fetch_object(mysql_query($query)))) die();
	$num1->cnt = $num1_2->cnt - $num1_1->cnt;
	$num2->cnt = $num1_2->cnt - $num2->cnt;
break;	
 default: die(); break;
}

$k = 12 / $num1->cnt;
$level = round($num2->cnt * $k);

ob_clean();
header('Location: /activity/level_'.$level.'.png');

mysql_close($link);
die();
?>

 

4. Добавляем в шаблоны skin_topic > RenderRow после:

				{$author['member_joined']}<br />

Наш код:

Активность по просмотрам:<br /> <img src="/activity/level.php?act=activity&id={$author['id']}" alt="" /><br /><br />
Активность по сообщениям:<br /> <img src="/activity/level.php?act=work&id={$author['id']}" alt="" /><br /><br />
Длительность:<br /> <img src="/activity/level.php?act=stage&id={$author['id']}" alt="" /><br /><br />

 

Вот, собственно, и все....

 

А можно и по извращаться - сесть и написать великий алгоритм, считающий "активность" по хитрой формуле, используя на входе количество просмотров страниц, количество постов, дату регистрации и прочие чудеса....

Изменено пользователем Ritsuka
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Делал активность по элементам мультифорума.

Считается именно число просмотров страниц.

Посмотреть можно в профиле, например http://phpforum.ru/index.php?showuser=1 - справа внизу под аватаркой.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
FatCat - числом - это как-то неинтересно... Не с чем сравнить. Проценты (шкала) от активности самого активного пользователя, имхо, информативнее.
Ссылка на комментарий
Поделиться на других сайтах

  • 0
FatCat - числом - это как-то неинтересно... Не с чем сравнить.

Моя любимая тема на сегодня - привлекательность для поисковок.

Можно оценивать "привлекательность" пользователя числом привлеченных целевых посетителей из поисковок.

http://vesvalo.net/index.php?showuser=1 - слева вверху пункт "Привлекли посетителей из поисковок". :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Я тут почитал, можете подсказать, как надо писать, чтоб оно считало по формуле (посты+просмотры)\время с момента регистрации ?

Огромное спасибо!)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Интересует тот же вопрос: как зделать так что б считало пости и просмотри на время с момента регистрации ? :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Т.е. вы желаете их трех индикаторов сделать один, который выводил бы значение, равное

(число просмотров страниц форума + число ответов на форуме) / длительность пребывания на форуме

 

Вот ваш скрипт:

/activity/level.php

<?php
// Читаем конфиругацию базы форума
include("../conf_global.php");

// Подключаемся к БД
$link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']) or die();
mysql_select_db($INFO['sql_database'], $link);
mysql_query("SET NAMES ".$INFO['mysql_codepage'], $link);

// Проверяем параметры на входе
$uid = (is_numeric(@$_GET["id"])) ? $_GET["id"] : 0;
if($uid == 0) die("Не указан идентификатор пользователя!");

// Текущий таймстамп + 1000 дней (чтобы сгладить эффект от новых регистраций)
$time = time() + 86400000;

// Максимальная активность на форуме
$query = "SELECT MAX(".$time."*(200 * posts + visit_hits)/(".$time." - joined)) AS activity FROM ibf_members";
if(!($all = mysql_fetch_object(mysql_query($query)))) die();

// Активность текущего пользователя
$query = "SELECT (".$time."*(200 * posts + visit_hits)/(".$time." - joined)) AS activity FROM ibf_members WHERE id = ".$uid;
if(!($user = mysql_fetch_object(mysql_query($query)))) die();

// Уровень по 12-бальной шкале
$level = round($user->activity * (12 / $all->activity));

ob_clean();
header('Location: /activity/level_'.$level.'.png');

mysql_close($link);
?>

 

Положить заместо предыдущего, в skin_topic > RenderRow убрать все шкалы, и добавить вместо них одну:

Активность:<br /> <img src="/activity/level.php?id={$author['id']}" alt="" /><br /><br />

Изменено пользователем Ritsuka
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Мдя.
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Мдя.

 

Обновил код.

 

 

Два раза)

Kod i bez kommentariev bil ponyaten, a ya pro drugoe :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Кстати, другой вариант реализации активности:

 

1. Пункты 1 и 2 как и в первом варианте.

 

2. Вместо отдельных файлов и прочих чудес в /sources/ipsclass.php до строки:

$member['location']		   = $this->txt_wordwrap( $member['location'], 25 );

Добавляем:

		if($member['id'] > 0){		  
		$this->DB->query("SELECT MAX(200 * posts + visit_hits + 1) AS activity FROM ibf_members");
		$mod_act_all = $this->DB->fetch_row();   
		$this->DB->query("SELECT (200 * posts + visit_hits + 1) AS activity FROM ibf_members WHERE id = ".$member['id']);
		$mod_act_user = $this->DB->fetch_row();
		$mod_act_level = round($mod_act_user["activity"] * (100 / $mod_act_all["activity"]));
		$member['member_rank_img'] .= '<br />Активность: '.$mod_act_level.'%';
	}

 

Все)

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.