Contratti dei tipi di blocco
Scopo e ambito
Questo documento è nato come inventario della Fase 1 dei tipi di blocco core pubblicati attualmente distribuiti in WebBlocks CMS, ora documenta anche la vista di contratto in sola lettura dell'area di amministrazione della Fase 2 e registra le correzioni di standardizzazione delle lacune della Fase 3 completate finora, inclusa la pulizia Layout + Card per section, container, grid, cluster, card e content_header, la pulizia Marketing / Contenuti strutturati per hero, columns, column_item, cta, feature-grid e feature-item, e la pulizia Legacy / Transitional che mantiene documentati in modo trasparente i vecchi slug di compatibilità senza promuoverli nel catalogo core pubblicato.
La Fase 1 è esclusivamente documentazione in sola lettura.
- Non ridisegna i form dei blocchi.
- Non aggiunge un costruttore di form basato su database.
- Non migra il contenuto dei blocchi.
- Non modifica il rendering pubblico.
- Non modifica il funzionamento attuale delle modifiche in
Admin -> System -> Block Types.
L'attuale schermata di amministrazione Block Types resta una schermata di catalogo e metadati. Nella Fase 2 può ora aprire un modale Contract in sola lettura per ogni riga elencata, ma non è ancora un costruttore di form dinamico né un editor di schemi.
La Fase 3 dei plugin aggiunge hook di blocco per plugin di sola dichiarazione tramite PluginBlockTypeDefinition, PluginBlockPackDefinition e PluginBlockRegistry. I plugin abilitati possono esporre handle di proprietà del plugin come analytics-tools::score-card ai fini della scoperta, ma tali dichiarazioni non sostituiscono i contratti dei blocchi core distribuiti, le view dei blocchi core, i seeder core o i servizi di modifica dei blocchi. Gli handle non qualificati in stile core come hero restano di proprietà del core e vengono rifiutati nelle dichiarazioni dei plugin.
Definizione
Un contratto di tipo di blocco è l'accordo tecnico attuale su come un tipo di blocco si comporta nei diversi livelli del CMS:
- identità di catalogo: slug, etichetta, categoria, stato e metadati di sistema o di contenitore
- origine del form di amministrazione: quale partial Blade modifica attualmente il blocco e quali campi espone
- validazione e gestione delle richieste: come
App\Http\Requests\Admin\BlockRequestnormalizza e valida attualmente i payload dei blocchi - proprietà dello storage: quali valori risiedono in
blocks, in righe di traduzione dedicate, inblock_mediao in record correlati - proprietà della traduzione: quali campi rivolti all'utente appartengono alla lingua
- proprietà condivisa: quali impostazioni o relazioni restano condivise tra le lingue
- proprietà di media o relazioni:
media_iddiretto,block_mediaordinato, lookup di navigazione o relazioni nella stessa pagina - supporto dei figli: se il blocco è un contenitore e se i tipi figli sono limitati
- origine del renderer pubblico: quale partial Blade pubblico esegue oggi il rendering del blocco
- contratto della radice del renderer: se il blocco possiede il proprio markup radice pubblico oppure si affida al percorso generico del wrapper
- portabilità e revisioni: se l'attuale forma di storage debba continuare a viaggiare attraverso revisioni, clonazione, esportazione/importazione e promozione
- test e lacune: copertura mirata nota, comportamenti poco chiari o debito di compatibilità
Termini del contratto attuale
Termini di stato usati di seguito:
clear: form di amministrazione, gestione delle richieste, storage e renderer sono sostanzialmente allineatimostly clear: il contratto attuale è comprensibile ma presenta un'avvertenza rilevantetransitional: il contratto attuale mantiene intenzionalmente un percorso di compatibilità o uno schema di proprietà mistoneeds review: i percorsi di codice attuali sono in disaccordo oppure il comportamento è documentato in modo così insufficiente che la Fase 2 dovrebbe evidenziarlo più chiaramentelegacy/fallback: il comportamento pubblicato dipende da un percorso di fallback o di compatibilità
Regole di proprietà dello storage
Il lavoro attuale e futuro sui contratti dovrebbe mantenere esplicite queste regole di proprietà:
- i testi rivolti all'utente appartengono alle righe di traduzione quando il blocco appartiene a una lingua
- i dati operativi o di impostazione condivisi appartengono alle impostazioni condivise del blocco o a relazioni esplicite
- i media dovrebbero usare i percorsi di proprietà
media_idoblock_mediaove applicabile - evitate di spostare contenuti rivolti all'utente in un JSON di impostazioni arbitrario
- mantenete documentati i percorsi di storage di compatibilità finché continuano a influenzare l'output pubblico o le importazioni
Sorgenti distribuite
Questo inventario della Fase 1 si basa sul codice sorgente distribuito, non su supposizioni.
- sorgente del catalogo:
app/Support/Blocks/CoreBlockTypeCatalogSyncer.php - normalizzazione della richiesta di modifica dei blocchi:
app/Http/Requests/Admin/BlockRequest.php - helper di persistenza:
app/Support/Blocks/BlockPayloadWriter.php,app/Support/Blocks/BlockTranslationWriter.php,app/Support/Blocks/BlockTranslationResolver.php - registro delle traduzioni:
app/Support/Blocks/BlockTranslationRegistry.php - form di amministrazione:
resources/views/admin/blocks/types/*.blade.php - renderer pubblici:
resources/views/pages/partials/blocks/*.blade.php - riferimenti di copertura: test su catalogo dei blocchi, rendering, traduzione e specifici per slug in
tests/Feature/
Tipi di blocco core pubblicati attualmente documentati qui: 42.
Comando di audit
La Fase 1 aggiunge un comando di audit sicuro per gli sviluppatori:
php artisan block-types:contracts-audit
php artisan block-types:contracts-audit --json
Il comando è in sola lettura.
- non modifica il database
- non dipende dal contenuto del sito installato
- legge le definizioni del catalogo core distribuito
- verifica la presenza dei file del form di amministrazione e del renderer pubblico distribuiti
- riporta i metadati della famiglia di traduzione e il supporto di base per i contenitori
Il comando è un supporto di aggiornamento per rilevare scostamenti di catalogo e di presenza dei file. Non sostituisce le note di contratto più complete contenute in questo documento.
Vista di amministrazione della Fase 2
La Fase 2 espone i dettagli del contratto in sola lettura in Admin -> System -> Block Types.
- ogni riga può aprire un modale
Block Type Contract - il modale è solo informativo e non invia aggiornamenti
- mostra i dettagli di catalogo, form di amministrazione, storage, traduzione, media o relazioni, figli, renderer e lacune a partire dal codice distribuito
- non trasforma l'amministrazione di Block Types in un editor di schemi o in un costruttore di form
- i tipi di blocco personalizzati o in bozza possono comunque aprire il modale, ma possono mostrare
No shipped contract is documented for this block type yet.quando non è definito alcun contratto core
Matrice dei contratti dei blocchi pubblicati
Contenuto
| Slug | Label | Categoria | Origine del modulo di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento come figlio/contenitore | Origine del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| header | Header | content | resources/views/admin/blocks/types/header.blade.php | title tramite righe di traduzione testuale | variant livello di intestazione; settings.alignment; ancora condivisa in settings.anchor con ripiego legacy su url | Il TOC della stessa pagina legge i blocchi Header dotati di ancora | Non è un contenitore | resources/views/pages/partials/blocks/header.blade.php | Possiede il proprio elemento di intestazione radice | clear | SyncCoreBlockTypesCommandTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Blocco di intestazione canonico; il contratto dell'ancora condivisa è chiaro, ma conserva ancora il comportamento di ripiego legacy su url. |
| plain_text | Plain Text | content | resources/views/admin/blocks/types/plain_text.blade.php | content tramite righe di traduzione testuale | settings.alignment | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/plain_text.blade.php | Possiede il proprio radice | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Semplice primitiva di testo corrente tradotto. |
| rich-text | Rich Text | content | resources/views/admin/blocks/types/rich-text.blade.php | content tramite righe di traduzione testuale | Nessuno | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/rich-text.blade.php | Possiede la propria radice .wb-rich-text quando è presente del contenuto | clear | RichTextBlockTest, PublicRichContentTest, BlockTranslationIntegrityTest | L'archiviazione sicura dell'HTML e la titolarità della traduzione sono chiare. |
| code | Code | content | resources/views/admin/blocks/types/code.blade.php | title, subtitle, content tramite righe di traduzione testuale | settings.language | Nessuno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/code.blade.php | Possiede la propria radice | clear | PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest | La Fase 3 allinea il titolo tradotto del codice, l'etichetta e il corpo dello snippet all'architettura di traduzione testuale esistente e ora ignora nell'output pubblico gli alberi di figli storici arbitrari. |
| button_link | Button Link | content | resources/views/admin/blocks/types/button_link.blade.php | l'etichetta title tramite righe di traduzione testuale | settings.url; settings.target; variant condiviso | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/button_link.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest | L'URL e il target condivisi, insieme all'etichetta tradotta, sono coerenti. |
| card | Card | layout | resources/views/admin/blocks/types/card.blade.php | Nessuno | settings.layout_name | I blocchi figli di regione definiscono la struttura; nessun contratto diretto di media o di traduzione | Contenitore; gli unici figli diretti ammessi sono card_header, card_body e card_footer | resources/views/pages/partials/blocks/card.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest, MediaVisualBlockContractsTest | Card è ora un guscio componibile. Possiede la radice della card, azzera al salvataggio i campi legacy di contenuto o media e mantiene solo un ripiego minimo di rendering legacy per le righe salvate più vecchie che non hanno figli di regione Card. |
| card_header | Card Header | layout | resources/views/admin/blocks/types/card_header.blade.php | Nessuno | settings.layout_name | Solo la relazione con il card padre | Contenitore; può essere collocato solo sotto card; non sono ammessi figli di regione card | resources/views/pages/partials/blocks/card_header.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Blocco di regione Card componibile per il contenuto dell'intestazione. |
| card_body | Card Body | layout | resources/views/admin/blocks/types/card_body.blade.php | Nessuno | settings.layout_name | Solo la relazione con il card padre | Contenitore; può essere collocato solo sotto card; non sono ammessi figli di regione card | resources/views/pages/partials/blocks/card_body.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Blocco di regione Card componibile per il contenuto principale. |
| card_footer | Card Footer | layout | resources/views/admin/blocks/types/card_footer.blade.php | Nessuno | settings.layout_name | Solo la relazione con il card padre | Contenitore; può essere collocato solo sotto card; non sono ammessi figli di regione card | resources/views/pages/partials/blocks/card_footer.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Blocco di regione Card componibile per il piè di pagina o i contenuti di azione. |
| stat-card | Stat Card | content | resources/views/admin/blocks/types/stat-card.blade.php | title, subtitle, content tramite righe di traduzione testuale | L'url canonico resta condiviso sulla riga del blocco | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/stat-card.blade.php | Possiede la propria radice stat-card | clear | StatCardTest, BlockTranslationIntegrityTest | La Fase 3 mantiene il campo URL facoltativo esistente e ora rende un semplice link pubblico quando è presente. |
| image | Image | content | resources/views/admin/blocks/types/image.blade.php | caption, alt text tramite righe di traduzione delle immagini | media_id condiviso; url canonico condiviso | Relazione diretta con il media immagine tramite media_id | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/image.blade.php | Possiede la propria radice semantica quando il media esiste | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest, BlockTranslationIntegrityTest | La Fase 3 allinea Image all'architettura di traduzione delle immagini esistente, così didascalia e testo alternativo appartengono alla singola lingua mentre il media selezionato e l'eventuale URL di collegamento restano condivisi. |
| gallery | Gallery | content | resources/views/admin/blocks/types/gallery.blade.php più resources/views/admin/blocks/types/partials/gallery-items-editor.blade.php | Per ciascun elemento della galleria: alt_text, caption, overlay_title e overlay_text tramite block_gallery_item_translations | Impostazioni di presentazione della galleria condivise, più le relazioni ordinate block_media degli elementi della galleria | Righe block_media ordinate con ruolo gallery_item; i testi degli elementi della galleria specifici della lingua risiedono in block_gallery_item_translations; possono ancora esistere valori legacy title/subtitle salvati sul blocco, ma il rendering pubblico li ignora | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/gallery.blade.php | Possiede la radice del proprio wrapper di galleria e registra un'unica modale viewer sotto #wb-overlay-root quando il lightbox è attivo | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest, PageBuilderExperienceTest, SiteCloneServiceTest, SiteExportImportTest, SitePromotionTest, ReconstructionIntegrityTest, SharedSlotRevisionTest | Gallery è ora un blocco di raccolta media. Il normale modulo di amministrazione usa un editor compatto a righe invece della vecchia griglia di asset selezionati. Il suo selettore annidato Add Gallery Items resta sul contratto condiviso di amministrazione #wb-overlay-root, così WebBlocks UI governa il ciclo di vita delle modali sovrapposte, e i lunghi elenchi di risultati compatti mantengono un'altezza di riga naturale mentre il corpo della modale resta il contenitore di scorrimento. Le varianti pubbliche sono distinte: grid mantiene celle uguali, masonry usa colonne CSS con altezza naturale dell'immagine e collage conserva la composizione con l'elemento in evidenza per primo. I valori legacy masonary salvati vengono ancora accettati e normalizzati verso il percorso canonico masonry. Gallery non produce più l'intestazione o il paragrafo introduttivo; quando serve un testo di sezione, gli editor devono collocare content_header più plain_text o rich-text prima di Gallery. Gli elementi di ripiego legacy basati sulle impostazioni restano leggibili per i contenuti più vecchi. |
| download | Download | content | resources/views/admin/blocks/types/download.blade.php | title, subtitle tramite righe di traduzione testuale | media_id condiviso; variant condiviso | Relazione diretta con il file di download tramite media_id | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/download.blade.php | Possiede la radice del proprio wrapper CTA quando il media esiste | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | La Fase 3 mantiene condivisi il media di download selezionato e la variante del pulsante, spostando l'etichetta visibile e il testo di supporto sul percorso di traduzione testuale esistente. |
| file | File | content | resources/views/admin/blocks/types/file.blade.php | title, content tramite righe di traduzione testuale | media_id condiviso; url canonico condiviso | Relazione diretta con il media tramite media_id, con ripiego su URL esterno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/file.blade.php | Possiede la propria radice di file-card | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | La Fase 3 rende un prodotto il renderer File già rilasciato, con un modulo di amministrazione dedicato, e rende esplicita la titolarità condivisa dell'origine del file tra la libreria media e il ripiego su URL esterno. |
| video | Video | content | resources/views/admin/blocks/types/video.blade.php | title, content tramite righe di traduzione testuale | media_id condiviso; url canonico condiviso | Relazione diretta con il media tramite media_id, con ripiego sicuro su URL esterno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/video.blade.php | Possiede la propria radice di video-card | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | La Fase 3 aggiunge il modulo di amministrazione e il percorso di salvataggio mancanti, così il video caricato, gli URL sicuri di provider esterni, i testi visibili tradotti e il comportamento pubblico di ripiego descrivono ora lo stesso contratto. |
| audio | Audio | content | resources/views/admin/blocks/types/audio.blade.php | title, content tramite righe di traduzione testuale | media_id condiviso; url canonico condiviso | Relazione diretta con il media tramite media_id, con ripiego su URL esterno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/audio.blade.php | Possiede la propria radice di audio-card | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | La Fase 3 aggiunge il modulo di amministrazione e il percorso di salvataggio mancanti, così l'audio caricato, i testi visibili tradotti e un rendering sicuro senza controlli vuoti corrispondono ora al contratto documentato. |
| table | Table | content | resources/views/admin/blocks/types/table.blade.php | title, content tramite righe di traduzione testuale | variant condiviso; il renderer verifica anche il ripiego settings.rows | Nessuno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/table.blade.php | Possiede la radice del proprio wrapper di tabella | mostly clear | PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest | La Fase 3 allinea la titolarità del titolo tradotto e del testo delle righe all'architettura di traduzione testuale esistente e ora ignora nell'output pubblico gli alberi di figli storici arbitrari; il percorso di ripiego legacy settings.rows resta documentato. |
| quote | Quote | content | resources/views/admin/blocks/types/quote.blade.php | Nessuno nel registro attuale | title, subtitle, content e variant canonici | Nessuno | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/quote.blade.php | Possiede la propria radice di citazione | clear | PublicRichContentTest, PageBuilderExperienceTest | La Fase 3 smette di trattare Quote come wrapper di layout o contenitore nell'output pubblico, conservando al tempo stesso le righe figlie già salvate negli alberi di blocchi in amministrazione. |
| hero | Hero | content | resources/views/admin/blocks/types/hero.blade.php | title, subtitle, content tramite righe di traduzione testuale | variant condiviso; settings.layout; settings.title_tag | Blocchi button figli per le CTA gestite | Contenitore; solo figli button | resources/views/pages/partials/blocks/hero.blade.php | Possiede la propria radice promozionale | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Hero è ora un contratto core pubblicato e basato su sorgenti reali. Il testo introduttivo appartiene alla singola lingua, le etichette delle CTA sono tradotte sui pulsanti figli e gli URL delle CTA restano condivisi. I ripieghi legacy sui contenuti restano leggibili quando i campi tradotti canonici sono vuoti. |
| columns | Columns | content | resources/views/admin/blocks/types/columns.blade.php | title, subtitle, content tramite righe di traduzione testuale | variant condiviso | Blocchi column_item figli | Contenitore; solo figli column_item | resources/views/pages/partials/blocks/columns.blade.php | Possiede la propria radice di contenuto strutturato | clear | PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Columns è ora un blocco di contenuto strutturato pubblicato e di prima classe. Il testo introduttivo appartiene alla singola lingua, mentre variante, ordine dei figli e URL dei figli restano condivisi. |
| column_item | Column Item | content | resources/views/admin/blocks/types/column_item.blade.php | title, subtitle, content tramite righe di traduzione testuale | url canonico condiviso | Relazione con il columns padre | Non è un contenitore | resources/views/pages/partials/blocks/column_item.blade.php | La radice dell'elemento è determinata dal padre e varia in base alla variante di Columns | clear | PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Column Item è ora un contratto figlio di supporto pubblicato per Columns. Le modifiche per lingua aggiornano il testo dell'elemento senza sovrascrivere gli URL condivisi. |
| cta | CTA | content | resources/views/admin/blocks/types/cta.blade.php | title, subtitle, content tramite righe di traduzione testuale | variant condiviso | Blocchi button figli per le CTA gestite | Contenitore; solo figli button | resources/views/pages/partials/blocks/cta.blade.php | Possiede la propria radice promozionale | clear | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | CTA è ora un contratto promozionale pubblicato, con testi ed etichette CTA appartenenti alla singola lingua, URL delle CTA condivisi e un renderer pubblico che possiede la propria radice. |
| feature-grid | Feature Grid | content | resources/views/admin/blocks/types/feature-grid.blade.php | title, subtitle, content tramite righe di traduzione testuale | Nessuno oltre alla struttura condivisa dei figli | Blocchi feature-item figli, con supporto compatibile per il legacy column_item | Contenitore; i figli ammessi sono feature-item e column_item | resources/views/pages/partials/blocks/feature-grid.blade.php | Delega alla presentazione a card di Columns e usa ancora il wrapper pubblico generico | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Feature Grid è ora un alias di compatibilità pubblicato, perché dispone di percorsi reali di amministrazione e rendering già rilasciati, ma continua intenzionalmente a delegare al contratto a card di Columns. |
| feature-item | Feature Item | content | resources/views/admin/blocks/types/feature-item.blade.php | title, content tramite righe di traduzione testuale | url canonico condiviso | Relazione con il feature-grid padre | Non è un contenitore | resources/views/pages/partials/blocks/feature-item.blade.php | Delega alla presentazione a card di Column Item | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Feature Item è ora un contratto figlio di supporto pubblicato per Feature Grid, che continua a condividere il guscio a card esistente di Column Item. |
Layout
| Slug | Etichetta | Categoria | Sorgente del form di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento figli/contenitore | Sorgente del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| section | Section | layout | resources/views/admin/blocks/types/section.blade.php | Nessuno | settings.layout_name; settings.spacing | Solo blocchi figli | Contenitore; nessuna whitelist esplicita dei figli | resources/views/pages/partials/blocks/section.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | La fase 3 mantiene Section solo come layout: le impostazioni di layout condivise restano canoniche, possiede la radice semantica e non sposta i testi visibili all'utente in impostazioni arbitrarie. |
| container | Container | layout | resources/views/admin/blocks/types/container.blade.php | Nessuno | settings.layout_name; settings.width; settings.flow | Solo blocchi figli | Contenitore; nessuna whitelist esplicita dei figli | resources/views/pages/partials/blocks/container.blade.php | Possiede il proprio contenitore radice | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | L'impostazione predefinita legacy ricade ancora sul flusso impilato quando non è definita, mentre Flow: None esplicito resta il percorso di composizione neutrale rispetto al layout. |
| cluster | Cluster | layout | resources/views/admin/blocks/types/cluster.blade.php | Nessuno | settings.layout_name; settings.gap; settings.alignment; settings.items_alignment; settings.wrap; settings.width | Solo blocchi figli | Contenitore; nessuna whitelist esplicita dei figli | resources/views/pages/partials/blocks/cluster.blade.php | Possiede il proprio cluster radice | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Le impostazioni di layout condivise restano esplicite e di proprietà del renderer, incluso il percorso di composizione esistente compatibile con la navbar (full-width, between, center, nowrap) senza aggiungere logica specifica per la navbar. |
| grid | Grid | layout | resources/views/admin/blocks/types/grid.blade.php | Nessuno | settings.layout_name; settings.columns; settings.gap | Solo blocchi figli | Contenitore; nessuna whitelist esplicita dei figli | resources/views/pages/partials/blocks/grid.blade.php | Possiede il proprio grid radice | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Le impostazioni di grid condivise restano canoniche e l'output pubblico resta limitato alle mappature di classe wb-grid- incluse e wb-gap- supportate. |
Pattern
| Slug | Etichetta | Categoria | Sorgente del form di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento figli/contenitore | Sorgente del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| content_header | Content Header | pattern | resources/views/admin/blocks/types/content_header.blade.php | title, subtitle, meta tramite righe di traduzione del testo | settings.alignment | meta è memorizzato come contenuto di elenco strutturato | Non è un contenitore | resources/views/pages/partials/blocks/content_header.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest | Content Header è un blocco pattern di tipo content-shell. Mantiene titolo, introduzione e testo meta di proprietà della lingua (locale), renderizza sempre il titolo come H1, ignora in fase di rendering eventuali valori di livello di intestazione salvati in passato e mantiene condiviso solo l'allineamento. |
| alert | Alert | pattern | resources/views/admin/blocks/types/alert.blade.php | title, content tramite righe di traduzione del testo | settings.variant | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/alert.blade.php | Possiede la radice del proprio alert | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | La variante condivisa e il testo tradotto si allineano senza problemi. |
Navigazione
| Slug | Etichetta | Categoria | Sorgente del form di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento figli/contenitore | Sorgente del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| link-list | Link List | navigation | resources/views/admin/blocks/types/link-list.blade.php | title, subtitle, content tramite righe di traduzione del testo | Nessuno | Blocchi link-list-item figli | Contenitore; solo figli link-list-item | resources/views/pages/partials/blocks/link-list.blade.php | Possiede la propria radice .wb-link-list quando esistono righe figlie | clear | LinkListBlockTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | La fase 3 ora rende il testo introduttivo tradotto esistente sopra l'elenco di link pubblico, senza modificare il comportamento degli elementi figli. |
| link-list-item | Link List Item | navigation | resources/views/admin/blocks/types/link-list-item.blade.php | title obbligatorio, subtitle facoltativo e content facoltativo, tramite righe di traduzione del testo | url condiviso obbligatorio | Relazione con il link-list padre | Non è un contenitore | resources/views/pages/partials/blocks/link-list-item.blade.php | Possiede la radice del link di riga e omette l'elemento descrizione quando il contenuto è vuoto | clear | LinkListBlockTest, PageBuilderExperienceTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | L'URL condiviso insieme al testo tradotto della riga è coerente. |
| toc | TOC | navigation | resources/views/admin/blocks/types/toc.blade.php | Nessuno | Solo il title canonico | Blocchi header pubblicati nella stessa pagina con ancore valide | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/toc.blade.php | Possiede il proprio wrapper TOC generato quando esistono intestazioni | clear | PublicRichContentTest, PageBuilderExperienceTest | La fase 3 mantiene TOC concentrato solo sulle intestazioni di pagina rilevate e non tratta più blocchi figli arbitrari come contenuto pubblico del TOC. |
| breadcrumb | Breadcrumb | navigation | resources/views/admin/blocks/types/breadcrumb.blade.php | Nessuno | settings.home_label; settings.include_current condivisi | Contesto di breadcrumb della pagina, del sito e della lingua (locale) correnti | Non è un contenitore | resources/views/pages/partials/blocks/breadcrumb.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest | La fase 3 conserva le impostazioni di breadcrumb esposte attraverso il percorso condiviso BlockRequest, così il comportamento del form corrisponde ora alla persistenza e al rendering. |
| header-actions | Header Actions | navigation | resources/views/admin/blocks/types/header-actions.blade.php | Nessuno | settings.show_mode_toggle; settings.show_accent_toggle; settings.show_search condivisi | Rotta di ricerca più hook di interfaccia lato client | Non è un contenitore | resources/views/pages/partials/blocks/header-actions.blade.php | Possiede solo il proprio cluster di azioni interno | clear | PublicEditorialBlocksRenderingTest | Blocco di utilità di sistema; per scelta progettuale non possiede traduzioni. |
| sticky-navbar | Navbar | navigation | resources/views/admin/blocks/types/sticky-navbar.blade.php | Nessuno | settings.layout_name; settings.sticky_mode | Blocchi figli annidati della navbar | Contenitore; i figli consentiti sono container, cluster, header, plain_text, rich-text, button_link, navbar-brand, navbar-navigation, header-actions, search-form | resources/views/pages/partials/blocks/sticky-navbar.blade.php | Il renderer pubblico possiede la radice esterna | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, BlockTypePhaseThreeContractsTest | La fase 3 allinea lo slug persistito sticky-navbar con Block::ownsPublicRoot(), così Navbar non riceve più un wrapper di blocco pubblico generico aggiuntivo. |
| navbar-brand | Navbar Brand | navigation | resources/views/admin/blocks/types/navbar-brand.blade.php | title, subtitle tramite righe di traduzione del testo | settings.url; settings.target; settings.aria_label condivisi | Media del logo condiviso tramite media_id; fallback all'URL della home del sito | Non è un contenitore | resources/views/pages/partials/blocks/navbar-brand.blade.php | Possiede solo il link del brand interno | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | La fase 3 allinea il comportamento di salvataggio dell'amministrazione con il contratto del renderer distribuito: l'URL salvato esplicito ha la precedenza, altrimenti si utilizza il percorso della home del sito corrente quando disponibile e infine / come fallback sicuro finale. |
| navbar-navigation | Navbar Navigation | navigation | resources/views/admin/blocks/types/navbar-navigation.blade.php | Nessuno | Il title canonico come etichetta ARIA condivisa; settings.menu_key | Albero di menu NavigationItem condiviso | Non è un contenitore | resources/views/pages/partials/blocks/navbar-navigation.blade.php | Possiede solo il wrapper di navigazione interno | clear | PublicEditorialBlocksRenderingTest | L'associazione del menu condivisa e l'etichetta ARIA sono comportamento attuale di proprietà del prodotto. |
| sidebar-brand | Sidebar Brand | navigation | resources/views/admin/blocks/types/sidebar-brand.blade.php | title, subtitle tramite righe di traduzione del testo | settings.url; settings.target; settings.aria_label condivisi | Media del logo condiviso tramite media_id; fallback all'URL della home del sito | Non è un contenitore | resources/views/pages/partials/blocks/sidebar-brand.blade.php | Possiede solo il link del brand interno | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | La fase 3 assegna a Sidebar Brand lo stesso ordine di fallback del nome accessibile in presenza del solo logo di Navbar Brand e lo stesso contratto conservativo di fallback dell'URL condiviso. |
| sidebar-navigation | Sidebar Navigation | navigation | resources/views/admin/blocks/types/sidebar-navigation.blade.php | title tramite righe di traduzione del testo | settings.menu_key; settings.layout_name; settings.show_icons; settings.active_matching condivisi | L'albero NavigationItem del CMS oppure blocchi figli manuali | Contenitore; solo figli sidebar-nav-item e sidebar-nav-group | resources/views/pages/partials/blocks/sidebar-navigation.blade.php | Possiede la propria radice | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Sia le impostazioni condivise della modalità menu sia la modalità con figli manuali sono esplicite. |
| sidebar-nav-item | Sidebar Nav Item | navigation | resources/views/admin/blocks/types/sidebar-nav-item.blade.php | title tramite righe di traduzione del testo | settings.url; settings.target; settings.icon; settings.active_mode; settings.manual_active condivisi | Slug condiviso del catalogo icone; relazione con la sidebar padre | Non è un contenitore | resources/views/pages/partials/blocks/sidebar-nav-item.blade.php | Possiede la radice del proprio link della sidebar | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Il comportamento del link condiviso e l'etichetta tradotta si accordano bene. |
| sidebar-nav-group | Sidebar Nav Group | navigation | resources/views/admin/blocks/types/sidebar-nav-group.blade.php | title tramite righe di traduzione del testo | settings.icon; settings.initially_open; settings.layout_name condivisi | Blocchi sidebar-nav-item figli; slug del catalogo icone | Contenitore; solo figli sidebar-nav-item | resources/views/pages/partials/blocks/sidebar-nav-group.blade.php | Possiede la propria radice .wb-nav-group | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | La fase 3 mantiene il contratto del wrapper nav-group distribuito di WebBlocks UI, mentre i link figli manuali annidati riutilizzano ora la stessa semantica dell'elemento sidebar per href, target, icona e output dello stato attivo. |
| search-form | Search Form | navigation | resources/views/admin/blocks/types/search-form.blade.php | title, subtitle, content tramite righe di traduzione del testo | variant; settings.show_button condivisi | Contesto della rotta di ricerca, del sito e della lingua (locale) | Non è un contenitore | resources/views/pages/partials/blocks/search-form.blade.php | Possiede la propria radice | clear | SearchFormTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Le impostazioni condivise di visualizzazione del pulsante e le etichette tradotte sono esplicite. |
| sidebar-footer | Sidebar Footer | navigation | resources/views/admin/blocks/types/sidebar-footer.blade.php | title, subtitle, content tramite righe di traduzione del testo | settings.variant condiviso | Nessuno | Non è un contenitore | resources/views/pages/partials/blocks/sidebar-footer.blade.php | Possiede la radice del proprio blocco footer interno | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | La variante condivisa con testo tradotto è semplice. |
Moduli
| Slug | Etichetta | Categoria | Sorgente del form di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento figli/contenitore | Sorgente del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| contact_form | Contact Form | form | resources/views/admin/blocks/types/contact_form.blade.php | title, content, submit_label, success_message tramite righe di traduzione del modulo di contatto | settings.recipient_email; settings.send_email_notification; settings.store_submissions condivisi | Gli invii di contact_messages sono collegati al blocco e alla pagina | Non è un contenitore | resources/views/pages/partials/blocks/contact_form.blade.php | Possiede la propria radice section.wb-card ed emette un modulo nativo protetto da CSRF che invia a /contact-messages | clear | ContactFormModuleTest, InternalContentApiTest, ContactMailDiagnoseCommandTest | Il renderer emette un campo di controllo antispam nascosto e generato, di proprietà del CMS, che non è un normale input del visitatore e non deve essere creato manualmente. Gli invii con il campo di controllo compilato restituiscono un successo generico, senza memorizzazione né notifica. I messaggi legittimi vengono memorizzati prima della notifica, lo spam valutato viene conservato per la revisione da parte dell'amministrazione, l'ordine di fallback del destinatario è blocco, sito, CONTACT_RECIPIENT_EMAIL e poi MAIL_FROM_ADDRESS, e le pagine di contatto non dovrebbero usare Trusted HTML, moduli grezzi o mailto: come sostituti. |
Avanzato
| Slug | Etichetta | Categoria | Sorgente del form di amministrazione | Campi traducibili | Campi condivisi/di impostazione | Campi media/relazione | Comportamento figli/contenitore | Sorgente del renderer pubblico | Contratto della radice del renderer | Stato attuale | Test / copertura | Lacune note / note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| html | HTML (Trusted) | advanced | resources/views/admin/blocks/types/html.blade.php | Nessuno | Il content HTML attendibile canonico | I registri pubblici di overlay e di fine body possono ricevere frammenti estratti | Non è un contenitore; le righe figlie storiche vengono conservate, ma non è supportato l'inserimento di nuovi figli | resources/views/pages/partials/blocks/html.blade.php | Possiede un wrapper attorno al markup attendibile e può anche emettere contenuto di overlay o di fine body fuori banda | mostly clear | PublicEditorialBlocksRenderingTest, PublicRichContentTest, PageBuilderExperienceTest | La fase 3 smette di trattare Trusted HTML come wrapper contenitore di figli pubblico. Il markup attendibile può comunque influenzare l'output condiviso di overlay o di fine body oltre la radice visibile. |
Panoramica su validazione e persistenza
Attualmente i tipi di blocco pubblicati non hanno ciascuno una propria classe request dedicata.
App\Http\Requests\Admin\BlockRequestè il percorso di richiesta di modifica condiviso- i rami specifici per slug all'interno di quella richiesta normalizzano i campi verso l'archiviazione canonica attuale
App\Support\Blocks\BlockPayloadWriterpersiste il payload normalizzato del bloccoApp\Support\Blocks\BlockTranslationWritersposta i campi di proprietà della lingua (locale) nelle righe di traduzione per le famiglie registrateApp\Support\Blocks\BlockTranslationResolverrisolve i valori tradotti o di fallback su un'istanza di blocco renderizzabile
Quel percorso di richiesta condiviso è una delle ragioni per cui la Fase 1 documenta prima i contratti, prima di qualsiasi lavoro di modifica basato su schema.
Lacune e backlog
Lacune rilevanti ancora presenti dopo le correzioni attuali della Fase 3:
galleryconserva ancora un percorso legacy di elementi di fallback basato sulle impostazioni quando le righe canoniche ordinate diblock_medianon sono presentitable— il suo renderer supporta ancora un percorso di fallback legacy basato susettings.rowsanche se il modulo di amministrazione principale scrive il testo tradotto delle righeheroconserva ancora i fallback legacy dei campi quando i campi introduttivi tradotti canonici sono vuotifeature-gridefeature-itemsono ora pubblicati perché supportati dal codice sorgente, ma restano intenzionalmente contratti delegati transitori sui percorsi di presentazione condivisi di Columns o Column Itemtabs,slider,menuefaq-listesistono ancora come righe legacy del catalogo in stato di bozza, con moduli o renderer di compatibilità, ma non sono contratti core pubblicati e devono continuare a fallire in modo sicuro nella finestra modale del contratto e nell'output di auditshowcase-listecontact-infoesistono solo come percorsi di compatibilità per il rendering pubblico e non come blocchi pubblicati del catalogo core; i loro link basati sulle impostazioni seguono ora le stesse regole di URL pubblico sicuro degli altri renderer di blocchi- i cataloghi pubblicati e in bozza coesistono, quindi qualsiasi futura esposizione in amministrazione deve distinguere esplicitamente tra contratti core pubblicati e righe in bozza o specifiche dell'installazione
Fase 3 consigliata
Lavoro di standardizzazione consigliato in seguito per i gruppi di blocchi:
- definire gruppi di blocchi stabili di proprietà del prodotto, come layout, contenuto, navigazione, pattern e avanzato, in un'unica fonte di verità
- allineare i raggruppamenti del selettore, quelli della documentazione e quelli dell'amministrazione Block Types alla stessa fonte
- decidere quali blocchi attualmente in bozza o transitori debbano diventare supportati, archiviati o esplicitamente legacy
- standardizzare quali contratti siano supportati da traduzioni e quali siano intenzionalmente solo condivisi prima di iniziare qualsiasi lavoro sui moduli basati su schema
Riepilogo della Fase 1
La Fase 1 stabilisce l'inventario attuale dei contratti pubblicati senza modificare il comportamento di modifica dei blocchi, la loro archiviazione o il rendering pubblico.
Quello era il punto di arresto previsto per il rilascio della Fase 1.
Riepilogo della Fase 2
La Fase 2 rende visibile il contratto documentato nell'amministrazione Block Types come informazione di sola lettura, mantenendo invariati il comportamento di modifica dei blocchi, l'archiviazione, i renderer e il selettore.
Riepilogo della Fase 3
La Fase 3 inizia a risolvere le lacune documentate a basso rischio nei contratti senza aggiungere un editor di schemi, un costruttore dinamico di moduli o un sistema di moduli di blocco basato su database.
codeora segue il percorso di traduzione del testo esistente per titolo, etichetta e corpo dello snippet, mantenendo condiviso il linguaggio di sintassitableora segue il percorso di traduzione del testo esistente per il titolo e il testo delle righe, mantenendo condiviso lo stile della tabellabreadcrumbora conserva al salvataggio le impostazioni condivise espostestat-cardora utilizza l'URL opzionale esistente nel renderer pubblico con un link semplice e sicurolink-listora esegue il rendering del testo introduttivo tradotto esistente sopra l'elenco degli elementi figlisticky-navbarora allinea la proprietà persistita della radice della Navbar conBlock::ownsPublicRoot()in modo che lo shell pubblico non aggiunga un wrapper generico aggiuntivoimageora segue il percorso di traduzione delle immagini esistente per la didascalia e il testo alternativo, mantenendo condivisi il media selezionato e l'URL del link opzionalegalleryora utilizza la tabella di proprietà della lingua (locale)block_gallery_item_translationsper il testo alternativo, la didascalia, il titolo dell'overlay e il testo dell'overlay di ogni elemento, mantenendo condivisi i media ordinati della galleria e le impostazioni di presentazione, conservando gli elementi di fallback legacy per i contenuti vecchi ed escludendo il titolo e la descrizione legacy della galleria dalla modifica normale e dall'output pubblicodownloadora segue il percorso di traduzione del testo esistente per l'etichetta visibile e il testo di supporto, mantenendo condivisi il media selezionato e la variante del pulsantefile,videoeaudioora dispongono di moduli di amministrazione di prima classe e di normalizzazione delle richieste, così che il testo visibile tradotto e i media condivisi o le sorgenti URL compiano il round-trip attraverso lo stesso contratto con cui vengono già resi pubblicamenteimage,gallery,download,file,videoeaudionon accettano più il posizionamento arbitrario di nuovi figli e non eseguono più pubblicamente il rendering di alberi di figli storici arbitrari, mentre le righe figlie esistenti restano conservate negli alberi di blocchi dell'amministrazionecode,table,quote,tocehtmlnon accettano più il posizionamento normale di nuovi figli e non eseguono più pubblicamente il rendering di alberi di figli storici arbitrari, mentre le righe figlie esistenti restano conservate negli alberi di blocchi dell'amministrazionenavbar-brandesidebar-brandora condividono un contratto conservativo di fallback basato sull'URL salvato o sulla home del sito, ed entrambi mantengono una denominazione accessibile e sicura per l'output con solo logo, senza imporre testo visibilesidebar-nav-groupora riutilizza la stessa semantica di output degli elementi manuali della barra laterale disidebar-nav-itemper i link figli annidati, mantenendo il contratto esistente del wrapper nav-group di WebBlocks UIsection,container,grid,cluster,cardecontent_headerora usano la stessa fonte di contratto distribuita nel registro, nella finestra modale di contratto di sola lettura dell'amministrazione, nell'output di audit, nella documentazione e nella copertura di regressione miratahero,columns,column_item,cta,feature-gridefeature-itemsono ora pubblicati nel catalogo core distribuito, documentati nel registro dei contratti condiviso e coperti come contratti di marketing o di contenuto strutturato supportati dal codice sorgente, invece di restare solo in bozza o poco documentati- le modifiche relative alla sola lingua (locale) per i pulsanti CTA gestiti e gli elementi figli strutturati ora conservano gli URL condivisi continuando ad aggiornare le etichette o il testo tradotti
- le primitive di layout mantengono le impostazioni di layout condivise e la struttura dei figli nell'archiviazione canonica dei blocchi, invece che in righe di traduzione o campi di testo arbitrari
cardora utilizza un contratto di shell componibile: la Card padre possiede la radicewb-card, le regioni della Card possiedonowb-card-header,wb-card-bodyewb-card-footer, i blocchi regione sono validi solo all'interno di Card e il testo Card salvato legacy viene conservato solo tramite un percorso di rendering di fallback minimo senza regionicontent_headermantiene titolo, introduzione e testo meta tradotti, esegue sempre il rendering del titolo come H1, ignora in modo sicuro i valori legacy salvati del livello di intestazione e mantiene la sua radice semantica<header class="wb-content-header">di proprietà del renderer, senza wrapper genericotestimonialestatsrestano documentati onestamente come comportamento di solo alias che delega ai percorsi di rendering esistenti di Quote o Columns, anziché come contratti core pubblicati autonomitabs,slider,menuefaq-listrestano slug in bozza o di compatibilità dell'era degli alias e non contratti core pubblicati, mentreshowcase-listecontact-inforestano renderer di compatibilità solo pubblici, senza una voce di contratto nel catalogo core distribuito