# Gestione Temi - Analisi Sistema di Theming

**Data Analisi:** 2025-07-29  
**Codebase:** CHEWEBAPP  
**Schemi Database:** `docs/cheweb_schema.sql`, `docs/chereport_schema.sql`

## **PANORAMICA SISTEMA**

Il sistema di gestione temi di CHEWEBAPP implementa un sistema di theming completo e flessibile che permette la personalizzazione dell'interfaccia utente per diversi clienti/brand. Il sistema è basato su database MySQL con supporto per toolbar configurabili, template HTML personalizzabili e risorse tema-specifiche.

---

## **ARCHITETTURA DATABASE**

### **Schema Entità-Relazione**

Gli schemi database (`docs/cheweb_schema.sql`) definiscono la seguente struttura:

#### **Tabella `thema`**
```sql
CREATE TABLE `thema` (
  `id_thema` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(20) DEFAULT NULL,          -- Nome display del tema
  `molt_orizz` int(11) DEFAULT NULL,        -- Moltiplicatore orizzontale
  `molt_vert` int(11) DEFAULT NULL,         -- Moltiplicatore verticale
  `path` varchar(100) DEFAULT NULL,         -- Percorso cartella tema
  `tipo_toolbar` varchar(15) DEFAULT NULL,  -- Tipo toolbar (icone/icone_css/descr)
  `is_popup` char(1) DEFAULT 'N',          -- Modalità popup
  `descrizione` varchar(255) DEFAULT NULL, -- Descrizione tema
  PRIMARY KEY (`id_thema`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

#### **Tabella `toolbar_item`**
```sql
CREATE TABLE `toolbar_item` (
  `idtoolbar_item` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `codice` char(10) NOT NULL,               -- Codice identificativo
  `title` varchar(45) NOT NULL,            -- Titolo pulsante
  `icon` varchar(30) NOT NULL,             -- Nome icona classica
  `icon_css` varchar(30) NOT NULL,         -- Nome icona CSS/FontAwesome
  `url` text NOT NULL,                     -- URL di destinazione
  `descr` varchar(100) NOT NULL,           -- Descrizione
  `on_click` text NOT NULL,                -- Codice JavaScript onClick
  `alt` varchar(45) NOT NULL,              -- Testo alternativo
  `only_menu` tinyint(1) unsigned NOT NULL DEFAULT 0, -- Solo nel menu
  `sequence` int(10) unsigned NOT NULL,     -- Ordinamento
  `group` varchar(45) NOT NULL,            -- Gruppo appartenenza
  `sequence_group` int(10) unsigned NOT NULL DEFAULT 0, -- Ordinamento gruppi
  PRIMARY KEY (`idtoolbar_item`),
  UNIQUE KEY `codice` (`codice`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

#### **Tabella `thema_toolbar_item`** (Junction Table)
*Nota: Questa tabella non esiste nel database attuale. La relazione tema-toolbar è implicita attraverso i permessi.*

#### **Tabella `toolbar_item_abilit`** (Permessi)
```sql
CREATE TABLE `toolbar_item_abilit` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idtoolbar_item` varchar(45) NOT NULL,   -- Riferimento toolbar_item
  `KNMSI_cod_sis` varchar(10) NOT NULL,    -- Codice sistema
  `cod_profilo` varchar(32) NOT NULL,      -- Codice profilo utente
  `login` varchar(32) NOT NULL,            -- Login utente specifico
  PRIMARY KEY (`id`),
  UNIQUE KEY `logico` (`KNMSI_cod_sis`,`cod_profilo`,`login`,`idtoolbar_item`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

#### **Tabella `utente`** (Integrazione Utenti)
```sql
CREATE TABLE `utente` (
  `login` varchar(32) NOT NULL,
  `login_as400` char(10) NOT NULL,
  `email` varchar(150) NOT NULL DEFAULT '',
  `stato` char(1) NOT NULL,
  `debug` char(1) NOT NULL,
  `md5_password` varchar(32) NOT NULL DEFAULT '',
  `eliminato` char(1) NOT NULL DEFAULT 'N',
  `themaName` varchar(20) NOT NULL DEFAULT 'STD',  -- Nome tema utente
  `spool_control` char(1) NOT NULL DEFAULT 'N',
  PRIMARY KEY (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

---

## **IMPLEMENTAZIONE PHP**

### **Classe `thema.class.php`**
**Percorso:** `/com/class/thema.class.php`

```php
class thema {
    public $themaName = "";          // Nome display
    public $themaFile = "";          // File tema (non utilizzato)
    public $moltipOrizz = "";        // Moltiplicatore orizzontale
    public $moltipVert = "";         // Moltiplicatore verticale
    public $path = "";               // Percorso cartella
    public $toolbarType = "";        // Tipo toolbar
    public $isPopUp = false;         // Modalità popup
    public $descrizione = "";        // Descrizione
    
    private $_toolbarTypes = array(
        "icone",                     // Solo icone
        "icone_descr",              // Icone + descrizione
        "descr",                    // Solo descrizione
        "icone_css"                 // Icone CSS/FontAwesome
    );
}
```

### **Gestione Temi in `utente.class.php`**
**Percorso:** `/com/class/utente.class.php`

#### **Metodi Principali:**

**`loadThemes()`** - Caricamento temi da database
```php
$sSQL_themes = "SELECT * FROM thema ORDER BY nome";
// Popola array $_STYLES con configurazioni temi
```

**`loadThema()`** - Applicazione tema utente
```php
// Carica tema basato su $this->themaName (default: "STD")
// Imposta $this->objThema con configurazione tema
```

**`setThema($thema)`** - Cambio tema utente
```php
// Aggiorna themaName e ricarica configurazione tema
```

**`getThemaFolder()`** - Percorso assoluto cartella tema
```php
return APP_ROOT_DIR . "/home/template/" . $this->objThema->path;
```

**`getThemaUrl()`** - URL web cartella tema
```php
return APP_ROOT_URL . "/home/template/" . $this->objThema->path;
```

**`getUrlImg($img)`** - Risoluzione immagini tema-specifiche
```php
// Prima cerca in tema corrente, poi fallback a /com/img/
```

---

## **STRUTTURA DIRECTORY TEMI**

### **Percorso Base:** `/home/template/`

### **Tema Standard (STD):**
```
STD/
├── css/
│   ├── style_dom.css         # Stili principali dominio
│   ├── style_popup.css       # Stili finestre popup
│   ├── calendar.css          # Widget calendario
│   ├── personal.css          # Personalizzazioni (vuoto)
│   └── confr/                # Stili confronto
├── html/
│   ├── menu.htm             # Template menu
│   ├── pagina.htm           # Template pagina principale
│   ├── popup.htm            # Template popup
│   ├── thema.htm            # Selettore temi
│   ├── documenti.htm        # Gestione documenti
│   ├── statistiche.htm      # Pagina statistiche
│   └── [altri template]
├── img/                     # Immagini tema-specifiche
│   ├── logo.png            # Logo cliente
│   ├── header.png          # Intestazione
│   ├── [icone toolbar]
│   └── [altri asset]
├── js/
│   └── personal.js          # JavaScript personalizzato
├── help.xml                 # Help sistema
├── menu.xml                 # Configurazione menu
└── templatexml/             # Template XML
```

### **Temi Clienti Disponibili:**
- **Standard:** `STD`, `_Standard`
- **Bancari:** `bancaprogetto_1024`, `capitalfin_1024`, `creditoFond_1024`, `mediocredito_1024`
- **Leasing:** `totalleasing_1024`, `inglease_1024`, `italprestiti_1024`
- **Branded:** `_Amco`, `_BancaCambiano`, `_Cheleo`, `_Capitalfin`, `_Ifiver`
- **Specializzati:** `dovalue`, `prime_1024`, `crif_1024`

---

## **SISTEMA TEMPLATE**

### **Classe `template.class.php`**
**Percorso:** `/com/class/template.class.php`

#### **Sistema Placeholder:**
- **Sintassi:** `{!PLACEHOLDER!}`
- **Principali:**
  - `{!THEMA_URL!}` - URL base tema corrente
  - `{!TOOLBAR!}` - HTML toolbar generata
  - `{!CONTENT!}` - Contenuto principale pagina
  - `{!USER_INFO!}` - Informazioni utente
  - `{!MENU!}` - Menu navigazione

#### **Processo Template:**
1. Caricamento file template da `getThemaFolder()/html/`
2. Sostituzione placeholder con dati dinamici
3. Rendering finale HTML

---

## **TOOLBAR CONFIGURABILE**

### **Generazione Toolbar**
**Classe:** `visualizer.class.php`

#### **Tipi Toolbar Supportati:**
1. **`"icone"`** - Solo immagini
2. **`"icone_descr"`** - Immagini + testo
3. **`"descr"`** - Solo testo
4. **`"icone_css"`** - Icone FontAwesome
5. **`"icone_css_descr"`** - FontAwesome + testo

#### **Query Caricamento:**
```sql
SELECT t.* FROM toolbar_item t
INNER JOIN toolbar_item_abilit at ON t.idtoolbar_item = at.idtoolbar_item 
WHERE (at.KNMSI_cod_sis = ? OR at.KNMSI_cod_sis = '')
  AND (at.cod_profilo = ? OR at.login = ?)
ORDER BY t.sequence_group, t.sequence
```

#### **Rendering Dinamico:**
- Basato su `objThema->toolbarType`
- Supporto gruppi e ordinamento
- Permessi per utente/sistema
- JavaScript onClick personalizzabile

---

## **INTERFACCIA SELEZIONE TEMI**

### **File:** `themeSelector.php`

#### **Funzionalità:**
```php
// Form selezione tema
if(isset($_POST["THEMA"])) {
    $objUtente->setThema($_POST["THEMA"]);
    
    // Opzione salvataggio predefinito
    if(isset($_POST["default"])) {
        $objUtente->update();  // Salva in database
    }
    
    // Refresh finestra parent
    echo "<script>if(opener)opener.document.getElementById('fisso').submit();</script>";
}
```

#### **Template:** `thema.htm`
- Dropdown con temi disponibili
- Checkbox "Rendi predefinito"
- Anteprima immediata
- Integrazione finestra popup

---

## **INTEGRAZIONE APPLICAZIONE**

### **Utilizzo Diffuso:**

#### **Esempi Implementazione:**
```php
// Caricamento template tema-specifico
$tplPath = $objUtente->getThemaFolder() . '/html/pagina.htm';

// URL risorse tema
$data["THEMA_URL"] = $objUtente->getThemaUrl();

// Template processing
$objTpl = new template($tplPath);
$objTpl->loadTemplateFromFile();
```

#### **File che Utilizzano il Sistema:**
- **Core:** 50+ file principali
- **Statistiche:** Tutti i moduli analisiStat/
- **Gestione documenti:** gesdoc.php, uplDoc.php, viewDoc*.php
- **Template aggregati:** templateAgg.php
- **Lookup e popup:** lookup.php, popup vari

### **Personalizzazione Automatica:**
- **Logo cliente** automatico per tema
- **Colori corporate** via CSS
- **Layout responsive** per risoluzioni diverse
- **Risorse fallback** automatiche

---

## **VANTAGGI ARCHITETTURA**

### **Flessibilità:**
- **Multi-tenant:** Ogni cliente può avere tema personalizzato
- **Branding completo:** Logo, colori, layout custom
- **Toolbar dinamica:** Funzionalità per ruolo/permessi
- **Responsive:** Supporto risoluzioni multiple

### **Manutenibilità:**
- **Separazione contenuto/presentazione**
- **Template riutilizzabili**
- **Risorse centralizzate per tema**
- **Fallback automatici**

### **Scalabilità:**
- **Database-driven:** Configurazione via DB
- **Plugin toolbar:** Nuove funzionalità via tabella
- **Temi modulari:** Struttura directory standard
- **Caching implicito:** Risorse statiche per tema

---

## **CONSIDERAZIONI TECNICHE**

### **Performance:**
- Template compilati a runtime
- Risorse statiche servite direttamente
- Caching implicito delle configurazioni tema

### **Sicurezza:**
- Validazione percorsi tema
- Sanitizzazione placeholder
- Controllo permessi toolbar

### **Compatibilità:**
- Supporto browser legacy
- Fallback immagini automatici
- CSS progressivo enhancement

---

## **RACCOMANDAZIONI SVILUPPO**

### **Best Practices:**
1. **Nuovi temi:** Copiare struttura da STD
2. **Personalizzazioni:** Utilizzare personal.css/personal.js
3. **Immagini:** Mantenere naming convention
4. **Testing:** Verificare fallback immagini
5. **Database:** Non modificare struttura core

### **Estensioni Future:**
- Cache template compilati
- Supporto SASS/LESS
- API REST per configurazione temi
- Interfaccia amministrazione web
- Supporto temi dark/light mode

---

**Fine Analisi**