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

Счётчик сообщений пользователя


theIggs

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

  • 2 недели спустя...

Так, с 2.0 кто-нить уже извращался? :D. Я вот чего надумал

modunctions.php

FIND:

function post_delete($id)
{
  global $std, $ibforums, $DB;

  $posts      = array();
  $attach_tid = array();
  $topics     = array();

ADD BELOW:

  $authors	= array();

FIND:

  //---------------------------------------
  // Get Stuff
  //---------------------------------------

  $DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
  $DB->simple_exec();

  while ( $r = $DB->fetch_row() )
  {
  	$posts[ $r['pid'] ]       = $r['topic_id'];
  	$topics[ $r['topic_id'] ] = 1;
  }

REPLACE:

  //---------------------------------------
  // Get Stuff
  //---------------------------------------

  $DB->simple_construct( array( 'select' => 'author_id, pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
  $DB->simple_exec();

  while ( $r = $DB->fetch_row() )
  {
  	$posts[ $r['pid'] ]       = $r['topic_id'];
  	$topics[ $r['topic_id'] ] = 1;
  	$authors[]         = $r['author_id'];
  }

FIND:

  //---------------------------------------
  // delete the post
  //---------------------------------------

  $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) );

  //---------------------------------------
  // Update the stats
  //---------------------------------------

ADD BELOW:

         if ($this->forum['inc_postcount'])
         {
             if ( count($authors) > 0 )
             {
                 $authorids = " IN(".implode(",",$authors).")";

  	$DB->simple_exec_query( array( 'update' => 'members',
             	'set' => 'posts = posts - 1',
                                             'where' => "id{$authorids}") );
             }
         }

Но тут есть одно но. Система-то теперь по другом работает, так что если удалять сразу несколько сообщений одного человека, его счетчик уменьшится только на 1. Можно конечно считать для каждого человека и обновлять его инфу отдельно, но так, имхо, запросов слишком много будет... Что не есть приемлимо... Какие будут предложения? Есть вариант группировать по количеству удаляемых сообщений, так количество запросов уменьшится, но то же не очень (зависит от ситуации конечно). Можно было бы что-нить помутить с самим запросом, но MySQL же подзапросы не понимает ;).

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

:D я сделал- даже рабтает - причем и при удалении темы тоже..

вот:

описывать что куда вставлено не буду просто вот этим надо заменить соответсвующее место в файле modunctions.php

в принципе места вставок помечены строчкой "//my post-1"

 

 //------------------------------------------------------
// @post_delete: delete post ID(s)
// -----------
// Accepts: $id (array | string) 
// Returns: NOTHING (TRUE/FALSE)
//------------------------------------------------------

