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

Удаление сообщений у групп


dimitry

Вопрос

Возникла необходимость к уже имеющейся фиче IPB 1.3 - разрешение редактирования сообщения данной группой пользователей в течение задаваемого в админке периода времени (например, 15 мин. на редактирование, а потом уже нельзя) прикрутить тоже самое, но только для удаления сообщений:

Ломаю голову, так и не могу никак додуматься, но похоже делать надо так:

Открыть: moderate.php

function delete_post()
....
$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'] ) and (orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ))
	{
		$passed = 1;
	}
	else 
	{
		$passed = 0;
	}

	if ($passed != 1) $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'] ))
	{
		if ($ibforums->member['g_edit_cutoff'] > 0)
		{
			if ( $this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ) )
			{
				$passed = 1;
			}
		}
		else
		{
			$passed = 1;
		}
	}
	else 
	{
		$passed = 0;
	}

	if ($passed != 1) $this->moderate_error();

 

Вот это место

if ( ($ibforums->member['g_delete_own_posts'] == 1) and ( $ibforums->member['id'] == $post['author_id'] ))
	{
		if ($ibforums->member['g_edit_cutoff'] > 0)
		{
			if ( $this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ) )

 

позаимствовано мной из скрипта post_edit_post.php

 

$can_edit = 0;

	if ($ibforums->member['g_is_supmod'])
	{
		$can_edit = 1;
	}
	if ($this->moderator['edit_post'])
	{
		$can_edit = 1;
	}
	if ( ($this->orig_post['author_id'] == $ibforums->member['id']) and ($ibforums->member['g_edit_posts'])  and !$this->orig_post['has_modcomment'])
	{
		// Have we set a time limit?

		if ($ibforums->member['g_edit_cutoff'] > 0)
		{
			if ( $this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ) )
			{
				$can_edit = 1;
			}
		}
		else
		{
			$can_edit = 1;
		}
	}

	if ($can_edit != 1)
	{
		$std->Error( array( LEVEL => 1, MSG => 'not_op') );
	}

Когда я сделал так, как помечено красной звездочкой (*) (см. код выше)

то меня почему то неважно, какой бы я период редактирования ни установил - все время пишет: У вас нету прав..., ну т.е. ставит passed=0 почему то ... :D

Помогите разобраться, пожалуйста.

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

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

  • 0
Чего-то я никак не пойму как относится function delete_post() к
разрешение редактирования сообщения
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Код читать умеешь?

 

// мы ничего не можем удалять, флаг инициализируется 0
$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'] ))
	{
// если у пользователя стоит время в течении которого он может редактировать свой пост
		if ($ibforums->member['g_edit_cutoff'] > 0)
		{
// и с момента поста еще не прошло n-минут в течении которых разрешено редактирование, то можем удалять пост
			if ( $this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ) )
			{
				$passed = 1;
			}
		}
		else
		{
// иначе, если нет у нас промежутка времени, можем удалять всегда
			$passed = 1;
		}
	}
// если не выполнилось ни одно условие, то запрещаем удалять сообщение
	else
	{
		$passed = 0;
	}
// собственно проверка на статус флага, если флаг опущен -- значение 0, то пишем что прав нет.		
	if ($passed != 1) $this->moderate_error();

 

Теперь исходя из кода смотри где у тебя проваливаются проверки. echo $переменная, и вперёд.

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

  • 0
Теперь исходя из кода смотри где у тебя проваливаются проверки. echo $переменная, и вперёд.

GiV

А вот предложенный код с точки зрения работоспособности верен?

Если да, то тогда дело у меня в другом, придеться разбираться.

А echo - это что из элементов кеша или что?

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

  • 0
А вот предложенный код с точки зрения работоспособности верен?

Ну ты попробуй, зачем спрашивать? :D

 

dimitry, ваш последний пост привет в недоумение ;)

Если да, то тогда дело у меня в другом, придеться разбираться.

То есть если все ок, то дело в другом? :)

А echo - это что из элементов кеша или что?

http://php.ru/manual/function.echo.html :)

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

  • 0

Проверил на работоспособность - все равно при любом случае - либо до срока окончания либо после срока окончания редактирования пишет ошибку

$this->moderate_error()
Вам запрещено использование этой функции

Просто непонятно, в чем дело, вроде бы все переменные должны выдавать 1, а выдается 0.

либо PHP просто не воспринимает в этом скрипте

код

// если у пользователя стоит время в течении которого он может редактировать свой пост
		if ($ibforums->member['g_edit_cutoff'] > 0)
		{
// и с момента поста еще не прошло n-минут в течении которых разрешено редактирование, то можем удалять пост
			if ( $this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 ) ) )
			{
				$passed = 1;
			}
		}
		else
		{
// иначе, если нет у нас промежутка времени, можем удалять всегда
			$passed = 1;
		}

Когда я ставлю

