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

[2.1.x]Thanks mod (кнопка "Спасибо")


AVol

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

И очень все-таки не хватает кнопки общего пересчета всех спасиб всех пользователей.

не факт, что заработает

 

Открыть thanks.php

 

//найти

	function thanks_recount()
{
	if ( $this->edit_permissions() )
	{
		// Input data
		$author_id = intval($this->ipsclass->input['mid']);

		if ($author_id)
		{
			// Get "post_thanks"
			$this->ipsclass->DB->simple_construct( array( 'select' => 'post_thanks', 'from' => 'posts', 'where' => 'author_id = ' . $author_id . ' and post_thanks <> \'\' ' ) );
			$this->ipsclass->DB->simple_exec();

			$thanks_count = 0;

			// Recount "post_thanks"
			while($row = $this->ipsclass->DB->fetch_row())
			{
				$thanks_count += count( explode(',',$row['post_thanks']) );
			}

			// Update "post_thanks"
			$this->ipsclass->DB->do_update( 'members', array( 'thanks_point' => $thanks_count ), 'id = ' . $author_id );

			// Redirect
			$this->ipsclass->print->redirect_screen( $this->ipsclass->lang['thx_recount_thanks'], "act=thanks&type=history&mid={$author_id}&st={$this->ipsclass->input['st']}" );
		}

//Заменить на

	function thanks_recount()
{
	if ( $this->edit_permissions() )
	{
		// Input data
		$author_id = intval($this->ipsclass->input['mid']);

		if ($author_id)
		{
			$recount_all = $this->ipsclass-DB->simple_construct(array('select' => 'id', 'from' => 'members'));
			while ($row = mysql_fetch_assoc($recount_all))
			{
			// Get "post_thanks"
			$this->ipsclass->DB->simple_construct( array( 'select' => 'post_thanks', 'from' => 'posts', 'where' => 'author_id = ' . $row[id] . ' and post_thanks <> \'\' ' ) );
			$this->ipsclass->DB->simple_exec();

			$thanks_count = 0;

			// Recount "post_thanks"
			while($row = $this->ipsclass->DB->fetch_row())
			{
				$thanks_count += count( explode(',',$row['post_thanks']) );
			}

			// Update "post_thanks"
			$this->ipsclass->DB->do_update( 'members', array( 'thanks_point' => $thanks_count ), 'id = ' . $row[id] );

			// Redirect
			$this->ipsclass->print->redirect_screen( $this->ipsclass->lang['thx_recount_thanks'], "act=thanks&type=history&mid={$author_id}&st={$this->ipsclass->input['st']}" );
			}
		}

 

Лучше сначало на локалке проверь, за изменения не отвечаю =)

 

Только я не советую это делать, нагрузка на базу будет огромной

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

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

А что Ваш пример делает? (просто я в программировании "не бум-бум") Я так понимаю, что здесь идет перечсет сразу при удалении спасиб (постов в которых эти "спасиба" были сказаны). У можно ли тогда сделать пересчет вручную (где-нить в админке кнопочкой) или допустим раз в сутки это автоматом делалось?

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

Неее, если нагрузка на сервак будет большой, то такой способ решения проблемы не подходит

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

 

Я просто добавил цикл, заходишь в любого пользователя и тыкаешь "пересчитать", только пересчитывается не этот 1, а сразу все

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

Поставил мод,все выполнил правильно абсолютно.

Зашел на форум ,вроде все нормально.

Но когда заходишь в любую тему ,например

http://*******.ruforum/index.php?showtopic=8

 

Появляется белый лист и ошибка;

 

Fatal error: Call to undefined method skin_topic_2::button_thanks() in /data/www/public_html/forum/sources/action_public/topics.php on line 965

 

Посмотрев еще раз 10 понял что установил я все правильно,и ссылается на какую то ошибку :D;):):)

 

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

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

В списке тех, кто сказал спасибо, видно только 9 последних. Как отобразить все, а лучше сделать постраничный вывод.
Ссылка на комментарий
Поделиться на других сайтах

Мод отличный, ставится легко. Спасибо + автору.

Подскажите, пожалуйста, как в текстовом скине заменить кнопку "спасибо" на слово.

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

Тогда в самом последнем шаге

