Salta ai contenuti

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à:

dynamic_navigation_collection

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

dynamic_navigation_home

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
}
}
});

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.

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;