Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Realizzazione Di Un Sito Web Dinamico Per La Gestione Di Servizi Rivolti Al Cliente
Realizzazione Di Un Sito Web Dinamico Per La Gestione Di Servizi Rivolti Al Cliente
FACOLTÀ DI INGEGNERIA
rivolti al cliente
Studente:
Giovanni Maggini
Matricola: 48930
Ente ospitante:
3Services S.r.l.
Relatore:
Marina Zanella
Correlatore:
Denis Moras
Indice
1 Introduzione............................................................1
3.1 TypoScript.....................................................................................34
3.2 Struttura, albero delle pagine e contenuti....................................38
3.3 Front-end....................................................................................... 41
3.3.1 Processo di rendering.............................................................41
II
3.3.2 API.........................................................................................43
3.3.3 TSFE......................................................................................44
3.3.4 Oggetti contenuto..................................................................46
3.4 Template.......................................................................................48
3.5 Layout............................................................................... .............55
3.6 Estensioni......................................................................................57
3.7 Utenti TYPO3.................................................................................61
3.7.1 Utenti back-end......................................................................61
3.7.2 Utenti front-end.....................................................................62
4 Svolgimento dell'attività.......................................64
6.1 Ricapitolazione.............................................................................121
6.2 Prospettive future........................................................................121
6.3 Valutazione complessiva.............................................................122
Riferimenti bibliografici, Appendice......................123
III
Nata nel 2002 dalla fusione di tre diverse aziende operanti in Brescia dal
1985, 3Services S.r.l. lavora per mettere a disposizione dei propri clienti
soluzioni per il loro business, seguendoli sotto ogni aspetto utile alla loro
attività: dalla fornitura dell'hardware all'assistenza tecnica, dalla messa a punto
di software gestionali su misura alla realizzazione e gestione di reti.
Un'ampia parte del progetto riguarda l'analisi dei CMS come soluzioni
attualmente disponibili sul mercato informatico e la valutazione di quale sia il
prodotto più adatto alle esigenze dell'azienda in base ai requisiti specificati.
1.3 Strumenti
1.3.1 PHP
PHP (acronimo di “PHP: Hypertext Preprocessor”) è un linguaggio Open
Source cross-platform di scripting general-purpose dedicato allo sviluppo web
che può essere inserito all'interno di codice HTML prodotto dal PHP Group e
rilasciato sotto “Licenza PHP” (meno restrittiva della licenza GNU GPL, a detta
del PHP Group[2]):non esistendo una specifica formale dell'implementazione di
PHP, quella fornita dal PHP Group è considerata uno standard de facto.
Nel nostro ambito, l'interprete PHP installato sul server web riceve come
input uno script PHP e produce una pagina web come output. PHP può essere
installato praticamente su qualunque sistema operativo o piattaforma durante
la fase di sviluppo. Nel presente progetto è stato installato su una piattaforma
Mac OS X 10.4.8; la scelta è coerente con la previsione di installazione su un
server Linux del software realizzato: Mac OS X cade nella categoria dei sistemi
operativi “Unix-like” (o, per seguire le linee guida del “The Open Group”, “UNIX
system-like”) e, nella sua più recente versione 10.5 “Leopard”, Mac OS X è a
tutti gli effetti un prodotto registrato Open Brand UNIX 03.[5][6]
● Iteratori di dati.
1.3.2 Apache
Il Progetto Server HTTP Apache (conosciuto semplicemente come “Apache”)
ha lo scopo di sviluppare e mantenere un server HTTP Open Source per i
moderni sistemi operativi, inclusi UNIX e Windows NT. “L'obiettivo di questo
progetto”, recita la pagina iniziale[8] del Progetto Apache
(http://httpd.apache.org), “è di offrire un server sicuro, efficiente ed estensibile
che fornisce servizi HTTP coerenti agli standard HTTP odierni”.
A partire dal 1996, Apache è diventato il server HTTP più diffuso sul World
Wide Web, incontrando sul suo cammino la concorrenza solo della piattaforma
.NET/IIS (Internet Information Services) di Microsoft e di Sun Java System
Web Server di Sun Microsystems. La diffusione di Apache (oltre il 45% del
mercato secondo gli ultimi dati[9]), la natura Free e Open Source del progetto
l'hanno reso il candidato ideale per lo sviluppo del progetto di questo Stage.
1.3.3 MySQL
MySQL è un database management system (DBMS) relazionale.
Diversamente da Apache, che è sviluppato da una community pubblica e il cui
codice sorgente è copyright dei singoli autori, MySQL è proprietà della svedese
MySQL AB e il software è rilasciato secondo la licenza GPL nella sua forma
denominata “Community Server”. Con il nome MySQL Enterprise si indicano
invece una serie di servizi legati alla gestione del database, forniti tramite
sottoscrizione di abbonamento, che assicurano supporto tecnico, consulenza e
software di monitoraggio non disponibili nella versione “Community”.
Mentre alcuni browser sono disponibili solo per una sistema operativo
(Internet Explorer è volutamente legato ai sistemi operativi Microsoft
Windows), altri sono cross-platform, cioè disponibili per vari sistemi operativi:
Mozilla Firefox, in particolare, è disponibile per sistemi operativi Windows,
Linux e Mac OS X, garantendo quindi agli sviluppatori di pagine web che gli
utenti che accedono al proprio sito web utilizzando Firefox potranno
visualizzare le informazioni in modo identico, indipendentemente dal sistema
operativo utilizzato, nonché sicuro.[13]
Web 2.0 viene percepito come una seconda generazioni di comunità on-line
e di servizi in rete che mirano a semplificare la collaborazione e la condivisione
tra gli utenti in rete. Questo termine è stato coniato nel 2004 da Tim O'Reilly
Non si parla di cambiamenti dal punto di vista tecnologico, non esiste una
“seconda versione” del World Wide Web dal punto di vista delle specifiche e
molte delle tecnologie utilizzate oggi sono in realtà diffuse da molto tempo; si
assiste invece a un cambiamento delle informazioni che vengono scambiate e
dell'utilizzo a cui le attuali tecnologie vengono sottoposte: weblog, social
bookmarking, wiki, podcast, feeds RSS, social software e servizi on-line. É
naturale che, contestualmente ai cambiamenti dal punto di vista sociale, anche
le tecnologie abbiano dovuto sapersi adattare migliorando i software lato-server,
dato il peso sempre maggiore delle applicazioni sul fornitore di servizi, dovuto al
loro spostamento dal sistema operativo al web.
Dopo una attenta analisi delle richieste, che in seguito riassumo, è risultata
vincente la scelta di adottare un CMS e adattarlo alle esigenze dell'azienda.
Durante la prima fase del lavoro di Stage erano stati definiti dall'azienda in
base alle richieste del settore commerciale, i seguenti requisiti (seppure a grandi
linee):
Al di là dei pregi che ogni singolo produttore presenta nelle pagine dedicate
al proprio prodotto, esistono dei punti chiave[18] a favore dell'adozione di un
sistema per la gestione dei contenuti all'interno della propria infrastruttura,
rivolti essenzialmente all'utente finale, che vado a elencare:
1 http://www.onecms.it/21/10/2007/perche-non-utilizzare-un-cms/
Parrebbe proprio, leggendo i punti appena citati, che la scelta del CMS ideale
sia una fatica improba e, nella maggior parte dei casi, frutto di delusioni o di
frustrazioni quando si passa al vero e proprio uso; questo può essere
considerato vero se si tratta di un utente privato che desidera dedicarsi alla
pubblicazione del proprio sito web personale avvalendosi di un CMS ma,
quando si tratta di un CMS di uso aziendale, la scelta viene effettuata da persone
aventi conoscenze tecniche superiori e quindi capaci di valutare pregi e difetti di
un prodotto software, oltre che l'effettiva applicabilità dello stesso in un
contesto aziendale.
Wikipedia ci offre una pagina[22] contenente una lista dei maggiori CMS
disponibili sul mercato e relativa licenza. Alcune demo[23] sono disponibili al
sito opensourcecms.com, che mette a disposizione sistemi CMS installati a cui è
possibile accedere per visionare le potenzialità.
Un altro sito che si è rivelato utile nella scelta del sistema da usare nel lavoro
di Stage è stato cmsmatrix.com, dove è possibile visionare delle tabelle
comparative di moltissimi CMS in circolazione. In particolare, lo spettro della
mia scelta si è ristretto ai famosi Drupal, Joomla! e TYPO3 in quanto tutti
rilasciati sotto licenza Open Source.
MySQL,
MySQL,
Database MySQL PostGreSQL,
Postgres
Oracle, MSSQL
License GNU GPL GNU GPL GNU GPL
Operating System Any Any Any
Programming Language PHP PHP PHP
Root Access No No No
Shell Access No No No
Web Server Apache, IIS Apache Apache, IIS
Security Drupal Joomla! TYPO3
Audit Trail Yes No Yes
Captcha Free Add On Yes Free Add On
Content Approval Yes Yes Yes
Email Verification Yes Yes Yes
Granular Privileges Yes No Yes
Kerberos Authentication No No Free Add On
LDAP Authentication Free Add On Free Add On Free Add On
Login History Yes Yes Yes
NIS Authentication No No Free Add On
NTLM Authentication Free Add On No Free Add On
Pluggable Authentication Yes No Free Add On
Problem Notification No No Yes
Sandbox No No Yes
Session Management Yes Yes Yes
SMB Authentication No No Free Add On
SSL Compatible Yes No Yes
SSL Logins No No Yes
SSL Pages No No Free Add On
Versioning Yes Yes Yes
Support Drupal Joomla! TYPO3
Certification Program No No No
Code Skeletons Yes No Free Add On
Commercial Manuals Yes Yes Yes
Commercial Support Yes Yes Yes
Commercial Training Yes Yes Yes
Developer Community Yes Yes Yes
On-line Help Yes Yes Yes
Pluggable API Yes Yes Yes
Professional Hosting Yes Yes Yes
Professional Services Yes Yes Yes
Public Forum Yes Yes Yes
Public Mailing List Yes No Yes
Test Framework Free Add On No Free Add On
Third-Party Developers Yes Yes Yes
Users Conference Yes Yes Yes
Ease of Use Drupal Joomla! TYPO3
Drag-N-Drop Content Free Add On No Free Add On
Email To Discussion Free Add On Free Add On Free Add On
Friendly URLs Yes Yes Yes
Image Resizing Free Add On Yes Yes
Macro Language Free Add On Yes Yes
Mass Upload Free Add On No Free Add On
Prototyping Limited Yes Free Add On
Server Page Language Yes Yes Yes
Site Setup Wizard Limited
Spell Checker Free Add On No Yes
Style Wizard Limited No Yes
Subscriptions Free Add On No Free Add On
É possibile notare innanzi tutto il fatto che i dati di Joomla! risultano poco
aggiornati ad oggi. Questo è un aspetto importante, tuttavia non fondamentale
in quanto la versione 1.0.x era comunque quella disponibile come release
“stabile” al tempo della scelta del sistema.
2.3.1 Drupal
Drupal è un prodotto software che permette a un privato a una comunità di
utenti di pubblicare, gestire e organizzare una grande varietà di contenuti su un
sito web[24]. Decine di migliaia di persone e organizzazioni hanno usato Drupal
per allestire diversi generi di siti web, inclusi:
● Applicazioni di E-Commerce.
● Direttori di risorse.
rispondente alle specifiche del W3C) dipende quindi dalla qualità del codice che
verrà sostituito all'interno dei tag. [24]
2.3.3 TYPO3
TYPO3 è un Enterprise CMS Open Source rilasciato sotto licenza GPL.[24]
Viene utilizzato da più di 122.000 server in tutto il mondo, è stato tradotto in 43
lingue ed è attivamente sviluppato da una community di oltre 27.000 utenti in
60 Paesi. Tra i suoi utilizzatori compaiono BASF, DaimlerChrysler, EDS,
Konika-Minolta, Volkswagen, UNESCO e altre numerose università, agenzie
governative e organizzazioni non-profit.
Esistono moltissimi altri sistemi per la gestione dei contenuti. Molti di essi
hanno un target specifico riguardo all'utenza e alle funzioni offerte. Un esempio
su tutti è il famoso e diffusissimo WordPress (definito come un “semantic
personal publishing platform”, cioè piattaforma per la pubblicazione personale
di testi sul World Wide Web), sebbene sia a tutti gli effetti un CMS e possa
essere preso in considerazione a buon diritto da parte di chi debba dedicarsi allo
sviluppo di un sito web personale o per una piccola organizzazione. Esso però
non rispecchia le necessità individuate per questo progetto di Stage.
● Gruppi di discussione.
TYPO3 è stato uno dei primi sistemi che ha reso modulare le proprie
funzionalità su diversi livelli. Dall'immagazzinamento (storage) dei dati alla
pubblicazione, questi livelli descrivono classi o moduli. Il livello di storage
contiene le API per la connessione di TYPO3 a diversi tipi di Database oppure
file XML attraverso i cosiddetti handler. D'altro lato TYPO3 ha a propria
disposizione API per estendere il software core, detti “extension system”, che si
connettono a TYPO3 tramite il TYPO3 Extension Manager, che ha anche la
funzione di IDE.
2.4.2 Struttura
La suddivisione più semplice per descrivere l'organizzazione di TYPO3 è
quella in front-end e back-end.
necessario acquisire nozioni e concetti propri della sfera di sviluppo del software
per poter apportare le modifiche essenziali per l'adattamento e il corretto
funzionamento delle estensioni. Successivamente ho dovuto concentrarmi sul
lavoro di amministrazione: scrittura del codice TypoScript, personalizzazione
delle estensioni, configurazione dell'intero sistema. Non mi è poi mancata una
parte di lavoro nel ruolo di redattore, vale a dire l'inserimento dei dati e delle
informazioni per la realizzazione del sito dell'azienda ospitante.
2.4.4 Community
La community TYPO3 è un gruppo internazionale e in rapida crescita di
appassionati e di utenti di TYPO3. Le mailing list rappresentano il centro della
comunità alle quali chiunque può accedere, anche usando software con
supporto ai newsgroup, per la lettura delle discussioni riguardanti i vari aspetti
del software, oppure per la partecipazione attiva richiedendo informazioni o
mettendo a disposizione la propria conoscenza per aiutare gli altri utenti.
ricevuto la risposta dallo sviluppatore stesso della extension con cui avevo
incontrato difficoltà, a riprova della validità di un simile sistema.
La licenza GNU GPL (GNU General Public License) è una licenza per il
software libero, inizialmente scritta da Richard Stallman per il Progetto GNU
(GNU's Not Unix). Costituisce il più famoso e popolare esempio di licenza
copyleft (gioco di parole della parola copyright), cioè dell'utilizzo delle leggi sui
diritti d'autore per rimuovere le restrizioni anziché aggiungerne, che richiede
che i lavori derivati da prodotti rilasciati sotto licenza GPL siano resi disponibili
secondo gli stessi diritti. Basandosi su questa filosofia, i destinatari di un
software rilasciato sotto GPL possono dichiararsi quindi possessori di “software
libero” e i diritti di copyleft utilizzati garantiscono che questa libertà sia
conservata, anche quando il prodotto viene modificato o sono effettuate
aggiunte.
3.1 TypoScript
Un CMS deve essere in grado di gestire vari tipi di contenuto sotto varie
forme dato che, come detto in precedenza, si basa sulla separazione dei
contenuti dalla presentazione.
Per fare un esempio pratico[35], agli utenti dei sistemi Windows è familiare
il concetto di struttura gerarchica di informazioni del sistema con l'utilizzo del
Registro di Configurazione, che mostra i valori come oggetti (Figura 3.1).
I valori e gli oggetti dei record di template, strutturati dal layer intermedio di
TypoScript, sono elaborati da PHP.
Un esempio per chiarire questo concetto: nel codice TypoScript riportato qui
sotto l'informazione, dopo il parsing di PHP, viene inserita in un array
multidimensionale.
myObject.property1 = value_x
myObject.property2 = value_y
myObject.property2.property3 = value_z
$TS['myObject.']['property1'] = 'value_x';
$TS['myObject.']['property2'] = 'value_y';
$TS['myObject.']['property2.']['property3'] =
'value_z';
o, alternativamente:
$TS = array(
'myObject.' => array(
'property1' => 'value_x',
'property2' => 'value_y',
'property2.' => array (
'property3' => 'value_z'
)
)
)
property1 value_x
property2 value_y
myObject property3 value_z
property2.
La struttura del sito viene mostrata nel Page Tree (l'albero delle pagine), un
principio comune in informatica. Il simbolo del globo in cima alla colonna
indica il livello di root (radice) dell'albero, al quale sono aggiunte le pagine che
vengono create, che formano concettualmente i rami e le foglie dell'albero.
Interi gruppi di pagine possono essere spostati, inseriti all'interno di altre
pagine o semplicemente il loro ordine può essere cambiato. In base alle icone
Standard
Advanced
External URL
Shortcut
Not in menu
SysFolder
Quella che più si discosta dal concetto di “pagina” a cui solitamente tutti
fanno riferimento è il tipo di pagina detto “Cartella di sistema”. Nonostante sia
un oggetto di tipo “pagina”, infatti, esso viene rappresentato con l'icona di una
cartella e fornisce un contenitore di informazioni. Non viene mostrato
all'interno dei menu e, nonostante possa contenere pagine, viene solitamente
utilizzato per la gestione delle informazioni e dei record che non vengono
mostrati nel front-end (in questo progetto sono state utilizzate SysFolder per
contenere informazioni sugli utenti del front-end e i file di configurazione per il
template del sito).
In base alla struttura del database di TYPO3, la tabella delle pagine occupa
un ruolo centrale all'interno di esso. Visto che l'ID della pagina è unico, ognuna
di esse può essere collegata e referenziata dalle altre. La struttura ad albero del
sistema permette di organizzare non solo la tabella delle pagine ma tutti i
contenuti del sito web: tutti i record della tabella tt_content, che ha al suo
interno i dati dell'intero sistema (i contenuti delle pagine), hanno assegnato un
identificatore univoco (UID) e sono collegati tra di essi tramite il PID della
pagina corrispondente, in relazione al punto in cui sono stati creati.
3.3 Front-end
● Se la pagina non può essere letta dalla cache, viene mostrata dal
setup di TypoScript e scritta nella cache.
PHP_SCRIPT_EXT.
3.3.2 API
Oltre alle librerie t3lib, sono disponibili altre librerie e oggetti nel front-end.
Il processo di rendering produce la struttura di oggetti illustrata di seguito.
$TSFE (tslib_fe)
|
---> fe_user (tslib_feUserAuth)
|
---> sys_page (t3lib_pageSelect)
|
---> cObj (tslib_cObj)
|
---> myPluginObj (extends tslib_pibase)
|
---> cObj (tslib_cObj)
Nella maggior parte dei casi un'estensione del front-end è un plug-in che
rappresenta una delle classi tslib_pibase. Dal plug-in è possibile quindi avere
accesso diretto alle seguenti classi e oggetti[17]:
tslib_fe
tslib_cObj
tslib_pibase
t3lib_pageSelect
Funzione delle pagine; può essere indirizzata nel front-end tramite l'oggetto
$GLOBALS['TSFE']->sys_page.
t3lib_div
3.3.3 TSFE
Il TypoScript Front End è disponibile come oggetto per i plug-in nella
variabile globale $TSFE e contiene informazioni, metodi e oggetti. Come già detto
in precedenza, TSFE è l'oggetto centrale che controlla l'intero processo di
rendering del front-end. Per molti plug-in è sufficiente l'utilizzo delle funzioni
degli oggetti t3lib_div e cObj, ma all'interno di questo progetto è stato utile
anche l'utilizzo di sys_language_uid nello sviluppo di un'interfaccia multilingua,
tmpl nell'utilizzo dei template e alcune semplici funzioni utili nel debug
dell'applicazione quali set_no_cache().
Segue un estratto[17] dei dati e degli oggetti presenti nella variabile $TSFE.
$TSFE -> id
Registro di TypoScript.
$TSFE -> cObj
L'oggetto $TSFE fornisce anche i metodi utili specifici per i plug-in elencati
di seguito.
getStorageSiterootPids()
Basato sulla rootline corrente (cioè sul “ramo” in cui si trova la pagina
corrente), questo metodo ritorna l'array TSconfig delle pagine.
setJS()
set_no_cache()
verrà creato l'oggetto TEXT chiamato 10, il quale avrà un valore assegnato,
cioè “oggetto di testo”.
10 = TEXT
10.value = oggetto di testo
Nei plug-in c'è un'istanza di tslib_cObj disponibile tramite $this -> cObj.
Questo riferimento all'oggetto è impostato automaticamente durante
l'inizializzazione del plug-in.
data[]
cObjGetSingle()
Crea un cObject nel front-end in base al nome che viene passato ( TEXT,
IMAGE, ...) e con il relativo setup di TypoScript.
stdWrap
Crea una query SQL WHERE che seleziona solo i record validi nelle queries
del front-end.
DbgetUpdate()
DbgetInsert()
Anche i plug-in seguono questo concetto, dato che sono chiamati tramite
USER o USER_INT e si aspettano un metodo con i parametri $content e $conf. Nei
plug-in normali, tuttavia, $content non viene utilizzato e può essere ignorato.
3.4 Template
Parlo ora degli oggetti di alto livello o Top Level Objects (TLO). Mentre i
cObjects rappresentano i contenuti della pagina e, in genere, elementi “esterni”
al sistema (immagini, testo, script in PHP, ecc.), i TLO sono utilizzati dal
sistema come contenitori di cObjects, come variabili di configurazione e librerie
di funzioni. Sono quindi la rappresentazione di dati a un livello di astrazione più
elevato rispetto ai cObjects. Ad essi appartiene il TLO di tipo PAGE, che genera
una pagina del sistema, config che contiene al suo interno le variabili di
configurazione del sito web (ad esempio la lingua predefinita del sito), oppure
● Cache.
● Statistiche/file di log.
● Tipi di pagina.
All'interno del sito web installato nell'ambito del progetto di Stage, la pagina
“rootpage” ha associato un template chiamato NEW SITE (nome di default al
momento della creazione). Questo template contiene poche informazioni, salvo
avere al suo interno il collegamento verso un extension template[37] chiamato
BASE TEMPLATE che contiene le informazioni per la generazione dell'output e
per l'impaginazione dei contenuti.
Template Title
Contiene il nome del template che verrà visualizzato nel back-end. Per
questo campo è possibile specificare le funzioni aggiuntive Deactivated, Start e
Stop, che consentono di stabilire la validità dell'oggetto template.
Website title
É il campo contenente il titolo del sito web, che verrà inserito all'interno del
tag HTML <title></title>.
Constants
Setup
Resources
Clear e Rootlevel
Clear Constants, Clear Setup e Rootlevel sono delle checkbox utilizzate per la
realizzazione di cascading template. In particolare, Rootlevel permette di
definire all'interno di una struttura di pagine quale sarà il punto di partenza
(root) di un intero sito web. Clear Constants e Clear Setup, invece, permettono
di terminare l'eredità di Setup e Constants da parte della corrente pagina
rispetto al template impostato a livello di root.
Include Static
Description
Tra i campi del Template Editor, i due più importanti sono Setup e
Constants. Il primo contiene il codice TypoScript, ovvero quello che definisce
tutte le configurazioni che controllano l'aspetto e il comportamento del sito web.
Il campo Constants, invece, passa al campo Setup valori globali, chiamati
costanti. Questo modo di procedere offre una visione d'insieme quando si tratta
di modificare i valori per singole parti di pagina. Usato nel modo corretto
permette, ad esempio, di modificare un singolo valore per ottenere un
cambiamento di una variabile nell'intero sistema di template.
Campo Constants:
myText.Content = Hello world!
Campo Setup:
pagina = PAGE
pagina {
typeNum = 0
10 = TEXT
10.value = {$myText.Content}
Un ipotetico altro oggetto, per esempio ancora di tipo testo, dovrebbe avere
numero diverso rispetto al precedente per evitare errori. Gli oggetti sono
elaborati in ordine crescente quindi un oggetto con valore inferiore sarà
posizionato all'interno della pagina in posizione precedente agli altri,
indipendentemente da come è posizionato all'interno del codice TypoScript nel
campo Setup.
3.5 Layout
TYPO3 mette a disposizione vari modi per la creazione dei layout tramite i
template TypoScript, uno dei quali è stato scelto per l'utilizzo in questo progetto.
Ad esempio, una tabella HTML può essere creata come un cObject di tipo
CTABLE, e al suo interno potremo riferirci alle varie parti con le aree chiamate
topMenu, leftMenu, rightMenu, bottomMenu e content-cell, previste da
TYPO3.
TemplaVoila!
3.6 Estensioni
automaketemplate/
ext_emconf.php
ext_icon.gif
ext_localconf.php
ext_php_api.dat
doc/
TODO.txt
manual.sxw
pi1/
class.tx_automaketemplate_pi1.php
Gli utenti del sistema TYPO3 sono di due categorie: utenti back-end e utenti
front-end.[17]
Gli utenti front-end (FEUser) sono visitatori del sito web che ottengono
privilegi e autorizzazioni particolari registrandosi (o tramite creazione
dell'account da parte degli amministratori). Ad esempio possono essere
La pagina del sistema contenente i record degli utenti viene creata come
cartella SysFolder all'interno dell'albero delle pagine, selezionando l'estensione
Website Users nel menu Contains Plug-in.
Nel corrente lavoro di Stage, alla pagina è stato dato il nome Utenti. Una
volta salvata, è possibile creare al suo interno nuovi record del tipo User Group,
specificando in questo modo i gruppi di utenti front-end che si vogliono creare.
La creazione degli utenti può avvenire sia da parte degli amministratori
(manualmente) oppure dando agli utenti non registrati la possibilità di
registrarsi all'interno del sito. Per fare questo mi sono avvalso di alcuni plug-in
creati appositamente per la gestione degli utenti front-end.
● MySQL .
Componenti opzionali:
(indispensabile)
Una volta decompressi gli archivi con il comando tar -xzpvf all'interno
della directory del nostro web server, vanno impostati i permessi di accesso ai
file e rinominate le directory in modo da accedere al sistema digitando
l'indirizzo http://127.0.0.1/3services/typo3/index.php, si utilizza il tool di
installazione (Figura 4.1) che, essendo il nostro il primo accesso al sistema, sarà
abilitato di default (i passi per l'installazione sono spiegati in dettaglio nella
documentazione compresa nell'archivio source o alla wiki[38] di TYPO3).
Cartella Contenuto
t3lib/ Librerie TYPO3 e setup del database core (t3lib/stddb/)
typo3/ Codice sorgente del back-end di amministrazione di TYPO3. Può
(condivisa tra tutti i siti essere collegata con un symlink a typo3_src. La maggior parte
web dell'installazione delle cartelle sono protette da scrittura, eccetto quelle presentate in
corrente) Tabella 4.
I file temp_CACHED_xxxxxx_ext_localconf.php e
temp_CACHED_xxxxxx_ext_tables.php sono generati
automaticamente da parte delle estensioni caricate di
ext_localconf.php e ext_tables.php. Possono essere
cancellati in qualunque momento dato che saranno riscritti
all'utilizzo successivo.
typo3temp/ Contiene i file temporanei.
(specifica per ogni sito
web)
uploads/ Contiene i file allegati a record del database gestiti da TCE. Viene
(specifica per ogni sito usata di default per le immagini inserite nell'editor di testo RTE ed
web) è necessaria solo se configurata in $TCA.
Cartella Contenuto
ext/ Contengono estensioni.
sysext/ ext/ viene utilizzata dalle estensioni “globali” e sysext/ dalle le
estensioni di sistema. Entrambi i tipi sono disponibili per tutte le
installazioni che condividono lo stesso codice sorgente.
La differenza sta nel fatto che le estensioni globali possono essere
assenti dal codice sorgente distribuito (possono essere aggiornate
da Extension Manager) mentre le estensioni di sistema sono
“permanenti” e saranno sempre parte del codice sorgente che viene
distribuito. Non è possibile modificare le estensioni di sistema, a
meno che questa opzione non sia impostata in
TYPO3_CONF_VARS.
gfx/ Elementi grafici.
install/ Contiene lo script di inizializzazione del tool di installazione.
mod/ Contiene moduli del back-end. Riflette il concetto di moduli e
sotto-moduli prima dell'avvento delle estensioni ed è usata
essenzialmente per compatibilità e per Extension Manager
(mod/tools/em/).
Esistono quindi dei moduli principali che non possono essere modificati e
che sono a disposizione dell'utenza fin dal primo utilizzo, e cioè:
● Web.
● File.
● Doc.
● Tools.
L'area del modulo Web è quella più utilizzata dagli utenti con responsabilità
di redattori del sito. I contenuti sono salvati sotto forma di pagine e possono
essere qui modificati. É possibile selezionare il sotto-modulo Page per la
creazione e la modifica di pagine all'interno del sito, oppure visualizzare come si
presenteranno al visitatore, elencare tutti gli elementi del sito web o della
singola pagina con la funzione List, ottenere informazioni, impostare le
credenziali di accesso, gestire i template o le varie versioni di una singola
pagina.
Il modulo User viene usato per gestire i Task (ovvero i compiti) all'interno di
un'organizzazione multi-utente che richiede coordinamento tra i membri del
gruppo di lavoro, oltre che per la gestione dello spazio di lavoro. Nel caso
dell'installazione effettuata per il progetto di Stage, il modulo User serve per
gestire gli ordini on-line effettuati attraverso il sistema di shop on-line fornito
dall'apposita estensione.
I file possono essere inseriti nella directory tramite il comando Upload, che
permette di scegliere dei file dal disco e caricarli nel sistema.
Sono stati aggiunti ai tag <td> e <table> le proprietà di tipo id=“ ... ” in
modo che i nomi degli ID siano poi referenziati all'interno del TypoScript
Template.[40]
[...]
[...]
[...]
<!--DWLayoutTable-->
<tr id="topmenu2">
<td width="150" height="21"><img src="images/3services-3s-
giu.gif" width="150" height="21"></td>
[...]
[...]
<td height="48"> </td>
<td id="menu_bottom1" ><div align="center"><ul
class="menu_bottom1">
<font color="#FF0000"><img src="images/crocetta.jpg"
width="10" height="10"></font>
[...]
In questa fase della realizzazione del template, viene creata una nuova
pagina di rootlevel all'interno del modulo Web|Page, che è stata chiamata
rootpage proprio per evidenziarne la caratteristica. Scegliendo New dal menu
contestuale selezionando l'icona del globo terrestre accanto al nome “New
TYPO3 Site” (che in seguito verrà modificato), è possibile scegliere quale record
creare.
Il template appena creato chiamato NEW SITE, quindi, è vuoto tranne per le
seguenti opzioni:
Campo Setup:
# Configuring the Auto-Parser for main template:
plugin.tx_automaketemplate_pi1 {
# Read the template file:
content = FILE
content.file = fileadmin/template1/main/modello1.html
# Here we define which elements in the HTML that
# should be wrapped in subpart-comments:
elements {
BODY.all = 1
BODY.all.subpartMarker = DOCUMENT_BODY
HEAD.all = 1
HEAD.all.subpartMarker = DOCUMENT_HEADER
HEAD.rmTagSections = title
TD.all = 1
TABLE.all = 1
div.all=1
}
# Prefix all relative paths with this value:
relPathPrefix = fileadmin/template1/main/
}
10 = HMENU
10.special = directory
10.special.value = 1
10.1 = TMENU
10.1 {
wrap = <ul class="menu_bottom1-no"> | </ul>
NO {
stdWrap.cObject = COA
stdWrap.cObject {
10 = TEXT
10.field = title
if.value.data = register:count_HMENU_MENUOBJ
if.negate = 1
if.isLessThan.prioriCalc=1
if.isLessThan.cObject=TEXT
if.isLessThan.cObject.insertData=1
if.isLessThan.cObject.value = ({register:count_menuItems}+1)/2
wrap = <li>|</li>
}
}
}
20 < .10
20.1.wrap = <ul class="menu_bottom2-no"> | </ul>
20.1.NO.stdWrap.cObject.if.negate >
}
All'interno del codice, il primo menu che è stato inserito è quello definito
menu_bottom, cioè quello che si occupa di generare, in di ogni pagina, un menu
in basso con il link a tutte le pagine di primo livello[41]. Il fatto che sia il primo
elemento nel listato non influisce sull'ordine degli elementi nella pagina: questo
sarà definito in seguito, gestendo la gerarchia dei cObject. Siccome nella
versione originale il menu era diviso in due righe caratterizzate da diverso
colore nei link, il precedente listato svolge la stessa funzione creando un menu
dinamico prelevando le pagine dal tree del sito web e inserendole all'interno di
un oggetto HMENU (un menu gerarchico) suddiviso in due righe. Siccome le
pagine del sito possono essere modificate, ad esempio cambiando l'ordine,
aggiungendone di nuove o modificando quelle esistenti, il menu viene generato
automaticamente e non è necessaria alcuna modifica al codice nel caso di
variazioni nella struttura del sito. Tutte le definizioni riguardanti colore e
immagine a lato, inoltre, sono contenute nel CSS, avvalorando quanto detto
finora riguardo alla separazione dei compiti tra programmatore e designer.
####LEFT MENU
temp.tmenu= HMENU
temp.tmenu.entryLevel=1
temp.tmenu {
# second level
1 = TMENU
1{
NO{
linkWrap = <p>|</p>
}
ACT=1
ACT{
linkWrap = <p class="menu_left_active">|</p>
}
#CUR=1
#CUR{
# wrapItemAndSub = <li class="menu_left_current-active">|</li>
#}
#IFSUB=1
#IFSUB{
# wrapItemAndSub = <li class="menu-level2-with-subpage">|</li>
#}
}
}
lib.menu_left < temp.tmenu
###########LEFT MENU END
Il LEFT MENU è contenuto nella tabella a sinistra del layout HTML, non è
presente in tutte le pagine in quanto contiene pagine di secondo livello, non
presenti in tutte le sezioni del sito (ad esempio non ci sono nella pagina iniziale).
Per specificare che il livello di questo menu non è la radice del page tree, si
utilizza entryLevel=1.
lib.topmenu1 = HMENU
lib.topmenu1 {
1=GMENU
1.maxItems=5
1 {
wrap (
<td width="150" height="52"><img
src="fileadmin/template1/main/images/3services-3s-su.gif"
width="150" height="52"></td>
| <td><img
src="fileadmin/template1/main/images/3services_12.gif" width="84"
height="52"></td>
<td><img
src="fileadmin/template1/main/images/3services_13.gif" width="224"
height="52"></td>
)
NO {
allWrap= <td> | </td>
XY= 48,52 || 90,52 || 72,52 || 45,52 || 64,52
5=IMAGE
5.file=fileadmin/template1/main/images/3s-home.gif ||
fileadmin/template1/main/images/3s-dove.gif ||
fileadmin/template1/main/images/3s-contatti.gif ||
fileadmin/template1/main/images/3s-news.jpg ||
fileadmin/template1/main/images/3s-offerte.jpg
10=TEXT
10 {
text.field=title
offset=12,46
fontColor=#FFFFFF
fontFile=fileadmin/fonts/RoSSEB28.PFB
fontSize=10px
align=bottom, center
shadow {
offset=0,0
color=#000000
opacity=25
blur=50
niceText=1
}
}
}
RO < .NO
RO=1
#RO.transparentBackground = 1
RO.10.fontColor= #000000
ACT < .RO
ACT=1
}
}
Il menu principale del sito web, ovvero quello presente nella parte superiore
della pagina contenente tutte le sezioni del sito, è stato suddiviso in due parti
per motivi legati alle immagini utilizzate di sfondo. Dato che la prima riga è
costituita da elementi aventi sfondo azzurro e la seconda rosso, la prima parte
viene creata tramite un GMENU (cioè un menu grafico, costituito da immagini)
contenente solo le prime pagine del sito web (specificate con .maxItems=5), le
altre saranno contenute nella seconda parte del menu e ulteriori pagine
eventualmente aggiunte andranno a posizionarsi lateralmente rispetto alla
seconda parte del topmenu.
Inoltre, dato che l'effetto della parte superiore del menu consiste nell'avere
inserito i link all'interno di un'immagine di sfondo creando un'illusione di testo
sovrapposto a un'immagine (in realtà si tratta di più immagini affiancate), è
stato necessario utilizzare più immagini in formato .gif, ognuna come sfondo del
testo del menu. Se fossero state disponibili le le immagini da cui il designer del
sito web era partito, sarebbe stato possibile avere un'unica immagine di sfondo
sulla quale inserire un menu in formato testo (TMENU) e lavorare su quello. In
questo modo vengono create da TypoScript varie immagini formate
dall'immagine iniziale come sfondo e da un elemento testo (10=TEXT)
sovrapposto a ciascuna di esse.
lib.topmenu2 = HMENU
lib.topmenu2 {
1=GMENU
# 1.maxItems=5
1.begin=6
1 {
wrap (
<td width="150" height="21"><img
src="fileadmin/template1/main/images/3services-3s-giu.gif"
width="150" height="21"></td>
| <td width="122" valign="top"><img
src="fileadmin/template1/main/images/spacer.gif" width="123"
height="21"></td>
)
NO {
allWrap= <td> | </td>
XY= [10.w]+10,21
5=IMAGE
5.file=fileadmin/template1/main/images/3s-topmenu2_sfondo.gif
10=TEXT
10 {
text.field=title
offset=3,15
fontColor=#FFFFFF
fontFile=fileadmin/fonts/RoSSEB28.PFB
fontSize=11px
align=left
shadow {
offset=0,0
color=#000000
opacity=25
blur=50
niceText=1
} #chiude la shadow
}
}
RO < .NO
RO=1
#RO.transparentBackground = 1
RO.10.fontColor= #1BCEFB
ACT < .RO
ACT=1
}
}
temp.mainTemplate = TEMPLATE
temp.mainTemplate {
# Feeding the content from the Auto-parser to the TEMPLATE
cObject:
template =< plugin.tx_automaketemplate_pi1
# Select only the content between the <body>-tags
workOnSubpart = DOCUMENT_BODY
Avendo creato tutti gli elementi della pagina e avendo a disposizione, tramite
Template Auto Parser, le varie parti del documento HTML all'interno delle quali
sostituirli tramite l'operatore di copia “<”, il listato qui presentato crea un
oggetto TEMPLATE in cui viene inserito, tramite referenziazione ( =< ), l'output di
Template Auto Parser e vengono copiati nelle sottoparti tutti gli elementi
temporanei o di libreria creati in precedenza.
Infine, viene creato l'oggetto pagina, in cui vengono copiati i dati che
costituiranno <body> e <head> del codice HTML che sarà generato all'accesso dei
browser web al sito.[40]
Illustro ora la realizzazione della pagina iniziale del sito web, a scopo
esemplificativo.
Il form per l'inserimento dei dati del nuovo elemento di contenuto ha al suo
interno un rich text editor fornito, nell'installazione di default, dall'estensione
htmlArea RTE, mentre per il progetto di Stage ho scelto di utilizzare l'estensione
TinyRTE[43] che offre le stesse funzionalità e una compatibilità migliorata con la
versione di Mozilla Firefox prescelta (Figura 4.10).
In questo modo, dato che sono stati utilizzati parte degli stili dal CSS del sito
web preesistente, sono conservati tutti gli stili di caratteri e le combinazioni di
colori per titoli, sottotitoli e testo.
Show Page ( ) permette a questo punto di aprire la pagina del front-end nel
browser e visualizzare il risultato (Figura 4.11).
Per questo motivo la registrazione degli utenti è stata gestita tramite il plug-
in front-end User Registration (sr_user_register) mentre per il login degli
utenti ho scelto di utilizzare Newloginbox (newloginbox), che costituisce
essenzialmente un miglioramento del sistema di login fornito con l'installazione.
Per fare riferimento alle variabili all'interno del plug-in, il codice standard è
il seguente:
plugin.NOMEPLUGIN_pi1.VARIABILE = VALORE
Inserendo il codice nel campo Constants all'interno del root template del sito
web, l'assegnazione avviene nel modo indicato di seguito:
plugin.tx_srfeuserregister_pi1.enableEmailConfirmation = 0
Per l'invio del messaggio email, il file php.ini deve contenere la riga
sendmail_path = /usr/sbin/sendmail
Per l'accesso agli utenti, è stata creata una pagina chiamata Login; essendo
una pagina presente nel ramo principale dell'albero delle pagine, essa è stata
automaticamente inclusa all'interno dei menu. Il campo login e alcune
funzionalità avanzate (quali ad esempio la possibilità di recuperare la password
e la conferma dell'avvenuto login) vengono messe a disposizione dall'estensione
All'interno del ramo avente come radice la pagina di login sono state create
pagine riservate agli utenti autenticati nel sistema. Le impostazioni di sicurezza
delle pagine vengono modificate all'interno del modulo Edit Page, selezionando
le proprietà della pagina e lavorando sul campo Access.
● Tracciabilità dell'ordine.
Dal punto di vista delle pagine front-end, invece, Webformat Shop System va
inserito al loro interno sotto forma di plug-in dal nome Advanced Shop System
come un normale contenuto di pagina; è quindi possibile selezionare il tipo di
visualizzazione tra le quattro disponibili:
Gli ordini vengono salvati nella SysFolder citata in precedenza sotto forma di
nuovo oggetto pagina contenente nuovi record per l'ordine e per ogni prodotto
acquistato.
Nell'ambito del progetto di Stage per contenere i prodotti è stata creata una
SysFolder chiamata, appunto, Prodotti, all'interno della quale sono stati inseriti
i record di tipo “Webformatshop Product”, categoria che si rende disponibile
all'interno del sistema in seguito all'installazione di TYPO3. Questa
organizzazione, sebbene logicamente corretta, non è ufficialmente
supportata[47] da Webformat e quindi anticipa le opzioni che saranno presenti
in una futura versione dello Shop System. Ogni prodotto è assegnato a una
categoria (Webformatshop Category), che in questo caso è stata creata sempre
all'interno della SysFolder Prodotti.
● Codice.
● Titolo.
● Descrizione.
● Numero oggetto.
● Titolo.
● Immagine.
● Quantità disponibile.
● Categoria.
# Template file
plugin.tx_extendedshop_pi1.file.templateFile =
EXT:extendedshop/pi1/shop.html
# CSS file
plugin.tx_extendedshop_pi1.file.cssFile =
EXT:extendedshop/pi1/stileShop.css
# Number of decimals
plugin.tx_extendedshop_pi1.priceDec = 2
# Decimal separator
plugin.tx_extendedshop_pi1.priceDecPoint = ,
# Thousand separator
plugin.tx_extendedshop_pi1.priceThousandPoint = .
# Set to 1 if you want to open a popup when the user clicks #over
the image in the list mode. If 0 the image is a link to #the detail
of the product
plugin.tx_extendedshop_pi1.clickEnlarge_list = 0
# Set to 1 if you want to open a popup when the user clicks #over
the image in the detail mode.
plugin.tx_extendedshop_pi1.clickEnlarge = 1
La procedura di acquisto dei prodotti sul sito di 3Services S.r.l. si avvale del
Webformat Shop System secondo i seguenti passi:
Nel caso di questo progetto di Stage ci si è riferiti a quelli che sono più
correttamente denominati Web Desktop o Webtop, ovvero sistemi che
trasformano il desktop in un servizio accessibile tramite il browser.
effettuare esperimenti per cambiare il rapporto tra gli utenti e gli strumenti
software di utilizzo ormai quotidiano per fornire accesso sempre e ovunque. In
una parola di tratta di compiere esperimenti di centralizzazione.
eyeOS è una piattaforma Open Source progettata per supportare una serie di
applicazioni web al suo interno.
É possibile utilizzare una versione “Live” dal sito del produttore, oppure
accedere ai vari tipi di servizi disponibili per le diverse utenze:
eyeOS consiste per la maggior parte di codice PHP inserito all'interno di file
con estensione .eyecode. A partire dalla versione 1.0, eyeOS è un sistema
operativo moderno basato su microkernel[54], che si occupa del caricamento di
servizi, librerie, widget (elementi dell'interfaccia di eyeOS) e, in cima a tutto
questo, di applicazioni.
5.3 Installazione e
personalizzazione
● account, dove vengono salvati gli account esistenti nel sistema (il
nome della directory è generato automaticamente, ad esempio l'utente
root è salvato in rt4) i cui parametri sono registrati in un file XML.
eyeOS/
|-- eyeOS9a9e09efb8
| |-- accounts
| | |-- mx6
| | `-- rt4
| |-- apps
| | |-- HelloWorld
| | |-- downZip
| | |-- editLink
| | |-- emptyTrash
| | |-- exit
| | |-- eyeAdmin
| | |-- eyeApps
| | |-- eyeBar
| | |-- eyeBoard
| | |-- eyeCalc
| | |-- eyeCalendar
| | |-- eyeChess
| | |-- eyeContacts
| | |-- eyeControl
| | |-- eyeCopy
| | |-- eyeDelete
| | |-- eyeDesk
| | |-- eyeDesk_extras
| | |-- eyeDialog
| | |-- eyeDock
| | |-- eyeDocs
| | |-- eyeDownload
| | |-- eyeFiles
| | |-- eyeGroups
| | |-- eyeImages
| | |-- eyeInfo
| | |-- eyeInstaller
| | |-- eyeLaunch
| | |-- eyeLogin
| | |-- eyeMkDir
| | |-- eyeMp3
| | |-- eyeNav
| | |-- eyeNotes
| | |-- eyePaste
| | |-- eyeProcess
| | |-- eyeProperties
| | |-- eyeRSS
| | |-- eyeRename
| | |-- eyeSoft
| | |-- eyeTrash
| | |-- eyeUpload
| | |-- eyeX
| | |-- eyeZip
| | |-- propertyTrash
| | |-- restoreTrash
| | `-- share
| |-- extern
| | |-- apps
| | `-- libs
| |-- groups
| | |-- gruppo1
| | |-- gruppo2
| | `-- public
| |-- log
| | |-- all
| | |-- proc
| | |-- sec
| | |-- um
| | `-- vfs
| |-- system
| | |-- conf
| | |-- kernel
| | |-- lib
| | `-- services
| `-- users
| |-- mx6
| `-- rt4
`-- img
73 directories
La versione 1.5 di eyeOS integra al suo interno un gestore degli utenti e delle
loro autorizzazioni; per il progetto di Stage è stato utilizzata una versione
precedente allora in stadio di “beta release”, che tuttavia forniva le operazioni di
base sugli utenti e sui gruppi.
Gli effetti grafici di eyeOS sono gestiti tramite AJAX e Javascript, entrambi
linguaggi di scripting utilizzati per la creazione di applicazioni web interattive.
Il modulo di interesse nel corrente progetto e per cui è stato scelto eyeOS è
principalmente eyeFiles, del quale mostro il menu di avvio in Figura 5.5. Esso
rappresenta l'equivalente dell'applicazione Finder di Mac OS X oppure di
Esplora Risorse dei sistemi operativi Windows.
L'unica differenza degna di nota per l'utente sarà il fatto che è necessario
selezionare prima il comando da eseguire ed in seguito cliccare sul file
selezionato, non il viceversa come si è soliti fare.
Per l'utente è possibile quindi navigare all'interno delle sue cartelle, spostare
i file sia all'interno di eyeOS che tra eyeOS e il client che sta utilizzando; per la
condivisione dei file tra gli utenti di eyeOS, è possibile spostarli all'interno della
directory Public per renderli visibili a tutti gli account del sistema, oppure
spostarli all'interno della directory del gruppo di appartenenza per condividerli
solo tra utenti selezionati.
Ricapitolazione, prospettive
future, valutazione complessiva.
Pa gi na 122 6 .1 Ri ca pit o la zio ne
6.1 Ricapitolazione
Durante il periodo di studio di TYPO3, mi sono reso conto della scarsità della
documentazione in lingua italiana presente per questo CMS. Ciò non ha
rappresentato un problema ai fini di questo progetto di Stage, anzi è stato uno
sprone per rendere questa trattazione un possibile riferimento per chi volesse
intraprendere lo sviluppo di siti web con TYPO3.
19: Calvin C. Sov, How do I decide what is the best CMS for me?
44: Rolland S, Holzinger F, User Guide for the Front-end User Registration
Extension, http://typo3.org/documentation/document-library/extension-
manuals/sr_feuser_register/current/
File modello.html
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//IT"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
</head>
<!--DWLayoutTable-->
<tr>
<!--DWLayoutTable -->
<tr>
<td width="1"></td>
</tr>
<tr>
<tr>
</tr>
</table></td>
<td></td>
</tr>
</table></td>
</tr>
<tr>
<tr id="topmenu2">
</tr>
</table></td>
<td class="sfondogiallorosso"></td>
</tr>
</table>
<tr>
<tr>
</tr>
<tr>
</a></p>
</td>
</tr>
<tr>
</tr>
</table>
</td>
<tr>
</tr>
<tr>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
</p></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td class="sottotitolo"><font
color="#990000">Referenze</font></td>
</tr>
<tr>
esigenza.</font></td>
</tr>
<tr>
</tr>
</table>
<table>
<tr>
<td height="48"> </td>
</ul>
<ul class="menu_bottom1b">
</ul></div></td>
</tr>
<tr>
<td height="19"> </td>
<td> </td>
</tr>
</table></td>
<p> </p>
</div></td>
</tr>
</table>
</body>
</html>
lib.splitmenu = COA
lib.splitmenu {
10 = HMENU
10.special = directory
10.special.value = 1
10.1 = TMENU
10.1 {
wrap = <ul class="menu_bottom1-no"> | </ul>
NO {
stdWrap.cObject = COA
stdWrap.cObject {
10 = TEXT
10.field = title
if.value.data = register:count_HMENU_MENUOBJ
if.negate = 1
if.isLessThan.prioriCalc=1
if.isLessThan.cObject=TEXT
if.isLessThan.cObject.insertData=1
if.isLessThan.cObject.value =
({register:count_menuItems}+1)/2
wrap = <li>|</li>
}
}
}
20 < .10
20.1.wrap = <ul class="menu_bottom2-no"> | </ul>
20.1.NO.stdWrap.cObject.if.negate >
}
####LEFT MENU
temp.tmenu= HMENU
temp.tmenu.entryLevel=1
temp.tmenu {
# second level
1 = TMENU
#1.wrap = <ul class="menu_left">|</ul>
1{
NO{
linkWrap = <p>|</p>
}
ACT=1
ACT{
linkWrap = <p class="menu_left_active">|</p>
}
#CUR=1
#CUR{
# wrapItemAndSub = <li class="menu_left_current-active">|</li>
#}
#IFSUB=1
#IFSUB{
# wrapItemAndSub = <li class="menu-level2-with-subpage">|</li>
#}
}
}
lib.menu_left < temp.tmenu
###########LEFT MENU END
lib.topmenu1 = HMENU
lib.topmenu1 {
1=GMENU
1.maxItems=5
1 {
wrap (
)
NO {
allWrap= <td> | </td>
RO < .NO
RO=1
#RO.transparentBackground = 1
RO.10.fontColor= #000000
ACT < .RO
ACT=1
}
lib.topmenu2 = HMENU
lib.topmenu2 {
1=GMENU
# 1.maxItems=5
1.begin=6
1 {
wrap (
)
NO {
allWrap= <td> | </td>
XY= [10.w]+10,21
5=IMAGE
5.file=fileadmin/template1/main/images/3s-topmenu2_sfondo.gif
10=TEXT
10 {
text.field=title
offset=3,15
fontColor=#FFFFFF
fontFile=fileadmin/fonts/RoSSEB28.PFB
fontSize=11px
align=left
shadow {
offset=0,0
color=#000000
opacity=25
blur=50
niceText=1
} # la shadow
RO < .NO
RO=1
#RO.transparentBackground = 1
RO.10.fontColor= #1BCEFB
ACT < .RO
ACT=1
} # GMENU 1
###BEGIN languageMenu
/*
temp.languageMenu < plugin.tx_srlanguagemenu_pi1
temp.languageMenu.languagesUidsList = 0,1
temp.languageMenu.defaultLayout= 0
temp.languageMenu.defaultLanguageISOCode = IT
#marks.LANGUAGE < plugin.tx_srlanguagemenu_pi1
*/
temp.languageMenu = COA
temp.languageMenu {
10 = RECORDS
10.tables = tt_content
10.source = 57
}
###END languageMenu
temp.mainTemplate = TEMPLATE
temp.mainTemplate {
# Feeding the content from the Auto-parser to the TEMPLATE
cObject:
template =< plugin.tx_automaketemplate_pi1
# Select only the content between the <body>-tags
workOnSubpart = DOCUMENT_BODY
# Substitute the ###menu_1### subpart with dynamic menu:
subparts.menu_bottom1 < lib.splitmenu
# Substitute the ###content### subpart with some example
content:
#subparts.content < styles.content.get
# Substitute the ###topmenu1### subpart with GMENU TOP Part 1:
subparts.topmenu1 < lib.topmenu1
# Substitute the ###topmenu2### subpart with GMENU TOP Part 2:
subparts.topmenu2 < lib.topmenu2
# Substitute the ###menu_left### subpart with Menu Left:
subparts.menu_left < lib.menu_left
# Substitute the ###content### subpart with content:
subparts.content < styles.content.get
# Substitute the ###languageMenu### subpart with languageMenu
:
subparts.languageMenu < temp.languageMenu
#debug
#page.config.disableAllHeaderCode=1
config.linkVars = L
config.typolinkLinkAccessRestrictedPages = NONE;
config.sys_language_uid = 0
config.language = it
config.locale_all = italian
page.config.htmlTag_langKey = it
[globalVar = GP:L = 5]
config.language = en
config.locale_all = english
config.sys_language_uid = 5
page.config.htmlTag_langKey = en
[global]
BODY {
margin: 0px;
background-image: url('../images/gessato-dx.gif');
background-repeat: repeat-y;
background-position: right;
background-color: #FFFFFF;
}
.testo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-style: normal;
font-weight: normal;
color: #003366;
text-decoration: none;
text-align: justify;
padding: 5px 10px;
white-space: normal;
line-height: normal;
display: compact;
.content {
width: 629px;
border: 0px;
padding: 0px;
.sfondo {
background-color: #FFFFCC;
background-image: url('../images/3s-gessato.gif');
background-repeat: repeat-x;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 9px;
color: #FFFFFF;
}
.niente {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 8px;
font-style: normal;
margin: 1px;
padding: 1px;
height: auto;
width: auto;
}
.credits {
}
.menu-sinistra {
font-family: Verdana, Arial, Helvetica, sans-serif;
background-image: url('../images/3s-gessatobianco.gif');
background-repeat: repeat-y;
}
.testoALLdestra {
font-family: Verdana, Arial, Helvetica, sans-serif;
color: #FFFFFF;
font-size: 9px;
text-align: right;
}
.titolo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 16px;
font-style: normal;
font-weight: bold;
color: #003399;
text-decoration: none;
text-align: justify;
padding: 5px 10px;
white-space: normal;
line-height: normal;
display: compact;
background-image: url('../images/righetta-blu.gif');
background-repeat: repeat-x;
background-position: bottom;
}
.sottotitolo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
font-style: normal;
font-weight: bold;
color: #0099CC;
text-decoration: none;
text-align: justify;
padding: 5px 10px;
white-space: normal;
line-height: normal;
display: compact;
background-image: url('../images/righetta-gialla.gif');
background-position: bottom;
background-repeat: repeat-x;
}
.righetta-blu {
background-image: url('../images/righetta-blu.gif');
background-repeat: repeat-x;
cursor: crosshair;
filter: BlendTrans(Duration=3);
}
.sfondodestra {
background-image: url('../images/gessato-dx.gif');
background-repeat: repeat-y;
background-position: right;
background-color: #FFFFFF;
}
.righetta-bluCopia {
background-image: url('../images/righetta-blu.gif)';
background-repeat: repeat-x;
cursor: crosshair;
filter: BlendTrans(Duration=3);
background-position: center;
}
.menu_left {
font-family: Verdana, Arial, Helvetica, sans-serif;
background-image: url('../images/sfondo-tasti.gif');
background-repeat: repeat-y;
font-size: 10px;
font-weight: bold;
color: #FFFFFF;
font-variant: normal;
text-decoration: underline;
text-align: left;
padding-left: 15px;
vertical-align: text-top;
.menu_left UL.menu_left {
list-style-type: none;
}
.menu_left UL.menu_left_active li {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color: #000000;
font-variant: normal;
text-decoration: none;
}
.menu_left_active {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color: #000000;
font-variant: normal;
text-decoration: none;
}
.menu-sopra {