----------------------------------------------------------------------
Тело шаблона :
----------------------------------------------------------------------
<a href="{ipb.script_url}act=thanks&type=add&f={ipb.input[f]}&t={ipb.input[t]}&pid={$post}" title="Thanks"><img src='style_images/<#IMG_DIR#>/thanks.gif' border='0'  alt='Thanks' /></a>

Изменить так:

----------------------------------------------------------------------
Тело шаблона :
----------------------------------------------------------------------
<a href="{ipb.script_url}act=thanks&type=add&f={ipb.input[f]}&t={ipb.input[t]}&pid={$post}" title="Thanks">Спасибо</a>

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

Вот, один хороший человек (Zio) сделал общий пересчет всех спасиб всем пользователям из админки

 

//******************************

//Массовое пересчитывание спасиб

//******************************

 

//============================================
// ./sources/action_admin/rebuild.php
//============================================


//*******************
// находим
//******************* 

					case 'tool_bansettings':
							$this->ipsclass->admin->cp_permission_check( $this->perm_main.'|'.$this->perm_child.':rebuild' );
							$this->tool_bansettings();
							break;

					case 'tools':
							$this->ipsclass->admin->cp_permission_check( $this->perm_main.'|'.$this->perm_child.':' );
							$this->tools_splash();
							break;

//****************
// добавляем после
//****************

					//----------------------
					// thanks
					//----------------------
					case 'recount_thanks':
							$this->ipsclass->admin->cp_permission_check( $this->perm_main.'|'.$this->perm_child.':rebuild' );
							$this->recount_thanks();
							break;
//*******************
// находим
//******************* 

	/*-------------------------------------------------------------------------*/
	// REBUILD POST COUNTS
	/*-------------------------------------------------------------------------*/

	function rebuild_post_counts()
	{

//******************* 
// добавляем ПЕРЕД
//******************* 

	function recount_thanks()
	{

			//-----------------------------------------
			// Set up
			//-----------------------------------------

			$done   = 0;
			$start  = intval( $this->ipsclass->input['st'] );
			$end	= intval( $this->ipsclass->input['pergo'] ) ? intval( $this->ipsclass->input['pergo'] ) : 500;
			$end   += $start;
			$output = array();

			//-----------------------------------------
			// Got any more?
			//-----------------------------------------

			$tmp = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'id', 'from' => 'members', 'where' => "id > $end", 'limit' => array(0,1)  ) );
			$max = intval( $tmp['id'] );

			//-----------------------------------------
			// Avoid limit...
			//-----------------------------------------

			$this->ipsclass->DB->simple_construct( array( 'select' => 'id, name', 'from' => 'members', 'where' => "id >= $start and id < $end and thanks_point>0", 'order' => 'id ASC' ) );
			$outer = $this->ipsclass->DB->simple_exec();


			//-----------------------------------------
			// Process...
			//-----------------------------------------
			while( $r = $this->ipsclass->DB->fetch_row( $outer ) )
			{
$this->ipsclass->DB->simple_construct( array( 'select' => 'post_thanks', 'from' => 'posts', 'where' => 'author_id = ' . $r['id'] . ' and post_thanks <> \'\' ' ) );
			$this->ipsclass->DB->simple_exec();

			$thanks_count = 0;

			// Recount "post_thanks"
			while($row = $this->ipsclass->DB->fetch_row())
			{
				$thanks_count += count( explode(',',$row['post_thanks']) );
			}
// Update "post_thanks"
			$this->ipsclass->DB->do_update( 'members', array( 'thanks_point' => $thanks_count ), 'id = ' . $r['id'] );
					$done++;
			}
			//-----------------------------------------
			// Finish - or more?...
			//-----------------------------------------

			if ( ! $done and ! $max )
			{
					 //-----------------------------------------
					// Done..
					//-----------------------------------------

					$text = "<b>Пересчет завершен</b><br />".implode( "<br />", $output );
					$url  = "{$this->ipsclass->form_code}";
					$time = 2;
			}
			else
			{
					//-----------------------------------------
					// More..
					//-----------------------------------------

					$text = "<b>Пользователей пересчитано: $end, продолжение...</b><br />".implode( "<br />", $output );
					$url  = "{$this->ipsclass->form_code}&code=".$this->ipsclass->input['code'].'&pergo='.$this->ipsclass->input['pergo'].'&st='.$end;
					$time = 0;
			}

			//-----------------------------------------
			// Bye....
			//-----------------------------------------

			$this->ipsclass->admin->redirect( $url, $text, 0, $time );
	}

