php

Aggiungere programmaticamente un post a phpBB3

Può capitare a volte di voler popolare un forum inserendo post automatici al verificarsi di alcune condizioni. In alcuni casi la cosa è piuttosto semplice e si risolve agendo direttamente sul database.

In scenari più complessi, quando per esempio si usa un software per la gestione del forum un pò più sofisticato, scrivere query per popolare il database con tutte le informazioni necessarie al corretto inserimento di un post diventa difficile.

Nei giorni scorsi mi sono trovato nella situazione di far interagire un sito internet, con un forum basato sulla versione 3 di phpBB ospitato su un server differente. Lo script che presento qui di seguito è il risultato dei miei studi e consente di trasmettere attraverso un form qualsiasi, informazioni da aggiungere ad un forum specifico.

Il codice della pagina di destinazione, che chiaramente deve essere ospitata sullo stesso server su cui gira phpBB3 ed è pertanto scritto in php, è il seguente:

<?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_posting.' . $phpEx);

$titolo = $_POST['titolo'];
$msgBody = $_POST['testo'];
$key = $_POST['key'];
$newsPage = $_POST['pagelink'];

$user->session_begin();
$auth->acl($user->data);

if ($titolo != '') {
	postMessage();
} else {
	header('Location: viewtopic.php?f=2');
}

function postMessage() {
	global $titolo, $key, $newsPage, $msgBody;

	$my_subject	= utf8_normalize_nfc($titolo);
	$my_text	= utf8_normalize_nfc($msgBody);

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

	$uid = 2;

	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(
		'forum_id'		=> 2,
		'icon_id'		=> false,

		'enable_bbcode'		=> true,
		'enable_smilies'	=> true,
		'enable_urls'		=> true,
		'enable_sig'		=> true,

		'topic_approved'	=> true,
		'post_approved'		=> true,

		'message'		=> $my_text,
		'message_md5'	=> md5($my_text),

		'bbcode_bitfield'	=> $bitfield,
		'bbcode_uid'		=> $uid,

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

	submit_post('post', $my_subject, 'Redazione', POST_NORMAL, $poll, $data, $update_message = true);
	    $topic_id = $data['topic_id'];
		$post_id = $data['post_id'];

		mysql_query("UPDATE phpbb_topics SET topic_approved = 1 WHERE topic_id=" . $topic_id);
		mysql_query("UPDATE phpbb_posts SET post_approved = 1 WHERE post_id=" . $post_id);
		mysql_query("UPDATE `phpbb_forums` SET forum_topics = forum_topics + 1, forum_posts = forum_posts + 1 WHERE forum_id = 2;");

		header( "Location: viewtopic.php?f=2&t=" . $topic_id);
}
?>

Il codice in realtà è piuttosto autodescrittivo ed è basato ampiamente sulle rare informazioni che sono riuscito a trovare online in merito a questo argomento. Cerco comunque di spiegare brevemente i punti essenziali.

Nella parte iniziale della pagina vengono inclusi i file di phpBB necessari al funzionamento dello script e subito dopo vengono popolate delle variabili con i dati provenienti dal form esterno.

A questo punto vengono eseguite due funzioni:

$user->session_begin();
$auth->acl($user->data);

delle quali non ho capito esattamente la funzione, ma senza delle quali l’inserimento del post genera un errore. Di certo avviene un qualche cosa a livello di autenticazione dell’utente anche perchè, una volta eseguita questa pagina venono perse le informazioni della sessione di login ed è nuovamente necessario effettuare l’autenticazione.

Quello che avviene all’interno della funzione postMessage() è piuttosto semplice e consiste semplicemente nell’assegnazione di valori ad un array di variabili che determineranno poi le caratteristiche del post inserito.

Al termine dell’inserimento è poi necessario eseguire delle query di aggiornamento in alcune tabelle affinchè le statistiche del forum vengano aggiornate.

Ad essere sinceri lo script presentato qui è molto lontano dall’essere perfetto e necessita di una buona aggiustata. Tuttavia funziona e fa esattamente quello per cui è stato scritto per cui, vista la carenza di documentazione sull’argomento, ho pensato fosse comunque utile condividerlo. A presto!

Lascia un commento