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

[90%] Удаление темы через X дней


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

Вот в этой теме привожу код для создания нового поля для мульти-модерации. Поля, где вводится количество дней, через которое тема будет удалена. Естесственно отсчет пойдет, когда мульти-модерация (с включенным этим пунктом) на конкретной теме будет применена. Этот хак, наппример, будет полезен для создания мульти-модерации, включающей в себя закрытие темы, написание сообщения от закрывшего модератора, и соответственно удаление темы, например, через 10 дней. Эта мульти-модерация будет работать по темам, которые должны быть удалены не по правиламт и т.д.

 

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

Также хак не тестировался на реально работающих форумах. На локалке вроде нормально работает!

 

Сам мод:

Сначала вам необходимо выполнить следующие SQL запросы к базе, чтобы добавить необходимые поле и таблицу:

CREATE TABLE ibf_topic_deleting (
 did mediumint(9) NOT NULL auto_increment,
 topic_id bigint(20) default '0',
 date_del int(10) NOT NULL default '0',
 PRIMARY KEY  (did)
) TYPE=MyISAM;

и

ALTER TABLE ibf_topic_mmod ADD topic_delete smallint(5) NOT NULL DEFAULT '0';

 

Теперь собственно изменения в файлах:

 

В index.php найдите:

//--------------------------------
//  The rest :D
//--------------------------------

До него вставьте:

// oska mod delete topic x days start
$cur_time = time();
$del_check = $DB->query("SELECT * FROM ibf_topic_deleting WHERE date_del < {$cur_time}");
if ($DB->get_num_rows($check) > 0 ) {
while ($topic_for_delete = $DB->fetch_row($check)) {
	$DB->query("DELETE FROM ibf_topic_deleting WHERE did = {$topic_for_delete['did']}");
	$DB->query("DELETE FROM ibf_topics WHERE tid = {$topic_for_delete['topic_id']}");
}
}
// oska mod delete topic x days start

 

В sources/Admin/ad_multi_moderate.php найдите:

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

Перед этой строкой добавьте:

'topic_delete'       => $ADMIN->make_safe($HTTP_POST_VARS['topic_delete']),

 

Далее в этом же файле найдите:

$ADMIN->html .= $SKIN->add_td_row( array( "<b>Add to <i>END</i> of topic title?</b>" ,
											  $SKIN->form_input("topic_title_end", $topic_mm['topic_title_end'] )
								     )      );

После этого необходимо добавить:

// oska mod delete topic in X days start
	$ADMIN->html .= $SKIN->add_td_row( array( "<b>Через сколько дней тему удалить?</b><br>После применении мульти-модерации с заполненным этим полем, начинается отчет дней, после которого тема удаляется!" ,
											  $SKIN->form_input("topic_delete", $topic_mm['topic_delete'] )
								     )      );
// oska mod delete topic in X days end

 

Далее в файле sources/lib/modfunctions.php найдите:

               //------------------------------------------------------
// @topic_add_reply: Appends topic with reply
// -----------
// Accepts: $post, $tids = array( 'tid', 'forumid' );
//         
// Returns: NOTHING (TRUE/FALSE)
//------------------------------------------------------

Перед ним вставьте:

// oska mod delete topic days start

function add_deleting_topic ($tid, $days) {
global $std, $ibforums, $DB;

	if ($tid && $days) {
	$now_time = time();
	$daysinsec = $days * 24 * 60 * 60 ;
	$answer = $now_time + $daysinsec;
	$insert_del_array = array (
		'topic_id' => $tid,
		'date_del' => $answer,
		);
	$db_del_string = $DB->compile_db_insert_string( $insert_del_array );
	$DB->query("INSERT INTO ibf_topic_deleting (" .$db_del_string['FIELD_NAMES']. ") VALUES (". $db_del_string['FIELD_VALUES'] .")");

	}
}

// oska mod delete topic days end

 

И в файле sources/mis/multi_moderate.php найдите:

       //-------------------------------------
       // Move topic?
       //-------------------------------------

Перед этим кодом вставьте:


       //-------------------------------------
       // Delete topic? Oska MOD!
       //-------------------------------------

	if ( $this->mm_data['topic_delete'] )
	{
		$this->modfunc->add_deleting_topic($this->topic['tid'], $this->mm_data['topic_delete']);
	}

 