//*******************
// находим
//******************* 

			//-------------------------------//

			$this->ipsclass->admin->output();

	}

//******************* 
// добавляем ПЕРЕД
//******************* 

			//-----------------------------------------
			// Recount thanks
			//-----------------------------------------

			$this->ipsclass->html .= $this->ipsclass->adskin->start_form( array( 1 => array( 'code'  , 'recount_thanks' ),
																				 2 => array( 'act'   , 'rebuild' ),
																				 4 => array( 'section', $this->ipsclass->section_code ),
																				 )	  );

			$this->ipsclass->adskin->td_header[] = array( " "	, "60%" );
			$this->ipsclass->adskin->td_header[] = array( " "	, "40%" );

			$this->ipsclass->html .= $this->ipsclass->adskin->start_table( "Пересчет благодарностей пользователей" );

			$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "<b>Пересчет благодарностей</b><div style='color:gray'>Данная опция позволяет пересчитать благодарности пользователей.<br />
																					 Эта функция полезна, если Вы удалили тему, в которой объявлены благодарности пользователю.</div>
																					 Внимание: эта опция требует достаточно много ресурсов.<br />
																					 Рекомендуется перестраивать Спасибо у 500 пользователей за раз.
																					 <span style='color:gray'>Если данная функция не может быть выполнена и PHP скрипт </span>\"вылетает\" <span style='color:gray'>по</span> \"30 секундному таймауту\"<span style='color:gray'>, то уменьшите число пересчитываемых за раз пользователей.</span>",
																												   "по ".	  $this->ipsclass->adskin->form_simple_input( 'pergo', '500', 5 ). " за раз"
																									   )	  );

			$this->ipsclass->html .= $this->ipsclass->adskin->end_form('Пересчитать благодарности пользователей');

			$this->ipsclass->html .= $this->ipsclass->adskin->end_table();

/********************************

 

//*******************************************

//Удаление спасиб вместе с постом

//*******************************************

 

//============================================
// ./sources/lib/func_mod.php
//============================================

//	function post_delete($id)

//*******************
// находим код, начинающийся с
//******************* 
	//-----------------------------------------
	// Get Stuff
	//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
	$this->ipsclass->DB->simple_exec();

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

	//-----------------------------------------
	// Is there an attachment to this post?
	//-----------------------------------------

//****************
//Заменяем на:
//****************

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

	$this->ipsclass->DB->simple_construct( array( 'select' => 'pid, topic_id, author_id, post_thanks', 'from' => 'posts', 'where' => 'pid'.$pid ) );
	$this->ipsclass->DB->simple_exec();
	 $r = $this->ipsclass->DB->fetch_row();
		$posts[ $r['pid'] ]	   = $r['topic_id'];
		$topics[ $r['topic_id'] ] = 1;
		$author_id=$r['author_id'];
		$post_thanks=$r['post_thanks'];
//Delete Thanks point
$this->ipsclass->DB->simple_construct( array( 'select' => 'thanks_point, posts', 'from' => 'members', 'where' => "id=".$author_id ) );
$this->ipsclass->DB->simple_exec();
$user_data = $this->ipsclass->DB->fetch_row( );
if ($post_thanks!="") {
$thanks_count=count( explode( ",", $post_thanks));
$thanks_point=($user_data['thanks_point']-$thanks_count);
} else {
$thanks_point=$user_data['thanks_point'];
}
$inp_data= array( 
'thanks_point' => $thanks_point, 
'posts' => $user_data['posts']-1, 
);
$this->ipsclass->DB->do_update( 'members',$inp_data, "id=".intval($author_id));
//End Delete Thanks point
	//-----------------------------------------
	// Is there an attachment to this post?
	//-----------------------------------------

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

У кого проблемы с thanks.php . Я нашел проблему (тоесть человек подсказал)

 

Все элементарно просто. cache нужно права поставить. ;):D

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

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

Спасибо, все перелестно работает!

 

Здесь много задавали вопросов о совместимости с модом хайд от от Vic'er. Я этот мод установил после мода "Спасибо". Как тепероь привязать их так, чтоб ссылка появлялась только после нажатия спасибо? А то по умолчанию у мода "хайд" настройки такие, что он показывает скрытый текст зарегистрированому пользователю просто и пользователю, имеющему Н-ое количество постов.

 

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

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

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

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

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