Leggi le ultime novità dal web

Spip: condivisione del core e della tabella utenti

Con questo articolo voglio mostrarvi la soluzione per sviluppare una serie di siti, organizzati in domini e sottodomini (www.esempio.it, sito1.esempio.it, sito2.esempio.it ecc.), che condividono tra loro lo stesso “core” di spip.

Sul web sono già presenti guide su questo argomento, qui però troverete di più: vi spiegherò come è possibile condividere anche gli utenti che, una volta iscritti al sito sito1, risulteranno iscritti anche agli altri siti.

Premetto che nell’articolo saranno trattati argomenti abbastanza tecnici, ma anche chi non possiede queste competenze, seguendo la procedura alla lettera senza porsi troppe domande, potrà ottenere il risultato desiderato.

Condivisione del core

Per far sì che tutti i siti condividano i file del "core", dovremo innanzitutto far puntare tutti i sottodomini alla cartella root di spip.
Poi, all’interno di quest’ultima creeremo la cartella /sites che conterrà le cartelle /www, /sito1, /sito2 ecc. per il dominio e ogni sottodominio che si intende creare.

Ogni cartella sito conterrà le cartelle /IMG, /config, /local, /tmp.

All’interno della cartella config nella root di spip, creare il file mes_options.php con il seguente codice:

<?php
$rep = 'sites/';
preg_match('/^([a-zA-Z_-]+)/', $_SERVER['HTTP_HOST'], $r);
//prefisso del sito centrale
$www_perfix = 'www';
$site = ($r[1]!='www')? $r[1] : $www_perfix ;
$path = _DIR_RACINE . $rep . $site . '/';


// path search order
define('_SPIP_PATH',
        $path . ':' .
        _DIR_RACINE .':' .
        _DIR_RACINE .'squelettes-dist/:' .
        _DIR_RACINE .'prive/:' .
        _DIR_RESTREINT);

// add the squelettes template folder
if(is_dir($path . 'squelettes')){
        $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';
}

// example of logs at the root for all sites
define('_FILE_LOG_SUFFIX', '_' . $site . '.log');
define('_DIR_LOG',  _DIR_RACINE . 'log/');

// prefixes for cookies and tables:
define('_SQL_PREFIX_ROOT', $www_perfix.'_');
$cookie_prefix = $table_prefix = $site;


// execute the config/mes_option.php file for the mutualised site
if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php'))
        include($f);

// start the site
spip_initialisation(
        ($path . _NOM_PERMANENTS_INACCESSIBLES),
        ($path . _NOM_PERMANENTS_ACCESSIBLES),
        ($path . _NOM_TEMPORAIRES_INACCESSIBLES),
        ($path . _NOM_TEMPORAIRES_ACCESSIBLES)
);

?>

Adesso tutti i nostri sotto domini del tipo sito1.esempio.it, sito2.esempio.it condivideranno tutti i file di spip comprese le squelettes.

Nel momento in cui vorremo creare delle squelette per un singolo sito (es. per il sito1), creeremo la cartella squellettes all’interno della cartella sites/sito1, in cui andremo a salvare tutte le squelette che dovranno essere usate esclusivamente dal sito desiderato.

Le squelette che vogliamo siano da tutti i siti, le salveremo, come al solito, nella cartella squellette nella root di spip.

Capite come questa soluzione consenta un gran risparmio di spazio di memoria su disco oltre a facilitare l’aggiornamento della grafica in siti che condividono uno o più modelli.

Condivisione tabella utenti

Adesso, al fine di condividere gli utenti tra i vari siti, dovremo apportare alcune modifiche al codice della logica di spip.

Creare il file squelettes/req/mysql.php come copia del file ecrire/req/mysql.php, quindi modificare le seguenti righe:

//
// Changer les noms des tables ($table_prefix)
// Quand tous les appels SQL seront abstraits on pourra l'ameliorer

define('_SQL_PREFIXE_TABLE', '/([,\s])spip_/S');
define('_SQL_PREFIXE_TABLE_AUTEURS', '/([,\s])spip_(auteurs)([^_]|$)/S');

// http://doc.spip.org/@traite_query
function traite_query($query, $db='', $prefixe='') {

        if ($GLOBALS['mysql_rappel_nom_base'] AND $db)
                $pref = '`'. $db.'`.';
        else $pref = '';

        if ($prefixe){
                // definisco il prefisso della tabella unica auteurs
                $pref_auteurs = $pref.'root_';
                //tutte le altre tabella avranno il prefisso del sito
                $pref .= $prefixe . "_";
        }

        if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
                $suite ='';
        } else {
                $suite = strstr($query, $regs[0]);
                $query = substr($query, 0, -strlen($suite));
                if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite, $r)) {
                  $suite = $r[1] . traite_query($r[2], $db, $prefixe);
                }
        }
        // sostituzione del prefisso `db`.spip_auteurs con `db`.www_auteurs
        if (preg_match(_SQL_PREFIXE_TABLE_AUTEURS, $query)){

                $r = preg_replace(_SQL_PREFIXE_TABLE_AUTEURS, '\1'.$pref_auteurs.'\2\3', $query) . $suite;
        }
        else {
                //sostituzione del prefisso per tutte le altre tabelle non auteurs
                $r = preg_replace(_SQL_PREFIXE_TABLE, '\1'.$pref, $query) . $suite;
                #        spip_log("traite_query: " . substr($r,0, 50) . ".... $db, $prefixe");
        }
        return $r;
}

Creare il file squelettes/action/iconifier.php come copia di ecrire/action/iconifier.php e apportare le seguenti modifiche.

In cima al file inserire la riga:

define('_DIR_LOGOS_AUTEURS', preg_replace('/(.*)(sites\/[a-z]+\/)(.*)/', '\1\3', _DIR_LOGOS));

modificare le funzioni action_spip_image_effacer_dist e
action_spip_image_ajouter_dist inserendo in cima:

$dir_logos = (preg_match('/^aut/',$arg)) ? _DIR_LOGOS_AUTEURS : _DIR_LOGOS ;

Creare il file squelettes/inc/chercher_logo.php come copia di ecrire/inc/chercher_logo.php e apportare le seguenti modifiche.

In cima al file inserire la riga

define('_DIR_LOGOS_AUTEURS', preg_replace('/(.*)(sites\/[a-z]+\/)(.*)/', '\1\3', _DIR_LOGOS));

modificare la funzione inc_chercher_logo inserendo in cima:

$type = type_du_logo($_id_objet);
$nom = $type . $mode . intval($id);
$dir_logos = ($type == 'aut') ? _DIR_LOGOS_AUTEURS : _DIR_LOGOS ;

Alla fine di questa procedura si potranno creare nuovi autori dal sito principale (es. www.esempio.it) e questi ultimi saranno riconosciuti da tutti i sottodomini (es. sito1.esempio.it, sito2.esempio.it ecc.).

New Com Web Srls - Via Valle Scrivia, 14 - 00141 Roma - C.F./P.Iva 13586351002 - REA: RM-1458775
Informativa sulla Privacy | Contatti