function post_delete($id)
{
  global $std, $ibforums, $DB;
  
  $posts      = array();
  $attach_tid = array();
  $topics     = array();

//my post-1
$author_id  = array();
//my post-1

  $this->error = "";

  if ( is_array( $id ) )
  {
  	if ( count($id) > 0 )
  	{
    $pid = " IN(".implode(",",$id).")";
  	}
  	else
  	{
    return FALSE;
  	}
  }
  else
  {
  	if ( intval($id) )
  	{
    $pid   = "=$id";
  	}
  	else
  	{
    return FALSE;
  	}
  }
  
  //---------------------------------------
  // Get Stuff
  //---------------------------------------
//my post-1
  $DB->simple_construct( array( 'select' => 'pid, topic_id, author_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
//my post-1
  $DB->simple_exec();
  
  while ( $r = $DB->fetch_row() )
  {
  	$posts[ $r['pid'] ]       = $r['topic_id'];
  	$topics[ $r['topic_id'] ] = 1;

//my post-1
  	$author_id[]=$r['author_id'];
//my post-1
  }
  
  //---------------------------------------
  // Is there an attachment to this post?
  //---------------------------------------
  
  $DB->simple_construct( array( 'select' => '*', 'from' => 'attachments', 'where' => "attach_pid".$pid ) );
  $DB->simple_exec();
  
  $attach_ids = array();
  
  while ( $killmeh = $DB->fetch_row( ) )
  {
  	if ( $killmeh['attach_location'] )
  	{
    @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_location'] );
  	}
  	if ( $killmeh['attach_thumb_location'] )
  	{
    @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_thumb_location'] );
  	}
  	
  	$attach_ids[] = $killmeh['attach_id'];
  	$attach_tid[ $posts[ $killmeh['attach_pid'] ] ] = $posts[ $killmeh['attach_pid'] ];
  }
  
  if ( count($attach_ids) )
  {
  	$DB->simple_exec_query( array( 'delete' => 'attachments', 'where' => "attach_id IN(".implode(",",$attach_ids).")" ) );
  	
  	//---------------------------------------
  	// Recount topic upload marker
  	//---------------------------------------
  	
  	require_once( ROOT_PATH.'sources/post.php' );
  	
  	$postlib = new post();
  	
  	foreach( $attach_tid as $apid => $tid )
  	{
    $postlib->pf_recount_topic_attachments($tid);
  	}
  }
  
  //---------------------------------------
  // delete the post
  //---------------------------------------
  
  $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) );
  
  //---------------------------------------
  // Update the stats
  //---------------------------------------
  
  $ibforums->cache['stats']['total_replies'] -= count($posts);
  
  $std->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
  
  //---------------------------------------
  // Update all relevant topics
  //---------------------------------------
  
  foreach( array_keys($topics) as $tid )
  {
  	$this->rebuild_topic($tid);
  }

//my post-1
//##################################################
for ($i=0; $i<count($author_id);$i++)
{
  $pcount = "";
  $mgroup = "";
  
//  $DB->simple_construct( array( 'select' => '*', 'from' => 'members', 'where' => 'id='.$author_id[$i] ) );
//  $DB->simple_exec();
//  $r = $DB->fetch_row();
    
    $pcount = "posts=posts-1, ";
  	
  	$r['last_post'] = time();

  	
  	$DB->simple_construct( array( 'update' => 'members',
            'set'    => $pcount." last_post=".intval($r['last_post']),
            'where'  => 'id='.$author_id[$i]
         )      );
         
  	$DB->simple_exec();

}
//##################################################
//my post-1
  
//  $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, "");
}

 

зы у меня внутри этой функции еще небольшое изменение закоментирована строчка в самом низу

//  $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, "");

я немного усовершенствовал логирование действий модераторов

если не хотите совершенствовать, то можно строчку раскоментировать

в файле moderate.php заменить на это соответсвующюю фунцию...

сделал это потому что опять же MySQL пропускал ошибки, а я работаю с постгре- он ошибки выдавал при стандартных запросах..

 function delete_post()
{
  global $std, $ibforums, $DB, $print;
  
  // Get this post id.
  
  $ibforums->input['p'] = intval($ibforums->input['p']);
  
  $DB->simple_construct( array( 'select' => 'pid, author_id, post_date, new_topic', 'from' => 'posts', 'where' => "topic_id={$this->topic['tid']} and pid={$ibforums->input['p']}" ) );
  $DB->simple_exec();
  
  if ( ! $post = $DB->fetch_row() )
  {
  	$this->moderate_error();
  }
  
  $passed = 0;
  
  if ($ibforums->member['g_is_supmod'] == 1)
  {
  	$passed = 1;
  }
  else if ($this->moderator['delete_post'] == 1)
  {
  	$passed = 1;
  }
  else if ( ($ibforums->member['g_delete_own_posts'] == 1) and ( $ibforums->member['id'] == $post['author_id'] ) )
  {
  	$passed = 1;
  }
  else 
  {
  	$passed = 0;
  }
  
  if ($passed != 1) $this->moderate_error();
  
  //---------------------------------------
  // Check to make sure that this isn't the first post in the topic..
  //---------------------------------------
  
  if ($post['new_topic'] == 1)
  {
  	$this->moderate_error('no_delete_post');
  }
  
  if ( $this->trash_forum and $this->trash_forum != $this->forum['id'] )
  {
  	//---------------------------------------
  	// Set up and pass to split topic handler
  	//---------------------------------------
  	
  	$ibforums->input['checked'] = 1;
  	$ibforums->input['fid']     = $this->trash_forum;
  	$ibforums->input['title']   = "From: ".$this->topic['title'];
  	$ibforums->input['desc']    = "From Topic ID: ".$this->topic['tid'];
  	$ibforums->input[ 'post_'.$ibforums->input['p'] ] = 1;
  	
  	$this->trash_inuse = 1;
  	
  	$this->multi_split_topic();
  	
  	$this->trash_inuse = 0;
  }
  else
  {
  	$this->modfunc->post_delete( $ibforums->input['p'] );
  	$this->modfunc->forum_recount( $this->forum['id'] );
  	$this->moderate_log("Deleted posts. Author:".$post['author_name']." Nom. post: ". $ibforums->input['p']);
  }
  
  $print->redirect_screen( $ibforums->lang['post_deleted'], "act=ST&f=".$this->forum['id']."&t=".$this->topic['tid']."&st=".$ibforums->input['st'] );
}

 

