saluzzo banner animated

Installazioni Multiple: Condivisione Generalizzata

Ad ogni installazione di Joomla! corrisponde uno e un solo sito ben preciso.

Al contrario di ciò che accade per altri CMS, indipendentemente dalla possibilità di differenziare graficamente sezioni o aree, ogni installazione di Joomla! consente la gestione di un singolo dominio: ciò significa che si dovranno effettuare tante installazioni quanti sono i domini o sottodomini che si intende gestire. Nella gestione di domini distinti capita spesso di avere la necessità di condividere informazioni tra le distinte installazioni di Joomla!, al fine di evitare la duplicazione delle informazioni e gestire problemi di sincronizzazione dei dati. A causa della limitazione di Joomla! di non poter condividere nativamente elementi tra le installazioni diverse, sempre più spesso capita di ricevere richieste di aiuto su questo tema o richieste di consigli su come procedere. Questo tipo di operazioni sono in genere gestite da script denominati bridge la cui unica funzionalità è appunto quella di "sincronizzare" tabelle diverse, creando, con questo meccanismo, un collegamento tra le varie installazioni e la condivisione degli elementi di interesse.

Questa guida propone una elegante soluzione alternativa affrontando questo problema senza la necessità di scrivere bridge o componenti che si occupino della sicronizzazione tra gli elementi delle distinte installazioni di Joomla!; la soluzione sfrutta una nuova caratteristica di MySQL presente a partire dalla versione 5: le viste.

2 - Requisiti minimi

Installazioni Multiple: Condivisione Generalizzata

La soluzione proposta da questa guida può essere applicata se garantiti i seguenti requisiti minimi:

  1. MySQL 5 o versione superiore
  2. Disporre di un utente con i permessi di struttura :DROP e CREATE VIEW
  3. Installazioni multiple su medesimo server MySQL

3 - Logica della soluzione

Installazioni Multiple: Condivisione Generalizzata

La soluzione proposta in questa guida si basa, come già accennato, su una delle nuove funzionalità introdotte in MySQL a partire dalla versione 5: le viste.

Ma che cos'è una vista? Una vista altro non è che una particolare Query, pensata per mascherare/filtrare i contenuti delle tabelle ed impedire che qualsiasi utente sia libero di accedervi e modificarne il contenuto. Una vista crea, in un certo senso, un alias, un collegamento regolamentato; oltre quindi ad una comune
selezione degli elementi, include in sè l'aspetto legato alla regolamentazione degli accessi e si differenzia, inoltre, dalle normali query di selezione, perchè è memorizzata nel sistema. La definizione di una vista appartiene al database in cui si definisce, ma specificando un diverso nome di database è
possibile memorizzare la vista in un database diverso: la notazione da utilizzare è nome_database.nome_vista.

Di seguito riportiamo la sintassi dell'istruzione CREATE utilizzata per creare una vista, così come riportato nel manuale di riferimento di MySQL:

CREATE

[OR REPLACE]

