{"elements":[{"id":7010,"title":"Sistema Plugin","body":"<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Architettura a Plugin<\/h2>\n    <p class=\"lead\">DressAPI adotta un&rsquo;architettura modulare in cui ogni funzionalit&agrave; &mdash; dalle pagine all&rsquo;autenticazione, dal menu alla gestione dei media &mdash; &egrave; implementata come un plugin indipendente. Questo approccio permette di estendere, sostituire o aggiungere funzionalit&agrave; al CMS senza modificare il codice del framework.<\/p>\n\n    <h3 class=\"mt-4\">Struttura di un plugin<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Directory Structure<\/div>\nplugins\/{nome}\/\n  config.php                        <span class=\"cm\"># Configurazione modulo<\/span>\n  controller\/\n    C{Nome}Controller.php           <span class=\"cm\"># Estende CBaseController<\/span>\n  model\/\n    C{Nome}Model.php                <span class=\"cm\"># Estende CBaseModel (opzionale)<\/span>\n  views\/{framework}\/\n    page-frames\/                    <span class=\"cm\"># Template (*.tmpl.php)<\/span>\n    processors\/                     <span class=\"cm\"># PreProcess.php, PostProcess.php<\/span>\n    inline-assets\/                  <span class=\"cm\"># js\/, css\/ per inclusione inline<\/span>\n    components\/                     <span class=\"cm\"># Componenti UI riutilizzabili<\/span>\n    <\/div>\n\n    <h3 class=\"mt-5\">Override dei moduli core<\/h3>\n    <p>I plugin nell&#39;implementazione (es. <code>cms\/plugins\/<\/code>) sovrascrivono automaticamente i moduli core con lo stesso nome. L&#39;ordine di ricerca &egrave;:<\/p>\n    <ol>\n      <li><code>APP_PLUGINS_PATH<\/code> &ndash; Plugin dell&#39;implementazione<\/li>\n      <li><code>APP_CORE_MODULES_PATH<\/code> &ndash; Moduli core<\/li>\n      <li>Fallback: <code>CBaseController<\/code> \/ <code>CBaseModel<\/code><\/li>\n    <\/ol>\n\n    <h3 class=\"mt-5\">Componenti UI (CComponent)<\/h3>\n    <p>Ogni plugin pu&ograve; definire componenti UI riutilizzabili nella directory <code>components\/<\/code>:<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Componente card<\/div>\ncomponents\/card\/\n  card.tmpl.php     <span class=\"cm\"># Template HTML<\/span>\n  card.css          <span class=\"cm\"># Stili (inclusi automaticamente)<\/span>\n  card.js           <span class=\"cm\"># Script (incluso automaticamente)<\/span>\n  config.json       <span class=\"cm\"># Parametri del componente<\/span>\n    <\/div>\n    <p>I componenti vengono inseriti nelle pagine con il tag:<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">HTML<\/div>\n&lt;component type=\"card\"&gt;{\"title\":\"Titolo\",\"body\":\"Contenuto\"}&lt;\/component&gt;\n    <\/div>\n    <p>Il tag viene processato server-side dalla classe <code>CComponent<\/code> che lo trasforma nel markup HTML finale.<\/p>\n\n    <h3 class=\"mt-5\">Creare un nuovo plugin<\/h3>\n    <p>Per creare un plugin personalizzato (es. <code>blog<\/code>):<\/p>\n    <ol>\n      <li>Crea la directory <code>plugins\/blog\/<\/code><\/li>\n      <li>Crea <code>controller\/CBlogController.php<\/code> estendendo <code>CBaseController<\/code><\/li>\n      <li>Opzionale: crea <code>model\/CBlogModel.php<\/code> per logica custom<\/li>\n      <li>Opzionale: aggiungi template in <code>views\/b5\/page-frames\/<\/code><\/li>\n      <li>Crea la tabella <code>blog<\/code> nel database con le convenzioni DressAPI<\/li>\n    <\/ol>\n    <p>Il framework rileva automaticamente il nuovo modulo e lo rende accessibile via API.<\/p>\n  <\/div>\n<\/section>\n\n<section class=\"da-section text-center\">\n  <a href=\"\/tutorials\" class=\"btn btn-outline-primary\">&larr; Torna ai Tutorial<\/a>\n<\/section>","description":"Architettura modulare e creazione plugin personalizzati","meta_keywords":"","visible":"yes","status":"public","creation_date":"0000-00-00","id__user":1,"priority":0,"groupname":"TUTORIAL"}],"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":["=","7010"]},"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":"\/tutorials\/plugin"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}