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

Хак автоматической склейки постов одного автора, идущих друг за другом


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

Все, наверное, знают что такое автоматическая склейка постов.

Это когда я написал пост, и где-нить через полминуты добавил еще один пост. Как результат - один склеенный пост (если, конечно, никто не написал следом за моим первым постом).

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

 

И так, мое решение для форумов IPB 2.1.x, кому интересно, конечно.

Выглядит оно так:

http://pixmixer.com/uploads/images/20060131/full_size/46929_Untitled-2.jpg

 

cache/lang_cache/*/lang_post.php (для всех языков сделать надо бы)

 

1ый вариант:

ищем:

$lang = array (

, добавляем ниже

'added_later'		 => "Добавлено позже",

 

2ой вариант (если строка из первого не находится):

ищем:

<?

, добавляем ниже

$lang['added_later'] = "Добавлено позже";

 

sources/classes/post/class_post_reply.php

 

ищем:

$new_post  = $last_post['post'].'<br /><br />'.$this->post['post'];

, заменяем на:

$new_post  = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br />'.$this->post['post'];

 

ищем:

					$this->ipsclass->DB->do_update( 'posts', array( 'post' => $new_post, 'post_date' => time() ), 'pid='.$last_post['pid'] );

, и, чтобы дата оригинального поста не менялась, заменяем на:

					$this->ipsclass->DB->do_update( 'posts', array( 'post' => $new_post), 'pid='.$last_post['pid'] );

 

ну вот, в общем-то и всё.

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

  • Ответы 52
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

  • Song

    Song 10 публикаций

  • AEC

    AEC 7 публикаций

  • xRay

    xRay 5 публикаций

  • foolly

    foolly 4 публикации

да, вот написал я штуку сюда, а протестировать на редактирование не догадался =)

<hr /> не парсится обратно.

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

ушел редактировать первый пост =)

 

кто успел сделать всё до даты этого поста, тому надо сделать:

sources/classes/post/class_post_reply.php

искать:

$new_post  = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br /><hr />'.$this->post['post'];

и заменить на

$new_post  = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br />'.$this->post['post'];

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

  • 2 недели спустя...
  • 3 месяца спустя...
можно ли как-нибудь редактировать цвет и размер этой фразы, причём при редактировании сообщения она бы оставалась неизменной?
Ссылка на комментарий
Поделиться на других сайтах

  • 3 месяца спустя...
  • 2 месяца спустя...
Если вам надо то выложу функцию для определения разницы во времени т.е.с колько прошло и в итоге получаем на выходе разницу которая выглядит так "Добавлено через 7 часов 51 минут 10 секунд (тут время поста)"

Отображение времени склейки

 

Вот моя функция для этого:

 

	//calculate timestamp diff
	function dateDiffEx($row)
{
			$s = $row["nu"] - $row["lastpost"]; 
			$m = intval($s/60);
			$s = $s % 60;
			$h = intval($m/60);
			$m = $m % 60;
			$d = intval($h/24);
			$h = $h % 24;
			$diff = ""; 
			if ( !$d == "0" ) { 
				$diff = $diff . "$d дней "; 
			} if ( !$h == "0" ) { 
				if (strlen($h)==1) $diff = $diff . "$h часа ";
				else $diff = $diff . "$h часов "; 
			} if ( !$m == "0" ) { 
					if (($m=="2") or ($m=="3") or ($m=="4"))  
		{
				   			$diff = $diff . "$m минуты ";	
					}
					else
					{
							if ($m=="1") $diff = $diff . "$m минуту ";
							else $diff = $diff . "$m минут ";
					}
			} if ( !$s == "0" ) { 
					if (($s=="2") or ($s=="3") or ($s=="4"))  
		{
				   			$diff = $diff . "$s секунды ";	
					}
					else
					{
							if ($s=="1") $diff = $diff . "$s секунду ";
							else $diff = $diff . "$s секунд ";
					}
			} if ( $diff == "" ) { 
				$diff = "-"; 
			} 
			trim ($diff); 
			return $diff;
}

 

Использовать так:

// calculate timestap diff
$dta["lastpost"]=$this->topic['last_post'];
$dta['nu']=time();
$dif1 = trim($this->dateDiffEx($dta));

 

Ну втыкаем ее

 

Было в коде .silent так

$new_post = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br />'.$this->post['post'];

 

дописываем вывод timestap diff

в результате это

$new_post = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' '.$dif1.' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br />'.$this->post['post'];

то что вставить надо зеленым цветом выделено

 

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

 

Удачи!

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

Song

Вот так (пашет только если не было уже склеек к своему же посту) код из 2.0.х:

 

$str1 = $last_post['post'];
$str2 = $this->post['post'];
$flood_str_cmp = str_replace ($str1,"",$str2);

if (strlen($flood_str_cmp)==0)
{
$this->$flood_post = 1;
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'dont_flood_equal_msg', 'EXTRA' => '') );
}
else
$DB->do_update( 'posts', array( 'post' => $new_post, 'post_date' => time() ), 'pid='.$last_post['pid'] );

 

Ну и в ерор_ланг пихаем месагу о том что это дубль в dont_flood_equal_msg

 

Блин писал этот код давно сейчас не догоняю почему это гад вообще срабатывает :D

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

Ну как и я говорил, ошибка у тебя алгоритмическая.

Вот смотри:

 

Первый пост: "тест"

Второй пост: "тест1"

Получилось (например): "тест Добавлено тест1"

 

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

"тест Добавлено тест1" != "тест1"

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

Я же написал работает если не было до этого склейки.

 

Ты у себя это делал? Если да, то как разрулил вместе со склейкой?

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

Ты у себя это делал?

да, я ж не зря внимание акцентировал.

Ты у себя это делал?

регулярным выражением вырезаю только последний ответ после "Добавлено" и сравниваю уже его.

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

  • 1 месяц спустя...
  • 2 месяца спустя...

Странно он как-то работает... склейка сообщений происходит всегда или то. что задано в админке?

Допустим если человек написал сообщение вчера.. и сегодня опять пишет в эту тему... то сообщения не склеиваются...

 

Т.е. вот эта функция в админке влияет?

Обьединять сообщения

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

0 - отмена возможности.

 

 

И можно как-нить объеденить этот мод и ЭТОТ? А то приходится выбирать что-то одно (((

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

Все, наверное, знают что такое автоматическая склейка постов.

Это когда я написал пост, и где-нить через полминуты добавил еще один пост. Как результат - один склеенный пост (если, конечно, никто не написал следом за моим первым постом).

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

 

И так, мое решение для форумов IPB 2.1.x, кому интересно, конечно.

Выглядит оно так:

http://pixmixer.com/uploads/images/20060131/full_size/46929_Untitled-2.jpg

 

cache/lang_cache/*/lang_post.php (для всех языков сделать надо бы)

 

