Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

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

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение 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;
Подскажите пожалуйста, что ему не нравится? :)
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

Эта "шапка" в функции не нужна. Сессия обычно на момент, когда вызывается функция, уже есть
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 9 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 41 раз
Поблагодарили: 1717 раз

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

Сообщение 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);
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение MiF84 »

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

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

Как-то можно все нужное поместить внутрь функции? Чтобы она работала как "черный ящик" независимо от остального кода.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

MiF84 писал(а): 27.12.2018 13:54 без необходимости предварительно что-ли предпринимать
Так не получится
Массив с данными в любом случае заполнять придётся
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение MiF84 »

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

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

Отправлено спустя 2 минуты 26 секунд:
Воспрос собстно только заставить работать $user->session_begin(false); внутри функции.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

Сессию заводят один раз на странице (вызовется второй - будет ошибка) и желательно вне функции
Если "отправитель" будет статичным, то, по-моему, проще попробовать скопировать submit_pm и чуть поправить его так, чтобы сессия не требовалась (не уверена, что учла всё, но это вполне может сработать)
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение MiF84 »

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

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

Вообще странно, что этот вопрос оказался сложно разрешимым... Невозможность использовать одну функцию внутри другой, хмм...
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

Вариант ещё проще: передавать данные get- или post-параметрами в отдельный файл, а в нём уже производить отправку ЛС (только защиту от "несанкционированной" отправки ещё добавить, а то мало ли кто на тот файл наткнётся)
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение 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);	
За пределы функции, то все работает, да же без старта сессии (и раньше она не запущена).

Ну раз очевидного решения проблемы нет, буду ковырять исходники, смотреть что ему не нравится. Спасибо.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

MiF84 писал(а): 27.12.2018 14:35все работает
Судя по коду функции, работает не всё
MiF84
phpBB 1.2.0
Сообщения: 16
Стаж: 14 лет 1 месяц
Благодарил (а): 3 раза

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

Сообщение 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);	
}
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12617
Стаж: 13 лет 4 месяца
Благодарил (а): 170 раз
Поблагодарили: 2535 раз

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

Сообщение Татьяна5 »

А, собственно, сессия задействована только если в сообщении есть вложения. Без них работать будет
Payalnik610
phpBB 1.4.1
Сообщения: 40
Стаж: 9 лет 9 месяцев
Благодарил (а): 3 раза
Поблагодарили: 2 раза

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

Сообщение Payalnik610 »

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

А можно ли сделать ссылку на новое сообщение в теме с предварительной формой сообщения, т.е. в разных темах разная форма и плюс как эту форму передать?
vbnm
phpBB 1.2.0
Сообщения: 13
Стаж: 13 лет 6 месяцев

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

Сообщение 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);

Вернуться в «Для разработчиков»