Создание сообщений на форуме из личных сообщений

Небольшие моды и хаки для форума phpBB3
Правила форума
При размещении мода/статьи взятой с другого форума/сайта обязательно необходимо указывать первоисточник сообщения.
 • Просмотры: 864
Аватара пользователя
PPK
Администратор
Благодарил (а): 82 раза
Поблагодарили: 1621 раз
Сообщения: 10284
Зарегистрирован: 21 мар 2009, 17:13
Сообщение

Создание сообщений на форуме из личных сообщений

17 окт 2013, 12:59

Иногда бывает так, что пользователи пишут в ЛС вопросы которые можно и нужно задавать на форуме, после чего, приходится каждому отвечать в ЛС, когда можно было-бы ответить сразу всем на форуме, после очередного "иногда" я подумал написать мод, который делал-бы из ЛС сообщение на форуме.

1. В phpmyadmin выполнить (если префикс таблиц не phpbb_ - заменить на свой)

Код: Выделить всё

INSERT INTO `phpbb_acl_options` (`auth_option_id`, `auth_option`, `is_global`, `is_local`, `founder_only`) VALUES (NULL, 'u_pm_createposts', '1', '0', '0');
2. Переделать файлы

includes/functions_privmsgs.php заменить

Код: Выделить всё

function handle_mark_actions($user_id, $mark_action)
{
	global $db, $user, $phpbb_root_path, $phpEx;
на

Код: Выделить всё

function handle_mark_actions($user_id, $mark_action)
{
	global $db, $user, $phpbb_root_path, $phpEx, $template;
после

Код: Выделить всё

				confirm_box(false, 'DELETE_MARKED_PM', build_hidden_fields($s_hidden_fields));
			}

		break;
добавить

Код: Выделить всё

		case 'create_posts':

			global $auth;

			if (!$auth->acl_get('u_pm_createposts'))
			{
				trigger_error('NO_AUTH_CREATE_POSTS');
			}

			if (confirm_box(true))
			{
				$user_save=array(
					'user_id' => $user->data['user_id'],
					'user_ip' => $user->ip,
					'username' => $user->data['username'],
					'is_registered' => $user->data['is_registered'],
					'user_colour' => $user->data['user_colour'],
				);

				$forum_id=request_var('forum_id', 0);

				create_posts_pm($user_id, $msg_ids, $cur_folder_id, $forum_id);

				$user->data['user_id']=$user_save['user_id'];
				$user->ip=$user_save['user_ip'];
				$user->data['username']=$user_save['username'];
				$user->data['is_registered']=$user_save['is_registered'];
				$user->data['user_colour']=$user_save['user_colour'];

				$success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_CREATED' : 'MESSAGES_CREATED';
				$redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=' . $cur_folder_id);
				$redirect2 = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);

				meta_refresh(3, $redirect);
				trigger_error($user->lang[$success_msg]. '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect2 . '">', '</a>') . '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $redirect . '">', '</a>'));
			}
			else
			{
				$template->assign_vars(array(
					'MESSAGE_TEXT_EXPLAIN'			=> select_forums('forum_id'),
					)
				);

				$s_hidden_fields = array(
					'cur_folder_id'	=> $cur_folder_id,
					'mark_option'	=> 'create_posts',
					'submit_mark'	=> true,
					'marked_msg_id'	=> $msg_ids
				);

				confirm_box(false, 'CREATE_POSTS_PM', build_hidden_fields($s_hidden_fields));
			}
		break;
после

Код: Выделить всё

	}

	return $address_list;
}
добавить

Код: Выделить всё

function select_forums($key)
{
	global $user, $config, $config, $phpbb_root_path, $phpEx;

	include_once("{$phpbb_root_path}includes/functions_admin.{$phpEx}");

	$forum_list = make_forum_select(false, false, true, true, true, false, true);

	// Build forum options
	$s_forum_options = '<select id="' . $key . '" name="' . $key . '">';
	foreach ($forum_list as $f_id => $f_row)
	{
		$s_forum_options .= '<option value="' . $f_id . '"' . (($f_row['disabled']) ? ' disabled="disabled" class="disabled-option"' : '') . '>' . $f_row['padding'] . $f_row['forum_name'] . '</option>';
	}
	$s_forum_options .= '</select>';

	return $s_forum_options;

}