1ый вариант:

ищем:

$lang = array (

, добавляем ниже

'added_later'		 => "Добавлено позже",

 

2ой вариант (если строка из первого не находится):

ищем:

<?

, добавляем ниже

$lang['added_later'] = "Добавлено позже";

 

sources/classes/post/class_post_reply.php

 

ищем:

$new_post  = $last_post['post'].'<br /><br />'.$this->post['post'];

, заменяем на:

$new_post  = $last_post['post'].'<br /><br /><b>'.$this->ipsclass->lang['added_later'].' ('.$this->ipsclass->get_date( time(), 'SHORT', 1 ).'):</b><br />'.$this->post['post'];

 

ищем:

					$this->ipsclass->DB->do_update( 'posts', array( 'post' => $new_post, 'post_date' => time() ), 'pid='.$last_post['pid'] );

, и, чтобы дата оригинального поста не менялась, заменяем на:

					$this->ipsclass->DB->do_update( 'posts', array( 'post' => $new_post), 'pid='.$last_post['pid'] );

 

ну вот, в общем-то и всё.

пробывал на 2.2.2 - не пашет

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

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

А можно про функцию поподробнее? Куда её вставлять-то?

 

И еще вопрос: как сделать так, чтобы добавленное сообщение распознавалось форумом как новое?

 

То бишь, чтобы в списке новых сообщений выводилось?

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

А можно про функцию поподробнее? Куда её вставлять-то?

 

И еще вопрос: как сделать так, чтобы добавленное сообщение распознавалось форумом как новое?

 

То бишь, чтобы в списке новых сообщений выводилось?

оно так и работает...

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

А можно про функцию поподробнее? Куда её вставлять-то?

 

И еще вопрос: как сделать так, чтобы добавленное сообщение распознавалось форумом как новое?

 

То бишь, чтобы в списке новых сообщений выводилось?

оно так и работает...

 

Эм. У меня нет... Я ставил версию мода из первого поста, то бишь из файлового архива. :D;)

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

Зарузка...

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

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

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