ну и чтобы счетчик уменьшался при удалении тем делаем такое изменение в файле modfunctions.php

ищем функцию

 function topic_delete($id, $nostats=0)

внутри строчку

 $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "topic_id".$tid ) );

меняем на

 	$this->post_delete($posts);	
//  $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "topic_id".$tid ) );

- все;)...

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

НО если юзаете корзину то счетчик уменьшается только при удалении из нее:)

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

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

кажется..

1. ищу решения -и уже близок к нахождению:D

2. фича удаления постов только для модеров, так что большой загрузки нет

3. реальная загрузка думаю может быть только если удалять тему с 500 постами.., много ли у вас таких тем и часто ли их вы удаляете?;)

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

кхм.. сказано сделано:D вот более продвинутый по идее меньше грузящий базу заменить этим всю функцию post_delete из файла modunctions.php

 //------------------------------------------------------
// @post_delete: delete post ID(s)
// -----------
// Accepts: $id (array | string) 
// Returns: NOTHING (TRUE/FALSE)
//------------------------------------------------------

function post_delete($id)
{
 global $std, $ibforums, $DB;
 
 $posts      = array();
 $attach_tid = array();
 $topics     = array();

//my post-1
$author_id  = array();
//my post-1

 $this->error = "";

 if ( is_array( $id ) )
 {
	 if ( count($id) > 0 )
	 {
   $pid = " IN(".implode(",",$id).")";
	 }
	 else
	 {
   return FALSE;
	 }
 }
 else
 {
	 if ( intval($id) )
	 {
   $pid   = "=$id";
	 }
	 else
	 {
   return FALSE;
	 }
 }
 
 //---------------------------------------
 // Get Stuff
 //---------------------------------------
//my post-1
 $DB->simple_construct( array( 'select' => 'pid, topic_id, author_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
//my post-1
 $DB->simple_exec();
 
 while ( $r = $DB->fetch_row() )
 {
	 $posts[ $r['pid'] ]       = $r['topic_id'];
	 $topics[ $r['topic_id'] ] = 1;

//my post-1
	 $author_id[$r['author_id']]=$author_id[$r['author_id']]+1;
//my post-1
 }
 
 //---------------------------------------
 // Is there an attachment to this post?
 //---------------------------------------

 $DB->simple_construct( array( 'select' => '*', 'from' => 'attachments', 'where' => "attach_pid".$pid ) );
 $DB->simple_exec();
 
 $attach_ids = array();
 
 while ( $killmeh = $DB->fetch_row( ) )
 {
	 if ( $killmeh['attach_location'] )
	 {
   @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_location'] );
	 }
	 if ( $killmeh['attach_thumb_location'] )
	 {
   @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_thumb_location'] );
	 }
	 
	 $attach_ids[] = $killmeh['attach_id'];
	 $attach_tid[ $posts[ $killmeh['attach_pid'] ] ] = $posts[ $killmeh['attach_pid'] ];
 }
 
 if ( count($attach_ids) )
 {
	 $DB->simple_exec_query( array( 'delete' => 'attachments', 'where' => "attach_id IN(".implode(",",$attach_ids).")" ) );
	 
	 //---------------------------------------
	 // Recount topic upload marker
	 //---------------------------------------
	 
	 require_once( ROOT_PATH.'sources/post.php' );
	 
	 $postlib = new post();
	 
	 foreach( $attach_tid as $apid => $tid )
	 {
   $postlib->pf_recount_topic_attachments($tid);
	 }
 }
 
 //---------------------------------------
 // delete the post
 //---------------------------------------
 
 $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) );
 
 //---------------------------------------
 // Update the stats
 //---------------------------------------
 
 $ibforums->cache['stats']['total_replies'] -= count($posts);
 
 $std->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
 
 //---------------------------------------
 // Update all relevant topics
 //---------------------------------------
 
 foreach( array_keys($topics) as $tid )
 {
	 $this->rebuild_topic($tid);
 }

//my post-1
//##################################################
foreach ($author_id as $member_id => $post_delete) 
{
 $pcount = '';
 
	 $pcount = "posts=posts-$post_delete, ";
	 
	 $r['last_post'] = time();

	 
	 $DB->simple_construct( array( 'update' => 'members',
           'set'    => $pcount.' last_post='.intval($r['last_post']),
           'where'  => 'id='.$member_id 
        )      );
        
	 $DB->simple_exec();

}
//##################################################
//my post-1
 
//  $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, "");
}

 

