{"elements":[{"id":2,"title":"Funzionalità","body":"<!-- CRUD Automatico -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>CRUD Automatico dallo Schema del Database<\/h2>\n    <div class=\"row g-4 align-items-center\">\n      <div class=\"col-lg-6\">\n        <p>DressAPI legge lo schema del database a runtime e genera endpoint REST completi per ogni tabella. Supporta operazioni GET, POST, PUT e DELETE con validazione automatica basata sui tipi di colonna e sui vincoli. Nessuna classe model, nessuna definizione di rotte, nessun boilerplate &mdash; solo il tuo database.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Endpoint Generati<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"kw\">GET<\/span>    \/product              <span class=\"cm\"># Elenco prodotti<\/span>\n<span class=\"kw\">GET<\/span>    \/product\/<span class=\"str\">42<\/span>           <span class=\"cm\"># Singolo prodotto per ID<\/span>\n<span class=\"kw\">GET<\/span>    \/product\/<span class=\"str\">full<\/span>         <span class=\"cm\"># Con tabelle correlate<\/span>\n<span class=\"kw\">POST<\/span>   \/product              <span class=\"cm\"># Crea nuovo prodotto<\/span>\n<span class=\"kw\">PUT<\/span>    \/product\/<span class=\"str\">42<\/span>           <span class=\"cm\"># Aggiorna prodotto<\/span>\n<span class=\"kw\">DELETE<\/span> \/product\/<span class=\"str\">42<\/span>           <span class=\"cm\"># Elimina prodotto<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Sistema di Query URL -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Sistema Avanzato di Query via URL<\/h2>\n    <div class=\"row g-4 align-items-center\">\n      <div class=\"col-lg-6\">\n        <p>Filtra, ordina e impagina direttamente tramite parametri URL. DressAPI supporta operatori di uguaglianza, confronto e ricerca parziale. Combina pi&ugrave; filtri in una singola richiesta per un recupero dati preciso.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Parametri URL<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">ob\/price-DESC<\/span>      <span class=\"cm\"># Ordina per prezzo decrescente<\/span>\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">p\/1,20<\/span>             <span class=\"cm\"># Pagina 1, 20 elementi<\/span>\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">price&gt;10<\/span>          <span class=\"cm\"># Prezzo maggiore di 10<\/span>\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">name~shirt<\/span>         <span class=\"cm\"># Nome contiene &quot;shirt&quot;<\/span>\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">status=active<\/span>      <span class=\"cm\"># Filtro esatto<\/span>\n<span class=\"kw\">GET<\/span> \/product\/<span class=\"str\">full<\/span>              <span class=\"cm\"># Include dati correlati<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Gestione Automatica Relazioni -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Gestione Automatica delle Relazioni<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>DressAPI rileva automaticamente le relazioni tra tabelle basandosi sulle convenzioni di naming. Le foreign key con prefisso <code>id_<\/code> vengono riconosciute come riferimenti ad altre tabelle e il framework le risolve in modo trasparente. Con <code>\/full<\/code> si ottengono tutti i dati correlati in una singola richiesta. Anche le relazioni many-to-many tramite crosstable vengono gestite automaticamente. La convenzione di naming &egrave; configurabile per adattarsi a qualsiasi schema esistente.<\/p>\n        <img src=\"\/assets\/images\/auto-relations.png\" alt=\"DressAPI dropdown foreign key risolti automaticamente\" class=\"img-fluid rounded shadow mt-3\">\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Esempio Relazioni<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"cm\"># Crosstable &quot;product_tag&quot; nel DB:<\/span>\nid  | id_product | id_tag\n1   | 3          | 7\n2   | 5          | 4\n\n<span class=\"cm\"># GET \/product_tag\/<span class=\"str\">full<\/span> &rarr; risoluzione automatica:<\/span>\nid  | id_product   | id_tag\n1   | <span class=\"str\">Television<\/span>   | <span class=\"str\">Electronics<\/span>\n2   | <span class=\"str\">USB Cable<\/span>    | <span class=\"str\">Accessories<\/span>\n\n<span class=\"cm\"># Convenzione di naming (configurabile):<\/span>\n<span class=\"str\">id_product<\/span>  <span class=\"cm\">&rarr; product.name<\/span>\n<span class=\"str\">id_tag<\/span>      <span class=\"cm\">&rarr; tag.name<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Sistema di Cache -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Sistema di Cache<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Cache automatica su file e Redis con invalidazione intelligente. La cache viene svuotata automaticamente quando i dati cambiano, garantendo risposte sempre aggiornate. Le connessioni lazy al database evitano di interrogare il DB quando la cache risponde, migliorando drasticamente le prestazioni.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">config.php<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"cm\">\/\/ Cache su file (default)<\/span>\n<span class=\"kw\">define<\/span>(<span class=\"str\">&#39;CACHE_DRIVER&#39;<\/span>, <span class=\"str\">&#39;file&#39;<\/span>);\n\n<span class=\"cm\">\/\/ Oppure cache Redis<\/span>\n<span class=\"kw\">define<\/span>(<span class=\"str\">&#39;CACHE_DRIVER&#39;<\/span>, <span class=\"str\">&#39;redis&#39;<\/span>);\n<span class=\"kw\">define<\/span>(<span class=\"str\">&#39;REDIS_HOST&#39;<\/span>,   <span class=\"str\">&#39;127.0.0.1&#39;<\/span>);\n<span class=\"kw\">define<\/span>(<span class=\"str\">&#39;REDIS_PORT&#39;<\/span>,   <span class=\"str\">6379<\/span>);\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Generazione Automatica dei Form -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Generazione Automatica dei Form<\/h2>\n    <div class=\"row g-4 align-items-center\">\n      <div class=\"col-lg-6\">\n        <p>In modalit&agrave; CMS, DressAPI genera automaticamente form CRUD completi dallo schema del database. Ogni campo riceve il controllo HTML appropriato in base al tipo: le foreign key diventano <code>&lt;select&gt;<\/code> dropdown popolate con i dati della tabella correlata, le colonne <code>ENUM<\/code> diventano radio button, i campi <code>TEXT<\/code> diventano editor rich text con toolbar completa, i campi immagine ottengono un uploader, e i campi standard ricevono il tipo di input corretto. Nessun template da scrivere, nessuna definizione di form &mdash; tutto viene derivato dal database.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <img src=\"\/assets\/images\/cms-auto-form.png\" alt=\"Form CRUD generato automaticamente da DressAPI\" class=\"img-fluid rounded shadow\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Autenticazione e ACL -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Autenticazione e ACL<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Autenticazione basata su JWT con controllo degli accessi per ruolo. Definisci permessi granulari (lettura, inserimento, aggiornamento, cancellazione) per ruolo e per modulo. Supporto per restrizioni owner-only, cos&igrave; gli utenti possono modificare solo i propri record. L&#39;autenticazione via sessione &egrave; disponibile per le pagine HTML.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <img src=\"\/assets\/images\/ACL.png\" alt=\"Tabella permessi ACL DressAPI\" class=\"img-fluid rounded shadow\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Motore di Template -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Motore di Template<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Sintassi template simile a Twig con variabili, modificatori e page frame modulari. Usa &#123;&#123;variable&#125;&#125; per il data binding, &#123;&#123;locals::var&#125;&#125; per le variabili locali e &#123;&#123; &#39;translatable&#39; &#125;&#125; per le stringhe tradotte automaticamente. Componenti come hero, card, accordion, tab e modal vengono generati da semplici configurazioni.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Sintassi Template<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"cm\">&lt;!-- Data binding --&gt;<\/span>\n&lt;h1&gt;<span class=\"fn\">&#123;&#123;title&#125;&#125;<\/span>&lt;\/h1&gt;\n&lt;p&gt;<span class=\"fn\">&#123;&#123;body&#125;&#125;<\/span>&lt;\/p&gt;\n\n<span class=\"cm\">&lt;!-- Stringhe tradotte --&gt;<\/span>\n&lt;a href=&quot;\/features&quot;&gt;<span class=\"fn\">&#123;&#123; &#39;Learn more&#39; &#125;&#125;<\/span>&lt;\/a&gt;\n\n<span class=\"cm\">&lt;!-- Variabili locali --&gt;<\/span>\n&lt;span&gt;<span class=\"fn\">&#123;&#123;locals::site_name&#125;&#125;<\/span>&lt;\/span&gt;\n\n<span class=\"cm\">&lt;!-- Modificatori --&gt;<\/span>\n&lt;p&gt;<span class=\"fn\">&#123;&#123;description|truncate:200&#125;&#125;<\/span>&lt;\/p&gt;\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Sistema Multilingua -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Sistema Multilingua<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Il sistema di traduzione opera su due livelli: la funzione _T() cerca le stringhe nella tabella _translation, mentre i tag &#64;&#64;XX incorporano pi&ugrave; varianti linguistiche inline per titoli e descrizioni. La modalit&agrave; auto-learning rileva le stringhe non tradotte e le aggiunge al database per la traduzione successiva. Supporta un numero illimitato di lingue.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Traduzione<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"cm\">&lt;!-- Nei template --&gt;<\/span>\n&lt;p&gt;<span class=\"fn\">&#123;&#123; &#39;Welcome to our site&#39; &#125;&#125;<\/span>&lt;\/p&gt;\n\n<span class=\"cm\">&lt;!-- In PHP --&gt;<\/span>\n<span class=\"kw\">print<\/span> <span class=\"fn\">_T<\/span>(<span class=\"str\">&#39;Hello world&#39;<\/span>);\n\n<span class=\"cm\">&lt;!-- Tag &#64;&#64;XX inline (per titoli) --&gt;<\/span>\n<span class=\"str\">&#64;&#64;EN<\/span> Hello <span class=\"str\">&#64;&#64;IT<\/span> Ciao <span class=\"str\">&#64;&#64;FR<\/span> Bonjour\n        <\/div>\n        <img src=\"\/assets\/images\/translator.png\" alt=\"Form gestione traduzioni DressAPI\" class=\"img-fluid rounded shadow mt-3\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Sistema Menu -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Sistema Menu con Drag-and-Drop<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Il sistema gerarchico di menu supporta gruppi multipli (menu principale, footer, sidebar). I menu possono essere riordinati tramite drag-and-drop nel pannello admin. Ogni voce pu&ograve; collegarsi a pagine, URL esterni o comandi speciali. La visibilit&agrave; per ruolo consente di mostrare menu diversi a ruoli utente differenti.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <img src=\"\/assets\/images\/menu_editor.png\" alt=\"Editor menu drag-and-drop DressAPI\" class=\"img-fluid rounded shadow\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- Architettura Modulare -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Architettura Modulare &amp; Plugin<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>DressAPI ha un'architettura completamente modulare. Ogni modulo segue una struttura standard con controller, model, views e configurazione. I plugin CMS possono sovrascrivere i moduli core per personalizzare il comportamento senza modificare il framework.<\/p>\n        <p>Il sistema <strong>CComponent<\/strong> fornisce componenti UI riutilizzabili (accordion, card, hero, modal, dropdown, carousel e molti altri), ciascuno con il proprio template HTML, CSS e JavaScript. Puoi creare i tuoi componenti custom seguendo la stessa struttura.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <h5 class=\"da-snippet-title\">Struttura Plugin &amp; Componenti<\/h5>\n        <div class=\"da-snippet\">\n<span class=\"cm\"># Struttura Modulo\/Plugin<\/span>\nmodules\/{name}\/\n  config.php\n  controller\/  CxxxController.php\n  model\/       CxxxModel.php\n  views\/{framework}\/\n    page-frames\/   *.tmpl.php\n    components\/    UI riutilizzabili\n\n<span class=\"cm\"># Struttura Componente<\/span>\ncomponents\/{name}\/\n  {name}.html      <span class=\"cm\"># Template HTML<\/span>\n  css\/{name}.css   <span class=\"cm\"># Stili<\/span>\n  js\/{name}.js     <span class=\"cm\"># Comportamento<\/span>\n        <\/div>\n        <img src=\"\/assets\/images\/editor_1.png\" alt=\"Editor visuale CComponent DressAPI\" class=\"img-fluid rounded shadow mt-3\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Repository File -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2>Repository File<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>DressAPI include un repository file integrato con gestione cartelle, upload file e anteprima immagini. Il repository consente di creare cartelle, caricare file e organizzare gli asset direttamente dal pannello admin. Le immagini caricate vengono ottimizzate automaticamente e possono essere referenziate nei contenuti delle pagine.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <img src=\"\/assets\/images\/repository.png\" alt=\"Gestore repository file DressAPI\" class=\"img-fluid rounded shadow\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- Scheduler Attivit&agrave; -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Scheduler Attivit&agrave;<\/h2>\n    <div class=\"row g-4\">\n      <div class=\"col-lg-6\">\n        <p>Lo scheduler integrato consente di automatizzare operazioni ricorrenti come la pulizia della cache, la sincronizzazione dei dati e la generazione di report. Le attivit&agrave; possono essere configurate con pianificazione granulare: seleziona anni, mesi, giorni della settimana o date specifiche. Ogni attivit&agrave; viene gestita interamente dal pannello admin senza toccare il crontab.<\/p>\n      <\/div>\n      <div class=\"col-lg-6\">\n        <img src=\"\/assets\/images\/scheduler.png\" alt=\"Scheduler attivit&agrave; DressAPI\" class=\"img-fluid rounded shadow\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>","description":"Esplora tutte le funzionalita di DressAPI: CRUD automatico, filtraggio avanzato, autenticazione, caching, output multi-formato e altro.","meta_keywords":"features,crud,authentication,caching,rest api,multi-language,cms","visible":"yes","status":"public","creation_date":"2025-01-01","id__user":1,"priority":0,"groupname":"FEATURES"}],"module":"pages","permissions":{"can_read":true},"main_item_title":"title","related_tables":[{"name":"Newsonpage","module":"newsonpage","FK":"id_cmspage","permissions":[]}],"page_info":{"table":"","key":"id","url":"\/pages","url_list":"\/pages","filters":{"id":["=","2"]},"pagination":{"total_items":23,"page":1,"total_pages":2,"step":1,"items_per_page":20,"url_prev":"\/pages","url_next":"\/pages\/p\/2","url_tmpl":"\/pages\/p\/[[p]]","url_tmpl_with_order":"\/pages\/p\/[[p]]\/ob\/[[ob]]"},"order":{"field":"id","type":"DESC","url_tmpl":"\/pages\/p\/[[p]]"},"module":{"title":"Pages","description":"List of pages","name":"pages"},"current":{"title":"Pages","description":"List of pages","name":"pages","url":"\/features"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}