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\BlockRequest normalizza e valida attualmente i payload dei blocchi
  • proprietà dello storage: quali valori risiedono in blocks, in righe di traduzione dedicate, in block_media o 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_id diretto, block_media ordinato, 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 allineati
  • mostly clear: il contratto attuale è comprensibile ma presenta un'avvertenza rilevante
  • transitional: il contratto attuale mantiene intenzionalmente un percorso di compatibilità o uno schema di proprietà misto
  • needs review: i percorsi di codice attuali sono in disaccordo oppure il comportamento è documentato in modo così insufficiente che la Fase 2 dovrebbe evidenziarlo più chiaramente
  • legacy/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_id o block_media ove 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\BlockPayloadWriter persiste il payload normalizzato del blocco
  • App\Support\Blocks\BlockTranslationWriter sposta i campi di proprietà della lingua (locale) nelle righe di traduzione per le famiglie registrate
  • App\Support\Blocks\BlockTranslationResolver risolve 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:

  • gallery conserva ancora un percorso legacy di elementi di fallback basato sulle impostazioni quando le righe canoniche ordinate di block_media non sono presenti
  • table — il suo renderer supporta ancora un percorso di fallback legacy basato su settings.rows anche se il modulo di amministrazione principale scrive il testo tradotto delle righe
  • hero conserva ancora i fallback legacy dei campi quando i campi introduttivi tradotti canonici sono vuoti
  • feature-grid e feature-item sono ora pubblicati perché supportati dal codice sorgente, ma restano intenzionalmente contratti delegati transitori sui percorsi di presentazione condivisi di Columns o Column Item
  • tabs, slider, menu e faq-list esistono 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 audit
  • showcase-list e contact-info esistono 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.

  • code ora segue il percorso di traduzione del testo esistente per titolo, etichetta e corpo dello snippet, mantenendo condiviso il linguaggio di sintassi
  • table ora segue il percorso di traduzione del testo esistente per il titolo e il testo delle righe, mantenendo condiviso lo stile della tabella
  • breadcrumb ora conserva al salvataggio le impostazioni condivise esposte
  • stat-card ora utilizza l'URL opzionale esistente nel renderer pubblico con un link semplice e sicuro
  • link-list ora esegue il rendering del testo introduttivo tradotto esistente sopra l'elenco degli elementi figli
  • sticky-navbar ora allinea la proprietà persistita della radice della Navbar con Block::ownsPublicRoot() in modo che lo shell pubblico non aggiunga un wrapper generico aggiuntivo
  • image ora 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 opzionale
  • gallery ora utilizza la tabella di proprietà della lingua (locale) block_gallery_item_translations per 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 pubblico
  • download ora 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 pulsante
  • file, video e audio ora 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 pubblicamente
  • image, gallery, download, file, video e audio non 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'amministrazione
  • code, table, quote, toc e html non 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'amministrazione
  • navbar-brand e sidebar-brand ora 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 visibile
  • sidebar-nav-group ora riutilizza la stessa semantica di output degli elementi manuali della barra laterale di sidebar-nav-item per i link figli annidati, mantenendo il contratto esistente del wrapper nav-group di WebBlocks UI
  • section, container, grid, cluster, card e content_header ora 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 mirata
  • hero, columns, column_item, cta, feature-grid e feature-item sono 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
  • card ora utilizza un contratto di shell componibile: la Card padre possiede la radice wb-card, le regioni della Card possiedono wb-card-header, wb-card-body e wb-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 regioni
  • content_header mantiene 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 generico
  • testimonial e stats restano documentati onestamente come comportamento di solo alias che delega ai percorsi di rendering esistenti di Quote o Columns, anziché come contratti core pubblicati autonomi
  • tabs, slider, menu e faq-list restano slug in bozza o di compatibilità dell'era degli alias e non contratti core pubblicati, mentre showcase-list e contact-info restano renderer di compatibilità solo pubblici, senza una voce di contratto nel catalogo core distribuito