|
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.
|
|
|
|