Страница 10 из 10

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 26.12.2018 23:35
MiF84
Здравствуйте. Никак не могу найти решение :(

Есть сторонний php скрипт, добавляющий личное сообщение на форум через submit_pm.

Начинается скрипт так:

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

	define('IN_PHPBB', true); 
		$phpbb_root_path = './forum/'; 
		$phpEx = substr(strrchr(__FILE__, '.') , 1); 

		include ($phpbb_root_path . 'common.' . $phpEx); 
		include ($phpbb_root_path . 'includes/message_parser.' . $phpEx);	
		include ($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);	
		

		$user->session_begin(false); 
		$user->setup();
Все работает, но если я помещаю этот код в функцию, например так:

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

function phpbb3_send_pm($from,$to,$subject,$text)
{
		define('IN_PHPBB', true); 
		$phpbb_root_path = '../forum/'; 
		$phpEx = substr(strrchr(__FILE__, '.') , 1); 

		include ($phpbb_root_path . 'common.' . $phpEx); 
		include ($phpbb_root_path . 'includes/message_parser.' . $phpEx);	
		include ($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);	


		$user->session_begin(false); 
		$user->setup();
То на "$user->session_begin(false);" скрипт молча перестает работать, не выдавая ошибок или намеков, что ему не нравится :(

Пока искал, собрал "коллекцию" переменных, которые возможно требуется объявить глобальными, но не работает.

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

global $db, $config, $auth, $phpEx, $phpbb_root_path, $cache, $user, $template, $phpbb_container, $request, $phpbb_dispatcher;
Подскажите пожалуйста, что ему не нравится? :)

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 11:48
Татьяна5
Эта "шапка" в функции не нужна. Сессия обычно на момент, когда вызывается функция, уже есть

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 11:50
Sheer
Зачем изобретать собственную функцию, когда есть штатная submit_pm ?
Пример

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

<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
include($phpbb_root_path . 'includes/message_parser.' . $phpEx);

// Start session
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();

$user_id = 2; // ID пользователя, от имени которого отправляется ЛС
$user_to = 48; // ID пользователя, которому отправляется ЛС
$pm_subject		= 'цйвйцвцуа'; // Тема ЛС
$message_body = 'dcsdvvцацуац'; // Текст ЛС

$message_parser = new parse_message();
$warn_pm_body = 'dcsdcsd';

$message_parser->message = $message_body;
$message_parser->parse(true, true, true, false, false, true, true);

$pm_data = array(
	'from_user_id'			=> $user->data['user_id'],
	'from_user_ip'			=> $user->ip,
	'from_username'			=> $user->data['username'],
	'enable_sig'			=> false,
	'enable_bbcode'			=> true,
	'enable_smilies'		=> true,
	'enable_urls'			=> false,
	'icon_id'				=> 0,
	'bbcode_bitfield'		=> $message_parser->bbcode_bitfield,
	'bbcode_uid'			=> $message_parser->bbcode_uid,
	'message'				=> $message_parser->message,
	'address_list'			=> array('u' => array($user_to => 'to')),
);

submit_pm('post', $pm_subject, $pm_data, false);

trigger_error($message_body);

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 13:49
MiF84
Sheer писал(а): 27.12.2018 11:50 Зачем изобретать собственную функцию, когда есть штатная submit_pm ?
Внутри этой функции и есть submit_pm. Просто нужно много где вызывать ее, и чтобы не дублировать код и править его в 1 месте если что, нужна эта функция. Вдобавок есть необходимость вызывать submit_pm() в внутри других функций.

Отправлено спустя 5 минут 7 секунд:
Татьяна5 писал(а): 27.12.2018 11:48 Эта "шапка" в функции не нужна. Сессия обычно на момент, когда вызывается функция, уже есть
Нужна возможность вызова функции в "голом" виде, без необходимости предварительно что-ли предпринимать. Предварительно сессия не открыта в моем случае.

Как-то можно все нужное поместить внутрь функции? Чтобы она работала как "черный ящик" независимо от остального кода.

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 13:55
Татьяна5
MiF84 писал(а): 27.12.2018 13:54 без необходимости предварительно что-ли предпринимать
Так не получится
Массив с данными в любом случае заполнять придётся

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 13:57
MiF84
Татьяна5 писал(а): 27.12.2018 13:55 Массив с данными в любом случае заполнять придётся
Хмм... а разве это нельзя сделать внутри функции? Я так понимаю тут проблема в видимости переменных, вопрос только какие надо сделать глобальные, чтобы все работало... разве нет?

Там у меня меняться будет только получатель, тема, и текст, все остальное всегда будет статично.

Отправлено спустя 2 минуты 26 секунд:
Воспрос собстно только заставить работать $user->session_begin(false); внутри функции.

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:06
Татьяна5
Сессию заводят один раз на странице (вызовется второй - будет ошибка) и желательно вне функции
Если "отправитель" будет статичным, то, по-моему, проще попробовать скопировать submit_pm и чуть поправить его так, чтобы сессия не требовалась (не уверена, что учла всё, но это вполне может сработать)

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:13
MiF84
Хотелось просто сделать стандартными средствами, чтобы в случае обновы не рушилась совместимость. Так-то понятно что можно и на прямую в базу все писать.

Заводить сессию на каждой странице тягая лишний phpbb код при каждом запросе на сайт, как-то не гуманно. Ну если других вариантов нет, придется что-то придумывать самописное.

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

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:24
Татьяна5
Вариант ещё проще: передавать данные get- или post-параметрами в отдельный файл, а в нём уже производить отправку ЛС (только защиту от "несанкционированной" отправки ещё добавить, а то мало ли кто на тот файл наткнётся)

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:35
MiF84
Это вариант не удобен, и сейчас резервно так и сделано.

Если я выношу этот код:

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

		define('IN_PHPBB', true); 
			$phpbb_root_path = './forum/'; 
			$phpEx = substr(strrchr(__FILE__, '.') , 1); 

			include ($phpbb_root_path . 'common.' . $phpEx); 
			include ($phpbb_root_path . 'includes/message_parser.' . $phpEx);	
			include ($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);	
За пределы функции, то все работает, да же без старта сессии (и раньше она не запущена).

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

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:39
Татьяна5
MiF84 писал(а): 27.12.2018 14:35все работает
Судя по коду функции, работает не всё

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 14:42
MiF84
Всмысли?

Работает если вызывать ее так НЕ внутри какой-то функции:

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

			define('IN_PHPBB', true); 
			$phpbb_root_path = './forum/'; 
			$phpEx = substr(strrchr(__FILE__, '.') , 1); 

			include ($phpbb_root_path . 'common.' . $phpEx); 
			include ($phpbb_root_path . 'includes/message_parser.' . $phpEx);	
			include ($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);	
		
			phpbb3_send_pm(64,2,'test'.time(),'test_text');
сама функция

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

function phpbb3_send_pm($from,$to,$subject,$text)
{		
		$my_subject=$subject;
		$my_text=$text; 

		$poll = $uid = $bitfield = $options = ''; 

		generate_text_for_storage($my_subject, $uid, $bitfield, $options, false, false, false);
		generate_text_for_storage($my_text, $uid, $bitfield, $options, true, true, true);

		$data = array( 
			'address_list'      => array ('u' => array($to => 'to')),
			'from_user_id'      => $from,
			'from_username'     => 'test',
			'icon_id'           => 0,
			'from_user_ip'      => '127.0.0.1',
			 
			'enable_bbcode'     => true,
			'enable_smilies'    => true,
			'enable_urls'       => true,
			'enable_sig'        => true,

			'message'           => $my_text,
			'bbcode_bitfield'   => $bitfield,
			'bbcode_uid'        => $uid,
		);

		submit_pm('post', $my_subject, $data, false);	
}

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 27.12.2018 15:16
Татьяна5
А, собственно, сессия задействована только если в сообщении есть вложения. Без них работать будет

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 01.02.2019 6:59
Payalnik610
Татьяна5 писал(а): 21.12.2018 7:23 Форум - указать id форума
Вложения - разбирайте файл posting.php, по словам attach и attachments
id сообщения возвращает submit_post, а по этому id можно запросом получить id темы
Спасибо, Submit_post Все Ок.

А можно ли сделать ссылку на новое сообщение в теме с предварительной формой сообщения, т.е. в разных темах разная форма и плюс как эту форму передать?

Re: [FAQ] Как программно добавить тему / пост / личное сообщение

Добавлено: 06.08.2021 2:53
vbnm
Ответ в существующей теме?

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

$data = array( 
'forum_id'	=> 21,// Указываем 'id' форум
	'icon_id'		=> false,
'topic_id' 	=> 10,//  Указываем Тему по 'id' топику
	'enable_bbcode'		=> true,
	'enable_smilies'	=> true,
	'enable_urls'		=> true,
	'enable_sig'		=> true,

	'message'		=> $my_text,
	'message_md5'	=> md5($my_text),
				
	'bbcode_bitfield'	=> $bitfield,
	'bbcode_uid'		=> $uid,

	'post_edit_locked'	=> 0,
	'topic_title'		=> $my_subject,
	'notify_set'		=> false,
	'notify'			=> false,
	'post_time' 		=> 0,
	'forum_name'		=> '',
	'enable_indexing'	=> true,
);

$newPostID = submit_post('reply', $my_subject, '', POST_NORMAL, $poll, $data);