Creating a DecentCMS content type
A content item in DecentCMS is an aggregate of parts, as defined by the content type of the item. For example, an item of type “page” is the combination of a title part, and a body part. This definition of which parts constitute a given type is configuration data that is defined at the level of the site.
If you open the `settings.json` file at the root of a site’s folder, you’ll find the content type definitions are part of the configuration of the “content” feature. More precisely, under `features.content.types`:
{
"name": "DecentCMS",
"host": ["decentcms.org", "local.decentcms.com"],
"port": "*",
"setup": true,
"features": {
"content": {
"types": {
"page": {
The type definition itself has a list of named parts, and their corresponding part types:
"page": {
"name": "Page",
"description": "A simple page type.",
"parts": {
"title": {
"type": "title"
},
"body": {
"type": "text"
}
}
}
It is possible, if necessary, to have other settings than the part’s type under a part definition.
Any service can access the type definition object through the content manager:
var cm = this.scope.require('content-manager');
var typeDefinition = cm.getType(someItem);
var bodyDefinition = typeDefinition.parts.body;
The content manager also has a helper method for getting the names of all the parts of a given type:
var textPartNames = cm.getParts(someItem, 'text');
In the next DecentCMS post, I think I’ll talk about dependency injection, which should be a fun one to tackle…