теперь запрос к базе мемберов идет по просто по каждому пользователю - сразу списывается количество удаленных постов..

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

или можно? мысли есть у кого?

кстати думаю еще внести изменения сюда: если включен переход пользователей от по группаом от кол-ва постов - снижать групу если надо

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

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

или можно? мысли есть у кого?

А чем старый способ не нравился?

кстати думаю еще внести изменения сюда: если включен переход пользователей от по группаом от кол-ва постов - снижать групу если надо

winnie, ты правильно мыслишь, но вопрос - где столько времени берёшь? :D

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

А чем старый способ не нравился?

старый это какой? если мой предыдущий, то там как правильно заметил d1pro количество запросов к базе мемберов было столько же сколько и удаляемых постов.... я сам понимал что это не хорошо- руки не доходили исправить, ну раз уж выложил на всеобщее пользование, то решил улучшить

 

 

где столько времени берёшь?

ОФФ :D не сплю не ем... ;)

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

Итак, я вот какой изврат навыдумывал... Жду критику:

modunctions.php

FIND:

function post_delete($id)
{
 global $std, $ibforums, $DB;

 $posts      = array();
 $attach_tid = array();
 $topics     = array();

ADD BELOW:

        $author_id	= array();
 $num_to_del = array();

FIND:

 //---------------------------------------
 // Get Stuff
 //---------------------------------------

 $DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
 $DB->simple_exec();

 while ( $r = $DB->fetch_row() )
 {
	 $posts[ $r['pid'] ]       = $r['topic_id'];
	 $topics[ $r['topic_id'] ] = 1;
 }

REPLACE:

 //---------------------------------------
 // Get Stuff
 //---------------------------------------

 $DB->simple_construct( array( 'select' => 'author_id, pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
 $DB->simple_exec();

 while ( $r = $DB->fetch_row() )
 {
	 $posts[ $r['pid'] ]       = $r['topic_id'];
	 $topics[ $r['topic_id'] ] = 1;
	 $author_id[$r['author_id']]++;
 }

FIND:

 //---------------------------------------
 // delete the post
 //---------------------------------------

 $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) );

 //---------------------------------------
 // Update the stats
 //---------------------------------------

ADD BELOW:

        if ($this->forum['inc_postcount'])
        {
            if ( count($author_id) > 0 )
            {
                foreach ($author_id as $member_id => $posts_to_del)
                {
                 $num_to_del[$posts_to_del] .= $member_id." ";
                }

                foreach ($num_to_del as $num => $auth)
                {
                 $authorids = " IN(".implode( ",", explode (" ", rtrim ($auth)) ).")";

             $DB->simple_exec_query( array( 'update' => 'members',
                                            'set' => "posts = posts - ".$num,
                                            'where' => "id{$authorids}") );
                }
	 }

        }

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

$author_id[$r['author_id']]++;

:D хех с этим согласен- странно почему я не заюзал- глюки;)

