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

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

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

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

Сообщение MiF84 » 26.12.2018 23:35

Здравствуйте. Никак не могу найти решение :(

Есть сторонний 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
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 11:48

Эта "шапка" в функции не нужна. Сессия обычно на момент, когда вызывается функция, уже есть

Аватара пользователя
Sheer
phpBB Guru
phpBB Guru
Сообщения: 11488
Зарегистрирован: 18.02.2007 19:01
Откуда: Калининград не Кенигсберг
Благодарил (а): 53 раза
Поблагодарили: 2579 раз

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

Сообщение Sheer » 27.12.2018 11:50

Зачем изобретать собственную функцию, когда есть штатная 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
Зарегистрирован: 21.10.2010 8:31
Благодарил (а): 5 раз

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

Сообщение MiF84 » 27.12.2018 13:49

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

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

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

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 13:55

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

MiF84
phpBB 1.2.0
Сообщения: 16
Зарегистрирован: 21.10.2010 8:31
Благодарил (а): 5 раз

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

Сообщение MiF84 » 27.12.2018 13:57

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

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

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

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 14:06

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

MiF84
phpBB 1.2.0
Сообщения: 16
Зарегистрирован: 21.10.2010 8:31
Благодарил (а): 5 раз

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

Сообщение MiF84 » 27.12.2018 14:13

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

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

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

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 14:24

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

MiF84
phpBB 1.2.0
Сообщения: 16
Зарегистрирован: 21.10.2010 8:31
Благодарил (а): 5 раз

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

Сообщение MiF84 » 27.12.2018 14:35

Это вариант не удобен, и сейчас резервно так и сделано.

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

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

		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
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 14:39

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

MiF84
phpBB 1.2.0
Сообщения: 16
Зарегистрирован: 21.10.2010 8:31
Благодарил (а): 5 раз

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

Сообщение MiF84 » 27.12.2018 14:42

Всмысли?

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

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

			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
Поддержка
Поддержка
Сообщения: 9754
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2717 раз

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

Сообщение Татьяна5 » 27.12.2018 15:16

А, собственно, сессия задействована только если в сообщении есть вложения. Без них работать будет

Payalnik610
phpBB 1.2.1
Сообщения: 20
Зарегистрирован: 24.02.2015 6:26
Благодарил (а): 1 раз

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

Сообщение Payalnik610 » 01.02.2019 6:59

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

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

Вернуться в «Для авторов»