function create_posts_pm($user_id, $msg_ids, $folder_id, $forum_id)
{
	global $db, $user, $phpbb_root_path, $phpEx;

	$user_id	= (int) $user_id;
	$folder_id	= (int) $folder_id;

	if (!$user_id)
	{
		return false;
	}

	if (!is_array($msg_ids))
	{
		if (!$msg_ids)
		{
			return false;
		}
		$msg_ids = array($msg_ids);
	}

	if (!sizeof($msg_ids))
	{
		return false;
	}

	$sql="SELECT forum_id, forum_name, enable_indexing FROM ".FORUMS_TABLE." WHERE forum_id='{$forum_id}'";
	$result=$db->sql_query($sql);
	$forum_data=$db->sql_fetchrow($result);
	$db->sql_freeresult($result);

	if(!sizeof($forum_data))
	{
		return false;
	}

	// Get PM Information for later deleting
	$sql = 'SELECT msg_id
		FROM ' . PRIVMSGS_TO_TABLE . '
		WHERE ' . $db->sql_in_set('msg_id', array_map('intval', $msg_ids)) . "
			AND folder_id = $folder_id
			AND user_id = $user_id";
	$result = $db->sql_query($sql);

	$create_posts_rows = array();
	$num_created = 0;
	while ($row = $db->sql_fetchrow($result))
	{
		$create_posts_rows[$row['msg_id']] = $row['msg_id'];
	}
	$db->sql_freeresult($result);
	unset($msg_ids);

	if (!sizeof($create_posts_rows))
	{
		return false;
	}

	include_once("{$phpbb_root_path}includes/functions_posting.{$phpEx}");

	$sql = 'SELECT pm.*, u.user_id, u.username, u.user_colour
		FROM ' . PRIVMSGS_TABLE . ' pm LEFT JOIN '.USERS_TABLE.' u ON (pm.author_id=u.user_id)
		WHERE ' . $db->sql_in_set('pm.msg_id', array_map('intval', $create_posts_rows)) . "";
	$result = $db->sql_query($sql);
	while($row=$db->sql_fetchrow($result))
	{
		$user->data['user_id']=$row['user_id'];
		$user->ip=$row['author_ip'];
		$user->data['username']=$row['username'];
		$user->data['is_registered']=true;
		$user->data['user_colour']=$row['user_colour'];

		$subject=$row['message_subject'];
		$username='';
		$topic_type=0;
		$poll=array();
		$data=array(
			'forum_name' => $forum_data['forum_name'],
			'topic_title' => $subject,
			'forum_id' => $forum_id,
			'icon_id' => $row['icon_id'],
			'topic_time_limit' => 0,
			//'topic_attachment' => $row['message_attachment'] ? 1 : 0,
			'attachment_data' => array(),
			'topic_desc' => '',
			'post_langvars' => 0,
			//'post_attachment' => $row['message_attachment'] ? 1 : 0,
			'enable_bbcode'		=> $row['enable_bbcode'],
			'enable_smilies'	=> $row['enable_smilies'],
			'enable_urls'	=> $row['enable_magic_url'],
			'enable_sig'		=> $row['enable_sig'],
			'bbcode_bitfield'	=> $row['bbcode_bitfield'],
			'bbcode_uid'		=> $row['bbcode_uid'],
			'post_edit_locked' => 0,
			'message' => $row['message_text'],
			'message_md5' => md5($row['message_text']),
			'enable_indexing' => $forum_data['enable_indexing'] ? true : false,
			'notify_set' => false,
			'notify' => false,
		);
		$update_message = false;
		$update_search_index = $forum_data['enable_indexing'] ? true : false;

		submit_post('post', $subject, $username, $topic_type, $poll, $data, $update_message, $update_search_index);
	}
	$db->sql_freeresult($result);

	/*$sql = 'DELETE
		FROM ' . ATTACHMENTS_TABLE . '
		WHERE ' . $db->sql_in_set('post_msg_id', array_map('intval', $create_posts_rows)) . " AND in_message='1'";
	$result = $db->sql_query($sql);*/

	/*$sql = 'UPDATE ' . ATTACHMENTS_TABLE . " SET in_message='0'
		WHERE " . $db->sql_in_set('post_msg_id', array_map('intval', $create_posts_rows)) . " AND in_message='1'";
	$result = $db->sql_query($sql);*/

	return true;
}
includes/ucp/ucp_pm.php заменить

