Feature/frontmatter twig processing (#788)

* start on processFrontmatter logic

* optimized the twig processing

* Added blueprint definitions

* updated changelog

* Fix to not process in admin
This commit is contained in:
Andy Miller
2016-04-14 15:33:45 -06:00
parent 5213867611
commit 6124f71d6e
4 changed files with 50 additions and 4 deletions

View File

@@ -14,6 +14,7 @@
* **Custom Form Field Types**: This advanced new functionality allows you to create a custom field type via a new plugin event called getFormFieldTypes(). This allows you to provide extra functionality or instructions on how to handle the form form field.
* **GPM Versioning**: A new feature that we have wanted to add to our GPM package management system is the ability to control dependencies by version. We have opted to use a syntax very similar to the Composer Package Manager that is already familiar to most PHP developers. This new versioning system allows you to define specific minimum version requirements of dependent packages within Grav. This should ensure that we have less (hopefully none!) issues when you update one package that also requires a specific minimum version of another package. The admin plugin for example may have an update that requires a specific version of Grav itself.
* Refactor of the process chain breaking out `Processors` into individual classes to allow for easier modification and addition. Thanks to toovy for this work. - [#745](https://github.com/getgrav/grav/pull/745)
* Added optional config to allow Twig processing in page frontmatter - [#788](https://github.com/getgrav/grav/pull/788)
* Added the ability to provide blueprints via a plugin (previously limited to Themes only).
* Added Developer CLI Tools to easily create a new theme or plugin
* Allow authentication for proxies - [#698](https://github.com/getgrav/grav/pull/698)

View File

@@ -234,8 +234,6 @@ form:
pages.twig_first:
type: toggle
label: PLUGIN_ADMIN.TWIG_FIRST
highlight: asc
default: desc
help: PLUGIN_ADMIN.TWIG_FIRST_HELP
highlight: 0
options:
@@ -244,6 +242,27 @@ form:
validate:
type: bool
pages.frontmatter.process_twig:
type: toggle
label: PLUGIN_ADMIN.FRONTMATTER_PROCESS_TWIG
help: PLUGIN_ADMIN.FRONTMATTER_PROCESS_TWIG_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
pages.frontmatter.ignore_fields:
type: selectize
size: large
placeholder: "e.g. forms"
label: PLUGIN_ADMIN.FRONTMATTER_IGNORE_FIELDS
help: PLUGIN_ADMIN.FRONTMATTER_IGNORE_FIELDS_HELP
classes: fancy
validate:
type: commalist
languages:
type: section
title: PLUGIN_ADMIN.LANGUAGES

View File

@@ -59,6 +59,9 @@ pages:
ignore_folders: [.git, .idea] # Folders to ignore in Pages
ignore_hidden: true # Ignore all Hidden files and folders
url_taxonomy_filters: true # Enable auto-magic URL-based taxonomy filters for page collections
frontmatter:
process_twig: false # Should the frontmatter be processed to replace Twig variables?
ignore_fields: ['form'] # Fields that might contain Twig variables and should not be processed
cache:
enabled: true # Set to true to enable caching

View File

@@ -152,6 +152,23 @@ class Page
return $this;
}
protected function processFrontmatter()
{
// Quick check for twig output tags in frontmatter if enabled
if (Utils::contains($this->frontmatter, '{{')) {
$process_fields = $this->file()->header();
$ignored_fields = [];
foreach ((array)Grav::instance()['config']->get('system.pages.frontmatter.ignore_fields') as $field) {
if (isset($process_fields[$field])) {
$ignored_fields[$field] = $process_fields[$field];
unset($process_fields[$field]);
}
}
$text_header = Grav::instance()['twig']->processString(json_encode($process_fields), ['page'=>$this]);
$this->header((object) (json_decode($text_header, true) + $ignored_fields));
}
}
/**
* Return an array with the routes of other translated languages
* @return array the page translated languages
@@ -290,9 +307,13 @@ class Page
$this->frontmatter = $file->frontmatter();
$this->header = (object)$file->header();
// If there's a `frontmatter.yaml` file merge that in with the page header
// note page's own frontmatter has precedence and will overwrite any defaults
if (!Utils::isAdminPlugin()) {
// Process frontmatter with Twig if enabled
if (Grav::instance()['config']->get('system.pages.frontmatter.process_twig') === true) {
$this->processFrontmatter();
}
// If there's a `frontmatter.yaml` file merge that in with the page header
// note page's own frontmatter has precedence and will overwrite any defaults
$frontmatter_file = $this->path . '/' . $this->folder . '/frontmatter.yaml';
if (file_exists($frontmatter_file)) {
$frontmatter_data = (array)Yaml::parse(file_get_contents($frontmatter_file));
@@ -313,6 +334,8 @@ class Page
}
$var = true;
}
}
if ($var) {