Relations
Create automatic relations between pages
Options See on deno.land
- extensions string[]
The list of extensions this plugin applies to
Default:[ ".html" ]
- idKey string
The field name used to save the page id
Default:"id"
- typeKey string
The field name used to save the page type
Default:"type"
- foreignKeys record
The foreign keys per type (type => foreign_key)
Description
This plugin is useful if you have different types of pages that are related. For example, let's say there are pages with articles and pages with authors. This plugin can relate the articles and authors pages automatically.
Installation
Import this plugin in your _config.ts
file to use it:
import lume from "lume/mod.ts";
import relations from "lume/plugins/relations.ts";
const site = lume();
site.use(relations(/* Options */));
export default site;
Usage
This plugin requires to specify the page types and their foreign key used to make the relation. For example:
import lume from "lume/mod.ts";
import relations from "lume/plugins/relations.ts";
const site = lume();
site.use(relations({
foreignKeys: {
article: "article_id",
author: "author_id",
},
}));
export default site;
In the following example, there are some pages of type: article
or type: author
. The pages of type article
include the relation with the author, using the foreign key author_id
:
---
id: 1
type: article
author_id: 2
---
Content of article 1, by Laura
---
id: 2
type: article
author_id: 2
---
Content of article 2, by Laura
---
id: 3
type: article
author_id: 1
---
Content of article 3, by Óscar
---
id: 1
type: author
title: Óscar Otero
---
Bio of Óscar
---
id: 2
type: author
title: Laura Rubio
---
Bio of Laura
This plugin automatically creates the variable author
for each article with the data of the author (1:n
relation). To render an article including the author:
<article>
{{ content | safe }}
<footer>By {{ author.title }}</footer>
</article>
The plugin also creates the inverse relation (n:1
relation) and creates the variable article
that is an array with all articles related to each author:
<article>
{{ content | safe }}
<h2>Articles created:</h2>
<ul>
{% for item in article %}
<li>
<a href="{{ item.url }}">
{{ item.title }}
</a>
</li>
{% endfor %}
</ul>
</article>
Multiple relations
You can relate multiple pages (n:n
relation) from the same page using an array in the foreign key. For example, an article written by many authors:
---
title: This is the title
type: article
id: 1
author_id: [1, 2]
---
Content of the article
Customize the id and type key
By default, the pages are identified by the value of the type
and id
keys. You can change it globally in the config:
site.use(relations({
typeKey: "kind",
idKey: "slug",
foreignKeys: {
article: "article_id",
author: "author_id",
},
}));
Configure individual relations
You can use an object to configure individual relations. The available options are:
foreignKey
(required): The key name use to set a relation (for examplearticle_id
).relationKey
: The key name use to store the relation (for examplearticle
).pluralRelationKey
: The key name use to store the relation if it's a multiple relation (for examplearticles
instead ofarticle
).idKey
: The key name used to identify the entity (by default isid
).filter
: A custom function to filter the related elements. It's useful when combined with the multilanguage plugin, to relate only elements not only with the sameid
but also the same language.
Let's see an example:
site.use(relations({
foreignKeys: {
article: "article_id",
author: {
foreignKey: "author_id",
relationKey: "author",
pluralRelationKey: "authors"
idKey: "name",
},
},
}));
In this example, the pages of type author
have a custom configuration:
- The foreign key is
author_id
. - The relation key is
author
. For example, the author related with an article is stored in theauthor
key. - The plural relation key is
authors
. If an article has multiple authors, they are stored in theauthors
key. - The id key is
name
instead ofid
.