Prima di tutto, è necessario rendere disponibile, nello stesso spazio web, sia il nuovo che il vecchio forum, dove del vecchio forum importano soltanto i file della galleria foto e alcune tabelle del database, prefissati con ppgal_. Questo lavoro abbiamo fatto per il sito www.gnubittol.com, dove è possibile consultare il risultato finale.
Siamo partiti da un vBulletin 3.6.12 e la PhotoPost vBGallery 2.4.2. Sia Photopost che vBulletin non sono cambiati moltissimo da allora, e di conseguenza lo script qui proposto dovrebbe funzionare senza modifiche anche su forum più recenti.
Lo script dispone di alcune righe di configurazione all'inizio e nel mezzo, che sono abbastanza facili da trovare e modificabili con un semplice editor di testo. Unica attenzione da prestare è alla chiusura delle virgolette. Se lo script non parte e/o mostra errori, è necessario rifare tutti i passaggi di configurazione con una copia vergine.
Dopo aver salvato lo script sulla spazio web del forum (il nome dello script è indifferente), è necessario lanciarlo. Dopo aver fatto il backup sia dei file allegati, sia del database!!! Lo script aggiunge direttamente i record nel database e copia i file senza utilizza le API di vBulletin, che è potenzialmente più pericoloso, ma anche molto più potente ... e noi abbiamo bisogno di potenza!
Quando lo script esegue, mostra la clessidra di attesa per svariati minuti, e non va assolutamente interrotto, né aggiornato. Al termine dell'operazione, che potrebbe tardare anche molto, non mostra nulla, pagina bianca. Nel forum invece si dovrebbe vedere il popolamento degli album, e da phpMyAdmin è possibile osservare il riempimento delle tabelle album, attachment, filedata e picturecomment. Nel contempo si creano anche cartelle nel file system, nella cartella indicata degli allegati. Qualora si trovano gli allegati nel database, è necessario esportarli prima!
Al termine dell'importazione, è necessario ricostruire le icone delle anteprima, pena di rallentare notevolmente il caricamento delle pagine dell'album, che tenta di caricare e ridurre le immagini al volo.
Codice PHP:
<?php
/*============================================================================*\
|| ########################################################################## ||
|| # Photo Gallery Import # ||
|| # ---------------------------------------------------------------------- # ||
|| # (C) Copyright Y2K Software s.a.s. 2012 - All Rights Reserved. # ||
|| # This file may not be redistributed in whole or significant part. # ||
|| ########################################################################## ||
\*============================================================================*/
/**
* @author Y2K Software
* @copyright (C) Copyright Y2K Software 2012 - All Rights Reserved
* @version 1.0.0
* @link www.pagerobot.com
*/
@ini_set('memory_limit', '-1');
@ini_set('max_execution_time', '0');
define('SRC_TABLE_PREFIX', 'vb3_');
define('DST_TABLE_PREFIX', 'vb4_');
$attachmentpath = '/var/www/forum/_attach_';
$gallerypath = '/var/www/gallery';
// Connessione al forum sorgente -----------------------------------------------
mysql_connect('localhost:3306', 'nome_utente', 'password');
mysql_select_db('nome_database_sorgente');
// Lettura dati sorgente -------------------------------------------------------
// Categorie
$ppgal_categories = array();
$SQL = "SELECT catid, title, description, active
FROM " . SRC_TABLE_PREFIX . "ppgal_categories
ORDER BY catid";
$rss = mysql_query($SQL);
while($rs = mysql_fetch_assoc($rss))
{
$ppgal_categories["$rs[catid]"] = $rs;
}
mysql_free_result($rss);
// Immagini
$ppgal_images = array();
$SQL = "SELECT imageid, title, description, catid, dateline, userid, username, extension, filename, filesize, width, height, views, open
FROM " . SRC_TABLE_PREFIX . "ppgal_images
ORDER BY imageid";
$rss = mysql_query($SQL);
while($rs = mysql_fetch_assoc($rss))
{
$userid = $rs['userid'];
$userpath = '';
$n = strlen($userid);
for($i = 0; $i < $n; $i++)
{
$userpath .= ($userpath ? '/' : '') . substr($userid, $i, 1);
}
$rs['filename'] = "$gallerypath/files/$userpath/$rs[filename]";
$rs['dst'] = "$attachmentpath/$userpath";
$ppgal_images["$rs[imageid]"] = $rs;
}
mysql_free_result($rss);
// Commenti
$ppgal_posts = array();
$SQL = "SELECT postid, title, userid, username, dateline, pagetext, imageid, visible, allowsmilie, ipaddress
FROM " . SRC_TABLE_PREFIX . "ppgal_posts
ORDER BY postid";
$rss = mysql_query($SQL);
while($rs = mysql_fetch_assoc($rss))
{
$ppgal_posts["$rs[postid]"] = $rs;
}
mysql_free_result($rss);
//print_r($ppgal_categories); die;
//print_r($ppgal_images); die;
//print_r($ppgal_posts); die;
// Connessione al forum destinazione -------------------------------------------
mysql_connect('localhost:3306', 'nome_utente', 'password');
mysql_select_db('nome_database_destinazione');
// Importazione
/**
* L'importazione manca di due parametri: informazioni aggiuntive (exif), che si
* possono però aggiungere alla descrizione della singola immagine, e le
* categorie di immagini, che si possono creare però a livello utente in forma
* di album separati.
* Facciamo a meno delle informazioni aggiuntive, ma creiamo gli Album per gli
* utenti (se esiste effettivamente una immagine).
* Inoltre non si creano e non si importano le anteprime, che si dovranno invece
* ricostruire dall'area manutenzione.
* Si prende la prima immagine come cover.
*/
// Per tutte le immagini ...
foreach($ppgal_images as $ikey => $ivalue)
{
// Cerca e crea categoria aka "album" utente se mancante
$newalbum = false;
$category = &$ppgal_categories["$ivalue[catid]"];
$title = mysql_escape_string($category['title']);
$description = mysql_escape_string($category['description']);
$SQL = "SELECT albumid
FROM " . DST_TABLE_PREFIX . "album
WHERE userid=$ivalue[userid]
AND title='$title'";
$rss = mysql_query($SQL);
$rs = mysql_fetch_assoc($rss);
mysql_free_result($rss);
if(!$rs)
{
// Crea album
$newalbum = true;
$SQL = "INSERT INTO " . DST_TABLE_PREFIX . "album SET
userid=$ivalue[userid],
createdate=$ivalue[dateline],
visible=0,
title='$title',
description='$description',
state=IF($category[active], 'public', 'private')";
mysql_query($SQL);
$albumid = mysql_insert_id();
}
else
{
$albumid = $rs['albumid'];
}
// Inserimento immagine: Filedata
$SQL = "SELECT filedataid
FROM " . DST_TABLE_PREFIX . "filedata
WHERE userid=$ivalue[userid]
AND dateline=$ivalue[dateline]
AND filesize=$ivalue[filesize]
AND width=$ivalue[width]
AND height=$ivalue[height]
AND refcount=2";
$rss = mysql_query($SQL);
$rs = mysql_fetch_assoc($rss);
mysql_free_result($rss);
if(!$rs)
{
$SQL = "INSERT INTO " . DST_TABLE_PREFIX . "filedata SET
userid=$ivalue[userid],
dateline=$ivalue[dateline],
filesize=$ivalue[filesize],
extension='$ivalue[extension]',
width=$ivalue[width],
height=$ivalue[height],
refcount=2";
mysql_query($SQL);
$filedataid = mysql_insert_id();
}
else
{
$filedataid = $rs['filedataid'];
}
// Inserimento immagine: Attachment
$filename = mysql_escape_string(basename($ivalue['filename']));
$caption = mysql_escape_string("<b>$ivalue[title]</b>\r\n$ivalue[description]");
$SQL = "SELECT attachmentid
FROM " . DST_TABLE_PREFIX . "attachment
WHERE filedataid=$filedataid";
$rss = mysql_query($SQL);
$rs = mysql_fetch_assoc($rss);
mysql_free_result($rss);
if(!$rs)
{
$SQL = "INSERT INTO " . DST_TABLE_PREFIX . "attachment SET
contenttypeid=8,
contentid=$albumid,
userid=$ivalue[userid],
dateline=$ivalue[dateline],
filedataid=$filedataid,
state=IF($ivalue[open], 'visible', 'moderation'),
counter=$ivalue[views],
filename='$filename',
caption='$caption',
displayorder=$filedataid";
mysql_query($SQL);
$attachmentid = mysql_insert_id();
}
else
{
$attachmentid = $rs['attachmentid'];
}
// Inserimento immagine: File system
@mkdir($ivalue['dst'], 0777, true);
@unlink("$ivalue[dst]/0.attach");
$dstfilename = "$ivalue[dst]/$attachmentid.attach";
if(!file_exists($dstfilename))
{
copy($ivalue['filename'], $dstfilename) or die;
}
// Inserimento immagine: Post / Comment
foreach($ppgal_posts as $pkey => $pvalue)
{
if($pvalue['imageid'] == $ivalue['imageid'])
{
$username = mysql_escape_string(basename($pvalue['username']));
$title = mysql_escape_string(basename($pvalue['title']));
$pagetext = mysql_escape_string(basename($pvalue['pagetext']));
$ipaddress = intval(sprintf('%u', ip2long($pvalue['ipaddress'])));
$SQL = "INSERT INTO " . DST_TABLE_PREFIX . "picturecomment SET
postuserid=$pvalue[userid],
postusername='$username',
dateline=$pvalue[dateline],
state=IF($pvalue[visible], 'visible', 'moderation'),
title='$title',
pagetext='$pagetext',
ipaddress=$ipaddress,
allowsmilie=$pvalue[allowsmilie],
filedataid=$filedataid,
userid=$ivalue[userid],
sourcecontenttypeid=8,
sourcecontentid=$albumid,
sourceattachmentid=$attachmentid";
mysql_query($SQL);
$picturecommentid = mysql_insert_id();
unset($ppgal_posts[$pkey]);
}
}
// Aggiornamento ultima immagine nell'album e conteggio
if($newalbum)
{
$SQL = "UPDATE " . DST_TABLE_PREFIX . "album SET
coverattachmentid=$attachmentid,
lastpicturedate=$ivalue[dateline],
visible=1
WHERE albumid=$albumid";
}
else
{
$SQL = "UPDATE " . DST_TABLE_PREFIX . "album SET
lastpicturedate=$ivalue[dateline],
visible=visible+1
WHERE albumid=$albumid";
}
mysql_query($SQL);
}
Messaggio vBulletin