feat(core): allow field name to override slug placeholders (#2087)
This commit is contained in:
parent
8ccbdf928e
commit
ff8dfac813
@ -62,18 +62,31 @@ const dateParsers = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const SLUG_MISSING_REQUIRED_DATE = 'SLUG_MISSING_REQUIRED_DATE';
|
const SLUG_MISSING_REQUIRED_DATE = 'SLUG_MISSING_REQUIRED_DATE';
|
||||||
|
const USE_FIELD_PREFIX = 'fields.';
|
||||||
|
|
||||||
|
// Allow `fields.` prefix in placeholder to override built in replacements
|
||||||
|
// like "slug" and "year" with values from fields of the same name.
|
||||||
|
function getExplicitFieldReplacement(key, data) {
|
||||||
|
if (!key.startsWith(USE_FIELD_PREFIX)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const fieldName = key.substring(USE_FIELD_PREFIX.length);
|
||||||
|
return data.get(fieldName, '').trim();
|
||||||
|
}
|
||||||
|
|
||||||
function compileSlug(template, date, identifier = '', data = Map(), processor) {
|
function compileSlug(template, date, identifier = '', data = Map(), processor) {
|
||||||
let missingRequiredDate;
|
let missingRequiredDate;
|
||||||
|
|
||||||
const slug = template.replace(/\{\{([^}]+)\}\}/g, (_, key) => {
|
const slug = template.replace(/\{\{([^}]+)\}\}/g, (_, key) => {
|
||||||
let replacement;
|
let replacement;
|
||||||
if (dateParsers[key] && !date) {
|
const explicitFieldReplacement = getExplicitFieldReplacement(key, data);
|
||||||
|
|
||||||
|
if (explicitFieldReplacement) {
|
||||||
|
replacement = explicitFieldReplacement;
|
||||||
|
} else if (dateParsers[key] && !date) {
|
||||||
missingRequiredDate = true;
|
missingRequiredDate = true;
|
||||||
return '';
|
return '';
|
||||||
}
|
} else if (dateParsers[key]) {
|
||||||
|
|
||||||
if (dateParsers[key]) {
|
|
||||||
replacement = dateParsers[key](date);
|
replacement = dateParsers[key](date);
|
||||||
} else if (key === 'slug') {
|
} else if (key === 'slug') {
|
||||||
replacement = identifier.trim();
|
replacement = identifier.trim();
|
||||||
|
@ -213,8 +213,13 @@ You may also specify a custom `extension` not included in the list above, as lon
|
|||||||
|
|
||||||
For folder collections where users can create new items, the `slug` option specifies a template for generating new filenames based on a file's creation date and `title` field. (This means that all collections with `create: true` must have a `title` field (a different field can be used via [`identifier_field`](#identifier_field)).
|
For folder collections where users can create new items, the `slug` option specifies a template for generating new filenames based on a file's creation date and `title` field. (This means that all collections with `create: true` must have a `title` field (a different field can be used via [`identifier_field`](#identifier_field)).
|
||||||
|
|
||||||
**Available template tags:**
|
The slug template can also reference a field value by name, eg. `{{title}}`. If a field name
|
||||||
|
conflicts with a built in template tag name - for example, if you have a field named `slug`, and
|
||||||
|
would like to reference that field via `{{slug}}`, you can do so by adding the explicit `fields.`
|
||||||
|
prefix, eg. `{{fields.slug}}`.
|
||||||
|
|
||||||
|
**Available template tags:**
|
||||||
|
* Any field can be referenced by wrapping the field name in double curly braces, eg. `{{author}}`
|
||||||
* `{{slug}}`: a url-safe version of the `title` field (or identifier field) for the file
|
* `{{slug}}`: a url-safe version of the `title` field (or identifier field) for the file
|
||||||
* `{{year}}`: 4-digit year of the file creation date
|
* `{{year}}`: 4-digit year of the file creation date
|
||||||
* `{{month}}`: 2-digit month of the file creation date
|
* `{{month}}`: 2-digit month of the file creation date
|
||||||
@ -224,11 +229,20 @@ For folder collections where users can create new items, the `slug` option speci
|
|||||||
* `{{second}}`: 2-digit second of the file creation date
|
* `{{second}}`: 2-digit second of the file creation date
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
slug: "{{year}}-{{month}}-{{day}}_{{slug}}"
|
slug: "{{year}}-{{month}}-{{day}}_{{slug}}"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Example using field names:**
|
||||||
|
```yaml
|
||||||
|
slug: "{{year}}-{{month}}-{{day}}_{{title}}_{{some_other_field}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example using field name that conflicts with a template tag:**
|
||||||
|
```yaml
|
||||||
|
slug: "{{year}}-{{month}}-{{day}}_{{fields.slug}}"
|
||||||
|
```
|
||||||
|
|
||||||
### `preview_path`
|
### `preview_path`
|
||||||
|
|
||||||
A string representing the path where content in this collection can be found on the live site. This
|
A string representing the path where content in this collection can be found on the live site. This
|
||||||
@ -237,18 +251,10 @@ root of a deploy preview.
|
|||||||
|
|
||||||
**Available template tags:**
|
**Available template tags:**
|
||||||
|
|
||||||
* Any field can be referenced by wrapping the field name in double curly braces, eg. `{{author}}`
|
Template tags are the same as those for [slug](#slug), with the following exceptions:
|
||||||
* `{{slug}}`: the entire slug for the current entry (not just the url-safe identifier, as is the
|
* `{{slug}}` is the entire slug for the current entry (not just the url-safe identifier, as is the
|
||||||
case with [`slug` configuration](#slug)
|
case with [`slug` configuration](#slug)
|
||||||
|
* The date based template tags, such as `{{year}}` and `{{month}}`, are pulled from a date field in your entry, and may require additional configuration - see [`preview_path_date_field`](#preview_path_date_field) for details. If a date template tag is used and no date can be found, `preview_path` will be ignored.
|
||||||
The following date based template tags are pulled from a date field in your entry, and may require additional configuration, see [`preview_path_date_field`](#preview_path_date_field) for details. If a date template tag is used and no date can be found, `preview_path` will be ignored.
|
|
||||||
|
|
||||||
* `{{year}}`: 4-digit year from entry data
|
|
||||||
* `{{month}}`: 2-digit month from entry data
|
|
||||||
* `{{day}}`: 2-digit day of the month from entry data
|
|
||||||
* `{{hour}}`: 2-digit hour from entry data
|
|
||||||
* `{{minute}}`: 2-digit minute from entry data
|
|
||||||
* `{{second}}`: 2-digit second from entry data
|
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user