Всё. Незавершенный мод установлен. Но уже должен быть работоспособен! Пожалуйста тестируйте, высказывайте замеченные ошибки и ваши предложения насчет того интерфейса для отмены...

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

V_V

Нет никакого интерфейса для отмены удаления уже ждущих (удаления) тем  Его необходимо придумать, где он будет, кто с ним будет работать, и как...

Что скажешь по поводу интерфейса?

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

Oska

ИМХО: в теме должна быть отметка о том, через сколько она будет удалена, возможно видимая всем и/или только тем, кому можно... + возможность отменить/изменить удаление

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

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

Ладно сделаем отметку в теме либо для админов + модеров этого раздела ИЛИ для всех (эту опцию настраиваться в админке будет).

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

 

А также список этих всех тем для изменения и удаления!

 

Вот тогда реальный мод будет. ОК. В общем интерфейс в разработке!

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

  • 2 года спустя...

Мое видение проблемы - для 2.0.х :D

Ибо в 2.0.х есть такая чудесная вещь как корзина, то удаление можно заменить отложенным переносом темы в эту самую корзину. Т.е. с темой производятся СРАЗУ все остальные действия, и ОТЛОЖЕННО производится перенос темы. В качестве форума для переноса указываем корзину. Отдельно создаем второе правило мультимодерации, где в поле "отложить перемещение на X дней" указываем "-1" - это будет означать отмену ранее установленного отложенного действия по перемещению. Отложенное действие по перемещению осуществляется с помощью задачи (task)

 

Инструкция по установке (2.0.х).

 

запросы

ALTER TABLE ibf_topic_mmod ADD topic_movetime smallint(5) NOT NULL DEFAULT '0';

 

CREATE TABLE `ibf_topic_movetime` (
 `did` mediumint(9) NOT NULL auto_increment,
 `topic_id` bigint(20) default '0',
 `date_move` int(10) NOT NULL default '0',
 `forum_id` smallint(6) NOT NULL default '0',
 PRIMARY KEY  (`did`)
) ENGINE=MyISAM

 

то и другое - со своим префиксом

 

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

Просмотр темы (skin_topic) / mm_start

Наверх добавить

<?php

if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Некорректный адрес</h1>Вы не имеете доступа к этому файлу напрямую. Если вы недавно обновляли форум, вы должны обновить все соответствующие файлы.";
exit();
}

class task_item
{
var $class     = "";
var $root_path = "";
var $task      = "";

/*-------------------------------------------------------------------------*/
// Our 'auto_run' function
// ADD CODE HERE
/*-------------------------------------------------------------------------*/

function run_task()
{
	global $DB, $ibforums, $std;


	$cur_time = time();
	$check = $DB->query("SELECT * FROM ibf_topic_movetime WHERE date_move < '{$cur_time}'");
	while ($row = $DB->fetch_row($check)) {
		$DB->query("DELETE FROM ibf_topic_movetime WHERE did = '{$row['did']}'");
		$DB->query("UPDATE ibf_topics SET forum_id='{$row['forum_id']}' WHERE tid = '{$row['topic_id']}'");
	}

	$this->class->append_task_log( $this->task, 'Checked and proceed' );
}

/*-------------------------------------------------------------------------*/
// register_class
// LEAVE ALONE
/*-------------------------------------------------------------------------*/

function register_class(&$class)
{
	$this->class = $class;

	$this->root_path = $this->class->root_path;
}

/*-------------------------------------------------------------------------*/
// pass_task
// LEAVE ALONE
/*-------------------------------------------------------------------------*/

function pass_task( $this_task )
{
	$this->task = $this_task;
}


}
?>

 

файл /sources/admin/ad_multi_moderate.php

найти

				'topic_approve'		 => $ibforums->input['topic_approve'],

 

НИЖЕ добавить

						'topic_movetime'	=> $ibforums->input['topic_movetime'],

 

найти

		$ibforums->html .= $ibforums->adskin->add_td_row( array( "<b>Переместить тему?</b><br /><div class='graytext'>Выберите форум куда переместить тему при мульти-модерации.</div>" ,
											  $ibforums->adskin->form_dropdown("topic_move", array_merge( array( 0 => array('-1', 'Не перемещать' ) ), $fporum_jump ), $topic_mm['topic_move'] )
											  ."<br />".$ibforums->adskin->form_checkbox('topic_move_link', $topic_mm['topic_move_link'] )."<strong>Оставить ссылку на тему в старом форуме?</strong>"
									 )	  );

 