Код: Выделить всё

				// Is moving PM triggered through mark options?
				if (!in_array($mark_option, array('mark_important', 'delete_marked')) && $submit_mark)
на

Код: Выделить всё

				// Is moving PM triggered through mark options?
				if (!in_array($mark_option, array('mark_important', 'delete_marked', 'create_posts')) && $submit_mark)
includes/ucp/ucp_pm_viewfolder.php заменить

Код: Выделить всё

		$icons = $cache->obtain_icons();

		$color_rows = array('marked', 'replied');
на

Код: Выделить всё

		$icons = $cache->obtain_icons();

		$color_rows = array('marked', 'replied', 'new');
перед

Код: Выделить всё

		// Minimise edits
		if (!$auth->acl_get('u_pm_delete') && $key = array_search('delete_marked', $mark_options))
добавить

Код: Выделить всё

		$auth->acl_get('u_pm_createposts') ? $mark_options[]='create_posts' : '';
language/ru/acp/permissions_phpbb.php после

Код: Выделить всё

	'acl_u_viewonline'	=> array('lang' => 'Может видеть статус присутствия', 'cat' => 'misc'),
	'acl_u_search'		=> array('lang' => 'Может использовать поиск', 'cat' => 'misc'),
добавить

Код: Выделить всё

	'acl_u_pm_createposts' => 	array('lang' => 'Может создавать сообщения из ЛС', 'cat' => 'pm'),
language/ru/ucp.php после

Код: Выделить всё

	'NO_PENDING'	=> 'Нет кандидатов в члены группы',
	'NO_NONMEMBER'	=> 'Нет пустых групп',
добавить

Код: Выделить всё

	'NO_AUTH_CREATE_POSTS'		=> 'У вас нет доступа к функции создания сообщений.',
	'CREATE_POSTS_PM'			=> 'Создать из отмеченных сообщения на форуме',
	'CREATE_POSTS_PM_CONFIRM'			=> '<span style="color:#FF0000;">Пожалуйста убедитесь, что в указанных ЛС нет никаких личных данных</span>, выберите форум в который данные ЛС будут перемещены (вложения перемещены не будут), также необходимо учитывать права доступа авторов ЛС в выбранном форуме.',
	'CREATE_POSTS' => 'Создать из отмеченных сообщения на форуме',
	'MESSAGES_CREATED' => 'Сообщения успешно созданы',
	'MESSAGE_CREATED' => 'Сообщение успешно создано',
styles/prosilver/template/confirm_body.html после

Код: Выделить всё

	<h2>{MESSAGE_TITLE}</h2>
	<p>{MESSAGE_TEXT}</p>
добавить

Код: Выделить всё

	<!-- IF MESSAGE_TEXT_EXPLAIN --><div style="text-align:center;padding-bottom:20px;">{MESSAGE_TEXT_EXPLAIN}</div><!-- ENDIF -->
styles/subsilver2/template/confirm_body.html заменить

Код: Выделить всё

		<td class="row1" align="center"><br /><p class="gen">{MESSAGE_TEXT}</p><br />{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="btnmain" />&nbsp;&nbsp;<input type="submit" name="cancel" value="{L_NO}" class="btnlite" /></td>
на

Код: Выделить всё

		<td class="row1" align="center"><!-- IF MESSAGE_TEXT_EXPLAIN --><div style="text-align:center;padding-bottom:20px;">{MESSAGE_TEXT_EXPLAIN}</div><!-- ENDIF --><br /><p class="gen">{MESSAGE_TEXT}</p><br />{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="btnmain" />&nbsp;&nbsp;<input type="submit" name="cancel" value="{L_NO}" class="btnlite" /></td>
3. Очистить кеш, обновить переделанные стили, назначить права.

Скриншоты:
Права в администраторском разделе

Личное сообщение

Опции для создания сообщения из ЛС




Сообщение из ЛС на форуме


Вернуться в «Минимоды и хаки для phpBB3»