Collezioni root dinamiche
Costruiamo un esempio più complesso dove la navigazione principale viene caricata dinamicamente dal database. Useremo la collezione units come quella per generare il resto della navigazione.
Per questo esempio avremo Units e Lessons come tipi di contenuto principali — immagina di modellare la struttura per un corso.
Nella collezione units creeremo un documento per ogni unità:

E ciascuno di quei documenti genererà una nuova voce di navigazione:

Dichiara la collezione principale
Sezione intitolata “Dichiara la collezione principale”Definiamo la collezione units come quella principale:
import { buildCollection } from "@firecms/core";
export type Unit = { name: string; description: string;}
export const unitsCollection = buildCollection<Unit>({ name: "Units", singularName: "Unit", group: "Main", id: "units", path: "units", customId: true, icon: "LocalLibrary", callbacks: { onSaveSuccess: ({ context }) => { context.navigation.refreshNavigation(); }, onDelete: ({ context }) => { context.navigation.refreshNavigation(); } }, properties: { name: { name: "Name", validation: { required: true }, dataType: "string" }, description: { name: "Description", validation: { required: true }, dataType: "string", multiline: true } }});Builder di collezioni dinamico
Sezione intitolata “Builder di collezioni dinamico”Tipicamente in FireCMS passi una lista statica di collezioni al componente CMS principale, ma in questo caso dobbiamo costruire le collezioni dinamicamente in base ai dati nel database.
FireCMS ti permette di passare una funzione che restituisce una lista di collezioni alla prop collections del componente FireCMSApp.
import { buildCollection, EntityCollectionsBuilder } from "@firecms/core";import { Unit, unitsCollection } from "./unit_collection";
const collectionBuilder: EntityCollectionsBuilder = async ({ dataSource, user }) => { const units = await dataSource.fetchCollection<Unit>({ path: "units", }); const lessonCollections = units.map(unit => buildCollection<Unit>({ name: unit.values.name, id: `units/${unit.id}/lessons`, path: `units/${unit.id}/lessons`, description: unit.values.description, group: "Units", properties: { name: { name: "Name", dataType: "string" }, description: { name: "Description", dataType: "string" } } }));
return [ unitsCollection, ...lessonCollections ]};Questo codice recupera i dati che vengono generati nella collezione units e crea una nuova collezione per ciascuno dei documenti.
Codice completo
Sezione intitolata “Codice completo”import { buildCollection } from "@firecms/core";import { FireCMSAppConfig } from "@firecms/cloud";
type Unit = { name: string; description: string;}
const unitsCollection = buildCollection<Unit>({ name: "Units", singularName: "Unit", group: "Main", id: "units", path: "units", customId: true, icon: "LocalLibrary", callbacks: { onSaveSuccess: ({ context }) => { context.navigation.refreshNavigation(); }, onDelete: ({ context }) => { context.navigation.refreshNavigation(); } }, properties: { name: { name: "Name", validation: { required: true }, dataType: "string" }, description: { name: "Description", validation: { required: true }, dataType: "string", multiline: true } }});
const appConfig: FireCMSAppConfig = { version: "1", collections: async ({ dataSource }) => { const units = await dataSource.fetchCollection<Unit>({ path: "units", }); const lessonCollections = units.map(unit => buildCollection({ name: unit.values.name, id: `units/${unit.id}/lessons`, path: `units/${unit.id}/lessons`, description: unit.values.description, group: "Units", properties: { name: { name: "Name", dataType: "string" } } }));
return [ unitsCollection, ...lessonCollections ] }}
export default appConfig;