• Importazione Galleria Photopost nell'album di vBulletin

    Per chi passa dalla versione 3 alla versione 4 di vbulletin, si trova a dover fare scelte difficili, perché spesso si perdono plugin utili con il passaggio. Con questo articolo mostriamo come importare la galleria Photopost dalla versione 3 negli album di vBulletin 4.

    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$i1);
        }
        
    $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'], 0777true);
        @
    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);
    }
    Commenti 1 Commento
    1. L'avatar di Ricsca
      Ricsca -
      Secondo me più che trasferire le immagini negli album di vbulletin era meglio aggiornare photopost