НИЖЕ добавить:

		$ibforums->html .= $ibforums->adskin->add_td_row( array( "<b>Отложенное перемещение на X дней или отмена этого действия?</b><br /><div class='graytext'>Для того, чтобы отложить действие по перемещению, укажите количество дней. Укажите <nobr><b>-1</b></nobr> для того, чтобы отменить ранее установленное время задержки.</div>" ,
											  $ibforums->adskin->form_input("topic_movetime", $topic_mm['topic_movetime'] )
									 )	  );

 

файл /sources/misc/multi_moderate.php

найти

	//-----------------------------------------
	// Move topic?
	//-----------------------------------------

 

ВЫШЕ добавить:

	if (intval($this->mm_data['topic_movetime']) == -1 )
{
	$DB->query("DELETE FROM ibf_topic_movetime WHERE topic_id='{$this->topic['tid']}'");
}

 

найти:

		if ( $this->mm_data['topic_move'] )
	{

 

НИЖЕ добавить:

		if (intval($this->mm_data['topic_movetime']) > 0 )
	{
		$now_time = time();
		$daysinsec = intval($this->mm_data['topic_movetime']) * 24 * 60 * 60;
		$answer = $now_time + $daysinsec;
		$DB->query("DELETE FROM ibf_topic_movetime WHERE topic_id='{$this->topic['tid']}'");
		$DB->query("INSERT INTO ibf_topic_movetime (topic_id, date_move, forum_id) VALUES ('{$this->topic['tid']}','{$answer}','{$this->mm_data['topic_move']}')");
	} else {

 

найти:

			}
		else
		{
			$DB->do_update( 'topic_mmod', array( 'topic_move' => 0 ), 'mm_id='.$this->mm_id );
		}

 

НИЖЕ добавить:

	}

 

Настройка

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

Правило 1.

Название: Закрыть и удалить через 5 дней

Действует: во всех форумах

Изменить состояние темы?: Закрыть

Переместить тему?: Корзина

Отложенное перемещение на X дней или отмена этого действия?: 5

Добавить сообщение в эту тему?: Да

Текст сообщения: <b>[!]</b> Эта тема закрыта и будет удалена через 5 дней.

 

Правило 2.

Название: Отменить удаление и открыть

Действует: во всех форумах

Изменить состояние темы?: Открыть

Отложенное перемещение на X дней или отмена этого действия?: -1

Добавить сообщение в эту тему?: Да

Текст сообщения: <b>[!]</b> Действие по отложенному удалению отменено, тема открыта.

 

 

Добавляем задачу в админке.

Название: Отложенное перемещение тем

Имя PHP-файла для выполнения: topic_movetime.php

Время выполнения: 12

Включить запись журнала действий: Нет

Включить задачу?: Да

 

Усё ;)

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

Хм.. не видел этой темы и делал сам. :D

У меня для топиков и для постов, но минус мода Оски в том, что у него появляются дополнительные запросы.

+ у него удаляется при авторизации, а у меня по крону.

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

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

Несколько вопросов :D

1. Совместим ли мод с 2.1.5?

2. Сроки "жизни" темы устанавливает модератор или же пользователь тоже сможет?

3. Можно ли автоматом устанавливать сроки на какой-либо один раздел целиком или же только на конкретные темы?

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

  • 2 месяца спустя...
Несколько вопросов :D

1. Совместим ли мод с 2.1.5?

 

а разве не видно: ibforums->html ? естественно надо переделывать

 

2. Сроки "жизни" темы устанавливает модератор или же пользователь тоже сможет?

 

сроки жизни ставятся в правиле мульти-модерации. кто по вашему редактирует правила мульти-модерации? только админ.

 

3. Можно ли автоматом устанавливать сроки на какой-либо один раздел целиком или же только на конкретные темы?

 

если бы это было можно, наверное это было бы заявлено в описании мода.

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

  • 3 недели спустя...
  • 3 недели спустя...
  • 11 месяцев спустя...
Ладно сделаем отметку в теме либо для админов + модеров этого раздела ИЛИ для всех (эту опцию настраиваться в админке будет).

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

 

А также список этих всех тем для изменения и удаления!

 

Вот тогда реальный мод будет. ОК. В общем интерфейс в разработке!

Ну почему он так и не доделан?? :D

Очень хочется для 1.3 интерфейс.

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

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

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

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

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

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

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

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

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

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

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

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

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