VRP - API della piattaforma (GENERATA)
Documento generato da docs/genera_doc.php dai commenti del codice.
Per ogni funzione: firma, descrizione, parametri, ritorno e Usato in (dove viene chiamata nel lab).
I file sono indicati col percorso relativo. Non modificare a mano: si rigenera.
Ultima generazione: 2026-09-10 16:19
Librerie condivise (platform/lib)
Le funzioni-aiuto che la piattaforma mette a disposizione dei servizi.
platform/lib/vrf.php
#### vrf_dir()
La cartella dei documenti, dalla config del servizio.
Ritorna: string - percorso assoluto, senza lo slash finale
Usato in: platform/lib/vrf.php:70, platform/lib/vrf.php:80, platform/lib/vrf.php:122, platform/pages/fogli.php:141
#### vrf_estensioni()
Le estensioni che apriamo. Non e' una restrizione del motore (ne mastica una novantina): e' la lista di quelle che hanno senso qui, e fa anche da filtro contro i nomi curiosi.
Ritorna: string[]
Usato in: platform/lib/vrf.php:67
#### vrf_path(string $nome)
Da un nome di file al suo percorso, o null se il nome non e' pulito. Passa solo il nome nudo (niente cartelle, niente ".."), e solo con un'estensione della lista: e' l'unico punto in cui un nome arrivato da fuori diventa un percorso su disco.
| parametro | descrizione |
string $nome |
Ritorna: string|null
Usato in: platform/lib/vrf.php:83, platform/pages/fogli.php:144, platform/pages/fogli.php:203, platform/pages/wopi.php:42
#### vrf_lista()
L'elenco dei documenti, il piu' recente in cima.
Ritorna: array - [['nome','size','mtime','ext'], ...]
Usato in: platform/lib/vrf.php:117, platform/pages/fogli.php:323
#### vrf_origine_browser()
L'indirizzo con cui il BROWSER sta parlando con noi in questo momento (https://mang3:8443, oppure il nome pubblico da fuori). ⚠️ NON E' lo stesso indirizzo con cui ci richiama il container ('origine' nella config). Sono due strade diverse e devono restare diverse: da casa il nome pubblico il browser NON lo raggiunge (il router non gira su se stesso) - vitti, 07/09/2026: *"connessione negata da casarosini.duckdns.org! e sto usando mang3"*. La cornice dell'editor va quindi chiesta allo STESSO nome da cui si sta navigando, mentre il gancio WOPI resta sul nome pubblico, che e' l'unico che il container sa risolvere e di cui si fida il certificato.
Ritorna: string
Usato in: platform/lib/vrf.php:150, platform/lib/vrf.php:205
#### vrf_cassetto()
Il cassetto di servizio (gettoni e copia della discovery), creato alla prima occasione. Sta dentro la cartella dei documenti ma comincia per punto, quindi vrf_lista() non lo vede nemmeno.
Ritorna: string
Usato in: platform/lib/vrf.php:140, platform/lib/vrf.php:166, platform/lib/vrf.php:184
#### vrf_gettone_crea(string $nome, array $utente)
Conia un gettone per (utente, file) e lo scrive nel cassetto. Ne approfitta per spazzare via quelli scaduti: sono file piccoli e pochi, non serve un cron per una cosa che si pulisce da sola.
| parametro | descrizione |
string $nome | nome del documento (gia' verificato) |
array $utente | vrp_current_user() |
Ritorna: string - il gettone
Usato in: platform/pages/fogli.php:215, platform/pages/wopi.php:18
#### vrf_gettone_leggi(string $tok, string $nome)
Rilegge un gettone. null se non c'e', e' scaduto o non e' suo quel file: chi chiama non deve decidere niente, gli basta il null.
| parametro | descrizione |
string $tok | |
string $nome | il file che la richiesta dice di voler toccare |
Ritorna: array|null
Usato in: platform/pages/wopi.php:43
#### vrf_urlsrc(string $ext)
L'indirizzo dell'editor giusto per un'estensione, chiesto a Collabora (la sua "discovery") e tenuto in caldo un giorno: e' una tabella che cambia solo quando cambia la versione del motore.
| parametro | descrizione |
string $ext |
Ritorna: string|null - l'urlsrc, o null se quel tipo non lo apre
Usato in: platform/pages/fogli.php:205
#### vrf_wopi_src(string $nome)
L'indirizzo con cui il container ci richiama per quel documento. E' assoluto e pubblico apposta: il container non e' "dentro" la piattaforma, ci arriva dalla stessa porta da cui arriva un browser. Sta nella config ('origine') e non qui: il giorno che la piattaforma passa dalla 8443 alla 443 si cambia una riga di JSON.
| parametro | descrizione |
string $nome |
Ritorna: string
Usato in: platform/pages/fogli.php:216
platform/lib/vrn_foto.php
#### vrn_foto_search(string $q, bool $anw = false, int $limit = 500)
Cerca foto per nome o cartella nell'indice lenostre.foto.
| parametro | descrizione |
string $q | testo da cercare (LIKE, su nome e cartella) |
bool $anw | se false, ESCLUDE le foto naturiste (anw=1) |
int $limit | numero massimo di risultati |
Ritorna: array - righe: path, cartella, nome, lat, lon, scattata_il, anw
manuale: sezione: Ricerca foto
Usato in: platform/pages/search.php:22, public/vrn/index.php:22, public/vrn/index.php:88
platform/lib/vrp_action.php
#### vrp_insert_action(string $service, string $action, string $detail = '')
Registra un'azione utente: UNA riga in sessions, accanto a login/logout/timeout. Riusa il vrp_insert generico - qui si costruisce solo la frase. Ospite (non loggato) -> user_id NULL (la FK fk_sess_user lo consente). Non-bloccante.
| parametro | descrizione |
string $service | slug del servizio dove e' successa (es. 'vrs','vrw','vrv') |
string $action | verbo breve macchina-leggibile (es. 'import','delete','upload') |
string $detail | descrizione UMANA ("importate 10 foto, cancellate 2") |
Ritorna: string|null - id della riga inserita, o null se non registrata
manuale: sezione: Azioni
Usato in: platform/lib/vrp_services.php:257, platform/lib/vrs.php:146, platform/lib/vrs.php:190, platform/lib/vrs.php:205, platform/lib/vrs.php:233, platform/lib/vrs.php:273, platform/lib/vrs.php:306, platform/pages/close.php:31, platform/pages/jukebox.php:612, platform/pages/jukebox.php:619, public/share/download.php:26, public/wiz_foto/nextcloud_import.php:152, public/wiz_foto/nextcloud_import.php:209, public/wiz_foto/vrw_provider.php:266, public/wiz_foto/vrw_provider.php:305, public/wiz_foto/vrw_provider.php:324, public/wiz_foto/vrw_provider.php:332, public/wiz_foto/vrw_provider.php:409, public/wiz_foto/vrw_provider.php:445, public/wiz_foto/vrw_provider.php:478
platform/lib/vrp_auth.php
#### vrp_login(string $username, string $password)
Verifica username+password e apre la sessione. Vero se autenticato.
| parametro | descrizione |
string $username | |
string $password |
Ritorna: bool
Usato in: platform/pages/login.php:33
#### vrp_current_user()
L'utente loggato (con i suoi ruoli per-servizio) o null. Memoizzato.
Ritorna: array|null - ['id','username','display_name','motto','email','avatar','roles'=>[svc=>role]]
Usato in: platform/lib/vrf.php:135, platform/lib/vrp_action.php:39, platform/lib/vrp_auth.php:110, platform/lib/vrp_auth.php:201, platform/lib/vrp_auth.php:223, platform/lib/vrp_auth.php:248, platform/lib/vrp_auth.php:309, platform/lib/vrp_log.php:59, platform/lib/vrs.php:45, platform/lib/vrv.php:38, platform/pages/accesso.php:20, platform/pages/fogli.php:121, platform/pages/home.php:27, platform/pages/interprete.php:135, platform/pages/jukebox.php:413, platform/pages/login.php:24, platform/pages/profilo.php:39, platform/pages/users.php:43, platform/pages/wopi.php:16, public/index.php:139 _(+6)_
#### vrp_logout(string $action = 'logout')
Chiude la sessione (e timbra la chiusura nel registro del portinaio). L'azione registrata distingue l'uscita manuale ('logout') dalla scadenza per inattivita' ('timeout'); il chiamante la sceglie.
| parametro | descrizione |
string $action | 'logout' (default) o 'timeout' |
Ritorna: void
Usato in: platform/lib/vrp_auth.php:341, platform/pages/logout.php:35
#### vrp_user_role(string $service)
Ruolo dell'utente corrente in un servizio, o null se non ne ha.
| parametro | descrizione |
string $service | slug del servizio (es. 'vrv') |
Ritorna: string|null
Usato in: platform/lib/vrs.php:52, platform/lib/vrv.php:41, platform/pages/fogli.php:122, platform/pages/interprete.php:136, public/vrn/index.php:44, public/wiz_foto/nextcloud_import.php:184
#### vrp_user_ritira(int $uid, string $cosa, ?string $vecchio, ?string $nuovo, ?int $chi = null)
Manda in soffitta il valore che una persona portava fino a adesso. Da chiamare PRIMA di scrivere quello nuovo, passandole il vecchio. Non fa niente se il vecchio era vuoto o se non e' cambiato: lo storico deve raccontare i cambi, non i salvataggi.
| parametro | descrizione | |
int $uid | di chi | |
string $cosa | 'avatar' oppure 'motto' | |
| `string | null $vecchio` | il valore che stava in users fino a un attimo fa |
| `string | null $nuovo` | quello che ci sta andando |
| `int | null $chi` | chi ha fatto il cambio (lui stesso o un admin) |
Ritorna: bool - vero se una riga di storia e' stata scritta
Usato in: platform/pages/profilo.php:76, platform/pages/profilo.php:100, platform/pages/profilo.php:133, platform/pages/users.php:129, platform/pages/users.php:170
#### vrp_user_storia(int $uid, string $cosa)
Quello che una persona portava PRIMA, dal piu' recente al piu' vecchio. Il corrente non c'e' dentro: quello sta in users. Se la tabella non c'e' ancora (DDL non lanciata) torna vuoto invece di far cadere la pagina.
| parametro | descrizione |
int $uid | di chi |
string $cosa | 'avatar' oppure 'motto' |
Ritorna: array - [['valore','ritirato_il','ritirato_da'], ...]
Usato in: platform/pages/profilo.php:69, platform/pages/profilo.php:157, platform/pages/profilo.php:158, platform/pages/users.php:213, platform/pages/users.php:391, platform/pages/users.php:427
#### vrp_is_admin()
Vero se l'utente corrente e' admin (ha ruolo 'admin' in un servizio). Regola provvisoria finche' non c'e' un ruolo di piattaforma dedicato.
Ritorna: bool
Usato in: platform/lib/vrp_auth.php:308, platform/lib/vrp_services.php:72, platform/pages/home.php:39, platform/pages/jukebox.php:415, platform/pages/users.php:49, public/index.php:95, public/index.php:181
#### vrp_is_di_casa()
Vero se chi sta guardando e' DI CASA, cioe' ha un ruolo su almeno un servizio di famiglia. Non lo e' chi ha ruoli solo su servizi marcati esterno nella loro targa (oggi: l'Interprete). PERCHE' (vitti, 10/09/2026). Lothar, il vicino tedesco del campeggio, ha la sua chiave per l'Interprete - giusto, fa da collaudatore. Ma con quella entrava anche in «Chi c'e' in casa» e leggeva foto, nomi veri e motti di tutta la famiglia: un elenco che non c'entra niente col tradurre una frase. La chiave e' di una porta sola. Fail-safe: se la targa di un servizio non si legge, quel servizio NON conta come «di casa». Meglio una porta chiusa per errore che un elenco di famiglia aperto per errore.
Ritorna: bool
Usato in: platform/pages/profilo.php:174, platform/pages/users.php:22, platform/pages/users.php:53, platform/pages/users.php:54
#### vrp_role_top()
Il ruolo "piu' alto" dell'utente corrente fra tutti i servizi, o null se non loggato / senza ruoli. Precedenza: admin > editor > viewer > guest. Serve a scegliere l'icona-ruolo del badge.
Ritorna: string|null
Usato in: platform/lib/vrp_log.php:63, public/index.php:216
#### vrp_role_icon(?string $role)
Icona (entita' HTML, gia' pronta da stampare) che evidenzia un ruolo: admin = corona (il Cesare imperatore), editor = matita, viewer = occhio, tutto il resto = sagoma (ospite).
| parametro | descrizione | |
| `string | null $role` | ruolo (es. 'admin') o null |
Ritorna: string
Usato in: public/index.php:222
#### vrp_guard_request()
Guardia d'AREA per i servizi ospitati DENTRO il lab (es. wiz_foto in public/wiz_foto/). Applica le restrizioni dichiarate nella targa del servizio (lan, admin, auth) SENZA che il codice del servizio contenga guardie: la chiama il loader (auto-prepend) prima di ogni pagina. I servizi esterni (VRV /vv/, leNostre /leNostre50/) hanno il loro accesso e vengono ignorati qui.
Ritorna: void
Usato in: platform/boot/3_2_1_Go.php:59, platform/lib/vrp_services.php:131
#### vrp_session_check()
Controllo del timeout d'inattivita' (autoritativo, server-side). Da chiamare a ogni boot PRIMA di ogni output: se la sessione loggata e' rimasta inattiva oltre VRP_SESSION_TTL, slogga; altrimenti aggiorna l'ultima attivita' (in sessione e nel registro del portinaio). Erede del meta-refresh di leNostre50, ma copre anche le chiamate AJAX.
Ritorna: void
Usato in: platform/boot/3_2_1_Go.php:55
#### vrp_visit_check()
Ciclo di vita della sessione-VISITA dell'OSPITE (non loggato), gemello del ciclo login->logout/timeout dei loggati. Da chiamare a ogni boot da vrp_session_check quando non c'e' utente: (1) spazza le visite altrui rimaste aperte oltre il TTL - chi chiude il browser non torna a farsi chiudere, l'uscita si data all'ultima attivita'; (2) chiude la MIA se scaduta; (3) all'ARRIVO apre una riga visit viva (ended_at NULL, user_id NULL, vrp_id ospite-XXXX); (4) altrimenti aggiorna last_activity. Il battito (beat=1) controlla soltanto, non conta come attivita' (come per i loggati). Cosi' in sessions_h si vede arrivo (started_at) e uscita (ended_at) di ogni visitatore. Non-bloccante di suo (vrp_run).
Ritorna: void
Usato in: platform/lib/vrp_auth.php:336
platform/lib/vrp_db.php
#### vrp_db(string $nome)
PDO verso un database della piattaforma (memoizzato per richiesta).
| parametro | descrizione |
string $nome | chiave in VRP_DB_CREDS (es. 'lenostre') |
Ritorna: PDO
Usato in: platform/boot/vrp_defines.php:58, platform/lib/vrn_foto.php:6, platform/lib/vrp_db.php:5, platform/lib/vrp_db.php:61, platform/lib/vrp_db.php:72, platform/lib/vrp_db.php:83, platform/lib/vrp_db.php:94, platform/lib/vrp_db.php:105, platform/lib/vrv.php:51
#### vrp_all(string $db, string $sql, array $params = [])
Tutte le righe di una SELECT (fetchAll associativo).
| parametro | descrizione |
string $db | nome database (es. 'lenostre') |
string $sql | query con placeholder :nome |
array $params | parametri [':nome' => valore] |
Ritorna: array
Usato in: platform/lib/vrn_foto.php:36, platform/lib/vrp_auth.php:76, platform/lib/vrp_auth.php:183, platform/lib/vrs.php:77, platform/lib/vrs.php:87, platform/lib/vrs.php:225, platform/lib/vrw.php:642, platform/pages/jukebox.php:386, platform/pages/sessioni.php:27, platform/pages/sessioni.php:43, platform/pages/sessioni.php:74, platform/pages/users.php:235, platform/pages/users.php:237, platform/pages/users.php:242, platform/pages/users.php:243, public/vrn/index.php:102, public/vrn/index.php:108, public/vrn/index.php:117
#### vrp_row(string $db, string $sql, array $params = [])
Una riga (array associativo) o null se nessuna.
Ritorna: array|null
Usato in: platform/lib/vrp_auth.php:23, platform/lib/vrp_auth.php:68, platform/lib/vrs.php:69, platform/lib/vrs.php:97, platform/pages/jukebox.php:560, platform/pages/profilo.php:152, platform/pages/users.php:205, platform/pages/users.php:252
#### vrp_val(string $db, string $sql, array $params = [])
Un solo valore scalare (prima colonna della prima riga).
Usato in: platform/lib/vrs.php:228, platform/pages/profilo.php:74, platform/pages/profilo.php:129, platform/pages/sessioni.php:58, platform/pages/users.php:110, platform/pages/users.php:130, platform/pages/users.php:166, platform/pages/users.php:229
#### vrp_run(string $db, string $sql, array $params = [])
Esegue INSERT/UPDATE/DELETE, ritorna il numero di righe toccate.
Ritorna: int
Usato in: platform/lib/vrp_auth.php:32, platform/lib/vrp_auth.php:40, platform/lib/vrp_auth.php:41, platform/lib/vrp_auth.php:94, platform/lib/vrp_auth.php:157, platform/lib/vrp_auth.php:161, platform/lib/vrp_auth.php:354, platform/lib/vrp_auth.php:382, platform/lib/vrp_auth.php:391, platform/lib/vrp_auth.php:407, platform/lib/vrp_auth.php:421, platform/lib/vrs.php:203, platform/lib/vrs.php:229, platform/lib/vrs.php:231, platform/lib/vrs.php:269, platform/lib/vrs.php:302, platform/pages/jukebox.php:540, platform/pages/jukebox.php:568, platform/pages/profilo.php:75, platform/pages/profilo.php:77 _(+9)_
#### vrp_insert(string $db, string $sql, array $params = [])
INSERT, ritorna l'id auto-generato.
Ritorna: string
Usato in: platform/lib/vrp_action.php:46, platform/lib/vrs.php:142, platform/lib/vrs.php:185, platform/lib/vrw.php:620, platform/pages/users.php:113
platform/lib/vrp_errori.php
#### vrp_risposta_da_guardare()
Vero se quello che stiamo rispondendo e' una pagina da guardare con gli occhi (HTML), falso se e' roba per una macchina (JSON, immagini, file da scaricare). Si legge dal Content-Type gia' dichiarato: se nessuno l'ha dichiarato, e' una pagina.
Ritorna: bool
manuale: sezione: Avvio
Usato in: platform/lib/vrp_errori.php:66, platform/lib/vrp_errori.php:81, platform/lib/vrp_errori.php:96, platform/lib/vrp_img.php:104
#### vrp_errori_installa(bool $debug)
Installa le tre guardie sugli errori: avvisi, eccezioni non prese, errore fatale. Spegne display_errors una volta per tutte - da qui in avanti sullo schermo ci scriviamo noi. Da chiamare una sola volta, dall'avvio.
| parametro | descrizione |
bool $debug | vero = sulle PAGINE si vede il dettaglio dell'errore; falso = il dettaglio sta solo nel log. Sulle risposte per le macchine non si stampa MAI un avviso, in nessuno dei due casi. |
Ritorna: void
manuale: sezione: Avvio
Usato in: platform/boot/3_2_1_Go.php:33, public/vv/lib/core/3_2_1_Go.php:66
platform/lib/vrp_explorer.php
#### vrp_explorer_json(array $data)
Emette una risposta JSON e termina lo script. Uso interno del motore per tutti gli endpoint AJAX.
| parametro | descrizione |
array $data |
Ritorna: void
Usato in: platform/lib/vrp_explorer.php:104, platform/lib/vrp_explorer.php:110, platform/lib/vrp_explorer.php:116, platform/lib/vrp_explorer.php:120, platform/lib/vrp_explorer.php:122, platform/lib/vrp_explorer.php:127, platform/lib/vrp_explorer.php:130, platform/lib/vrp_explorer.php:132, platform/lib/vrp_explorer.php:135
#### vrp_explorer_dispatch(array $provider)
Cuore di instradamento: se la richiesta corrente e' una chiamata dell'esploratore (parametro ?vx=...), la serve col provider e TERMINA lo script. Altrimenti ritorna (la pagina prosegue e rende l'HTML). Va chiamata in cima alla pagina-servizio, PRIMA di ogni output. Endpoint (namespace ?vx= per non pestare gli ?azione= gia' esistenti): ?vx=tree&node=<key> -> sottocartelle (lazy) [provider 'tree'] ?vx=scan&node=<key> -> file + briciole + madre [provider 'scan'] ?vx=action&name=<nome> -> azione (POST, corpo JSON) [provider 'actions'] ?vx=upload -> upload file (POST multipart) [provider 'upload']
| parametro | descrizione |
array $provider | vedi il contratto in testa al file |
Ritorna: void
Usato in: platform/pages/jukebox.php:639, public/share/index.php:19, public/vv/bg_picker.php:162, public/vv/media_popup.php:283, public/vv/musica_picker.php:94, public/vx_demo.php:112, public/wiz_foto/gestore_foto.php:23, public/wiz_foto/gestore_foto_vx.php:23
#### vrp_explorer_render(array $provider, array $opt = [])
Rende lo SCHELETRO HTML del widget (guscio + contenitori vuoti) e lo script d'avvio che boota il JS col provider 'ui'. Il contenuto (albero, griglia) lo riempie il JS chiamando gli endpoint di dispatch. La pagina non deve scrivere una riga di markup dell'esploratore: chiama questa e mette in <head> il CSS (vedi vrp_explorer_assets()).
| parametro | descrizione |
array $provider | lo stesso passato a dispatch (serve 'root','name','ui') |
array $opt | 'mount' (string) id del contenitore, default 'vx-root'; 'endpoint' (string) URL base delle chiamate ?vx=, default '' = la pagina corrente. |
Ritorna: string - HTML
Usato in: platform/pages/jukebox.php:701, public/share/index.php:60, public/vv/bg_picker.php:199, public/vv/media_popup.php:306, public/vv/musica_picker.php:191, public/vx_demo.php:130, public/wiz_foto/gestore_foto.php:45, public/wiz_foto/gestore_foto_vx.php:45
#### vrp_explorer_assets()
Tag <link> del CSS del widget, con cache-busting. Da mettere in <head> della pagina-servizio (o iniettato dalla cornice di piattaforma).
Ritorna: string
Usato in: platform/lib/vrp_explorer.php:144, platform/pages/jukebox.php:660, public/share/index.php:32, public/vv/bg_picker.php:169, public/vv/media_popup.php:291, public/vv/musica_picker.php:104, public/vx_demo.php:121, public/wiz_foto/gestore_foto.php:33, public/wiz_foto/gestore_foto_vx.php:33
platform/lib/vrp_img.php
#### vrp_img_resolve(string $src, array $bases)
Risolve un web-path (es. "/leNostre/2025/foto.jpg") nel path reale sul filesystem, cercando il prefisso tra le basi consentite e verificando che il risultato resti DENTRO la base (niente ".." traversal).
| parametro | descrizione |
string $src | web-path come arriva da ?src= |
array $bases | mappa web-prefix => base-filesystem (es. ['/leNostre' => '/srv/http/leNostre']) |
Ritorna: string|null - path reale del file, oppure null se fuori base / inesistente
manuale: sezione: Immagini
Usato in: platform/lib/vrp_img.php:15, public/media/img.php:39, public/wiz_foto/nc_thumb.php:32, public/wiz_foto/vrw_vthumb.php:30
#### vrp_img_fail(int $code, string $msg)
Ferma lo script emettendo un codice HTTP e un messaggio testuale. Uso interno del motore (immagine non servibile).
| parametro | descrizione |
int $code | |
string $msg |
Ritorna: void
Usato in: platform/lib/vrp_img.php:96, platform/lib/vrp_img.php:100, platform/lib/vrp_img.php:140, public/media/img.php:41, public/media/img.php:51
#### vrp_img_serve(string $fsPath, int $w, array $opt = [])
Ridimensiona il file $fsPath a larghezza $w e lo EMETTE come JPEG, con cache su disco (se 'cache_dir' e' scrivibile), orientamento EXIF ed ETag. NON fa controlli d'accesso: il chiamante ("cappello") ha gia' risolto il path e deciso le regole (LAN/pubblico). Non ingrandisce mai. Termina lo script (invia l'immagine ed esce).
| parametro | descrizione | ||
string $fsPath | path reale del file, gia' risolto e autorizzato | ||
int $w | larghezza richiesta (normalizzata sulla whitelist) | ||
array $opt | 'cache_dir' (string | null) base cache; null = niente cache su disco 'visibility' ('public' | 'private') per Cache-Control; default 'public' 'quality' (int) qualita' JPEG; default VRP_IMG_QUALITY 'allowed_w' (int[]) whitelist larghezze; default VRP_IMG_ALLOWED_W 'default_w' (int) larghezza di ripiego; default VRP_IMG_DEFAULT_W |
Ritorna: void
manuale: sezione: Immagini
Usato in: platform/lib/vrp_img.php:16, public/media/img.php:57, public/share/anw/verboten.php:33, public/share/thumb.php:11, public/share/thumb.php:65, public/wiz_foto/nc_thumb.php:11, public/wiz_foto/nc_thumb.php:43, public/wiz_foto/vrw_vthumb.php:61
platform/lib/vrp_log.php
#### vrp_log_rank(string $level)
Rango numerico di un livello (999 se sconosciuto).
| parametro | descrizione | ||||
string $level | ERROR | WARN | TRACE | INFO | DEBUG |
Ritorna: int
Usato in: platform/lib/vrp_log.php:48
#### vrp_log_enabled(string $level)
Vero se, data la soglia VRP_LOG_LEVEL, il livello va scritto.
| parametro | descrizione |
string $level |
Ritorna: bool
Usato in: platform/lib/vrp_log.php:76, platform/pages/jukebox.php:786
#### vrp_log_identity()
Firma di chi sta agendo, per la riga di log: [@utente#id@ruolo]. La prende dall'auth di piattaforma (vrp_auth): utente loggato + ruolo piu' alto. Se non loggato (pagine pubbliche) degrada a ospite.
Ritorna: string
Usato in: platform/lib/vrp_log.php:96
#### vrp_log_write(string $level, string $msg)
Scrive una riga di log, se il livello e' abilitato dalla soglia. Formato: [data][canale][LIVELLO][file:riga][@chi] messaggio
| parametro | descrizione |
string $level | |
string $msg |
Ritorna: void
Usato in: platform/lib/vrp_log.php:116, platform/lib/vrp_log.php:124, platform/lib/vrp_log.php:132, platform/lib/vrp_log.php:140, platform/lib/vrp_log.php:148
#### vrp_log_error(string $msg)
Logga un ERRORE serio (sempre scritto: rango minimo).
| parametro | descrizione |
string $msg | messaggio |
Ritorna: void
manuale: sezione: Log
Usato in: platform/lib/vrf.php:191, platform/lib/vrp_action.php:61, platform/lib/vrw.php:625, platform/lib/vrw.php:647, platform/pages/fogli.php:147, platform/pages/fogli.php:152, platform/pages/interprete.php:255, platform/pages/wopi.php:94, platform/pages/wopi.php:102
#### vrp_log_warn(string $msg)
Logga un WARNING (situazione anomala non fatale).
| parametro | descrizione |
string $msg | messaggio |
Ritorna: void
manuale: sezione: Log
Usato in: platform/pages/interprete.php:238, platform/pages/jukebox.php:611, platform/pages/wopi.php:48
#### vrp_log_trace(string $msg)
Logga una TRACE (ingresso/uscita del flusso principale).
| parametro | descrizione |
string $msg | messaggio |
Ritorna: void
manuale: sezione: Log
Usato in: _(nessun uso trovato nel lab)_
#### vrp_log_info(string $msg)
Logga una INFO (decisioni e contesto operativo).
| parametro | descrizione |
string $msg | messaggio |
Ritorna: void
manuale: sezione: Log
Usato in: platform/pages/config.php:59, platform/pages/config.php:126, platform/pages/config.php:160, platform/pages/config.php:183, platform/pages/fogli.php:154, platform/pages/fogli.php:217, platform/pages/interprete.php:250, platform/pages/jukebox.php:548, platform/pages/jukebox.php:572, platform/pages/login.php:38, platform/pages/profilo.php:80, platform/pages/profilo.php:144, platform/pages/users.php:198, platform/pages/users.php:219, platform/pages/wopi.php:108
#### vrp_log_debug(string $msg)
Logga un DEBUG (dettaglio massimo: branch, variabili intermedie).
| parametro | descrizione |
string $msg | messaggio |
Ritorna: void
manuale: sezione: Log
Usato in: platform/pages/jukebox.php:614
platform/lib/vrp_services.php
#### vrp_services()
Lista dei servizi ACCESI, ognuno con la sua targa, pronta per la navigazione. Legge i file puntati da VRP_SERVICES. Fail-loud: se a un servizio manca il blocco manifest, si ferma e lo dice.
Ritorna: array - slug => ['slug','label','icon','blurb','url','enabled', ...]
Usato in: platform/lib/vrp_auth.php:292, platform/lib/vrp_services.php:140, platform/pages/home.php:29, platform/pages/users.php:65
#### vrp_collegamenti()
I COLLEGAMENTI del server, gia' filtrati per chi sta guardando: le porte che non sono servizi di piattaforma (documentazione, NAS, phpMyAdmin, Nextcloud) e che vivono nella tendina della barra. Il filtro e' lo stesso delle cartoline in home: 'lan' -> solo dalla rete di casa, 'admin' -> solo amministratori. Una voce che non si potrebbe aprire NON si mostra: la barra non promette porte chiuse. Fail-soft di proposito: se il file manca o e' sbagliato la tendina sparisce e basta - un elenco di scorciatoie non deve poter impedire l'accesso alla piattaforma.
Ritorna: array - ['label','icona','voci'=>[...]] oppure [] se non c'e' niente
manuale: sezione: Servizi
Usato in: public/index.php:192
#### vrp_service_config(string $slug)
Config COMPLETA di un servizio (non solo la targa), dal file puntato in VRP_SERVICES. Memoizzata per richiesta. E' il "puntatore" del servizio, letto una volta e riusato.
| parametro | descrizione |
string $slug | chiave del servizio (es. 'vrw') |
Ritorna: array
Usato in: platform/lib/vrf.php:38, platform/lib/vrf.php:223, platform/lib/vrp_auth.php:229, platform/lib/vrp_services.php:116, platform/lib/vrs.php:27, platform/lib/vrw.php:18, platform/pages/fogli.php:67, platform/pages/interprete.php:79, public/vrn/index.php:152, public/wiz_foto/nc_thumb.php:24, public/wiz_foto/nextcloud_import.php:10
#### vrp_load_service_libs()
Carica le librerie PHP dei servizi che ne dichiarano una (campo lib nella loro config = file dentro platform/lib). Cosi' la piattaforma mette le funzioni del servizio a disposizione delle sue pagine SENZA che il loader conosca i singoli servizi: il puntatore e' il registro services. La config viene passata alla lib nella variabile $vrp_service. Un servizio esterno (VRV, leNostre) non dichiara lib.
Ritorna: void
Usato in: platform/boot/3_2_1_Go.php:52
#### vrp_current_service()
Il servizio ospitato nel lab dentro cui cade la richiesta corrente (riconosciuto dall'url della sua targa vs SCRIPT_NAME), o null. Stessa logica di riconoscimento della guardia d'area vrp_guard_request().
Ritorna: array|null - la targa del servizio (slug + manifest) o null
Usato in: platform/lib/vrp_services.php:168, platform/lib/vrp_services.php:204, platform/lib/vrp_services.php:248, platform/lib/vrv.php:31
#### vrp_service_bg()
Dipinge le pagine HTML del servizio ospitato col suo sfondo, guidato dalla config (manifest.wallpaper): cosi' ogni servizio e' riconoscibile a colpo d'occhio SENZA codice nelle sue pagine. La piattaforma bufferizza l'output e, prima di </head> (o subito dopo il <link> del tema), inserisce un <style> che mette lo sfondo con un velo per la leggibilita'. Solo per risposte HTML che hanno una testata/tema: CSV, download e binari (senza </head> ne <link .css>) restano intatti. Da chiamare al boot, dopo la guardia d'area.
Ritorna: void
Usato in: platform/boot/3_2_1_Go.php:63, platform/lib/vrp_services.php:193
#### vrp_service_esci()
Inietta un bottone "Chiudi servizio" fisso nelle pagine dei SERVIZI ospitati (che NON hanno la barra di piattaforma). NON slogga: la sessione e' unica e condivisa -> il logout VERO sta solo nella barra di piattaforma. Qui si CHIUDE solo il servizio (rotta ?p=close&svc=<slug>, che registra l'evento e chiude il tab, sessione viva). Stessa tecnica salva-binari di vrp_service_bg(): il link entra solo nelle risposte HTML con testata/tema; CSV, immagini e binari restano intatti. Solo per utente loggato dentro un servizio ospitato.
Ritorna: void
manuale: sezione: Servizi
Usato in: platform/boot/3_2_1_Go.php:68
#### vrp_service_open_log()
Registra l'APERTURA di un servizio nel registro del portinaio: una riga-evento in sessions (via vrp_insert_action), gemella del 'close' scritto da ?p=close. Scatta UNA sola volta per entrata-servizio (flag di sessione vrp_open_svc[<slug>]), non ad ogni pagina; il flag viene azzerato alla chiusura (close.php) cosi' una nuova entrata rilogga. Vale anche per gli OSPITI (user_id NULL): cosi' si vede quando arrivano (open) e quando se ne vanno (close), simmetrico. Limite: se l'ospite chiude il tab invece di premere "Chiudi servizio", l'uscita non parte.
Ritorna: void
manuale: sezione: Servizi
Usato in: platform/boot/3_2_1_Go.php:72
platform/lib/vrp_slideshow.php
#### vrp_slideshow_fs_to_web(string $fs, array $bases)
Converte un path sul disco in path web, se sta dentro una base consentita; altrimenti null (guardia anti-traversal).
| parametro | descrizione |
string $fs | path assoluto sul disco |
array $bases | lista di ['fs'=>base-disco, 'web'=>prefisso-web] |
Ritorna: string|null
Usato in: platform/lib/vrp_slideshow.php:61, platform/lib/vrp_slideshow.php:159, platform/lib/vrp_slideshow.php:165, platform/lib/vrp_slideshow.php:192, platform/lib/vrp_slideshow.php:200
#### vrp_slideshow_web_to_fs(string $web, array $bases)
Converte un path WEB in path sul disco, se cade dentro una base consentita ed e' un file vero; altrimenti null. E' l'inverso di vrp_slideshow_fs_to_web, e si appoggia a QUELLA per la parola finale: una guardia sola, non due che possono discordare.
| parametro | descrizione |
string $web | path web (es. /leNostre/2026/.../foto.jpg) |
array $bases | lista di ['fs'=>base-disco, 'web'=>prefisso-web] |
Ritorna: string|null
Usato in: platform/lib/vrp_slideshow.php:148
#### vrp_slideshow_images_ordered(string $dir)
Immagini di una cartella nell'ordine di slide.txt (se c'e', segue le sottocartelle elencate; altrimenti scandisce e ordina naturale).
| parametro | descrizione |
string $dir | cartella assoluta |
Ritorna: string[] - path assoluti delle immagini
Usato in: platform/lib/vrp_slideshow.php:81, platform/lib/vrp_slideshow.php:182
#### vrp_slideshow_mp3_ordered(string $dir)
Mp3 di una cartella nell'ordine di slide.txt (come le immagini).
| parametro | descrizione |
string $dir | cartella assoluta |
Ritorna: string[] - path assoluti degli mp3
Usato in: platform/lib/vrp_slideshow.php:108, platform/lib/vrp_slideshow.php:183
#### vrp_slideshow_collect(array $get, array $bases, string $imgEndpoint, array $allowedW = [480, 640, 1280, 1920])
Dai parametri (?dir= | ?list=, ?w=) ricava gli URL web di immagini e mp3 pronti per il visore. Con $w valido le immagini passano dal cappello di ridimensionamento; senza, si servono dirette.
| parametro | descrizione |
array $get | $_GET (usa 'dir', 'list', 'w') |
array $bases | basi consentite [['fs'=>..,'web'=>..], ...] |
string $imgEndpoint | URL del cappello di resize (es. /lab/public/media/img.php) |
int[] $allowedW | larghezze ammesse per il resize |
Ritorna: array{images:string[],mp3s:string[]}
Usato in: public/media/slideshow.php:32
#### vrp_slideshow_render(array $webImages, array $webMp3s)
Stampa la pagina HTML/JS del visore (blur, toolbar, audio, frecce, slider foto). E' il visore storico, invariato: cambia solo che gli elenchi arrivano gia' risolti.
| parametro | descrizione |
string[] $webImages | URL web delle immagini |
string[] $webMp3s | URL web degli mp3 |
Ritorna: void
Usato in: public/media/slideshow.php:33
platform/lib/vrp_ups.php
#### vrp_ups_stato()
Interroga NUT (upsc) e restituisce lo stato dell'UPS gia' masticato: percentuali, tensioni, potenza e autonomia stimate, piu' un'etichetta umana dello stato ('Rete OK', 'A batteria'...). Non stampa niente e non muore mai: se il demone non risponde torna ['ok' => false] con il motivo, e chi chiama decide cosa mostrare.
Ritorna: array - ['ok'=>bool, 'errore'=>string, 'stato'=>string, 'classe'=>string, 'grezzo'=>string, 'batteria'=>float, 'vin'=>float, 'vout'=>float, 'freq'=>float, 'carico'=>float, 'watt'=>float, 'ampere'=>float, 'autonomia_min'=>?int]
manuale: sezione: Servizi
Usato in: platform/pages/home.php:74
platform/lib/vrp_util.php
#### vrp_h($s)
Escape HTML sicuro. Tollera null e array (uniti con " & ").
| parametro | descrizione |
mixed $s |
Ritorna: string
Usato in: platform/lib/vrp_explorer.php:182, platform/lib/vrp_explorer.php:210, platform/lib/vrp_explorer.php:228, platform/lib/vrp_services.php:215, platform/lib/vrp_zoom.php:39, platform/lib/vrp_zoom.php:40, platform/lib/vrs.php:379, platform/lib/vrs.php:403, platform/lib/vrs.php:419, platform/lib/vrs.php:422, platform/lib/vrs.php:435, platform/lib/vrs.php:454, platform/lib/vrs.php:465, platform/lib/vrs.php:468, platform/lib/vrs.php:477, platform/lib/vrs.php:478, platform/lib/vrs.php:479, platform/pages/accesso.php:45, platform/pages/accesso.php:47, platform/pages/accesso.php:48 _(+178)_
#### vrp_url(string $path = '/')
URL assoluto a partire dalla base di piattaforma (VRP_BASE_URL).
| parametro | descrizione |
string $path | percorso relativo (es. 'public/vrp_config.php') |
Ritorna: string
Usato in: platform/lib/vrp_auth.php:312, platform/lib/vrp_services.php:215, platform/lib/vrp_util.php:81, platform/pages/accesso.php:21, platform/pages/accesso.php:32, platform/pages/accesso.php:47, platform/pages/close.php:39, platform/pages/close.php:49, platform/pages/close.php:50, platform/pages/fogli.php:124, platform/pages/fogli.php:125, platform/pages/fogli.php:155, platform/pages/fogli.php:210, platform/pages/fogli.php:213, platform/pages/fogli.php:260, platform/pages/fogli.php:344, platform/pages/interprete.php:137, platform/pages/interprete.php:138, platform/pages/login.php:22, platform/pages/login.php:50 _(+32)_
#### vrp_safe_next(?string $next)
Ripulisce un next (dove tornare) e lo restituisce solo se e' sicuro. Alla stessa pagina di piattaforma ci si arriva da servizi diversi (VRV, VRW, VRS...), quindi chi chiama si porta dietro ?next=<dove tornare>. Ma un indirizzo che arriva da fuori non si usa mai a scatola chiusa: se lo si passasse tale e quale a un bottone o a un Location, chiunque potrebbe costruire un link che dalla nostra pagina spedisce l'utente altrove. Tre controlli, gli stessi che accesso.php e login.php facevano gia' scritti a mano (osservazione di vitti l'08/08/2026: «devi salvare da dove e' arrivato, altrimenti dove torna?»): 1. deve cominciare con la base della piattaforma -> sta in casa nostra; 2. niente // -> blocca gli indirizzi tipo //altrosito.com, che il browser interpreta come "stesso protocollo, ALTRO host"; 3. niente a-capo -> niente iniezione di intestazioni HTTP.
| parametro | descrizione | |
| `string | null $next` | il valore grezzo arrivato da fuori |
Ritorna: string - il next se e' sicuro, stringa vuota se non lo e'
Usato in: platform/pages/users.php:270, platform/pages/users.php:274
#### vrp_asset_url(string $rel)
URL di un asset con marca-tempo (?v=mtime) per bustare la cache.
| parametro | descrizione |
string $rel | percorso relativo alla piattaforma (es. 'public/css/x.css') |
Ritorna: string
Usato in: platform/lib/vrp_explorer.php:177, platform/lib/vrp_explorer.php:228, platform/lib/vrp_zoom.php:39, platform/lib/vrp_zoom.php:40, platform/pages/jukebox.php:659
#### vrp_client_ip()
IP del client, gestendo eventuali proxy; '-' se ignoto.
Ritorna: string
Usato in: platform/lib/vrp_action.php:54, platform/lib/vrp_auth.php:47, platform/lib/vrp_auth.php:412
#### vrp_is_lan()
Vero se la richiesta arriva dalla LAN di casa o da localhost (127.0.0.1 / ::1 / 192.168.1.0-24 / WireGuard). CLI sempre vero.
Ritorna: bool
Usato in: platform/lib/vrp_auth.php:304, platform/lib/vrp_services.php:71, platform/pages/home.php:38, platform/pages/home.php:72, platform/pages/users.php:49, public/index.php:90, public/index.php:180, public/share/anw/verboten.php:15, public/vrn/index.php:53, public/wiz_foto/nc_thumb.php:18, public/wiz_foto/vrw_vthumb.php:20
#### vrp_csrf_token()
Token CSRF di sessione (creato una volta sola).
Ritorna: string
Usato in: platform/lib/vrp_explorer.php:163, platform/lib/vrs.php:422, platform/pages/config.php:211, platform/pages/fogli.php:162, platform/pages/interprete.php:271, platform/pages/login.php:41, platform/pages/profilo.php:154, platform/pages/users.php:258, public/wiz_foto/nextcloud_import.php:317
#### vrp_csrf_check()
Verifica il token CSRF arrivato via POST.
Ritorna: bool
Usato in: platform/lib/vrp_explorer.php:129, platform/pages/config.php:49, platform/pages/fogli.php:137, platform/pages/interprete.php:187, platform/pages/login.php:31, platform/pages/profilo.php:59, platform/pages/users.php:84, public/share/create_dir.php:10, public/share/delete.php:11, public/share/move.php:11, public/share/upload.php:10, public/wiz_foto/nextcloud_import.php:197
#### vrp_load_json(string $path)
Legge un file JSON e lo restituisce come array. Fail-loud: se il file manca o il JSON e' malformato si ferma e lo DICE (col percorso), non restituisce un array vuoto in silenzio. Erede di vv_load_json del vecchio VRV, ripulito dalle guardie e dai fallback muti.
| parametro | descrizione |
string $path | percorso assoluto del file .json |
Ritorna: array
Usato in: platform/lib/vrp_services.php:30, platform/lib/vrp_services.php:60, platform/lib/vrp_services.php:99, platform/pages/users.php:68
platform/lib/vrp_zoom.php
#### vrp_zoom_assets()
Tag <link> e <script> del visore, con cache-busting. Da mettere nella pagina che usa data-vrp-zoom.
Ritorna: string - HTML
Usato in: platform/lib/vrp_zoom.php:8, platform/pages/profilo.php:272, platform/pages/users.php:471, public/vv/lib/header_badge.php:88
platform/lib/vrs.php
#### vrs_cfg()
Config del servizio (la sua targa + campi), dal registro. Memoizzata.
Usato in: platform/lib/vrs.php:33, platform/lib/vrs.php:39, public/share/index.php:22
#### vrs_storage_root()
Radice fisica dello storage (cartelle numerate per dir_id).
Usato in: platform/lib/vrs.php:109
#### vrs_root_dir_id()
Id della cartella radice dell'albero share.
Usato in: platform/lib/vrs.php:215, platform/lib/vrs.php:284, platform/lib/vrs.php:391, public/share/delete.php:16, public/share/move.php:16, public/share/vrs_provider.php:64
#### vrs_uid()
Id dell'utente di piattaforma corrente, o null.
Usato in: platform/lib/vrs.php:58, public/share/create_dir.php:17, public/share/upload.php:20, public/share/vrs_provider.php:113, public/share/vrs_provider.php:150
#### vrs_is_admin()
Vero se l'utente corrente e' admin del servizio share.
Usato in: platform/lib/vrs.php:59
#### vrs_can_manage(?int $ownerUserId)
Vero se l'utente corrente puo' gestire un elemento di $ownerUserId.
Usato in: platform/lib/vrs.php:199, platform/lib/vrs.php:219, platform/lib/vrs.php:245, platform/lib/vrs.php:288, platform/lib/vrs.php:414, platform/lib/vrs.php:431, public/share/vrs_provider.php:45, public/share/vrs_provider.php:92
#### vrs_get_dir(int $dirId)
Una cartella per id (viva), o null.
Usato in: platform/lib/vrs.php:139, platform/lib/vrs.php:153, platform/lib/vrs.php:218, platform/lib/vrs.php:248, platform/lib/vrs.php:287, platform/lib/vrs.php:291, platform/lib/vrs.php:298, platform/lib/vrs.php:377, platform/lib/vrs.php:397, public/share/move.php:20, public/share/upload.php:16, public/share/vrs_provider.php:23, public/share/vrs_provider.php:98, public/share/vrs_provider.php:134, public/share/vrs_provider.php:152
#### vrs_list_child_dirs(int $parentId)
Cartelle figlie (vive) di una cartella, in ordine di nome.
Usato in: platform/lib/vrs.php:222, platform/lib/vrs.php:404, platform/lib/vrs.php:449, public/share/vrs_provider.php:70, public/share/vrs_provider.php:74, public/share/vrs_provider.php:85
#### vrs_list_files(int $dirId)
File (vivi) contenuti in una cartella, in ordine di nome.
Usato in: platform/lib/vrs.php:458, public/share/vrs_provider.php:95
#### vrs_get_file(int $fileId)
Un file per id (vivo), o null.
Usato in: platform/lib/vrs.php:198, platform/lib/vrs.php:244, public/share/download.php:11, public/share/thumb.php:19
#### vrs_fs_dir(int $dirId)
Path fisico della cartella di un dir_id.
Usato in: platform/lib/vrs.php:115, platform/lib/vrs.php:125, platform/lib/vrs.php:230
#### vrs_ensure_fs_dir(int $dirId)
Garantisce (e ritorna) la cartella fisica di un dir_id.
Usato in: platform/lib/vrs.php:145, platform/lib/vrs.php:165, platform/lib/vrs.php:255
#### vrs_file_path(array $file)
Path fisico completo di un file (dalla sua riga share_files).
Usato in: platform/lib/vrs.php:202, platform/lib/vrs.php:226, platform/lib/vrs.php:254, public/share/download.php:17, public/share/thumb.php:33
#### vrs_create_dir(int $parentId, string $name, int $ownerUserId)
Crea una cartella figlia (DB + mkdir). Ritorna il nuovo id.
Usato in: public/share/create_dir.php:24, public/share/vrs_provider.php:116
#### vrs_store_uploaded_file(int $dirId, array $file, int $ownerUserId)
Salva un file uploadato in una cartella (move + insert). Ritorna l'id.
Usato in: public/share/upload.php:41, public/share/vrs_provider.php:159
#### vrs_delete_file(int $id)
Cancella un file: rimuove il file fisico e marca la riga come eliminata. Solo chi puo' gestirlo (admin o proprietario). Vero se fatto.
Usato in: public/share/delete.php:23, public/share/delete.php:33, public/share/vrs_provider.php:128
#### vrs_delete_dir(int $id)
Cancella una cartella (ricorsiva, hard): rimuove i file fisici e le tuple di cartella, sottocartelle e loro file. Mai la radice. Solo chi puo' gestirla.
Usato in: platform/lib/vrs.php:223, public/share/delete.php:24, public/share/delete.php:33, public/share/vrs_provider.php:127
#### vrs_move_file(int $id, int $destDirId)
Sposta un FILE in un'altra cartella. Cambia dir_id (DB) e sposta il file fisico nella cartella-numero della destinazione (lo storage e' piatto: <storage>/<dir_id>/). Anti-collisione col suffisso _N come nell'upload. Solo chi puo' gestirlo. Vero se fatto.
Usato in: public/share/move.php:26, public/share/vrs_provider.php:141
#### vrs_move_dir(int $id, int $destDirId)
Sposta una CARTELLA sotto un'altra: cambia solo parent_id (lo storage e' piatto per dir_id, niente da spostare sul disco). Guardie anti-ciclo: non la radice, non dentro se stessa o una propria discendente. Solo chi puo' gestirla. Vero se fatto.
Usato in: public/share/move.php:27, public/share/vrs_provider.php:140
#### vrs_parse_sel(array $sel)
Interpreta i valori dei checkbox multi-selezione ("file:ID" / "dir:ID") in due liste di id validi. Ignora il resto.
Usato in: public/share/delete.php:21, public/share/move.php:18
#### vrs_format_bytes(int $bytes)
Byte -> stringa leggibile (B/KB/MB/GB/TB).
Usato in: platform/lib/vrs.php:190, platform/lib/vrs.php:461, public/share/download.php:26, public/share/vrs_provider.php:43
#### vrs_sanitize_filename(string $name)
Sanitizza il nome di un file (mantiene lettere/numeri/._- e spazi->_).
Usato in: platform/lib/vrs.php:164
#### vrs_sanitize_dirname(string $name)
Sanitizza il nome logico di una cartella (niente slash, spazi compressi).
Usato in: platform/lib/vrs.php:135
#### vrs_is_thumbable(string $filename)
Vero se il nome-file e' un'immagine servibile come thumbnail da vrp_img.
Usato in: platform/lib/vrs.php:464, public/share/thumb.php:26, public/share/vrs_provider.php:47
#### vrs_is_video(string $filename)
Vero se il nome-file e' un video (anteprima = fotogramma via ffmpeg).
Usato in: platform/lib/vrs.php:466, public/share/thumb.php:27, public/share/vrs_provider.php:50
#### vrs_breadcrumb(int $dirId)
Briciole di navigazione (dalla radice alla cartella corrente).
Usato in: _(nessun uso trovato nel lab)_
#### vrs_render_tree(int $currentId)
Albero laterale NAVIGABILE: tutte le cartelle, annidate e indentate, a partire dalla radice; quella corrente evidenziata. Ogni voce porta data-dir, cosi' in modalita' "sposta" un clic la sceglie come destinazione (come il picker del gestore foto).
Usato in: _(nessun uso trovato nel lab)_
#### vrs_tree_branch(int $dirId, int $currentId, int $depth)
Un ramo (ricorsivo) dell'albero laterale: la cartella e le sue figlie.
Usato in: platform/lib/vrs.php:391, platform/lib/vrs.php:405
#### vrs_delete_button(string $type, int $id, int $backDir, ?int $ownerId)
Bottoncino 🗑 (form POST a delete.php) per file/cartella, solo se l'utente puo' gestire l'elemento. $type = 'file'|'dir'.
Usato in: platform/lib/vrs.php:455, platform/lib/vrs.php:481
#### vrs_sel_checkbox(string $type, int $id, ?int $ownerId)
Checkbox di multi-selezione per un elemento (associato via form= alla barra azioni "vx-bulkform"), solo se l'utente puo' gestirlo. $type = 'file'|'dir'.
Usato in: platform/lib/vrs.php:453, platform/lib/vrs.php:476
#### vrs_render_dir(int $dirId)
Contenuto della cartella: sottocartelle + file (anteprima per immagini e video, bottone cancella per chi puo' gestire).
Usato in: _(nessun uso trovato nel lab)_
platform/lib/vrw.php
#### vrw_base_url()
Prefisso URL della cartella del wizard (per i link fra gli step).
Ritorna: string
Usato in: platform/lib/vrw.php:63, platform/lib/vrw.php:66, public/wiz_foto/index.php:4, public/wiz_foto/vrw_provider.php:33
#### vrw_css_href()
URL del foglio di stile locale del wizard (theme.css).
Ritorna: string
Usato in: public/wiz_foto/export_staging_csv.php:93, public/wiz_foto/heic_to_jpg.php:249, public/wiz_foto/import.php:288, public/wiz_foto/index.php:24, public/wiz_foto/nextcloud_import.php:234, public/wiz_foto/unzip_amazon.php:257, public/wiz_foto/upload_to_staging.php:65
#### vrw_mkdir(string $dir)
Crea una cartella (se manca) con i permessi collaborativi del wizard.
Usato in: public/wiz_foto/unzip_amazon.php:10, public/wiz_foto/unzip_amazon.php:115, public/wiz_foto/unzip_amazon.php:154
#### vrw_is_jpeg(string $p)
Vero se il file e' un JPEG (per estensione).
Usato in: platform/lib/vrw.php:207, platform/lib/vrw.php:803, public/wiz_foto/nextcloud_import.php:34, public/wiz_foto/nextcloud_import.php:66
#### vrw_is_heic(string $p)
Vero se il file e' un HEIC/HEIF (per estensione).
Usato in: platform/lib/vrw.php:799, public/wiz_foto/heic_to_jpg.php:158, public/wiz_foto/nextcloud_import.php:35, public/wiz_foto/nextcloud_import.php:67
#### vrw_is_video(string $p)
Vero se il file e' un filmato (per estensione, vedi VRW_VIDEO_EXT).
Usato in: platform/lib/vrw.php:33, platform/lib/vrw.php:114, platform/lib/vrw.php:150, platform/lib/vrw.php:302, platform/lib/vrw.php:334, platform/lib/vrw.php:721, platform/lib/vrw.php:777, platform/lib/vrw.php:803, public/wiz_foto/nextcloud_import.php:36, public/wiz_foto/nextcloud_import.php:68, public/wiz_foto/vrw_provider.php:109, public/wiz_foto/vrw_vthumb.php:31
#### vrw_is_live_photo(string $p)
Vero se il filmato e' il "pezzo video" di una Live Photo iPhone: accanto c'e' una foto con lo STESSO nome (stesso stem). Sono clip di 2-3 secondi che non sono filmati: la foto e' gia' in archivio, il video si scarta.
| parametro | descrizione |
string $p | file da esaminare |
Ritorna: bool
Usato in: platform/lib/vrw.php:777, public/wiz_foto/nextcloud_import.php:36, public/wiz_foto/nextcloud_import.php:73
#### vrw_count_videos(string $dir, array $skip = ['thumbs', '.cestino'])
Quanti filmati ci sono sotto una cartella, RICORSIVO. Serve al conteggio sulle mattonelle del Gestore: i video NON stanno nell'indice lenostre.foto (che e' l'indice delle FOTO, per GPS e ricerca), quindi il conto si fa sul filesystem. Costo misurato sul mang3: ~10 ms per un anno, ~225 ms per l'intero archivio (54.800 file) - solo la radice paga.
| parametro | descrizione |
string $dir | cartella di partenza (path assoluto) |
array $skip | cartelle di servizio da non percorrere |
Ritorna: int
Usato in: public/wiz_foto/vrw_provider.php:211
#### vrw_video_date(string $file)
Data/ora di un filmato: i video non hanno EXIF, la data sta nel tag creation_time del contenitore (letto con ffprobe). E' in UTC, quindi va riportata al fuso locale o la cartella-giorno sbaglia di un'ora.
| parametro | descrizione |
string $file | filmato |
Ritorna: DateTimeImmutable|null
Usato in: platform/lib/vrw.php:303
#### vrw_heic_to_jpg(string $src, string $dst)
Converte un HEIC in JPG col primo strumento disponibile (heif-convert -> magick -> convert). Non tocca il sorgente. Il tool scelto e' memoizzato. Vero se il jpg e' stato creato.
| parametro | descrizione |
string $src | file HEIC |
string $dst | jpg di destinazione (temporaneo) |
Ritorna: bool
Usato in: public/wiz_foto/nextcloud_import.php:91
#### vrw_exif_date(string $file)
Data/ora dagli EXIF del JPEG (DateTimeOriginal/Digitized/DateTime), o null.
Usato in: platform/lib/vrw.php:299
#### vrw_filename_date(string $path)
Data/ora dal nome file (IMG_AAAAMMGG_HHMMSS, AAAA-MM-GG_HH-MM-SS, ...), o null.
Usato in: platform/lib/vrw.php:307
#### vrw_filename_year_hint(string $path)
Solo l'anno dal nome (fallback per la cartella indecise), o null.
Usato in: platform/lib/vrw.php:339
#### vrw_safe_target_path(string $dstDir, string $baseName)
Percorso di destinazione senza sovrascrivere (_001, _002, ...).
Usato in: platform/lib/vrw.php:353, platform/lib/vrw.php:695
#### vrw_is_duplicate_by_size(string $dstPath, int $srcSize)
Doppione se esiste gia' un file di pari dimensione nel punto di destinazione.
Usato in: platform/lib/vrw.php:347, platform/lib/vrw.php:370
#### vrw_data_scatto(string $src, bool $useMtime)
Data/ora di scatto di un file, con la catena di ripieghi del wizard: EXIF -> (per i filmati) ffprobe -> data nel nome -> (facoltativo) mtime. ESTRATTA DA vrw_ingest() APPOSTA: la usa anche il ricontrollo della pulizia di Nextcloud, che deve calcolare lo STESSO nome di destinazione dell'import. Se le due catene divergessero, il ricontrollo direbbe "non archiviato" per file archiviatissimi (o peggio il contrario): una sola sorgente di verita'.
| parametro | descrizione |
string $src | file da datare |
bool $useMtime | se vero, ultimo ripiego = data del file |
Ritorna: array - ['dt'=>DateTimeImmutable|null, 'source'=>EXIF|VIDEO|NOME|MTIME|'']
Usato in: platform/lib/vrw.php:337, platform/lib/vrw.php:716
#### vrw_ingest(string $src, string $label, string $destBase, string $mode, bool $dryRun, bool $useMtime)
Importa UN file in leNostre. Ritorna l'esito (senza scrivere se $dryRun).
| parametro | descrizione |
string $src | file sorgente (jpeg, oppure un filmato: vedi VRW_VIDEO_EXT) |
string $label | etichetta per la cartella "indecise" (es. account) |
string $destBase | radice leNostre |
string $mode | 'copy' (default sensato per Nextcloud) o 'move' |
bool $dryRun | solo anteprima, non tocca il disco |
bool $useMtime | usa la mtime se mancano EXIF e data-nel-nome |
Ritorna: array - ['status'=>imported|indecise|skipped|error,'dry'=>bool,'dst'=>..,'source'=>..,'msg'=>..]
Usato in: platform/lib/vrw.php:288, platform/lib/vrw.php:720, public/wiz_foto/nextcloud_import.php:99
#### vrw_fix_file(string $file)
Applica al file i permessi collaborativi del wizard.
Usato in: public/wiz_foto/unzip_amazon.php:173
#### vrw_fix_dir(string $dir)
Applica alla cartella i permessi collaborativi del wizard.
Usato in: _(nessun uso trovato nel lab)_
#### vrw_pecore_overlay(string $title, array $doneButtons, string $movie = '/vittrosviaggi_shared/movie/intervallo/intervallo_pecore.mp4')
Overlay "intervallo pecore" + barra di avanzamento: fonte UNICA per gli step lenti (unzip, HEIC, import...). Stampa CSS+HTML+JS (VVPecore). Uso in JS: VVPecore.run(items, worker, {verb:'scompatto', summaryUnit:'file'}).
| parametro | descrizione |
string $title | titolo mostrato sull'overlay |
array $doneButtons | bottoni di fine lavoro ([label,href]; href '#stay' = resta) |
string $movie | video di attesa (default: intervallo pecore in shared) |
Ritorna: void
Usato in: public/wiz_foto/heic_to_jpg.php:333, public/wiz_foto/import.php:375, public/wiz_foto/unzip_amazon.php:344
#### vrw_nc_creds(string $acct)
Le chiavi di Nextcloud di un account (password-applicazione), dal file dei segreti fuori dall'albero web. Nella targa c'e' solo il puntatore.
| parametro | descrizione |
string $acct | account Nextcloud (es. 'vitti') |
Ritorna: array|null - ['base_url'=>..,'user'=>..,'pass'=>..] o null se non configurato
Usato in: platform/lib/vrw.php:550, platform/lib/vrw.php:563
#### vrw_nc_configurato(string $acct)
Vero se la pulizia di Nextcloud e' configurata per questo account.
Usato in: public/wiz_foto/nextcloud_import.php:184
#### vrw_nc_dav(string $acct, string $metodo, string $rel)
Manda UNA richiesta WebDAV all'area file di un account Nextcloud. Il percorso e' relativo alla radice dell'utente (es. "Photos/2026/08/02/x.jpg").
| parametro | descrizione |
string $acct | account Nextcloud |
string $metodo | verbo WebDAV (DELETE, PROPFIND, HEAD, ...) |
string $rel | percorso relativo alla radice dell'utente |
Ritorna: array - ['ok'=>bool,'code'=>int,'err'=>string]
Usato in: platform/lib/vrw.php:596
#### vrw_nc_trash(string $acct, string $rel)
Sposta UN file di Nextcloud nel cestino di Nextcloud (DELETE WebDAV). NON svuota il cestino: da li' si ripristina dal browser.
| parametro | descrizione |
string $acct | account Nextcloud |
string $rel | percorso relativo alla radice dell'utente |
Ritorna: array - ['ok'=>bool,'code'=>int,'err'=>string]
Usato in: public/wiz_foto/nextcloud_import.php:202
#### vrw_import_registra(string $acct, string $srcRel, int $srcSize, string $esito, ?int $sessId)
Annota in vrp_auth.vrw_import che UN file di Nextcloud e' entrato in leNostre. Non salva DOVE e' finito, di proposito: se annotasse la destinazione, il registro invecchierebbe al primo spostamento o rinomina del Gestore - cioe' il male da cui questo registro salva. Annota il FATTO, che non cambia piu'. Non-bloccante: se il DB e' giu' si logga e l'import tira dritto (una foto importata e non annotata resta su Nextcloud, che e' il male minore).
| parametro | descrizione | ||
string $acct | account Nextcloud | ||
string $srcRel | percorso su Nextcloud (Photos/AAAA/MM/GG/nome) | ||
int $srcSize | dimensione del file sorgente | ||
string $esito | imported | skipped | indecise |
| `int | null $sessId` | riga di sessions col riassunto (per indagare dopo) |
Ritorna: void
Usato in: public/wiz_foto/nextcloud_import.php:162
#### vrw_import_registro(string $acct, string $giorno, string $sottoDir)
Il registro degli import di UNA cartella-giorno, pronto da consultare: 'nomefile|dimensione' => true. Si legge una volta per pulizia. Se il DB e' giu' torna vuoto -> la scopetta ripiega sulla ricerca in archivio e, non trovando, non propone niente: si tace, non si sbaglia.
| parametro | descrizione |
string $acct | account Nextcloud |
string $giorno | 'AAAA/MM/GG' |
string $sottoDir | sottocartella delle foto su Nextcloud (di solito 'Photos') |
Ritorna: array
Usato in: platform/lib/vrw.php:759, public/wiz_foto/nextcloud_import.php:194
#### vrw_archivio_indice(string $destBase, array $skip = ['thumbs', '.cestino'])
Indice dell'archivio per il ricontrollo: nome-di-destinazione -> elenco di [dimensione, percorso]. Si costruisce UNA volta per ogni pulizia e serve a ritrovare una foto ANCHE SE nel frattempo il Gestore l'ha spostata in un'altra cartella (Elena riordina di continuo: cercarla solo dove l'import l'aveva messa la darebbe per non archiviata). La CHIAVE e' il nome normalizzato: minuscolo e senza la coda _001/_002 dell'anti-collisione, cosi' il ricontrollo trova al primo colpo invece di frugare tutto l'indice per ogni file (su un giorno da 135 foto: 1,5 s -> pochi millesimi). Costo misurato: ~0,25 s per l'intero archivio (54.800 file).
| parametro | descrizione |
string $destBase | radice leNostre |
array $skip | cartelle di servizio da non percorrere |
Ritorna: array - ['aaaammgg-hhmmss.jpg' => [[size, path], ...], ...]
Usato in: platform/lib/vrw.php:710, platform/lib/vrw.php:757, public/wiz_foto/nextcloud_import.php:193
#### vrw_nome_normalizzato(string $nome)
Nome-file ridotto alla forma di destinazione: minuscolo e senza la coda _001/_002 che vrw_safe_target_path() aggiunge per non sovrascrivere.
Usato in: platform/lib/vrw.php:688
#### vrw_gia_archiviato(string $src, array $indice, bool $useMtime)
Il file di Nextcloud e' gia' in archivio? Ritorna DOVE, o null. Il metro e' quello dell'import: nome di destinazione calcolato dalla data (AAAAMMGG-HHMMSS.est, piu' le varianti _001/_002 dell'anti- collisione) E dimensione IDENTICA al byte. Data al secondo + peso esatto: due file diversi non si scambiano. Chi non ha una data affidabile non e' mai "gia' archiviato" (finirebbe in indecise con un nome che non si sa ricostruire) -> non si tocca.
| parametro | descrizione |
string $src | file su Nextcloud |
array $indice | da vrw_archivio_indice() |
bool $useMtime | come nell'import |
Ritorna: string|null - percorso in leNostre, o null se non ritrovato
Usato in: platform/lib/vrw.php:810
#### vrw_nc_esame_giorno(string $dirGiorno, string $destBase, array $indice, bool $useMtime, array $registro = [])
Il RICONTROLLO di un giorno di Nextcloud, prima di proporre la pulizia. Non cancella niente: guarda e riferisce. Divide in due mucchi - cio' che risulta gia' entrato in archivio (si puo' cestinare) e cio' che resta dov'e', con scritto PERCHE' in parole capibili. DUE STRADE INDIPENDENTI per dire di si', e basta che una risponda: (a) il REGISTRO degli import: "questo file l'ho portato dentro io". E' un fatto che non scade -> regge a spostamenti, RINOMINE e cernite (Elena scarta di continuo, e col solo confronto in archivio le sue scelte facevano sparire il file dai radar). (b) la RICERCA in archivio: copre tutto cio' che e' stato importato PRIMA che il registro esistesse, di cui il registro non sa nulla. Un file resta su Nextcloud solo se NESSUNA delle due sa dire di si'. ORDINE DEI CONTROLLI, che non e' un dettaglio: il registro si consulta PRIMA di guardare il tipo del file. Il tipo dice solo se ha senso cercare un gemello identico in archivio, cioe' riguarda la sola strada (b). Restano fuori da soli, senza codice apposta: le clip Live Photo (l'import le scarta, quindi in archivio non ci sono mai state) e gli HEIC che il Wizard non ha mai importato (entrano convertiti in jpg, che pesa diverso -> la ricerca non li ritrova mai). Un heic che INVECE risulta importato si pulisce, e lo dice il registro.
| parametro | descrizione |
string $dirGiorno | cartella-giorno su Nextcloud (path assoluto) |
string $destBase | radice leNostre |
array $indice | da vrw_archivio_indice() |
bool $useMtime | come nell'import |
array $registro | da vrw_import_registro() (vuoto = solo la ricerca) |
Ritorna: array - ['pronti'=>[['nome','size','dove']], 'restano'=>[['nome','perche']], 'bytes'=>int]
Usato in: public/wiz_foto/nextcloud_import.php:195, public/wiz_foto/nextcloud_import.php:214
_1 file senza funzioni documentate (saltati): platform/lib/vrv.php._
Pagine della piattaforma (platform/pages)
Le funzioni che vivono dentro una pagina invece che in una libreria: sono di quella pagina e non si riusano, ma sono documentate e vanno trovate.
platform/pages/config.php
#### cfg_write_json(string $file, array $data)
Scrive un array come JSON leggibile (con newline finale).
Usato in: platform/pages/config.php:125, platform/pages/config.php:159, platform/pages/config.php:179, platform/pages/config.php:182
#### cfg_row_text(string $name, string $label, string $val, string $desc = '')
Riga label + input testo (classi vrp-cfg-*).
Usato in: platform/pages/config.php:244, platform/pages/config.php:256, platform/pages/config.php:257, platform/pages/config.php:258, platform/pages/config.php:275, platform/pages/config.php:283, platform/pages/config.php:285, platform/pages/config.php:302, platform/pages/config.php:308
#### cfg_row_ro(string $label, string $val)
Riga label + valore in sola lettura.
Usato in: platform/pages/config.php:314, platform/pages/config.php:315, platform/pages/config.php:316, platform/pages/config.php:317
platform/pages/fogli.php
#### vrf_altra_porta(string $nome)
SE IL FOGLIO RESTA GRIGIO, QUASI SEMPRE E' IL CERTIFICATO (09/09/2026). L'editor apre un filo di dati (websocket) verso lo STESSO nome da cui si sta navigando. Su mang3 il certificato e' quello fatto in casa: la pagina la si apre lo stesso dando l'ok una volta, ma per il filo di dati il browser quel permesso non lo estende e chiude senza dire niente - risultato, la cornice resta grigia e nessuno capisce perche'. Provato dai log: il 07/09, quando funzionava, il filo partiva dal nome pubblico (certificato Let's Encrypt); il 09/09, navigando come mang3 dal tunnel, nei log del filo non c'e' NESSUNA riga - il browser non l'ha nemmeno aperto. La pagina, la cornice e il gettone erano tutti a posto. Qui non si aggiusta niente: si dice, e si offre la porta giusta.
| parametro | descrizione |
string $nome | il documento aperto |
Ritorna: string|null - l'indirizzo pubblico dello stesso documento, o null se ci si sta gia' navigando (e allora non c'e' niente da dire)
Usato in: platform/pages/fogli.php:275
#### vrf_icona(string $ext)
L'icona per tipo: si riconosce il documento prima di leggerne il nome.
Usato in: platform/pages/fogli.php:272, platform/pages/fogli.php:345
#### vrf_tipo(string $ext)
Il tipo a parole, che «xlsx» non dice niente a nessuno.
Usato in: platform/pages/fogli.php:349
#### vrf_titolo(string $nome)
Il nome senza l'estensione: il tipo lo dicono gia' l'icona e la riga sotto.
Usato in: platform/pages/fogli.php:272, platform/pages/fogli.php:347
#### vrf_quando(int $t)
La data come la direbbe una persona: «oggi alle 21:17», non «07/09/2026».
Usato in: platform/pages/fogli.php:348
platform/pages/interprete.php
#### vri_altra_porta()
IL MICROFONO LO DA' SOLO IL NOME PUBBLICO. Il browser concede il microfono solo a una pagina con un certificato di cui si fida: da casarosini.duckdns.org c'e' Let's Encrypt e va, da mang3 il nostro e' fatto in casa e la richiesta muore. E' la stessa storia dei Fogli col filo di dati dell'editor, chiusa oggi pomeriggio - e la sera vitti ci e' ricascato, ma per colpa nostra: non c'era scritto da nessuna parte. Qui non si aggiusta niente: si dice, e si offre la porta giusta.
Ritorna: string|null - la stessa pagina sul nome pubblico, o null se ci si sta gia' navigando (e allora non c'e' niente da dire)
Usato in: platform/pages/interprete.php:360
#### vri_bcp47(string $nome)
Il codice che vuole il BROWSER per parlare e per ascoltare. Il motore di traduzione lavora coi nomi inglesi ("German"); il microfono e la voce del browser vogliono un codice con la nazione dentro ("de-DE"): senza, il riconoscimento capisce l'italiano anche mentre parla un tedesco. Se una lingua non e' in tabella si torna stringa vuota, e il bottone non compare: meglio niente che un microfono che ascolta nella lingua sbagliata.
Usato in: platform/pages/interprete.php:325, platform/pages/interprete.php:352, platform/pages/interprete.php:377
#### vri_e_una_copia(string $prima, string $dopo)
Dice se il traduttore ci ha ridato indietro la stessa frase. quota_copiata() della libreria condivisa su una frase corta si arrende (le servono almeno dodici parole per misurare), e qui le frasi corte sono la regola. Allora si confronta alla buona: via la punteggiatura, via gli spazi, tutto minuscolo. Non e' una prova certa - "Hotel" resta "Hotel" anche tradotto - ma un tentativo in piu' costa un decimo di centesimo.
Usato in: platform/pages/interprete.php:237
platform/pages/jukebox.php
#### jb_dir(string $nodo)
Il percorso su disco di un nodo, o null se non e' un nodo buono. Qui sta la GUARDIA: lo scaffale dev'essere in JB_SCAFFALI e nessun pezzo del percorso puo' essere '.' o '..', altrimenti dal browser si uscirebbe dalla cartella della musica.
| parametro | descrizione |
string $nodo | es. "mp3" oppure "mus/Aizpute" |
Ritorna: string|null
Usato in: platform/pages/jukebox.php:135, platform/pages/jukebox.php:157, platform/pages/jukebox.php:231, platform/pages/jukebox.php:296, platform/pages/jukebox.php:448
#### jb_brani(string $nodo)
I brani che stanno DIRETTAMENTE in un nodo, in ordine naturale.
| parametro | descrizione |
string $nodo |
Ritorna: array - nomi di file
Usato in: platform/pages/jukebox.php:181, platform/pages/jukebox.php:476
#### jb_cartelle(string $nodo)
Le cartelle che stanno dentro un nodo, in ordine naturale.
| parametro | descrizione |
string $nodo |
Ritorna: array - nomi di cartella
Usato in: platform/pages/jukebox.php:184, platform/pages/jukebox.php:430, platform/pages/jukebox.php:435, platform/pages/jukebox.php:437, platform/pages/jukebox.php:464
#### jb_chiavi(string $nodo)
Tutte le chiavi dei brani sotto un nodo, cartelle comprese, a fondo. Serve ai bottoni "Accoda tutto" e alla convalida delle playing list: un brano messo in una sottocartella non deve sparire da nessuno dei due.
| parametro | descrizione |
string $nodo |
Ritorna: array - chiavi "<nodo>/<file>"
Usato in: platform/pages/jukebox.php:185, platform/pages/jukebox.php:368, platform/pages/jukebox.php:455, platform/pages/jukebox.php:471, platform/pages/jukebox.php:644
#### jb_url(string $chiave)
L'indirizzo web di un brano, pronto per il tag <audio>. Ogni pezzo del percorso si codifica per conto suo: le barre devono restare barre, o l'indirizzo non punta piu' a niente.
| parametro | descrizione |
string $chiave | "<nodo>/<file>" |
Ritorna: string
Usato in: platform/pages/jukebox.php:240, platform/pages/jukebox.php:490, platform/pages/jukebox.php:647
#### jb_copertina(string $chiave)
La copertina di un brano, come indirizzo web, o null se non ce n'e'. Due sorgenti, in quest'ordine: 1. un'immagine messa A MANO accanto al brano, stesso nome (canzone.mp3 -> canzone.jpg): comanda sempre lei, cosi' una copertina brutta si corregge senza toccare il codice; 2. quella INCORPORATA nel file, estratta con ffmpeg e tenuta in cache: e' il caso dei brani fatti con Suno. Il brano senza copertina lascia in cache un file VUOTO. Non e' uno scarto: e' la memoria di aver gia' guardato, e risparmia una chiamata a ffmpeg a ogni apertura della pagina. Per rifare tutto da capo si svuota la cartella.
| parametro | descrizione |
string $chiave | scaffale |
string $nome | nome del file del brano |
Ritorna: string|null - indirizzo web dell'immagine, o null
Usato in: platform/pages/jukebox.php:488, platform/pages/jukebox.php:651
#### jb_copertina_cartella(string $nodo)
La copertina di una CARTELLA, come indirizzo web, o null. vitti, 10/09/2026: *"possiamo metterla come cover della cartella olimpiadi?"* - con la foto di lui-Caronte al Parcheggio K. La regola e' la stessa dei brani, ma al contrario: non si cerca un file col nome giusto, si guarda dentro la cartella. Comanda cover.<est> se c'e'; se no vale la prima immagine in ordine naturale. Cosi' per mettere una copertina basta buttare una foto dentro la cartella - nessun nome da imparare, nessun codice da toccare - e per cambiarla basta metterne un'altra chiamata cover. Le immagini NON compaiono fra i brani (jb_brani filtra su JB_EXT): una foto nella cartella della musica non da' fastidio a nessuno. La miniatura si tiene in cache come quelle dei brani, ma niente segnaposto vuoto: una cartella senza copertina costa solo una lettura di cartella, e se la foto la metti domani deve comparire domani. La cache si rifa' da sola quando l'originale e' piu' nuovo.
| parametro | descrizione |
string $nodo | "mus/Olimpiadi" |
Ritorna: string|null - indirizzo web della miniatura, o null
Usato in: platform/pages/jukebox.php:470
#### jb_chiavi_valide()
Le chiavi "<scaffale>/<file>" che oggi esistono davvero sul disco. Serve a non salvare (e a non suonare) brani che non ci sono piu': un file cancellato da una cartella non deve rompere la coda di nessuno.
Ritorna: array - chiave => true
Usato in: platform/pages/jukebox.php:395, platform/pages/jukebox.php:530
#### jb_playlist_elenco()
Tutte le playing list di casa, con il nome del padrone. Si leggono tutte da chiunque, ospiti compresi (deciso da vitti il 06/09): e' il SALVATAGGIO a volere un nome, non l'ascolto. Se la tabella non c'e' ancora (DDL da lanciare come root) la pagina non deve cadere: il JukeBox suona lo stesso, senza liste.
Ritorna: array - [['id','user_id','nome','di','brani'=>[chiavi]], ...]
Usato in: platform/pages/jukebox.php:549, platform/pages/jukebox.php:573, platform/pages/jukebox.php:657
platform/pages/log.php
#### log_tail(string $file, int $lines)
Ultime $lines righe di $file (dal fondo, senza caricare tutto).
Usato in: platform/pages/log.php:68
platform/pages/profilo.php
#### pf_quando(string $sql)
Una data in italiano, corta, per la soffitta ("fino al 6 set 2026").
Usato in: platform/pages/profilo.php:206, platform/pages/profilo.php:263
platform/pages/search.php
#### vrn_foto_url(string $path)
URL della foto nell'archivio (base: VRP_MEDIA_URL).
Usato in: platform/pages/search.php:46
platform/pages/users.php
#### usr_avatar_url(?string $file)
URL dell'avatar di un utente (o '' se non ha foto).
Usato in: platform/pages/users.php:310, platform/pages/users.php:422, platform/pages/users.php:431
_9 file senza funzioni documentate (saltati):platform/pages/accesso.php,platform/pages/admin.php,platform/pages/close.php,platform/pages/guardiano.php,platform/pages/home.php,platform/pages/login.php,platform/pages/logout.php,platform/pages/sessioni.php,platform/pages/wopi.php._
Libreria VRV (public/vv: lib + inc)
Le funzioni del diario VRV. Qui vive anche la roba di uso quotidiano (escape, date, sessione): guardare QUI prima di scriversi una funzione in casa.
public/vv/inc/diario_list_lib.php
#### vv_render_cofanetto_item(array $g, bool $is_staff = false, array $langsByBase = [], array $childrenByPost = [])
Disegna un cofanetto come fisarmonica di primo livello: una riga sola che, aperta, mostra dentro i suoi post (che a loro volta possono aprire le traduzioni). Serve ad accorciare la lista.
| parametro | descrizione |
array $g | un blocco 'cofanetto' di vv_cofanetto_raggruppa() |
bool $is_staff | se la lista e' quella loggata |
array $langsByBase | bandierine per famiglia (come per i post) |
array $childrenByPost | traduzioni per post, solo per lo staff |
Ritorna: void - stampa direttamente in pagina
Usato in: public/vv/diario_lista_admin.php:266, public/vv/diario_lista_guest.php:209
public/vv/lib/audio.php
#### vv_list_mp3(string $fsDir, string $base = '/vittrosviaggi_shared/mp3/', bool $onlyBasename=false)
Ritorna la lista di file MP3 presenti nella cartella condivisa.
| parametro | descrizione |
string $fsDir | percorso FS, es: '/srv/http/vittrosviaggi_shared/mp3' |
string $base | URL base pubblico per i file, es: '/vittrosviaggi_shared/mp3/' |
bool $onlyBasename | se true ritorna solo i nomi file (senza URL) |
Ritorna: array - lista (string) o lista di oggetti [{name, url, mtime}]
Usato in: public/vv/ajax/get_playlist.php:20
#### vv_audio_relativi(string $fsDir, array $ext = ['mp3'])
I brani sotto una cartella, SOTTOCARTELLE COMPRESE, come percorsi relativi alla cartella stessa ("Olimpiadi/01 - Non Siamo Solo Badge.mp3"). In ordine naturale per NOME DEL FILE: cosi' finche' le cartelle non ci sono l'ordine e' identico a quello di prima, e la Radio del badge non cambia una virgola. Nasce il 10/09/2026, quando vitti ha chiesto di mettere la musica in cartelle per racconto: fino a quel giorno chi leggeva queste cartelle faceva uno scandir piatto, e un brano dentro una cartella sarebbe semplicemente sparito dalla Radio e dai post.
| parametro | descrizione |
string $fsDir | la cartella (es. /srv/http/vittrosviaggi_shared/mp3) |
string[] $ext | le estensioni ammesse, minuscole |
Ritorna: string[] - percorsi relativi
Usato in: public/vv/lib/audio.php:100, public/vv/lib/header_badge.php:44, public/vv/lib/musica_widget.php:54
#### vv_audio_risolvi(string $nome, string $fsDir, array $ext = ['mp3'])
Dove sta davvero un brano di cui si conosce solo il NOME. post.musica tiene i nomi nudi ("La Citta' Futura.mp3") e cosi' restano: nessun post da migrare, e i file si possono riordinare in cartelle quante volte si vuole senza toccare il database. Il nome si riduce a basename prima di cercarlo, e si cerca solo dentro l'elenco letto dal disco: da fuori non si puo' nominare niente che non sia gia' li'.
| parametro | descrizione |
string $nome | il nome del file, come sta nel campo musica |
string $fsDir | la cartella dove cercare |
string[] $ext | le estensioni ammesse, minuscole |
Ritorna: string|null - il percorso relativo, o null se il brano non c'e' piu'
Usato in: public/vv/lib/musica_widget.php:74, public/vv/visualizza_post.php:273, public/vv/visualizza_post_draft.php:170
public/vv/lib/auth.php
#### current_user_id()
ID utente loggato, oppure null se guest
Usato in: public/vv/lib/functions.php:429, public/vv/visualizza_post.php:58, public/vv/visualizza_post_draft.php:42
#### current_user_role()
Ruolo utente corrente (admin|editor|amico|ospite|amik_nat|guest)
Usato in: public/vv/ajax/post_audio.php:182, public/vv/auth.php:21, public/vv/lib/auth.php:21, public/vv/trad_widget.php:2
#### user_has_role(array $roles)
true se l’utente ha almeno uno dei ruoli richiesti
Usato in: _(nessun uso trovato nel lab)_
public/vv/lib/caricaTinyMCE.php
#### caricaTinyMCE()
Inizializza TinyMCE per il textarea#contenuto Versione base: porting da is/tinymce-init.js (vv_tinymce2)
Usato in: public/vv/lib/caricaTinyMCE.php:10, public/vv/modifica_post.php:634
public/vv/lib/cofanetto.php
#### vv_cofanetto_post_in_lingua(PDO $pdo, int $post_id, string $lang, bool $solo_pubblicati)
Lo stesso post nella lingua chiesta: se la traduzione c'e' torna lei, se no torna l'originale. E' la regola di casa del cofanetto (la stessa che vale per le puntate), qui a portata di una riga sola.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post di partenza (di solito il capostipite) |
string $lang | lingua in lettura ('' = italiano) |
bool $solo_pubblicati | true per chi non e' dello staff: le bozze non contano |
Ritorna: int - id del post da aprire (0 se non ce n'e' nessuno di leggibile)
Usato in: public/vv/lib/cofanetto.php:106
#### vv_cofanetto_indice(PDO $pdo, int $post_id, string $lang, bool $solo_pubblicati)
Trova il cofanetto di un post e ne restituisce l'indice completo, gia' risolto nella lingua richiesta. Funziona sia stando su un EPISODIO (si risale per famiglia) sia stando sulla COPERTINA (il post indicato da cofanetto.copertina_post_id).
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post da cui si guarda |
string $lang | lingua in lettura ('' = italiano) |
bool $solo_pubblicati | true per chi NON e' dello staff: le puntate e le traduzioni ancora in lavorazione non entrano nell'indice (una voce non pubblicata ripiega sull'originale, come se non fosse tradotta). |
Ritorna: array|null - riga del cofanetto piu' 'mio_ordine' (0 = copertina), 'mia_famiglia' e 'voci' (indice ordinato, una per famiglia)
manuale: Ritorna null se il post non sta in nessun cofanetto: chi chiama non deve controllare altro.
Usato in: public/vv/lib/cofanetto.php:242, public/vv/lib/cofanetto.php:262, public/vv/lib/cofanetto.php:307, public/vv/visualizza_post.php:307, public/vv/visualizza_post_draft.php:208
#### vv_cofanetto_parole(string $lang)
Le parole fisse della barretta nella lingua in lettura. Sono tre in croce e non meritano una tabella: stanno qui, e una lingua che manca ripiega sull'italiano invece di uscire vuota.
| parametro | descrizione |
string $lang | lingua in lettura ('' o sconosciuta = italiano) |
Ritorna: array - ['cofanetto' => .., 'di' => .., 'nav' => ..]
Usato in: public/vv/lib/cofanetto.php:272, public/vv/lib/cofanetto.php:321
#### vv_cofanetto_voce_parola(string $parola, string $lang)
Traduce la parola-voce del cofanetto (cofanetto.voce_etichetta: Episodio, Tappa, Capitolo...). Il DB tiene la parola in italiano, qui la si volta nella lingua in lettura.
| parametro | descrizione |
string $parola | la parola come sta nel DB, in italiano |
string $lang | lingua in lettura |
Ritorna: string - la parola tradotta, o quella italiana se non la conosco
manuale: Una parola nuova nel DB non rompe niente: resta in italiano finche' non la si aggiunge qui.
Usato in: public/vv/lib/cofanetto.php:251, public/vv/lib/cofanetto.php:292
#### vv_cofanetto_titolo_pulito(string $titolo)
Il titolo di un post senza il prefisso della data ("20260626 - "). Nel cofanetto le puntate si chiamano col loro nome, la data la racconta gia' il post.
| parametro | descrizione |
string $titolo | titolo come sta nel DB |
Ritorna: string - titolo ripulito
Usato in: public/vv/lib/cofanetto.php:255, public/vv/lib/cofanetto.php:296, public/vv/lib/cofanetto_widget.php:105
#### vv_cofanetto_etichetta(array $box, array $voce, string $lang)
Come si chiama una voce nella barretta. Se il cofanetto ha una parola sua (Episodio, Tappa...) la usa col numero, se no ripiega sul titolo del post ripulito dal prefisso della data.
| parametro | descrizione |
array $box | il cofanetto come lo torna vv_cofanetto_indice() |
array $voce | una riga di $box['voci'] |
string $lang | lingua in lettura ('' = italiano) |
Ritorna: string - etichetta pronta da scrivere, es. "Episode 3"
Usato in: public/vv/lib/cofanetto.php:356, public/vv/lib/cofanetto.php:372
#### vv_cofanetto_indice_html(?array $box, string $lang, string $lingua_testi)
L'INDICE del cofanetto, quello che si legge sulla COPERTINA: tutte le puntate in fila, ognuna nella lingua in lettura. Prende il posto della barretta prec/succ, che sulla copertina non avrebbe senso.
| parametro | descrizione | |
| `array | null $box` | il cofanetto come lo torna vv_cofanetto_indice() |
string $lang | lingua da appiccicare ai link ('' = nessuna) | |
string $lingua_testi | lingua delle scritte (quella del post in lettura) |
Ritorna: string - HTML dell'indice, vuoto se non c'e' niente da elencare
manuale: L'indice si scrive da solo: metti un post nel cofanetto e la sua riga compare qui, in tutte le lingue.
Usato in: public/vv/lib/cofanetto.php:348
#### vv_cofanetto_nav_html(?array $box, int $post_id, string $lang, string $lingua_testi)
Disegna la barretta di navigazione del cofanetto. Su un episodio: precedente . il cofanetto (N di M) . successivo. Sulla copertina: la porta di ingresso alla prima puntata.
| parametro | descrizione | |
| `array | null $box` | il cofanetto come lo torna vv_cofanetto_indice() |
int $post_id | post che si sta guardando | |
string $lang | lingua da appiccicare ai link ('' = nessuna) | |
string $lingua_testi | lingua delle PAROLE della barretta. Sono due cose diverse: leggendo un post inglese da un link nudo (senza ?lang=) i link non devono prendersi il gettone, ma le scritte vanno in inglese lo stesso. |
Ritorna: string - HTML della barretta, stringa vuota se non c'e' cofanetto
manuale: La lingua viaggia sui link come un gettone (?lang=): chi legge in inglese resta in inglese di puntata in puntata.
Usato in: public/vv/visualizza_post.php:313, public/vv/visualizza_post_draft.php:212
#### vv_cofanetto_innesta(string $contenuto, string $nav)
Mette la barretta (o l'indice) DENTRO il foglio del post, non sotto. Se il testo e' avvolto nel riquadro .vv-postbg - quello che porta lo sfondo e la cornice - la barretta va infilata prima della sua chiusura, se no resta fuori, sul grigio della pagina.
| parametro | descrizione |
string $contenuto | HTML del post come esce dall'editor |
string $nav | HTML della barretta/indice (puo' essere vuoto) |
Ritorna: string - il contenuto con la barretta al posto giusto
manuale: Un post senza riquadro (i vecchi) non ha niente da chiudere: li' la barretta si accoda in fondo, come prima. Lo stesso vale per i post in cui il riquadro NON arriva alla fine del testo: la barretta deve stare IN FONDO a quello che si legge, e finire dentro un riquadro che chiude a meta' post la seppellirebbe in mezzo alle righe.
Usato in: public/vv/lib/cofanetto.php:417, public/vv/visualizza_post.php:420, public/vv/visualizza_post_draft.php:272
#### vv_postbg_chiusura(string $contenuto)
Trova dove si CHIUDE il riquadro .vv-postbg, contando le scatole. Non basta l'ultimo </div> del testo: quello e' l'ultimo div che capita, e in un post con la struttura sfasata puo' stare a meta' articolo (il riquadro chiude presto e il resto del testo gli rimane fuori). Qui si parte dal <div> che porta la classe e si scorre in avanti tenendo il conto di quante scatole si aprono e si chiudono: la chiusura buona e' quella che riporta il conto a zero.
| parametro | descrizione |
string $contenuto | HTML del post |
Ritorna: int|null - posizione del </div> che chiude il riquadro, oppure null se il riquadro non c'e' o resta aperto
manuale: Serve a vv_cofanetto_innesta() per capire se il riquadro avvolge davvero tutto il post. Un riquadro mai chiuso (HTML sbilanciato) torna null: chi chiama si accoda in fondo, che e' sempre una scelta sicura.
Usato in: public/vv/lib/cofanetto.php:394
#### vv_cofanetto_raggruppa(PDO $pdo, array $rows)
Raggruppa le righe di una lista sotto il loro cofanetto, per accorciarla. Le righe che non stanno in nessun cofanetto restano dove sono; quelle di uno stesso cofanetto si radunano nel punto in cui compare la PRIMA di loro, in ordine di puntata. La COPERTINA sta in testa al gruppo, e nel conteggio delle puntate non entra ('copertina' => true sulla sua riga).
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
array $rows | righe come le torna vv_fetch_posts() |
Ritorna: array - blocchi in ordine: ['tipo'=>'post','row'=>..] oppure ['tipo'=>'cofanetto','box'=>..,'righe'=>[..]]
manuale: Il conteggio 'totale' nel box e' quello VERO del cofanetto, non quello della pagina: cosi' si vede "3 di 5" quando una ricerca ne pesca solo alcuni.
Usato in: public/vv/diario_lista_admin.php:264, public/vv/diario_lista_guest.php:208, public/vv/inc/diario_list_lib.php:758
#### vv_cofanetto_famiglia_di(PDO $pdo, int $post_id)
La famiglia a cui appartiene un post: il capostipite. Una traduzione risponde con l'id del suo originale, un originale con il proprio.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post di partenza |
Ritorna: int - id della famiglia (0 se il post non esiste)
manuale: Nel cofanetto entrano le FAMIGLIE, non i singoli post: cosi' la scatola vale per tutte le lingue.
Usato in: public/vv/ajax/cofanetto_azione.php:37, public/vv/lib/cofanetto.php:608, public/vv/lib/cofanetto.php:646
#### vv_cofanetto_copertina_di(PDO $pdo, int $post_id)
La scatola di cui questo post e' la COPERTINA, se lo e'. La copertina non e' una puntata: sta fuori da cofanetto_post, e' il post che presenta il cofanetto e ne ospita l'indice.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post da esaminare |
Ritorna: array|null - riga di cofanetto, null se il post non fa da copertina
Usato in: public/vv/lib/cofanetto.php:656
#### vv_cofanetto_imposta_copertina(PDO $pdo, int $cofanetto_id, int $post_id)
Dice chi fa da copertina a una scatola. Un post fa da copertina a una scatola sola: se lo era di un'altra, quell'altra resta senza.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $cofanetto_id | scatola da vestire |
int $post_id | post che fa da copertina (0 = nessuno, la toglie) |
Ritorna: void
manuale: La copertina e' un post a se': non mettercelo anche come puntata, o nella fila si apre un buco.
Usato in: public/vv/ajax/cofanetto_azione.php:92, public/vv/ajax/cofanetto_azione.php:98, public/vv/crea_nuovo_post.php:43, public/vv/lib/cofanetto.php:849
#### vv_cofanetto_elenco(PDO $pdo)
Tutte le scatole esistenti, con quante puntate contengono. Serve al pannello per proporre "mettilo in...".
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
Ritorna: array - righe di cofanetto piu' 'quante'
Usato in: public/vv/crea_nuovo_post.php:63, public/vv/lib/cofanetto.php:677
#### vv_cofanetto_stato(PDO $pdo, int $post_id)
Tutto quello che il pannello deve sapere su un post: la sua famiglia, in che scatola sta (se ci sta), a che posto, e l'elenco delle scatole fra cui scegliere.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post aperto in modifica |
Ritorna: array - ['famiglia'=>int,'dentro'=>array|null,'copertina'=>array|null,'elenco'=>array,'sorelle'=>array]
manuale: Tre casi: il post e' una PUNTATA ('dentro'), e' la COPERTINA ('copertina'), o non c'entra niente (tutti e due null).
Usato in: public/vv/lib/cofanetto_widget.php:26, public/vv/modifica_post.php:580
#### vv_cofanetto_slug(PDO $pdo, string $nome)
Ricava uno slug ASCII e non ancora usato dal nome della scatola. (Le cartelle e gli indirizzi in casa VittRos si scrivono senza accenti: vedi la convenzione dei nomi dei waypoint.)
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
string $nome | nome della scatola, anche con accenti e apostrofi |
Ritorna: string - slug libero, es. "l-inchiesta-sui-fazzoletti"
Usato in: public/vv/lib/cofanetto.php:724
#### vv_cofanetto_crea(PDO $pdo, string $nome, string $sottotitolo, string $voce, int $categoria_id)
Crea una scatola nuova, vuota.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
string $nome | come si chiama il cofanetto |
string $sottotitolo | riga di spiegazione (puo' essere vuota) |
string $voce | parola per le puntate: "Episodio", "Tappa"... |
int $categoria_id | categoria del diario (0 = nessuna) |
Ritorna: int - id della scatola appena creata
Usato in: public/vv/ajax/cofanetto_azione.php:46
#### vv_cofanetto_aggiungi(PDO $pdo, int $cofanetto_id, int $famiglia_id)
Mette una famiglia in una scatola, in coda alle altre. Se la famiglia stava gia' in un'altra scatola, trasloca (una famiglia = un cofanetto).
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $cofanetto_id | scatola di destinazione |
int $famiglia_id | famiglia da metterci |
Ritorna: int - posizione assegnata
Usato in: public/vv/ajax/cofanetto_azione.php:53, public/vv/ajax/cofanetto_azione.php:59
#### vv_cofanetto_rinumera(PDO $pdo, int $cofanetto_id)
Rimette in fila le posizioni di una scatola (1,2,3...) dopo che si e' tolta o spostata una puntata: niente buchi, niente doppioni.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $cofanetto_id | scatola da rinumerare |
Ritorna: void
Usato in: public/vv/lib/cofanetto.php:789
#### vv_cofanetto_togli(PDO $pdo, int $famiglia_id)
Toglie una famiglia dalla sua scatola e richiude la fila.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $famiglia_id | famiglia da togliere |
Ritorna: void
Usato in: public/vv/ajax/cofanetto_azione.php:63
#### vv_cofanetto_sposta(PDO $pdo, int $famiglia_id, int $delta)
Sposta una puntata di un posto in su (-1) o in giu' (+1), scambiandola con la vicina. Ai bordi non fa niente.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $famiglia_id | puntata da spostare |
int $delta | -1 su, +1 giu' |
Ritorna: int - la nuova posizione
Usato in: public/vv/ajax/cofanetto_azione.php:67, public/vv/ajax/cofanetto_azione.php:71
#### vv_cofanetto_aggiorna(PDO $pdo, int $cofanetto_id, string $nome, string $sottotitolo, string $voce, int $copertina)
Aggiorna i dati della scatola (nome, sottotitolo, parola-voce, copertina). Lo slug NON si tocca: e' l'indirizzo, se cambia si rompono i collegamenti gia' dati in giro.
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $cofanetto_id | scatola da aggiornare |
string $nome | nuovo nome |
string $sottotitolo | nuovo sottotitolo |
string $voce | nuova parola-voce |
int $copertina | post copertina (0 = nessuna) |
Ritorna: void
Usato in: public/vv/ajax/cofanetto_azione.php:77
public/vv/lib/cofanetto_widget.php
#### vv_cofanetto_pannello_html(PDO $pdo, int $post_id)
Disegna il pannello di gestione del cofanetto per il post aperto in modifica. Tre casi: il post e' una PUNTATA (fila e comandi), e' la COPERTINA (presentazione della scatola), o non c'entra niente (allora propone di metterlo in una scatola, di fargli da copertina, o di crearne una nuova).
| parametro | descrizione |
PDO $pdo | connessione al DB del diario |
int $post_id | post aperto in modifica |
Ritorna: string - HTML del pannello (senza il contenitore a tendina)
manuale: Il post entra nel cofanetto con tutta la sua FAMIGLIA: le traduzioni ci finiscono da sole.
Usato in: public/vv/ajax/cofanetto_azione.php:107, public/vv/lib/cofanetto_widget.php:161, public/vv/modifica_post.php:359
#### vv_cofanetto_pannello_js()
Il pezzetto di JavaScript del pannello: manda l'azione all'ajax e rimpiazza il pannello con quello che il server rimanda gia' disegnato.
Ritorna: string - il tag <script> pronto da stampare una volta sola
manuale: Non disegna niente: raccoglie i campi del pannello e li spedisce. Il disegno resta di vv_cofanetto_pannello_html().
Usato in: public/vv/modifica_post.php:361
public/vv/lib/core/3_2_1_Go.php
#### vv_db_cfg_debug()
Ritorna [cfg, src], dove cfg è l'array completo (con pass), src indica da dove è arrivato ogni campo.
Usato in: public/vv/lib/core/3_2_1_Go.php:341, public/vv/testing/db_doctor.php:16
#### h($s)
Escape HTML di casa: da usare SEMPRE al posto di htmlspecialchars. Tollera null e array (li unisce con " & ") e non muore sui byte sporchi grazie a ENT_SUBSTITUTE.
| parametro | descrizione |
mixed $s | testo (o null, o array) da mettere in pagina |
Ritorna: string - testo con &<>"' resi innocui, in UTF-8
manuale: Sempre attorno a qualunque cosa arrivi dal DB o dall'utente.
Usato in: public/vv/ajax/post_audio.php:44, public/vv/ajax/post_pdf.php:37, public/vv/cestino.php:158, public/vv/cestino.php:163, public/vv/cestino.php:173, public/vv/cestino.php:196, public/vv/cestino.php:201, public/vv/cestino.php:203, public/vv/cestino.php:205, public/vv/cestino.php:222, public/vv/crea_nuovo_post.php:118, public/vv/diario_lista_admin.php:239, public/vv/diario_lista_admin.php:248, public/vv/diario_lista_admin.php:249, public/vv/inc/diario_list_lib.php:546, public/vv/inc/diario_list_lib.php:555, public/vv/inc/diario_list_lib.php:556, public/vv/inc/diario_list_lib.php:576, public/vv/inc/diario_list_lib.php:682, public/vv/inc/diario_list_lib.php:777 _(+228)_
public/vv/lib/core/compat_vv_shims.php
#### vv_site_link(string $path = '', $label = null)
vv_site_link($path = '', $label = null) -> href string or full <a> when second arg provided. Minimal fallback: prefix BASE_URL.
Usato in: public/vv/debug/whoami_max_diag.php:26, public/vv/lib/core/compat_vv_shims.php:249, public/vv/lib/core/compat_vv_shims.php:388, public/vv/lib/footer.php:13
#### vv_app_meta($key = null, $default = null)
vv_app_meta($key = null, $default = null) Fallback: delega a vv_meta() se disponibile, altrimenti legge meta/version.json.
Usato in: public/vv/lib/core/compat_vv_shims.php:303, public/vv/lib/core/compat_vv_shims.php:434, public/vv/lib/core/compat_vv_shims.php:439, public/vv/lib/core/compat_vv_shims.php:442, public/vv/lib/core/compat_vv_shims.php:445, public/vv/lib/core/compat_vv_shims.php:449, public/vv/lib/functions.php:68, public/vv/lib/functions.php:86, public/vv/lib/functions.php:504, public/vv/lib/helper.php:29, public/vv/lib/partials/info_modal.php:3
#### vv_last_updated_human($ts = null)
vv_last_updated_human($ts) Ritorna stringa leggibile breve (es. "2h", "3d", "2025-10-08")
Usato in: public/vv/debug/whoami_max_diag.php:29, public/vv/lib/core/compat_vv_shims.php:272, public/vv/lib/core/compat_vv_shims.php:333, public/vv/lib/footer.php:14
#### vv_year_span($from, $to = null)
vv_year_span($from, $to = null) Input: string|int date or timestamp; ritorna "YYYY" o "YYYY–YYYY" oppure vuoto.
Usato in: public/vv/lib/core/compat_vv_shims.php:355, public/vv/lib/footer.php:17, public/vv/lib/footer.php:23
#### vv_site_link(string $path = '')
vv_site_link($path) -> string Semplice helper per generare link interni.
Usato in: public/vv/debug/whoami_max_diag.php:26, public/vv/lib/core/compat_vv_shims.php:249, public/vv/lib/core/compat_vv_shims.php:388, public/vv/lib/footer.php:13
#### vv_latest_changelog()
vv_latest_changelog(): string Prova a leggere i changelog più comuni e ritorna un frammento HTML o testo.
Usato in: public/vv/lib/core/compat_vv_shims.php:402, public/vv/lib/partials/info_modal.php:25
public/vv/lib/core/meta.php
#### vv_meta($key = null, $default = null)
vv_meta(): legge i meta. - vv_meta() → array completo - vv_meta('chiave', $default) → valore o default - vv_meta(['a','b']) → array con quelle chiavi
Usato in: public/vv/lib/core/compat_vv_shims.php:72, public/vv/lib/core/compat_vv_shims.php:293, public/vv/lib/core/compat_vv_shims.php:304, public/vv/lib/core/compat_vv_shims.php:309, public/vv/lib/core/meta.php:92, public/vv/lib/core/meta.php:93, public/vv/lib/core/meta.php:94, public/vv/lib/core/meta.php:95, public/vv/tools/vv_selftest.php:20, public/vv/tools/vv_selftest.php:21, public/vv/tools/vv_selftest.php:81
public/vv/lib/core/roles.php
#### current_user()
Ritorna array compatibile con vecchio codice: - 'id' - 'username' - 'ruolo' (stringa: il ruolo principale) - 'roles' (array)
Usato in: public/vv/_deprecato/utenti_legacy_20260905/ajax_profilo_avatar.php:8, public/vv/_deprecato/utenti_legacy_20260905/profilo.php:6, public/vv/ajax/handle_rimuovi_post.php:16, public/vv/ajax/profilo_save.php:7, public/vv/bg_picker.php:22, public/vv/cestino.php:41, public/vv/debug/whoami_max.php:21, public/vv/diario_lista_admin.php:21, public/vv/diario_lista_admin.php:27, public/vv/diario_lista_admin.php:29, public/vv/inc/diario_list_lib.php:29, public/vv/inc/diario_list_lib.php:30, public/vv/inc/diario_list_lib.php:195, public/vv/inc/diario_list_lib.php:473, public/vv/lib/core/roles.php:71, public/vv/lib/functions.php:533, public/vv/lib/functions.php:551, public/vv/media_popup.php:50, public/vv/musica_picker.php:34, public/vv/pubblicati.php:7
public/vv/lib/db_utilities.php
#### draft_delete(mysqli $db, int $post_id, int $current_user_id, bool $force=false)
Cancella bozza solo se: - l'utente è proprietario (updated_by == current_user), oppure - è admin (passa $force=true).
Usato in: _(nessun uso trovato nel lab)_
public/vv/lib/draft.php
#### vv_draft_uguale_alla_versione(PDO $pdo, int $post_id, string $titolo, string $hash, ?string $sfondo)
Dice se quello che si sta per mettere in bozza e' identico a quello che il post gia' mostra: stesso contenuto E stesso titolo (e sfondo, se chi scrive ne ha uno). In quel caso non e' lavoro in sospeso.
| parametro | descrizione | |
PDO $pdo | connessione al DB del diario | |
int $post_id | post da confrontare | |
string $titolo | titolo che si sta per scrivere | |
string $hash | impronta del contenuto che si sta per scrivere | |
| `string | null $sfondo` | sfondo che si sta per scrivere (NULL = nessuna opinione) |
Ritorna: bool - true se non c'e' nessuna differenza
manuale: Guarda la STESSA versione che carica l'editor (l'ultima non nascosta): e' da li' che nascono i fantasmi.
Usato in: public/vv/lib/draft.php:72
#### vv_draft_write(PDO $pdo, int $post_id, string $titolo, string $contenuto, int $uid, ?string $sfondo = null)
Scrive (o aggiorna) la bozza di un post. Calcola da se' l'impronta del contenuto: chi chiama non deve ricordarsene, ed e' il motivo per cui questa funzione esiste. Se non c'e' nessuna differenza con quello che il post gia' mostra, invece di scrivere CANCELLA la bozza.
| parametro | descrizione | |
PDO $pdo | connessione al DB del diario | |
int $post_id | post a cui appartiene la bozza | |
string $titolo | titolo da mettere in bozza | |
string $contenuto | HTML del post | |
int $uid | chi sta scrivendo (utente in sessione) | |
| `string | null $sfondo` | sfondo del post; NULL = "non ho un'opinione", cioe' lascia quello che c'e' gia' in bozza |
Ritorna: string - l'impronta del contenuto (sha256), scritta o no
manuale: Da usare SEMPRE al posto di una INSERT a mano su post_drafts, cosi' l'impronta non puo' mancare.
Usato in: public/vv/ajax/create_translation.php:135, public/vv/ajax/handle_restore_version.php:161, public/vv/ajax/handle_salva_post.php:124, public/vv/ajax/handle_salva_post.php:417, public/vv/ajax/restore_to_draft.php:79, public/vv/ajax/restore_to_draft.php:91, public/vv/ajax/translate_post.php:120, public/vv/ajax/translate_save.php:82
public/vv/lib/i18n_adapter.php
#### vrv_has_nonempty_heading(DOMElement $wrap)
Ritorna true se esiste almeno un <h2> o <h3> non vuoto (testo reale).
Usato in: public/vv/lib/i18n_adapter.php:47
#### vrv_collect_element_nodes(DOMNode $root)
Colleziona tutti i nodi ELEMENT in ordine documento, ricorsivamente. Così vediamo <hr>/<h2>/<h3> anche se annidati dentro div/p/span.
Ritorna: DOMElement[]
Usato in: public/vv/lib/i18n_adapter.php:88
#### vrv_trim_nbsp(string $s)
Trim che elimina NBSP e spazi “strani”.
Usato in: public/vv/lib/i18n_adapter.php:102, public/vv/lib/i18n_adapter.php:203
public/vv/lib/media_helpers.php
#### vv_copy_resize_to_post(string $srcAbs, string $destDirAbs = '', array $opts = [])
Copia (e se possibile ridimensiona) $srcAbs in foto/post_$postId/ mantenendo il nome file.
| parametro | descrizione |
string $srcAbs | |
string $destDirAbs | (se vuoto, calcolato da BASE_FS) |
array $opts | ['max_w'=>1200,'max_h'=>900,'quality'=>85] |
Ritorna: bool
Usato in: public/vv/_deprecato/handler_ajax.php:78, public/vv/media_popup.php:188
#### vv_set_post_cartella(int $postId, string $imgRel)
Registra in post.cartella la cartella (relativa a leNostre) dell'ultima foto inserita nel post. È la fonte che alimenta la sezione "Salvata" del VitExplorer (media_popup.php → azione 'sorgenti'): così, riaprendo il popup, la cartella da cui si è pescato torna in cima senza ricercarla. NB: prima questo campo NON veniva MAI scritto all'inserimento foto (letto e buttato in salva_post.php, e gli endpoint ajax erano morti), quindi cartella restava NULL — vedi indagine 2026-06-04.
| parametro | descrizione |
int $postId | id del post in modifica |
string $imgRel | path della foto relativo a leNostre, es. "2025-2026/251219 Spagna - Portogallo/IMG_0001.jpg" |
Ritorna: bool - true se l'UPDATE è andato a buon fine
Usato in: public/vv/media_popup.php:180, public/vv/media_popup.php:195
public/vv/lib/musica_widget.php
#### vv_musica_disponibili()
I brani disponibili nella cartella condivisa, in ordine naturale.
Ritorna: string[] - nomi di file (solo basename)
Usato in: public/vv/ajax/post_musica.php:66, public/vv/lib/musica_widget.php:90, public/vv/lib/musica_widget.php:125, public/vv/musica_picker.php:61
#### vv_musica_url(string $nome)
L'indirizzo web di un brano di cui si conosce solo il nome. Ogni pezzo del percorso si codifica per conto suo: le barre fra le cartelle devono restare barre. Se il brano non si trova si torna all'indirizzo piatto di sempre: meglio un 404 come ieri che una pagina che si rompe.
| parametro | descrizione |
string $nome | il nome del file, come sta nel campo musica |
Ritorna: string
Usato in: public/vv/ajax/musica_upload.php:113, public/vv/lib/musica_widget.php:50, public/vv/lib/musica_widget.php:91, public/vv/musica_picker.php:74
#### vv_musica_urls()
La mappa nome -> indirizzo di tutti i brani, per il JavaScript: la pagina non puo' indovinare in che cartella sta un brano, e chiederlo al server a ogni clic sarebbe un viaggio per niente.
Ritorna: array<string,string>
Usato in: public/vv/lib/musica_widget.php:137, public/vv/musica_picker.php:203
#### vv_musica_scaletta(?string $raw)
La scaletta di un post: i nomi nel campo post.musica, in ordine. Stessa lettura del visore (visualizza_post.php ~r.243): si esplode sulla barra verticale e si passa da basename, cosi' un valore vecchio con dentro un percorso non porta fuori dalla cartella.
| parametro | descrizione |
string $raw | il campo grezzo |
Ritorna: string[]
Usato in: public/vv/ajax/post_musica.php:16, public/vv/lib/musica_widget.php:126
#### vv_musica_pannello_html(int $post_id, string $musica_raw = '', string $eredita_da = '')
Il pannello della tendina «Musica»: la scaletta del post in cima, nel suo ordine, e sotto tutti gli altri brani della cartella. Salva da se' con ajax/post_musica.php (js/vrv-musica.js).
| parametro | descrizione |
int $post_id | |
string $musica_raw | il campo post.musica gia' letto dalla pagina |
string $eredita_da | nome della musica del PADRE, se questo post e' una traduzione senza musica sua (si limita a dirlo: il visore fa gia' l'ereditarieta'). |
Ritorna: string - HTML
Usato in: public/vv/modifica_post.php:390
#### vv_musica_riga_html(string $nome, bool $manca = false)
Una riga della scaletta. Serve due volte: per stampare la scaletta che c'e' gia', e per riempire il <template> che il JS clona quando dal selettore arriva un brano nuovo. Il JS NON la riscrive: cosi' la riga esiste in un posto solo e non ci sono due versioni che divergono al primo ritocco.
| parametro | descrizione |
string $nome | |
bool $manca | il file non c'e' piu' nella cartella |
Ritorna: string - HTML
Usato in: public/vv/lib/musica_widget.php:148, public/vv/lib/musica_widget.php:161
public/vv/lib/perm.php
#### vv_can_edit_post(array $post, array $user, string $role)
Vero se l'utente puo' MODIFICARE questo post.
| parametro | descrizione |
array $post | la riga del post (serve 'autore_id') |
array $user | l'utente corrente (serve 'id') |
string $role | il suo ruolo nel VRV |
Ritorna: bool
Usato in: public/vv/ajax/handle_salva_post.php:211, public/vv/ajax/release_post.php:60, public/vv/inc/diario_list_lib.php:476, public/vv/modifica_post.php:80
#### vv_can_delete_post(array $post, array $user, string $role)
Vero se l'utente puo' CANCELLARE questo post. Stessa regola della modifica: cancellare e' piu' grave, non meno.
| parametro | descrizione |
array $post | |
array $user | |
string $role |
Ritorna: bool
Usato in: public/vv/ajax/handle_rimuovi_post.php:37, public/vv/cestino.php:72, public/vv/inc/diario_list_lib.php:477
#### vv_can_create_post(string $role)
Vero se l'utente puo' CREARE un post nuovo. Un post che non esiste ancora non ha un autore da confrontare: qui conta solo il ruolo.
| parametro | descrizione |
string $role |
Ritorna: bool
Usato in: public/vv/modifica_post.php:29
#### vv_is_post_owner(array $post, array $user)
Il confronto autore/utente, scritto UNA volta sola. Un post senza autore (autore_id NULL) non e' di nessuno: non lo tocca chi non e' admin, se no diventerebbe di chiunque.
| parametro | descrizione |
array $post | |
array $user |
Ritorna: bool
Usato in: public/vv/lib/perm.php:45, public/vv/lib/perm.php:64
public/vv/lib/thumbs.php
#### thumb_url(string $relPath, int $w = 320)
Ritorna l'URL del thumbnail (creandolo se manca). $relPath è il percorso relativo a /leNostre (es: "2025/0314 .../foto.jpg") $w è la larghezza target (altezza auto, mantiene proporzioni).
Usato in: public/vv/bin/pregenera_thumbs.php:49
#### _vv_make_thumb_gd(string $srcFs, string $dstFs, int $w, string $ext)
Genera thumb con GD
Usato in: public/vv/lib/thumbs.php:28
public/vv/lib/vrv_editor_presence.php
#### vrv_presence_touch(int $post_id, string $win, int $uid, string $nome, int $aperta_alle = 0)
Segna "questa finestra e' viva su questo post". Da chiamare a ogni battito e a ogni salvataggio.
| parametro | descrizione |
int $post_id | |
string $win | token della finestra (lo genera modifica_post.php) |
int $uid | utente |
string $nome | nome da mostrare nel cartello |
int $aperta_alle | timestamp di apertura della finestra (0 = adesso) |
Ritorna: void
Usato in: public/vv/ajax/editor_ping.php:48, public/vv/ajax/handle_salva_post.php:299, public/vv/modifica_post.php:314
#### vrv_presence_drop(int $post_id, string $win)
Toglie la finestra dall'elenco (chiusura pulita dell'editor).
Ritorna: void
Usato in: public/vv/ajax/editor_ping.php:42
#### vrv_presence_others(int $post_id, string $win)
Le ALTRE finestre vive sullo stesso post (esclusa la propria).
| parametro | descrizione |
int $post_id | |
string $win | la finestra che chiede, da escludere |
Ritorna: array - elenco di ['nome','aperta_alle','ultimo','uid'], le piu' vecchie prima
Usato in: public/vv/ajax/editor_ping.php:50
_27 file senza funzioni documentate (saltati):public/vv/lib/bootstrap1.php,public/vv/lib/colors.php,public/vv/lib/db_polyfills.php,public/vv/lib/disputil.php,public/vv/lib/footer.php,public/vv/lib/functions.php,public/vv/lib/guard_admin.php,public/vv/lib/guard_auth.php,public/vv/lib/header.php,public/vv/lib/header_badge.php,public/vv/lib/header_badge_mini.php,public/vv/lib/header_slot_diario_admin.php,public/vv/lib/header_slot_modifica.php,public/vv/lib/helper.php,public/vv/lib/helpers.php,public/vv/lib/js_globals.php,public/vv/lib/lingue.php,public/vv/lib/partials/info_modal.php,public/vv/lib/ridimensiona_funziona.php,public/vv/lib/ridimensiona_lib.php,public/vv/lib/theme.php,public/vv/lib/torna_admin.php,public/vv/lib/trad_widget.php,public/vv/lib/upload_tinymce.php,public/vv/lib/version_meta.php,public/vv/lib/versioning.php,public/vv/lib/vitropolis_control_panel.php._
Wizard foto VRW (public/wiz_foto)
Le funzioni vrw_* del gestore foto, che non stanno in platform/lib.
public/wiz_foto/import.php
#### exifDate(string $file)
Prova a leggere EXIF datetime (se possibile).
Usato in: public/vv/import_amazon_2.php:80, public/wiz_foto/import.php:123
#### filenameDate(string $path)
Prova a ricavare data/ora dal nome file (Amazon style).
Usato in: public/wiz_foto/import.php:124
#### filenameYearHint(string $path)
Solo anno dal nome (anche se non hai ora), utile per indecise.
Usato in: public/wiz_foto/import.php:127
#### zipLabel(string $unzippedRoot, string $filePath)
Trova ziplabel = nome cartella immediatamente sotto unzipped.
Usato in: public/wiz_foto/import.php:120
#### safeTargetPath(string $dstDir, string $baseName)
Evita sovrascritture: ..._001, ..._002 ...
Usato in: public/vv/import_amazon_2.php:92, public/wiz_foto/import.php:134
#### isDuplicateBySize(string $dstPath, int $srcSize)
Doppioni: se esiste già un file stesso size, consideriamo duplicato.
Usato in: public/wiz_foto/import.php:136, public/wiz_foto/import.php:156
#### vrw_import_file(string $src, string $unzippedRoot, string $destBase, string $mode, bool $dryRun, bool $useMtime, array &$stats, array &$logMoved, array &$logCopied, array &$logSkipped, array &$logIndecise, array &$errors)
Importa UN file (EXIF/nome→data→destinazione, doppioni, copy/move). Aggiorna stats e log per riferimento. Usata sia dal loop legacy (no-JS) sia dall'endpoint AJAX per-bucket (barra pecore).
Usato in: public/wiz_foto/import.php:199, public/wiz_foto/import.php:254
public/wiz_foto/lenostre_index.php
#### ln_nominatim_reverse(float $lat, float $lon)
Reverse-geocode via Nominatim (cortesia: User-Agent nostro, in italiano). 📌 21/08/2026 - LA FRAZIONE E IL COMUNE, deciso da vitti. Fino a stamattina si chiedeva a «zoom 12», che risponde sempre col COMUNE: Colonnata, i prati sopra Campocecina e Campocecina stessa erano tutti e tre «Carrara, Italia» - vero, e inutile. A zoom 16 la risposta contiene anche il paese vero, e vitti ha scelto di tenerli tutti e due: «Colonnata (Carrara), Italia». Lungo ma completo, e non perde il comune, che e' quello che Elena copia per battezzare le cartelle. ⚠️ Si guardano SOLO village e hamlet come nome piccolo. suburb e neighbourhood in citta' sono divisioni amministrative: a Milano davano «Municipio 1 (Milano)», che non e' un posto dove si va, e' una casella del municipio.
Usato in: public/wiz_foto/lenostre_index.php:275, public/wiz_foto/lenostre_index.php:320, public/wiz_foto/vrw_ops.php:494
#### ln_luogo(float $lat, float $lon, bool $chiedi = true)
Nome-luogo pigro: cache -> Nominatim (e cache). $chiedi=false = solo cache, zero rete.
Usato in: public/wiz_foto/vrw_ops.php:498
#### ln_localita_fill(PDO $pdo, ?string $relPrefix = null, int $maxRete = 60)
Riempie foto.localita dove manca. Torna ['foto','nomi','chiamate']. $relPrefix : limita a un file o a una cartella (path relativo a leNostre); null = tutto. $maxRete : quante volte al massimo si puo' disturbare Nominatim (0 = solo cache). Le foto si raggruppano per COORDINATA arrotondata prima di chiedere: venti scatti dello stesso pranzo sono una domanda sola, non venti.
Usato in: public/wiz_foto/geocodifica_foto.php:30, public/wiz_foto/nextcloud_import.php:138, public/wiz_foto/popola_foto_index.php:35
public/wiz_foto/nextcloud_import.php
#### nc_peso(int $b)
Dimensione in parole, per i pannelli (niente byte in faccia a Elena).
Usato in: public/wiz_foto/nextcloud_import.php:268, public/wiz_foto/nextcloud_import.php:292
public/wiz_foto/vrw_ops.php
#### vrw_cestino_dir()
Cartella-cestino e suo registro (ledger di ripristino).
Usato in: public/wiz_foto/vrw_ops.php:31, public/wiz_foto/vrw_ops.php:43, public/wiz_foto/vrw_ops.php:125, public/wiz_foto/vrw_ops.php:128, public/wiz_foto/vrw_ops.php:136, public/wiz_foto/vrw_ops.php:138, public/wiz_foto/vrw_ops.php:194, public/wiz_foto/vrw_ops.php:198, public/wiz_foto/vrw_ops.php:200, public/wiz_foto/vrw_ops.php:229, public/wiz_foto/vrw_ops.php:231
#### vrw_cestino_load()
Legge il ledger del cestino (lista di voci ripristinabili).
Usato in: public/wiz_foto/vrw_ops.php:141, public/wiz_foto/vrw_ops.php:162, public/wiz_foto/vrw_ops.php:185
#### vrw_cestino_save(array $list)
Salva il ledger del cestino (crea la cartella se manca).
Usato in: public/wiz_foto/vrw_ops.php:144, public/wiz_foto/vrw_ops.php:203, public/wiz_foto/vrw_ops.php:233
#### vrw_trash_id()
Id univoco di una voce-cestino (timestamp + coda casuale).
Usato in: public/wiz_foto/vrw_ops.php:126
#### vrw_idx_sync(callable $fn)
Riallinea l'indice foto, NON bloccante (DB giu' = logga e prosegue).
Usato in: public/wiz_foto/vrw_ops.php:145, public/wiz_foto/vrw_ops.php:205, public/wiz_foto/vrw_provider.php:405, public/wiz_foto/vrw_provider.php:436, public/wiz_foto/vrw_provider.php:470
#### vrw_load_points(string $mpFile)
Estrae l'array da "window.puntiFoto = [ ... ];".
Usato in: public/wiz_foto/vrw_ops.php:89, public/wiz_foto/vrw_ops.php:469
#### vrw_count_refs(string $tripsDir, string $relPath, string $kind)
Conta dove un path (file esatto o cartella-prefisso) e' referenziato in tutti i trip. SOLA LETTURA: serve ad AVVISARE prima di cestinare, non a riscrivere. Ritorna il totale di riferimenti (attivi + nascosti) e il dettaglio per-trip.
| parametro | descrizione | |
string $tripsDir | radice dei viaggi (map_points.js) | |
string $relPath | path relativo a leNostre | |
string $kind | 'file' | 'folder' |
Ritorna: array - ['total'=>int, 'hits'=>[['trip','active','hidden'], ...]]
Usato in: public/wiz_foto/vrw_provider.php:288, public/wiz_foto/vrw_provider.php:386
#### vrw_trash_one(string $rel, string $kind, array $P)
CESTINA un elemento (file o cartella): sposta il file in .cestino, annota nel ledger, riallinea l'indice. Mai unlink, MAI tocca le mappe.
| parametro | descrizione | |
string $rel | path relativo a leNostre (gia' ripulito dal chiamante) | |
string $kind | 'file' | 'folder' |
array $P | paths (chiavi almeno: fs, skip) |
Ritorna: array - ['ok'=>bool, 'id'=>?, 'err'=>?]
Usato in: public/wiz_foto/vrw_provider.php:300
#### vrw_cestino_list(array $P)
Contenuto del cestino per il pannello: le voci del ledger, le piu' recenti in cima, ognuna con la miniatura (se e' un file) servita da img.php dal file gia' spostato in .cestino. Sola lettura.
| parametro | descrizione |
array $P | paths (chiavi: img) |
Ritorna: array - ['count'=>int, 'items'=>[...]]
Usato in: public/wiz_foto/vrw_provider.php:315
#### vrw_cestino_restore(string $id, array $P)
RIPRISTINA una voce dal cestino: riporta il file (e il gemello thumb, se c'era) al suo posto in leNostre, toglie la voce dal ledger e riallinea l'indice. Non tocca mai le mappe (leggo-non-scrivo): se la foto era usata da un trip, torna disponibile e basta.
| parametro | descrizione |
string $id | id della voce-cestino |
array $P | paths (chiavi: fs) |
Ritorna: array - ['ok'=>bool, 'rel'=>?, 'err'=>?]
Usato in: public/wiz_foto/vrw_provider.php:322
#### vrw_rrm(string $p)
Cancellazione ricorsiva (l'UNICO vero unlink: solo per "svuota cestino").
Usato in: public/wiz_foto/vrw_ops.php:213, public/wiz_foto/vrw_ops.php:231
#### vrw_cestino_empty()
SVUOTA il cestino: l'unico gesto distruttivo del VRW. Cancella per davvero (unlink ricorsivo) tutto cio' che sta in .cestino, tranne il ledger stesso, poi azzera il ledger.
Ritorna: array - ['ok'=>true, 'removed'=>int]
Usato in: public/wiz_foto/vrw_provider.php:331
#### vrw_name_valid(string $name, array $skip)
Nome valido: non vuoto, niente separatori/dotfile/controllo/servizio.
Usato in: public/wiz_foto/vrw_provider.php:381, public/wiz_foto/vrw_provider.php:397
#### vrw_write_points(string $mpFile, array $points)
Salva window.puntiFoto (con .bak datato accanto al file).
Usato in: public/wiz_foto/vrw_ops.php:471
#### vrw_path_rewrite(string $s, string $old, string $new, string $kind)
Riscrive un path se combacia: file = esatto, folder = prefisso.
Usato in: public/wiz_foto/vrw_ops.php:279, public/wiz_foto/vrw_ops.php:287, public/wiz_foto/vrw_ops.php:304
#### vrw_rewrite_points(array &$points, string $oldWeb, string $newWeb, string $kind)
Riscrive i riferimenti in un array puntiFoto (files/excluded + thumb). Ritorna n. modifiche.
Usato in: public/wiz_foto/vrw_ops.php:470
#### vrw_rewrite_manifest(string $file, string $oldFs, string $newFs, string $kind)
Riscrive i path FS dentro un manifest .txt (slideshow). Ritorna n. righe modificate.
Usato in: public/wiz_foto/vrw_ops.php:475
#### vrw_resolve_new_rel(string $rel, string $name, string $kind)
rel + nuovo nome -> nuovo rel (per i file conserva l'estensione se omessa).
Usato in: public/wiz_foto/vrw_provider.php:382, public/wiz_foto/vrw_provider.php:398
#### vrw_resolve_move_rel(string $rel, string $destDir)
Destinazione di uno spostamento: cartella dest + basename(rel).
Usato in: public/wiz_foto/vrw_ops.php:345
#### vrw_validate_move(string $rel, string $kind, string $destDir, array $P)
Valida uno spostamento di rel (kind) nella cartella destDir.
Usato in: public/wiz_foto/vrw_provider.php:429
#### vrw_resolve_copy_rel(string $rel, string $destDir, string $LN)
Copia: risolve il path di destinazione. Se esiste gia' un elemento con lo stesso nome (anche copiando nella STESSA cartella) aggiunge " - copia" / " - copia N" (per i file, prima dell'estensione).
Usato in: public/wiz_foto/vrw_ops.php:390
#### vrw_validate_copy(string $rel, string $kind, string $destDir, array $P)
Valida una copia. A differenza dello SPOSTA, copiare nella STESSA cartella e' lecito (produce "- copia"); resta vietato copiare una cartella dentro se stessa o una sua discendente.
Usato in: public/wiz_foto/vrw_provider.php:465
#### vrw_copy_tree(string $srcAbs, string $dstAbs)
Copia ricorsiva NON distruttiva: file singolo o intero albero. NON tocca gli originali, NON aggiorna riferimenti/mappe (la copia e' nuova, nessuno la referenzia). Best-effort sui permessi.
Usato in: public/wiz_foto/vrw_provider.php:468
#### vrw_cascade_move(string $rel, string $newRel, string $kind, array $P, string $bkLabel = 'cascade')
Motore cascata: porta rel -> newRel (FS + gemello mirror thumbs + map_points files/excluded/thumb + manifest slideshow), con backup mirato dei soli file referenzianti. Usato da RINOMINA e SPOSTA.
| parametro | descrizione | |
string $rel | path relativo origine | |
string $newRel | path relativo destinazione | |
string $kind | 'file' | 'folder' |
array $P | paths (chiavi: fs, trips, slides) | |
string $bkLabel | etichetta cartella-backup ('rename' | 'move') |
Ritorna: array - ['ok'=>bool, 'refs_updated'=>int, 'manifests_updated'=>int, 'backup'=>string, 'err'=>?]
Usato in: public/wiz_foto/vrw_provider.php:402, public/wiz_foto/vrw_provider.php:431
#### vrw_nominatim_reverse(float $lat, float $lon)
Reverse-geocode via Nominatim (cortesia: User-Agent + zoom 12, italiano).
Usato in: _(nessun uso trovato nel lab)_
#### vrw_geocode(float $lat, float $lon)
Nome-luogo pigro: cache -> Nominatim (e cache). Ritorna ['ok','place'].
Usato in: public/wiz_foto/vrw_provider.php:370
public/wiz_foto/vrw_provider.php
#### vrw_paths()
Radici e regole condivise col gestore_foto (unica fonte di verita').
Usato in: public/wiz_foto/vrw_provider.php:56, public/wiz_foto/vrw_vthumb.php:25
#### vrw_clean(string $s)
Ripulisce una key-path dal client (niente .. o backslash, niente / ai bordi).
Usato in: public/wiz_foto/vrw_provider.php:64, public/wiz_foto/vrw_provider.php:86, public/wiz_foto/vrw_provider.php:252, public/wiz_foto/vrw_provider.php:278, public/wiz_foto/vrw_provider.php:377, public/wiz_foto/vrw_provider.php:393, public/wiz_foto/vrw_provider.php:419, public/wiz_foto/vrw_provider.php:427, public/wiz_foto/vrw_provider.php:455, public/wiz_foto/vrw_provider.php:463
#### vrw_skip(string $name, array $skip)
Vero se il nome di cartella va nascosto (servizio o nascosta con .).
Usato in: public/wiz_foto/vrw_provider.php:69, public/wiz_foto/vrw_provider.php:72, public/wiz_foto/vrw_provider.php:97
#### vrw_provider()
Costruisce e ritorna il provider del VRW per vrp_explorer.
Usato in: public/wiz_foto/gestore_foto.php:22, public/wiz_foto/gestore_foto_vx.php:22
_14 file senza funzioni documentate (saltati):public/wiz_foto/_cfg.php,public/wiz_foto/_info.php,public/wiz_foto/_pecore.php,public/wiz_foto/export_staging_csv.php,public/wiz_foto/geocodifica_foto.php,public/wiz_foto/gestore_foto.php,public/wiz_foto/gestore_foto_vx.php,public/wiz_foto/heic_to_jpg.php,public/wiz_foto/index.php,public/wiz_foto/nc_thumb.php,public/wiz_foto/popola_foto_index.php,public/wiz_foto/unzip_amazon.php,public/wiz_foto/upload_to_staging.php,public/wiz_foto/vrw_vthumb.php._
Ajax
Gli endpoint AJAX del lab (documentati dove i file definiscono funzioni con docblock).
public/vv/ajax/post_audio.php
#### audio_stop(string $msg, int $code)
Ferma tutto e spiega perche', in una paginetta leggibile invece che con uno scaricamento rotto.
| parametro | descrizione |
string $msg | cosa e' andato storto, in italiano |
int $code | codice HTTP da restituire |
Ritorna: void
Usato in: public/vv/ajax/post_audio.php:158, public/vv/ajax/post_audio.php:168, public/vv/ajax/post_audio.php:191, public/vv/ajax/post_audio.php:217, public/vv/ajax/post_audio.php:228, public/vv/ajax/post_audio.php:233, public/vv/ajax/post_audio.php:236
#### audio_nome_file(string $titolo, string $est)
Trasforma un titolo in un nome di file civile: niente accenti, niente segni strani, niente spazi.
| parametro | descrizione |
string $titolo | il titolo come sta nel DB |
string $est | estensione da appendere, punto compreso |
Ritorna: string - es. "20260120_Vitti_alle_Olimpiadi.zip"
manuale: I nomi di file in casa VittRos si scrivono in ASCII: vedi la convenzione dei waypoint.
Usato in: public/vv/ajax/post_audio.php:222, public/vv/ajax/post_audio.php:256
#### audio_mime(string $file)
Il tipo MIME giusto per un file audio, dall'estensione. Serve perche' il browser sappia che sta ricevendo musica e non roba binaria.
| parametro | descrizione |
string $file | nome del file |
Ritorna: string - il MIME, o application/octet-stream se non lo conosco
Usato in: public/vv/ajax/post_audio.php:243
#### audio_brani_del_post(PDO $pdo, int $id, string $ruolo, string $musica)
Legge un post con lo stesso metro del visore (le quattro corsie di visualizza_post.php) e ne ricava i brani che esistono davvero. Se il post e' una traduzione senza musica propria, eredita quella del padre: e' la stessa regola del visore.
| parametro | descrizione |
PDO $pdo | la connessione |
int $id | numero del post |
string $ruolo | il ruolo di chi sta chiedendo |
string $musica | cartella dei file audio, con lo slash finale |
Ritorna: array|null - ['titolo'=>..., 'brani'=>[...]] oppure null se il post non e' visibile da chi chiede
Usato in: public/vv/ajax/post_audio.php:206, public/vv/ajax/post_audio.php:231
#### audio_manda_zip(array $dentro, string $nome, string $cache, string $etichetta)
Prepara (o ritrova) lo zip di un elenco di brani e lo spedisce. La firma e' fatta sull'elenco: se cambia un brano, lo zip si rifa' da solo, come la copia del PDF che dipende dall'impronta.
| parametro | descrizione |
array $dentro | nome-nello-zip => percorso del file sul disco |
string $nome | come si deve chiamare il file scaricato |
string $cache | cartella dove tenere le copie |
string $etichetta | per il registro (es. "post 117") |
Ritorna: void - non torna: spedisce e basta
Usato in: public/vv/ajax/post_audio.php:222, public/vv/ajax/post_audio.php:256
public/vv/ajax/post_pdf.php
#### pdf_stop(string $msg, int $code)
Ferma tutto e spiega perche', in una paginetta leggibile invece che con un PDF rotto.
| parametro | descrizione |
string $msg | cosa e' andato storto, in italiano |
int $code | codice HTTP da restituire |
Ritorna: void
Usato in: public/vv/ajax/post_pdf.php:58, public/vv/ajax/post_pdf.php:77, public/vv/ajax/post_pdf.php:80, public/vv/ajax/post_pdf.php:111
#### pdf_nome_file(string $titolo)
Trasforma il titolo del post in un nome di file civile: niente accenti, niente segni strani, niente spazi.
| parametro | descrizione |
string $titolo | il titolo come sta nel DB |
Ritorna: string - es. "20250802_perche_il_2_agosto.pdf"
manuale: I nomi di file in casa VittRos si scrivono in ASCII: vedi la convenzione dei waypoint.
Usato in: public/vv/ajax/post_pdf.php:116
_37 file senza funzioni documentate (saltati):public/vv/ajax/admin_categorie.php,public/vv/ajax/check_translation.php,public/vv/ajax/cofanetto_azione.php,public/vv/ajax/create_translation.php,public/vv/ajax/diario_rilascia.php,public/vv/ajax/discard_draft.php,public/vv/ajax/draft_info.php,public/vv/ajax/editor_ping.php,public/vv/ajax/get_log.php,public/vv/ajax/get_playlist.php,public/vv/ajax/handle_restore_version.php,public/vv/ajax/handle_rimuovi_post.php,public/vv/ajax/handle_salva_post.php,public/vv/ajax/handle_set_visibility.php,public/vv/ajax/handle_upload_media.php,public/vv/ajax/hide_version.php,public/vv/ajax/musica_upload.php,public/vv/ajax/park_stale_version.php,public/vv/ajax/post_musica.php,public/vv/ajax/profilo_save.php,public/vv/ajax/registra_utente.php,public/vv/ajax/release_post.php,public/vv/ajax/restore_to_draft.php,public/vv/ajax/set_debug.php,public/vv/ajax/set_theme.php,public/vv/ajax/split_translation.php,public/vv/ajax/translate_chunk.php,public/vv/ajax/translate_chunks_prepare.php,public/vv/ajax/translate_post.php,public/vv/ajax/translate_save.php_(+7)_._
JavaScript
Le funzioni JavaScript del lab. Si documentano con gli STESSI tag del PHP (@desc/@param/@return/@manual) messi in un blocco /** */ subito sopra la funzione. I file elencati in fondo come "senza funzioni documentate" sono la lista della spesa.
public/vv/js/modifica_post.js
#### readTitolo()
Il titolo come sta ADESSO nella casella in cima alla pagina.
Ritorna: {string} - il titolo, stringa vuota se la casella non c'e'
Usato in: public/vv/js/modifica_post.js:514, public/vv/js/modifica_post.js:921, public/vv/js/vrv-carica-tinymce.js:1995
#### readLingua()
La lingua scelta per il post (campo nascosto, tenuto allineato dalla tendina in cima).
Ritorna: {string} - codice lingua, 'it' se non e' impostata
Usato in: public/vv/js/modifica_post.js:522
#### readSfondo()
Lo sfondo scelto per il post (campo nascosto).
Ritorna: {string} - nome della classe di sfondo, vuoto se nessuno
Usato in: public/vv/js/modifica_post.js:76, public/vv/js/modifica_post.js:521, public/vv/js/modifica_post.js:593, public/vv/js/modifica_post.js:923, public/vv/js/vrv-carica-tinymce.js:1998
#### readContenuto()
Il testo del post come sta ADESSO: lo chiede a TinyMCE se c'e', altrimenti ripiega sulla casella nuda.
Ritorna: {string} - HTML del post
manuale: E' questa la fonte di verita' per salvataggio e autosalvataggio: se TinyMCE non ha ancora finito di caricarsi si prende la casella, non si aspetta.
Usato in: public/vv/js/modifica_post.js:520, public/vv/js/modifica_post.js:922
#### getVersionNote()
La nota che l'utente scrive per la versione ("cosa ho cambiato").
Ritorna: {string} - la nota ripulita dagli spazi, vuota se il campo non c'e'
Usato in: _(nessun uso trovato nel lab)_
#### autosaveSoon(ms)
Programma la scrittura della bozza fra ms millisecondi, e se intanto arriva un'altra battuta ricomincia a contare.
| parametro | descrizione |
{number} ms | quanto aspettare; senza argomento, 2500. 🕐 E' QUESTO IL TEMPO VERO DELL'AUTOSAVE, non un intervallo fisso: chi scrive lo riarma a ogni tasto (titolo e TinyMCE, piu' in basso), quindi la bozza si scrive 2,5 secondi dopo che si smette di battere. Non si salva mentre le dita corrono - si salva appena si prende fiato. La sveglia da 10 secondi qui sotto e' solo la riserva, e scrive unicamente se il testo e' cambiato davvero rispetto all'ultimo salvataggio. Terza rete: chiudendo la scheda parte un salvataggio d'uscita (sendBeacon, js/vrv-carica-tinymce.js). Provata da Elena il 30/08: scheda chiusa e riaperta, bozza al suo posto. |
Usato in: public/vv/js/modifica_post.js:499, public/vv/js/modifica_post.js:938, public/vv/js/modifica_post.js:975
#### vvRefreshVersionsMenu()
Richiede al server l'elenco aggiornato delle versioni e lo fa ridisegnare al menu Versioni. Silenziosa per scelta: se il server non risponde il menu resta com'era, senza disturbare chi scrive.
Ritorna: {Promise<void>}
Usato in: public/vv/js/modifica_post.js:747, public/vv/js/modifica_post.js:1442, public/vv/js/modifica_post.js:1475
#### restoreVersionAndReload(versionNo)
Riporta una vecchia versione dentro la bozza corrente, dopo aver chiesto conferma, e ricarica la pagina per rileggere tutto da capo.
| parametro | descrizione |
{number} versionNo | numero della versione da ripristinare |
Ritorna: {Promise<void>}
manuale: La bozza corrente viene SOVRASCRITTA: l'avviso lo dice, ma vale la pena ricordarlo.
Usato in: public/vv/js/modifica_post.js:1371
#### keepMenuInViewport(menu)
Teneva i menu dentro lo schermo spostandoli da JavaScript. Oggi non fa piu' niente: il lavoro lo fa il CSS. Lasciata perche' viene ancora chiamata da bindDropdown per la tendina Versioni.
| parametro | descrizione |
{Element} menu | il menu da sistemare (ignorato) |
Ritorna: {void}
Usato in: public/vv/js/modifica_post.js:1171, public/vv/js/modifica_post.js:1236
#### setDdOpen(dd, open)
Apre o chiude UNA tendina della barra, tenendo allineato quello che la tendina racconta a chi non vede (aria-expanded e aria-hidden).
| parametro | descrizione |
{Element} dd | il contenitore .vrv-dd della tendina |
{boolean} open | true per aprire, false per chiudere |
Ritorna: {void}
Usato in: public/vv/js/modifica_post.js:1106, public/vv/js/modifica_post.js:1109, public/vv/js/modifica_post.js:1165, public/vv/js/modifica_post.js:1168
#### bindDropdown(ddId, btnId)
Fa funzionare il bottone di una tendina: al clic chiude tutte le altre e apre la sua. Va chiamata una volta per ogni tendina.
| parametro | descrizione |
{string} ddId | id del contenitore .vrv-dd |
{string} btnId | id del bottone che la apre |
Ritorna: {void}
manuale: Se una tendina non si apre, il primo sospetto e' che manchi la sua riga in initVrvDropdowns().
Usato in: _(nessun uso trovato nel lab)_
#### renderVersionsMenu()
Segnaposto VUOTO: ritorna subito. Il menu Versioni lo disegna davvero un'altra renderVersionsMenu(items) piu' in basso, chiusa dentro il suo blocco e pubblicata come window.vvRenderVersionsMenu.
Ritorna: {void}
manuale: Attenzione leggendo initVrvDropdowns: la chiamata a renderVersionsMenu() finisce QUI e non fa nulla, nonostante il commento entusiasta che ha accanto.
Usato in: public/vv/js/modifica_post.js:1121, public/vv/js/modifica_post.js:1179, public/vv/js/modifica_post.js:1182, public/vv/js/modifica_post.js:1240
#### escapeHtml(str)
Rende innocui i caratteri che in HTML vogliono dire qualcosa (& < > virgolette). Gemello del h() del PHP.
| parametro | descrizione |
{string} str | testo da mettere in pagina |
Ritorna: {string} - testo con i caratteri speciali sostituiti
Usato in: public/vv/js/modifica_post.js:1406
#### stripXmlHack(html)
Toglie dal contenuto il finto prologo XML che TinyMCE a volte infila in testa (<!--?xml encoding="utf-8" ?-->).
| parametro | descrizione |
{string} html | contenuto del post |
Ritorna: {string} - lo stesso contenuto senza quel prologo
Usato in: _(nessun uso trovato nel lab)_
#### vrvIsInRestoreCooldown()
Dice se siamo nei secondi subito dopo un ripristino di versione, in cui conviene lasciare la pagina in pace.
Ritorna: {boolean} - vero se il tempo di grazia non e' ancora finito
Usato in: _(nessun uso trovato nel lab)_
public/vv/js/vrv-admin-post.js
#### vrvAdminPostRicerca()
Ricerca dal vivo del post da aprire. Ricopia le voci della tendina in un elenco sotto la casella, e mentre si scrive lascia vedere solo quelle che corrispondono, col conto "N su M". Il clic su una voce - o Invio, che prende la prima rimasta - apre quel post. Esc svuota la casella e richiude l'elenco.
Ritorna: void
Usato in: public/vv/js/vrv-admin-post.js:95
#### vrvAdminPostLingua()
La scelta della lingua del post: le pastiglie (it, en, de...) scrivono la sigla nel campo nascosto e si accendono una alla volta. La casella libera accanto serve per una lingua non in elenco: tiene solo lettere, al massimo due, e quando ne ha due prende lei il comando e spegne le pastiglie; se la si svuota si torna a "it".
Ritorna: void
Usato in: public/vv/js/vrv-admin-post.js:96
public/vv/js/vrv-diario-lista-admin.js
#### vrvListaRicercaDalVivo()
Ricerca dal vivo sui titoli, mentre si digita, senza ricaricare la pagina: nasconde le schede che non corrispondono. Esc svuota. Le traduzioni stanno DENTRO la scheda del padre, quindi sparendo lui spariscono anche loro; per i cofanetti, se corrisponde il nome della scatola si mostra il gruppo intero. Gestisce anche la spunta "anche nel contenuto": il filtro qui in pagina vede solo i titoli di QUESTA pagina, il testo dei post ce l'ha solo il server -> con la spunta si ricarica passando ?q= e si cerca in tutto l'archivio.
Ritorna: void
Usato in: public/vv/js/vrv-diario-lista-admin.js:195
#### vrvListaRilascia()
Il bottone "Rilascia" di ogni riga: manda la richiesta a ajax/diario_rilascia.php e, se e' andata, scrive "Rilasciato" sul bottone e lo spegne. Ascolta sul documento, cosi' vale anche per le righe che compaiono dopo (fisarmoniche dei cofanetti).
Ritorna: void
Usato in: public/vv/js/vrv-diario-lista-admin.js:196
#### vrvListaPastiglieVisibilita()
Uniforma le pastiglie della visibilita': quelle scritte con le classi vecchie (.vis-pill, .visibility, .vv-visibility) prendono anche .vv-visibility-pill, che e' quella che il foglio di stile disegna davvero.
Ritorna: void
Usato in: public/vv/js/vrv-diario-lista-admin.js:197
#### vrvListaCategoriaSelect()
La tendina della categoria su ogni riga: al cambio salva subito con ajax/admin_categorie.php, colora il campo di verde o di rosso e lo dice col messaggino (DispUtil.toast), tornando poi al colore normale. Durante la chiamata la tendina resta spenta.
Ritorna: void
Usato in: public/vv/js/vrv-diario-lista-admin.js:198
public/vv/js/vrv-footer.js
#### vrvFooterASfioramento()
Il piede sta nascosto e si affaccia solo se si indugia sulla striscia in fondo (.footer-hover-zone): compare dopo un secondo, e sparisce due secondi dopo che ci si e' allontanati. Restando col puntatore sul piede stesso non sparisce. Se in pagina non c'e' il piede o la striscia, non fa nulla.
Ritorna: void
Usato in: public/vv/js/vrv-footer.js:54
public/vv/js/vrv-info-modal.js
#### vrvInfoModal()
Apre e chiude la finestrella: la aprono i comandi marcati data-vv="open-info", la chiudono la crocetta, il clic sullo sfondo e il tasto Esc. Aperta e chiusa sono la classe .is-hidden, non uno stile inline. Aspetta che il DOM sia pronto.
Ritorna: void
Usato in: public/vv/js/vrv-info-modal.js:40
public/vv/js/vrv-lista-comune.js
#### vrvListaBarraFiltri()
La barra dei filtri in alto: apre e chiude le tendine (una alla volta, chiudendo le altre) e, scelta una voce, scrive il valore nel campo nascosto, riporta l'impaginazione alla pagina 1 e manda il modulo. Si ferma se in pagina non c'e' la barra.
Ritorna: void
Usato in: public/vv/js/vrv-lista-comune.js:91
#### vrvListaSpazioTestata()
Misura quanto scendono la testata e il medaglione utente e scrive l'altezza nella variabile CSS --vv-header-clear, cosi' il contenuto non finisce sotto di loro. Si riaggiorna quando quei due cambiano dimensione (ResizeObserver) e a ogni ridimensionamento della finestra; se la pagina sta ancora caricando, aspetta il DOM.
Ritorna: void
Usato in: public/vv/js/vrv-lista-comune.js:92
public/vv/js/vrv-modifica-post-barra.js
#### vrvDiscardDraftAndReload()
Butta via la bozza in corso e ricarica il post dall'ultima versione salvata. E' l'uscita di sicurezza quando l'editor si e' impuntato su una bozza che non si vuole piu'.
Ritorna: Promise - niente: o ricarica la pagina, o mostra l'errore in un alert
manuale: Chiede conferma prima di buttare via il lavoro. La bozza si CANCELLA (ajax/discard_draft.php): senza riga, ricaricando, l'editor riparte dall'ultima versione.
Usato in: public/vv/js/vrv-modifica-post-barra.js:411
#### vrvMostraInfoBozza()
Dice com'e' messa la bozza di questo post: se c'e', quando e' stata salvata e quanto e' lunga, contro l'ultima versione salvata.
Ritorna: {Promise<void>} - niente: scrive la risposta in un avviso
manuale: Nato il 07/08/2026 al posto del toast "Bozza trovata", che compariva a OGNI apertura dell'editor anche quando la bozza non c'era. L'informazione non si stampa piu' da sola: si chiede. ⚠️ Il conto lo fa il SERVER nel momento in cui premi (ajax/draft_info.php). Chiederlo alla pagina sarebbe la stessa bugia di prima: la pagina sa solo com'erano le cose quando e' stata aperta.
Usato in: public/vv/js/vrv-modifica-post-barra.js:404
#### vrvCloseAllDropdowns()
Chiude tutte le tendine della barra. E' il punto 2 dei quattro elenchi da aggiornare quando se ne aggiunge una: se una tendina non e' in questa lista, resta aperta mentre le altre si chiudono.
Ritorna: void
Usato in: public/vv/js/vrv-modifica-post-barra.js:20, public/vv/js/vrv-modifica-post-barra.js:243, public/vv/js/vrv-modifica-post-barra.js:289, public/vv/js/vrv-modifica-post-barra.js:302, public/vv/js/vrv-modifica-post-barra.js:403
#### vrvToggleDropdown(btn, menu)
Apre una tendina e chiude le altre; se era gia' aperta la chiude.
| parametro | descrizione |
{HTMLElement} btn | il bottone della tendina |
{HTMLElement} menu | il pannello che si apre |
Ritorna: void
manuale: Aperto e chiuso si scrivono in aria-hidden, non in una classe: il CSS guarda .vrv-dd__menu[aria-hidden="false"].
Usato in: public/vv/js/vrv-modifica-post-barra.js:257, public/vv/js/vrv-modifica-post-barra.js:263, public/vv/js/vrv-modifica-post-barra.js:268, public/vv/js/vrv-modifica-post-barra.js:274, public/vv/js/vrv-modifica-post-barra.js:279, public/vv/js/vrv-modifica-post-barra.js:284
#### vrvOpenSaveModal(actionName)
Apre la finestrella che chiede la NOTA di versione, e si ricorda quale comando l'ha aperta (salva e continua / salva ed esci).
| parametro | descrizione |
{string} actionName | 'save_continue' oppure 'save_exit' |
Ritorna: void
Usato in: public/vv/js/vrv-modifica-post-barra.js:391, public/vv/js/vrv-modifica-post-barra.js:395
#### vrvCloseSaveModal()
Chiude la finestrella della nota e dimentica il comando in attesa.
Ritorna: void
Usato in: public/vv/js/vrv-modifica-post-barra.js:303, public/vv/js/vrv-modifica-post-barra.js:415, public/vv/js/vrv-modifica-post-barra.js:420, public/vv/js/vrv-modifica-post-barra.js:453
#### vrvGetExitUrl()
Dove si va uscendo dall'editor: la lista dei post dell'amministrazione.
Ritorna: string - l'indirizzo della pagina di uscita
Usato in: public/vv/js/vrv-modifica-post-barra.js:350, public/vv/js/vrv-modifica-post-barra.js:457
#### vrvExitWithoutSave()
Esce dall'editor buttando via quello che si sta scrivendo, dopo averlo chiesto una volta.
Ritorna: void
Usato in: public/vv/js/vrv-modifica-post-barra.js:399
#### vrvSavePostWithNote(note, actionName)
Salva il post con la nota di versione appena scritta. Il salvataggio vero lo fa window.callSave() (js/modifica_post.js): qui si passa la nota e si mostra l'esito.
| parametro | descrizione |
{string} note | la nota di versione |
{string} actionName | quale comando ha chiesto il salvataggio (per chi chiama) |
Ritorna: Promise - l'esito di callSave: {ok:true} oppure {ok:false, error}
manuale: Se callSave non c'e' (script non caricato) non esplode: torna un esito negativo con la spiegazione.
Usato in: public/vv/js/vrv-modifica-post-barra.js:446
public/vv/js/vrv-musica.js
#### dillo(testo, ok)
Dice come e' andata, e si cancella da solo se e' una buona notizia.
| parametro | descrizione |
{string} testo | |
{boolean} ok |
Ritorna: {void}
Usato in: public/vv/js/vrv-musica.js:104, public/vv/js/vrv-musica.js:127, public/vv/js/vrv-musica.js:154, public/vv/js/vrv-musica.js:185, public/vv/js/vrv-musica.js:195, public/vv/js/vrv-musica.js:218, public/vv/js/vrv-musica.js:227, public/vv/js/vrv-musica.js:233, public/vv/js/vrv-musica.js:242, public/vv/js/vrv-musica.js:245, public/vv/js/vrv-musica.js:252, platform/pages/jukebox.php:942, platform/pages/jukebox.php:1146, platform/pages/jukebox.php:1148, platform/pages/jukebox.php:1156, platform/pages/jukebox.php:1160, platform/pages/jukebox.php:1180, platform/pages/jukebox.php:1194, platform/pages/jukebox.php:1211, platform/pages/jukebox.php:1219 _(+30)_
#### scaletta()
I brani della scaletta, dall'alto in basso.
Ritorna: {string[]}
Usato in: public/vv/js/vrv-musica.js:207, public/vv/js/vrv-musica.js:221
#### aggiornaVuoto()
Mostra o nasconde la riga "nessun brano" secondo com'e' messa la scaletta. Da chiamare dopo ogni aggiunta o rimozione.
Ritorna: {void}
Usato in: public/vv/js/vrv-musica.js:126, public/vv/js/vrv-musica.js:184, public/vv/js/vrv-musica.js:194, public/vv/js/vrv-musica.js:241
#### ascolta(li)
Ascolta un brano della scaletta, o lo ferma se e' gia' lui a suonare. Il ▶ e' un interruttore, non un grilletto.
| parametro | descrizione |
{HTMLElement} li | la riga del brano |
Ritorna: {void}
Usato in: public/vv/js/vrv-musica.js:121
#### scegli()
Apre il selettore dei brani. Resta aperto mentre si sceglie: ogni clic laggiu' chiama vvMusicaDalPicker() qui sotto.
Ritorna: {void}
Usato in: public/vv/js/vrv-musica.js:116
#### vvMusicaDalPicker(nome)
Ci chiama musica_picker.php a ogni clic su un brano. E' un INTERRUTTORE: se il brano non c'e' lo mette in fondo alla scaletta, se c'e' gia' lo toglie. Prima aggiungeva e basta, e un brano preso per sbaglio si poteva togliere solo tornando nell'editor (vitti, 04/09/2026: "non si puo' deselezionare"). Chi sceglie deve poter disfare dove sta scegliendo, non da un'altra parte. Aggiungendo si va in FONDO: cosi' l'ordine dei clic laggiu' diventa l'ordine della scaletta. Vive su window perche' e' il selettore, da un'altra finestra, a chiamarla (window.opener.vvMusicaDalPicker).
| parametro | descrizione |
{string} nome | il nome del file |
Ritorna: {string} - 'ok' se aggiunto, 'tolto' se rimosso, 'no' se nome vuoto
Usato in: public/vv/js/vrv-musica.js:140, public/vv/musica_picker.php:240
#### vvMusicaScaletta()
La scaletta di adesso, per il selettore: gli serve per segnare le mattonelle dei brani gia' presi, cosi' si vede a colpo d'occhio cosa si e' scelto e cosa un altro clic andrebbe a togliere. Vive su window per lo stesso motivo di vvMusicaDalPicker.
Ritorna: {string[]}
Usato in: public/vv/musica_picker.php:213
#### salva()
Scrive la scaletta nel campo post.musica. Il server tiene solo i brani che esistono davvero: se ne scarta qualcuno lo dice, non li fa sparire in silenzio.
Ritorna: {Promise<void>}
Usato in: public/vv/js/vrv-musica.js:115
public/vv/js/vrv-visualizza-post-draft.js
#### vrvDraftSlegaImmaginiFloat()
Slega le immagini affiancate dalle misure fisse. TinyMCE, salvando, scrive width/height sull'immagine (e a volte anche negli stili inline): a video quelle misure litigano col foglio di stile e la foto esce storta. Qui si tolgono, cosi' comanda solo il CSS. Vale sia per le immagini con la classe .vv-float-* addosso sia per quelle dentro un <figure> che ce l'ha; alle prime si azzera anche il margine inline.
Ritorna: void
Usato in: public/vv/js/vrv-visualizza-post-draft.js:77
#### vrvDraftFrecceScorrimento()
Le frecce di scorrimento del post (.vv-scrollpins): il clic su inizio, fine o meta' chiama vvScrollPin(), che sta in js/vv-scrollpins.js (caricato prima di questo file). Si ferma subito se in pagina non c'e' la barretta.
Ritorna: void
Usato in: public/vv/js/vrv-visualizza-post-draft.js:78
_23 file senza funzioni documentate (saltati):public/guardiano-mpegts.js,public/js/vrp-explorer.js,public/js/vrp-zoom.js,public/share/js/santino-drag.js,public/share/js/share-scrollpins.js,public/share/js/share.js,public/vv/_deprecato/vv_media_insert.js,public/vv/js/disputil_toast.js,public/vv/js/testing_notes.js,public/vv/js/trad_widget.js,public/vv/js/visualizza_post.js,public/vv/js/vrp_crop.js,public/vv/js/vrv-carica-tinymce.js,public/vv/js/vrv-postmap.js,public/vv/js/vrv-zoom.js,public/vv/js/vv-carousel.js,public/vv/js/vv-draft-ui.js,public/vv/js/vv-editor.js,public/vv/js/vv-scrollpins.js,public/vv/js/vv_ajax.js,public/vv/js/vv_audio.js,public/vv/js/vv_diario_rilascia.js,public/wiz_foto/vrw.js._