[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

[DEFINER = { user | CURRENT_USER }]

[SQL SECURITY { DEFINER | INVOKER }]

VIEW view_name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

La soluzione si basa, quindi, sull'idea di sostiuire alcune delle tabelle della seconda installazione con delle viste alle corrispondenti nella prima. Si crea un collegamento, un alias, per alcuni elementi e Joomla! non noterà la differenza, ma al tempo stesso si potranno mantenere distinte altre parti.

Tabelle e viste fanno parte dello stesso spazio dei nomi in un database MySQL: non è possibile, quindi, all'interno del medesimo database avere viste o tabelle con lo stesso nome.

4 - Condivisione Utenti: caso d'uso

Installazioni Multiple: Condivisione Generalizzata

Immaginiamo, ad esempio, di voler condividere tra tre installazioni distinte di Joomla!, quella dedicata al forum, quella con la quale viene gestito il wiki e quella relativa al forge, le configurazioni d'accesso relative agli utenti registrati, al fine di poter avere un unico account con il quale accedere a tutte queste aree.

Consideriamo la seguente situazione: si immagini di aver già provveduto a realizzare due installazioni complete di Joomla!, una direttamente nella cartella principale (root) del nostro dominio e una in una qualsiasi sottocartella. A queste due installazioni accediamo specificando, nel primo caso come url semplicemente http://www.miodominio.it, mentre nel secondo http://www.miodominio.it/joomla.

Come specificato nei requisiti minimi, entrambe le installazioni condividono il medesimo server MySQL, ma non è necessario che condividano anche il medesimo database: consideriamo, quindi, sempre come caso ipotetico, di aver proceduto con la prima installazione a popolare le tabelle in un database joomladb e con la seconda altrojoomladb.

Nel caso si disponesse di un solo database, le tabelle delle due distinte installazioni in esso contenute si differenzierebbero semplicemente per il prefisso delle tabelle, ad esempio, si immagini di aver impostato jos_ per la per la prima installazione e, con molta fantasia, jos2_ per la seconda: la soluzione proposta da questa guida potrebbe comunque essere applicata. Riassumiamo, a questo punto, sinteticamente i parametri di ogni installazione e i due possibili scenari considerati.

Installazioni distinte su database distinti

Parametri prima installazione di Joomla!

Dominio
http://www.miodominio.it
Nome Database joomladb
Prefisso tabelle
jos_

Parametri seconda installazione di Joomla!

Dominio
http://www.miodominio.it/joomla
Nome Database altrojoomladb
Prefisso tabelle
jos_

Installazioni distinte su medesimo database.

Parametri prima installazione di Joomla!

Dominio
http://www.miodominio.it
Nome Database joomladb
Prefisso tabelle
jos_

Seconda installazione di Joomla!

Dominio
http://www.miodominio.it/joomla
Nome Database joomladb
Prefisso tabelle
jos2_


Tabelle Joomla! fondamentali per la gestione utenti

Nella struttura del database di Joomla!, le tabelle preposte alla registrazione dei dati relative alla gestione degli accessi degli utenti sono:

  • jos_users
  • jos_core_acl_aro
  • jos_core_acl_groups_aro_map


Individuate le tabelle su cui agire si tratta, a questo punto, di creare in modo opportuno, con la giusta sequenza di istruzioni SQL, le giuste sostituzioni tra tabelle e viste.

5 - Procedimento

Installazioni Multiple: Condivisione Generalizzata

In questa sezione saranno presentate le istruzioni SQL con le quali si può realizzare la condivisione degli utenti per installazioni distinte di Joomla!, considerando entrambi gli scenari presentati precedentemente.

Come specificato nei requisiti minimi, per poter eseguire il codice riportato di seguito, è necessario che l'utente con il quale si accede al database possegga i permessi di eliminazione delle tabelle (DROP) di creazione delle viste (CREATE VIEW). Se si posseggono tali privilegi, direttamente dalla interfaccia a linea di comando di MySQL o, se si è poco avvezzi a questo tipo di strumenti, utilizzando phpMyAdmin, si può inserendo il codice riportato di seguito.

Prima di procedere si consiglia di effettuare un backup dei dati.

Primo scenario: installazioni distinte su database distinti.

USE altrojoomladb;



DROP TABLE jos_users;

DROP TABLE jos_core_acl_aro;

DROP TABLE jos_core_acl_groups_aro_map;



USE joomladb;



CREATE VIEW altrojoomladb.jos_users AS

SELECT * FROM jos_users;

CREATE VIEW altrojoomladb.jos_core_acl_aro AS

SELECT * FROM jos_core_acl_aro;

CREATE VIEW altrojoomladb.jos_core_acl_groups_aro_map AS

SELECT * FROM jos_core_acl_groups_aro_map;

Analizziamo cosa è stato fatto: una volta autenticati nel sistema, si procede alla selezione del database relativo alla seconda installazione e si eliminano le tabelle contenenti i dati degli utenti; si passa quindi, al database relativo alla prima installazione e si procede alla creazione delle viste che andranno a sostituire le tabelle eliminate.

Secondo scenario: installazioni distinte su medesimo database.

USE joomladb;



DROP TABLE jos2_users;

CREATE VIEW jos2_users AS

SELECT * FROM jos_users;



DROP TABLE jos2_core_acl_aro;

CREATE VIEW jos2_core_acl_aro AS

SELECT * FROM jos_core_acl_aro;



DROP TABLE jos2_core_acl_groups_aro_map;

CREATE VIEW jos2_core_acl_groups_aro_map AS

SELECT * FROM jos_core_acl_groups_aro_map;

Il procedimento relativo al secondo scenario è del tutto equivalente a quello utilizzato per il primo, in questo caso però, si dovrà porre particolare attenzione ad indicare in modo preciso il corretto prefisso delle tabelle.

6 - Condivisione contenuti: caso d'uso

Installazioni Multiple: Condivisione Generalizzata

Concettualmente, la condivisione di informazioni tra installazioni distinte di Joomla! proposta in questa guida è estendibile a qualsiasi altro elemento, sia esso un modulo, un componente o un contenuto.

A dimostrazione di quanto appena affermato si consideri il seguente esempio:

USE altrojoomladb;



DROP TABLE jos_content;

DROP TABLE jos_categories;

DROP TABLE jos_sections;



USE joomladb;



CREATE OR REPLACE VIEW altrojoomladb.jos_content AS

SELECT TRUNCATE((id+0.01)*100,0) AS id,

title,title_alias, introtext, `fulltext`, state,

TRUNCATE((sectionid+0.01)*100,0) AS sectionid, mask,

TRUNCATE((catid+0.01)*100,0) AS catid, created,

created_by, created_by_alias, modified, modified_by,

checked_out, checked_out_time, publish_up,

publish_down, images, urls, attribs, version, parentid,

ordering, metakey, metadesc, access, hits

FROM jos_content

UNION

SELECT TRUNCATE((id+0.02)*100,0) AS id,

title, title_alias, introtext, `fulltext`, state,

TRUNCATE((sectionid+0.02)*100,0) AS sectionid, mask,

TRUNCATE((catid+0.02)*100,0) AS catid, created,

created_by, created_by_alias, modified, modified_by,

checked_out, checked_out_time, publish_up,

publish_down, images, urls, attribs, version, parentid,

ordering, metakey, metadesc, access, hits

FROM jos2_content;



CREATE OR REPLACE VIEW altrojoomladb.jos_categories AS

SELECT TRUNCATE((id+0.01)*100,0) AS id, parent_id, title,

name, image, IF(section REGEXP '[[:digit:]]+',

TRUNCATE((section+0.01)*100,0), section) AS section,

image_position, description, published, checked_out,

checked_out_time, editor, ordering, access, count, params

FROM jos_categories

UNION

SELECT TRUNCATE((id+0.02)*100,0) AS id, parent_id, title,

name, image, IF(section REGEXP '[[:digit:]]+',

TRUNCATE((section+0.02)*100,0), section) AS section,

image_position, description, published, checked_out,

checked_out_time, editor, ordering, access, count, params

FROM jos2_categories;



CREATE OR REPLACE VIEW altrojoomladb.jos_sections AS

SELECT TRUNCATE((id+0.01)*100,0) AS id, title, name, image,

scope, image_position, description, published, checked_out,

checked_out_time, ordering, access, count, params

FROM jos_sections

UNION

SELECT TRUNCATE((id+0.02)*100,0) AS id, title, name, image,

scope, image_position, description, published, checked_out,

checked_out_time, ordering, access, count, params

FROM jos2_sections;

Per cogliere completamente la logica di questo secondo esempio di condivisione, è sufficiente capire quali funzioni assolvano le tabelle considerate e quante installazioni di Joomla! siano in esso coinvolte. Le tabelle scelte, come indicano bene i nomi, consentono di gestire sezioni, categorie e contenuti di Joomla!; le installazioni coinvolte in questo caso, invece, sono tre, suddivise su due distinti database.

Con questo secondo esempio si uniscono i contenuti provenienti da due distinte installazioni di Joomla! in una terza, al fine, ad esempio, di poter riunirli tutti in una sola Home Page.

Aggrediamo la logica del codice SQL iniziando a delinerare gli scenari in cui si colloca ognuna delle installazioni:

Parametri prima installazione di Joomla!

Dominio
http://www.miodominio.it/joomla1
Nome Database joomladb
Prefisso tabelle
jos_

Parametri seconda installazione di Joomla!

Dominio
http://www.miodominio.it/joomla2
Nome Database altrojoomladb
Prefisso tabelle
jos2_

Parametri terza installazione di Joomla!

Dominio
http://www.miodominio.it
Nome Database altrojoomladb
Prefisso tabelle
jos_

7 - Analisi della soluzione

Installazioni Multiple: Condivisione Generalizzata

Una volta autenticati nel sistema, si procede alla selezione del database relativo alla terza installazione, delle tre installazioni di Joomla! è infatti questa quella in cui i contenuti vengono riuniti, e si eliminano le tabelle utilizzate per la gestione dei contenuti; si passa quindi, al database relativo alle altre due installazioni e si procede alla creazione delle viste che andranno a sostituire le tabelle eliminate.

L'unione dei contenuti si ottiene, quindi, sempre grazie alla creazione, anche se più complesse della precedenti, di alcune viste: in questo caso, infatti, anzichè utilizzare per la definizione delle viste semplici query di selezione, si utilizzano query di unione.

Con la clausola UNION è possibile riunire in un solo insieme, i cui nomi delle colonne sono definiti dai campi della prima query, i dati provenienti da estrazioni distinte.

Oltre all'utilizzo della clausola UNION, si è proceduto ad un abile ridefinizione degli id che costituiscono le chiavi primarie degli elementi aggregati: la soluzione scelta, pur mantenendo identificabili gli elementi provenienti dalle varie installazioni, consente di riunirli senza interferenze.

Analizziamone la logica.