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

[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 недели спустя...

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

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

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

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

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

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

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

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

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

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

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