ну кстати сразу есть глюк..

если удаляете из корзины.. а у вас стоит проверка на форум (счетчик постов вкл/выкл) ..

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

на счет запроса к базе мемберов на апдейт ее

разве такой запрос возможен?

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

winnie

Проверял, возможен :D. Группировка по количеству удаляемых постов и создание запросов адекватных только этом числу... Насчет корзины не думал, не юзаю сею фичу...

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

d1pro

Проверял, возможен . Группировка по количеству удаляемых постов и создание запросов адекватных только этом числу...

да сейчас разобрался- действительно возможен, НО .. не факт что таких запросов будет меньше чем если для каждого пользователя делать запрос.. выгода вообщем не большая... а иногда может и не быть ее :D

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

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

winnie

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

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

d1pro

;)

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

вообщем в этом вопросе думаю мы к ощему мнению не придем и поэтому думаю надо направить мыслительную деятельность на то, как проверить из какого форума удаляем посты (топики) при наличии корзины :D

Добавлено в [mergetime]1091658606[/mergetime]

пока только варианты

1. не использовать корзину

2. не использвать форумы в которых отключен счетчик постов..

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

winnie

А при удалении в корзину разве посты не убавляются? Или нет? На корзине не стоит признат inc_count?

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

А при удалении в корзину разве посты не убавляются?

нет идет просто перемещение постов/топиков и только при удалении из корзины списываются посты, то есть идет обращение к нашей функции function post_delete($id) и соответственно списываются посты.

На корзине не стоит признат inc_count?

кхм.. ставить его конечно можно, НО.. смысл.. счетчик у нас списываться не будет никогда, хотя посты/топики могут попасть в корзину из форума в котором включен счетчик

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

Скажите, какой из всех вышеперечисленных способов нормально работает во второй версии СО ВКЛЮЧЕННОЙ КОРЗИНОЙ? Изменено пользователем Aleks
Ссылка на комментарий
Поделиться на других сайтах

увы пока никак.. простыми проверками тут не обойтись :) к соалению..

есть идеи реализации, но они требуют больших изменений..

так что либо одно либо другое

ОФФ в в принципе я думал уже на счет надобности форумов без счетчика.. нужны ли они?:D ведь обчно они флеймовые.. и их чистят;) так что.. какая разница есть счетчик или нет..

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

непорядочек конечно.... делать - так нормально.. с автоперемещением из группы (если ты в нёё помещён по числу постов)
Ссылка на комментарий
Поделиться на других сайтах

с автоперемещением из группы (если ты в нёё помещён по числу постов)

это то не долго организовать...

ОФФ просто пока решаю проблему " как простым способом делать проверку - убавлять не убавлять кол-во постов"

просто хаки желательно делать при помощи минимальных исправлений в файлах, для удобства повторения

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

о. возникла идея. а что если не мучить форум и не править сорцы, а просто написать модуль для таскменеджера который с определённой переодичностью пересчитывает все посты?

Добавлено в [mergetime]1091992355[/mergetime]

ведь править сорцы форума - это далеко не лучший выход. а тут хоть чуть-чуть статистика будет неверна, но всё время будет подправляться. и не надо мучится с вопросом уменьшать счётчик или нет.

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

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

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

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