orig_post['post_date'] < ( time()

сообщение начинает удаляться, но всегда? ну это и понятно, но вот почему в случае

orig_post['post_date'] > ( time() ничего не работает???

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

  • 0

Jax, да все там правильно:

Обычная алгебра :D Смотрите:

 

Пусть orig_post['post_date'] == 0 ч 00 мин 00 сек

member['g_edit_cutoff']) == 15 мин (15*60==900 сек)

Если time() == 00ч05мин00сек

Тогда

0ч00м00с > 0ч05м00с - 900сек

Если time() == 00ч20мин00сек

Тогда

0ч00м00с<0ч20м00с - 0ч15мин00с == 00ч05мин00с

$this->orig_post['post_date'] > ( time() - ( intval($ibforums->member['g_edit_cutoff']) * 60 )

Функция time() в php - в секундах

orig_post['post_date'] по идее тоже

member['g_edit_cutoff']) переводится в секунды для верного счета, так как в админке она в минутах.

Ну, вот и где правда? А?

;)

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

  • 0

dimitry, вы так глубоко зарылись, что сейчас наверное всю Землю насквозь пробурите... :D

 

Во-первых, если это не модераторские группы, то вам файл moderate.php вовсем не нужен, если удаление происходит не мод.функциями. Вам нужен topics.php.

 

Во-вторых, все делается куда проще. И так.

Открываем ./sources/Admin/ad_groups.php и находим там:

							 'g_can_remove'		 => $IN['g_can_remove'],

Ниже добавляем:

							 'g_delete_posts'		 => $IN['g_delete_posts'],
						 'g_delete_deloff'		=> $IN['g_delete_deloff'],

Находим тамже (русская версия админки):

		$ADMIN->html .= $SKIN->add_td_row( array( "<b>Разрешить удаление своих тем?$guest_legend" ,
											  $SKIN->form_yes_no("g_delete_own_topics", $group['g_delete_own_topics'] )
									 )	  );

Ниже вставляем:

		$ADMIN->html .= $SKIN->add_td_row( array( "<b>Разрешить этой группе удалять свои сообщения?$guest_legend" ,
											  $SKIN->form_yes_no("g_delete_posts", $group['g_delete_posts'] )
									 )	  );

	$ADMIN->html .= $SKIN->add_td_row( array( "<b>Ограничение во времени удаления (в минутах)?$guest_legend<br>По прошествии этих минут, пользователь уже не сможет удлить своё сообщение. Оставьте пробел или введите 0, для отмены этого ограничения." ,
											  $SKIN->form_input("g_delete_deloff", $group['g_delete_deloff'] )
									 )	  );

Сохраняем и открываем ./sources/Topics.php. В нем ищем:

function delete_button

В этой же функции пытаемся отыскать строчки:

				if ($ibforums->member['g_is_supmod']) return $button;
			if ($this->moderator['delete_post']) return $button;

После них вставляем:

if ($poster['id'] == $ibforums->member['id'] and ($ibforums->member['g_delete_posts']))
			{

					// Проверяем права на удаление по прошествию времени

					if ($ibforums->member['g_delete_deloff'] > 0)
					{
							if ( $post_date > ( time() - ( intval($ibforums->member['g_delete_deloff']) * 60 ) ) )
							{
					// Если со временем все ОК - показываем кнопочку
									return $button;
							}
							else
							{
					// Если время закончилось - возвращаем ничего :)
									return "";
							}
					}
					else
					{
					// А если есть права на удаление, но нет никакого лимита - показываем кнопку
							return $button;
					}
			}

Сохраняем.

Готово!

 

Идем в админку, в настройку групп и ставим лимиты и проверяем.

 

Примечание: Сам не проверял ;)

Удачи.

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

  • 0

Jax

Тут нужно существенно поправить и дополнить:

 

ALTER TABLE `ibf_groups` ADD `g_delete_deloff` INT( 10 ) DEFAULT '0' AFTER `g_edit_cutoff`;

 

Открыть ad_groups.php

 

Найти:

 

'g_can_remove'		 => $IN['g_can_remove'],

 

Ниже добавить:

 

'g_delete_deloff'		=> $IN['g_delete_deloff'],

 

Найти:

 

 $ADMIN->html .= $SKIN->add_td_row( array( "<b>Разрешить удаление своих сообщений?$guest_legend" ,
											  $SKIN->form_yes_no("g_delete_own_posts", $group['g_delete_own_posts'] )
									 )	  );

 

Ниже добавить:

 

$ADMIN->html .= $SKIN->add_td_row( array( "<b>Ограничение во времени удаления (в минутах)?$guest_legend<br>По прошествии этих минут, пользователь уже не сможет удлить своё сообщение. Оставьте пробел или введите 0, для отмены этого ограничения." ,
											  $SKIN->form_input("g_delete_deloff", $group['g_delete_deloff'] )
									 )	  );

Открыть Topics.php

 

Найти:

 

if ( ($post_count != 0 and $first == 0) or ($first > 0) )
		{
			$row['delete_button'] = $this->delete_button($row['pid'], $poster);
		}

 

Заменить на:

 

if ( ($post_count != 0 and $first == 0) or ($first > 0) )
		{
			$row['delete_button'] = $this->delete_button($row['pid'], $poster, $row['post_date']);
		}

 

