# Google Calendar Sync Plus — upgrade VTE 26.04: pagina bianca Settings (risolto)

**Versione plugin con fix:** 2.3.17+ (`gspl_compat_maybe_load_smarty_setup`)  
**Verificato su:** vteguzzini — VTE **26.04** (build 3367), PHP **8.3**  
**Data:** 2026-05-18

---

## Sintomo

- URL: `index.php?module=GoogleSyncPlus&action=Settings&parenttab=Settings`
- Shell VTE visibile (menu, header), **area contenuto completamente bianca**
- Cron/sync del modulo possono ancora funzionare in background

## Causa (evidenza runtime)

Dopo upgrade **25.x → 26.04** spesso resta in root il file legacy **`Smarty_setup.php`** (shim deprecato per `vtigerCRM_Smarty`).

Il plugin (≤ 2.3.16) eseguiva:

```php
if (is_file('Smarty_setup.php')) {
    require_once 'Smarty_setup.php';
}
```

Su **VTE 26 + PHP 8.3** quel `require` provoca **fatal error** prima di qualsiasi HTML:

```
PHP Fatal error: Declaration of vtigerCRM_SmartyBase::fetch(...) must be compatible with
VteSmartyBase::fetch(...): Vtenext\Types\HtmlString
in /var/www/html/ISTANZA/Smarty_setup.php on line 10
```

`index.php` carica header/footer; il body del modulo termina in fatal → **pagina bianca**.

**Errore di design del guard originale:** `is_file()` è vero anche quando il file è un residuo post-upgrade; su VTE 26 non va mai incluso.

---

## Correzione nel plugin

### 1. `gspl_compat_maybe_load_smarty_setup()` in `gspl_compat.php`

Carica `Smarty_setup.php` **solo** su VTE 25. Su VTE 26 **non** lo include se:

- esiste `include/utils/VteSmarty.php`, oppure
- `enterprise_current_version >= 26` in `vteversion.php`

```php
function gspl_compat_maybe_load_smarty_setup(): void
{
    if (!is_file('Smarty_setup.php')) {
        return;
    }
    if (is_file('include/utils/VteSmarty.php') || class_exists('VteSmarty', false)) {
        return;
    }
    if (is_file('vteversion.php')) {
        require_once 'vteversion.php';
        if (!empty($enterprise_current_version)
            && version_compare($enterprise_current_version, '26', '>=')) {
            return;
        }
    }
    require_once 'Smarty_setup.php';
}
```

### 2. Sostituzione in `Settings.php` e `bootstrap.php`

```php
require_once __DIR__ . '/gspl_compat.php';
gspl_compat_maybe_load_smarty_setup();
```

`Settings.php` non usa Smarty (HTML inline); il caricamento era solo “difensivo” e dannoso su 26.

---

## Verifica

### CLI (admin)

```bash
cd /var/www/html/vteguzzini
php8.3 -r "
chdir('.');
require 'config.inc.php';
require 'include/utils/utils.php';
VteSession::start();
global \$adb, \$table_prefix;
\$id = \$adb->queryGetFirstValue('SELECT id FROM '.\$table_prefix.'_users WHERE user_name=?', ['admin']);
\$u = CRMEntity::getInstance('Users');
\$u->retrieveCurrentUserInfoFromFile(\$id);
\$current_user = \$u;
require 'modules/GoogleSyncPlus/Settings.php';
"
```

**Atteso:** nessun fatal; output con stringa `Google Calendar Sync Plus` (~19 KB HTML).

### Browser

- Impostazioni → **Google Calendar Sync Plus**
- Compaiono: stato licenza, impostazioni globali, licenze utente, gestione sincronizzazioni

**Esito vteguzzini:** OK (2026-05-18).

---

## Dopo il fix: banner “Aggiornamento VTE rilevato” (normale)

Se la pagina Settings si carica ma compare il banner giallo **“Aggiornamento VTE rilevato”** con file core cambiati (`activity`, `mail`, `calendarhandler`) e versione **25.01.2 → 26.04**:

- **Non** è la pagina bianca: è il meccanismo `gspl_compat_check_drift()` che segnala override SDK da rigenerare.
- Azione consigliata: pulsante **“Rigenera override SDK”** (o `auth.php?mode=realign_sdk` dalla UI).
- Senza realign, sync/inviti mail possono usare patch obsolete rispetto al core 26.

Vedi anche `README.txt` sezione drift / `logs/gspl_core_state.json`.

---

## Opzionale lato server

Rinominare il residuo (VTE 26 non lo usa):

```bash
mv /var/www/html/ISTANZA/Smarty_setup.php /var/www/html/ISTANZA/Smarty_setup.php.bak.25
```

Non obbligatorio se il plugin include `gspl_compat_maybe_load_smarty_setup()`.

---

## Checklist upgrade istanza (VTE 25 → 26 + GSPL)

| Step | Azione |
|------|--------|
| 1 | Upgrade VTE 26.04 (Apache PHP 8.3, `composer install` post-copia file) |
| 2 | Bypass Morphsuit se istanza Pantarei: `disable_morphsuit.flag` + hook `MorphsuitUtils.php` |
| 3 | Login: `AuthControllerNoVTCH` via SDK se error `#27` |
| 4 | Deploy plugin ≥ **2.3.17** con fix Smarty (questo documento) |
| 5 | Aprire Settings GSPL → **Rigenera override SDK** se compare il banner drift |
| 6 | Verificare sync cron e OAuth utenti |

---

## File da includere nel prossimo ZIP/OTA

| File | Modifica |
|------|----------|
| `modules/GoogleSyncPlus/gspl_compat.php` | `gspl_compat_maybe_load_smarty_setup()` |
| `modules/GoogleSyncPlus/Settings.php` | usa helper al posto di `is_file(Smarty_setup)` |
| `modules/GoogleSyncPlus/bootstrap.php` | idem |
| `modules/GoogleSyncPlus/docs/VTE26-pagina-bianca-Settings.md` | questo documento |

**Suggerimento versione manifest:** bump a **2.3.17** (o successiva) con nota changelog: *Fix pagina bianca Settings su VTE 26 se presente Smarty_setup.php legacy*.

---

## Ipotesi scartate

| Ipotesi | Esito |
|--------|--------|
| Permessi `is_admin` | Scartata — mostrerebbe “Access denied”, non bianco |
| Morphsuit / licenza GSPL | Scartata — redirect o banner diversi, non fatal in Settings |
| Routing `IndexRouter` VTE 26 | Scartata — `modules/GoogleSyncPlus/Settings.php` viene incluso |
| `VTEProperties.php` | Scartata — fatal prima, su `Smarty_setup.php` |
| Drift SDK core | Scartata per pagina bianca — causa banner post-fix, non fatal |

---

## Conclusione

La pagina bianca su **Settings** dopo upgrade a VTE 26.04 era un **fatal PHP** da inclusione dello shim **`Smarty_setup.php`** lasciato in root dall’installazione 25.x. La soluzione è **non includerlo mai su VTE 26**, tramite `gspl_compat_maybe_load_smarty_setup()`, mantenendo compatibilità con VTE 25.

Una volta ripristinata la UI Settings, completare l’upgrade funzionale del plugin con **rigenerazione override SDK** se richiesto dal banner di drift.
