Forestry is another popular, commercial git-based CMS option. The basic setup of Forestry is simple. When you import a project, Forestry will automatically look at the content and map out the data models in its system for you, placing all of these settings in a
.forestry directory in your project. Below is the default editing for a basic post that has a one-to-one relationship to an author and a one-to-many relationship to related posts.
While Forestry is extremely smart in recognizing fields, it isn't able automatically see that the
related_posts represent relationships. Instead,
author is just a string value and
related_posts is an array of string values. However, these can be overridden.
In this example, open one of the posts and, from the menu icon in the top-right-corner, choose "Create Template" to create a frontmatter template based upon the content model.
Since this template represents the post type, Name the template "Posts".
This will generate a frontmatter template as shown below, which can be edited via the UI.
However, this requires some changes that can't be made via the UI, which requires pulling the code down and edit it. Once the code is fetched, the generated file can be found at
.forestry/font_matter/templates/posts.yml. It has the following contents:
--- label: Posts hide_body: false fields: - type: text name: title label: title - type: datetime name: date label: date - type: text name: author label: author - type: list name: related_posts label: related_posts
config option to each that contains
required: true to
author since these are required fields. For example, the title will look like this:
- type: text name: title label: title config: required: true
Next, edit the
author type. Rather than
type: text this should be
type: select so that it will create a drop down of options. Within the
config, define a
source of type
pages that pulls from the
authors section as shown below:
- type: select name: author label: author config: required: true source: type: pages section: authors
related_posts is already using the sortable list field type, which is what is needed. However, it needs to be configured to use a select-style entry rather than text and to pull that select from the list of posts. The configuration for this looks similar to the code above.
- type: list name: related_posts label: related_posts config: use_select: true source: type: pages section: posts
The last step is to force posts to use this template by modifying the
.forestry/settings.yml file. Under the section for
posts, add the
template setting as follows:
- type: directory path: content/posts label: Posts create: all match: "**/*" templates: - posts
Once everything is checked back into source control, the dropdowns are working properly.
Notice that existing references to authors and related posts may disappeared or show "Invalid Reference." This is because Forestry adds the full relative path to each related file rather than just the slug. Either edit this manually for each post via the UI or in the code. For example, here's the updated frontmatter for one of my posts:
title: Han Shot First date: 2020-03-31 author: authors/brian-rinaldi.md related_posts: - posts/last-jedi-was-good.md - posts/return-of-skywalker-awful.md