Найти:

 

function delete_button($post_id, $poster)

 

Заменить на:

 

function delete_button($post_id, $poster, $post_date)

 

Найти:

 

if ( $ibforums->member['g_is_supmod'] )
	{
		return $button;

	}

 

Заменить на:

 

  if ( $ibforums->member['g_is_supmod'] )
	{
		return $button;

	}
	if ( $this->moderator['delete_post'] )
	{
		return $button;
	}

		if ( $this->topic['state'] == "closed" )
		{
			return "";
		}

	   else if ( $poster['id'] == $ibforums->member['id'] and ($ibforums->member['g_delete_own_posts']) )
		 {

					// Проверяем права на удаление по прошествию времени

					if ($ibforums->member['g_delete_deloff'] > 0)
					{
							if ( $post_date > ( time() - ( intval($ibforums->member['g_delete_deloff']) * 60 ) ) )
							{
					// Если со временем все ОК - показываем кнопочку
									return $button;
							}
							else
							{
					// Если время закончилось - возвращаем ничего :)
									return "";
							}
					}
					else
					{
					// А если есть права на удаление, но нет никакого лимита - показываем кнопку
							return $button;
					}
			}


	return "";

 

Примечание: С учетом изменений, внесенным от Song для запрета юзерам удаления сообщений, если тема закрыта.

 

Открыть: Moderate.php

 

Найти:

 

  $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();

 

Заменить на:

 

	$passed = 0;

	if ( $ibforums->member['g_is_supmod'] == 1 )
	{
		$passed = 1;

	}
if ($this->moderator['delete_post'] == 1)
	{
		$passed = 1;

	}
  else if ( $this->topic['state'] != "closed" )
	  {


		if ( $ibforums->member['g_delete_own_posts'] == 1 and $ibforums->member['id'] == $post['author_id'] )
		{


	if ($ibforums->member['g_delete_deloff'] > 0)
					{
							if ( $post['post_date'] > ( time() - ( intval($ibforums->member['g_delete_deloff']) * 60 ) ) )
							{
					// Если со временем все ОК
									$passed = 1;
							}

					}
					else
					{
					// А если есть права на удаление, но нет никакого лимита
							$passed = 1;
					}

}	
  }	


	if ( $passed != 1 )
	{
		$this->moderate_error();
	}

Примечание: С учетом изменений, внесенным от Song для запрета юзерам удаления сообщений, если тема закрыта.

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

  • 0
с Moderate.php выходит какая-то свистопляска:

А с чего вы взяли, что в Moderate.php есть $this->orig_post ?

 

Переменная $this->orig_post это прерагатива файла post_edit_post.php и только!

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

  • 0
с Moderate.php выходит какая-то свистопляска:

А с чего вы взяли, что в Moderate.php есть $this->orig_post ?

 

Переменная $this->orig_post это прерагатива файла post_edit_post.php и только!

Т.е. ее не добавишь в Modarate.php ?

А не знаете, как можно подправить этот код, чтобы он заработал или надо ставить что-то типа $post_date вместо $this->orig_post .Хотя, если подставить, то тоже ничего не изменится.

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

  • 0

Добавить можно всё.

Но вы ж своим исправлением её не добавляете.

 

Не думайте что всё решается переменными с одинаковыми именами.

 

Была например у меня в файле переменная $god, выполняла какую-то работу. Я взял её просто написал в другом файле. Вы всерьёз считаете, что в этом другом файле должна восстановиться функция работы этой перемнной как было в том только от того что я её там написал?

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

  • 0
Добавить можно всё.

Но вы ж своим исправлением её не добавляете.

Я понимаю, что здесь она совсем бездействует.Но все-таки можно как-то обыграть это код, чтобы в функции проверки прав заработала проверка по времени поста?

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

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

  • 0

Функциях прав доступа?

 

Moderate.php в данном случае это удаление сообщения. А где функция прав доступа?

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

  • 0
А где функция прав доступа?

я и имею ввиду скрипт Modarate.php, где это реализуется.

Прерагатива

$this->post['post_date']   = $this->orig_post['post_date'];

находится в post_edit_post.php в функции function complete_edit($class)

Чтобы проверка по времени заработала внутри функции function delete_post() в Moderate.php нужно ли как-то прописывать прерагативу

$this->post['post_date']   = $this->orig_post['post_date'];

в какой-то отдельной функции типа function complete_delete($class) в Modarate.php или это надо как-то по-другому делать.То есть нужно ли в Moderate.php еще какую-то дополнительную функцию прописывать или нет?

Подскажите.

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

  • 0

Ох Дмитрий :D всё вы на свете перепутали.

Используйте просто вместо $this->orig_post['post_date'] в вашем коде $post['post_date'] и будет Вам счастье

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

  • 0
$post['post_date'] и будет Вам счастье

 

Great thnx, все четко.Чувствовал, что какая-то мелочь оставалась...

 

Итак, заинтересовавшиеся этой модификацией - см. пост Удаление сообщений у групп

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

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

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

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

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

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

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

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

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

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

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

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