mirror of
https://github.com/getgrav/grav.git
synced 2026-07-06 23:28:14 +02:00
Blueprint extend: Fix extending blueprints for configuration
This commit is contained in:
8
composer.lock
generated
8
composer.lock
generated
@@ -637,12 +637,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/rockettheme/toolbox.git",
|
||||
"reference": "a88015f9e6e473e5ddf4294f747d8fe434de3857"
|
||||
"reference": "2c6f703d6da8570ec2ab51d5111189e284d5a12e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/rockettheme/toolbox/zipball/a88015f9e6e473e5ddf4294f747d8fe434de3857",
|
||||
"reference": "a88015f9e6e473e5ddf4294f747d8fe434de3857",
|
||||
"url": "https://api.github.com/repos/rockettheme/toolbox/zipball/2c6f703d6da8570ec2ab51d5111189e284d5a12e",
|
||||
"reference": "2c6f703d6da8570ec2ab51d5111189e284d5a12e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -677,7 +677,7 @@
|
||||
"php",
|
||||
"rockettheme"
|
||||
],
|
||||
"time": "2016-02-16 10:01:59"
|
||||
"time": "2016-02-18 12:10:06"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace Grav\Common\Config;
|
||||
use Grav\Common\File\CompiledYamlFile;
|
||||
use Grav\Common\Grav;
|
||||
use RocketTheme\Toolbox\Blueprints\Blueprints;
|
||||
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
|
||||
|
||||
/**
|
||||
* The Compiled Blueprints class.
|
||||
@@ -46,6 +47,11 @@ class CompiledBlueprints extends CompiledBase
|
||||
$this->object = (new Blueprints($data))->setTypes($this->getTypes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of form field types.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getTypes()
|
||||
{
|
||||
return Grav::instance()['plugins']->formFieldTypes;
|
||||
@@ -63,12 +69,105 @@ class CompiledBlueprints extends CompiledBase
|
||||
* Load single configuration file and append it to the correct position.
|
||||
*
|
||||
* @param string $name Name of the position.
|
||||
* @param string $filename File to be loaded.
|
||||
* @param array $files Files to be loaded.
|
||||
*/
|
||||
protected function loadFile($name, $filename)
|
||||
protected function loadFile($name, $files)
|
||||
{
|
||||
$data = $this->loadBlueprints($files);
|
||||
|
||||
// Merge all extends into a single blueprint.
|
||||
foreach ($data as $content) {
|
||||
$this->object->embed($name, $content, '/', 1);
|
||||
}
|
||||
}
|
||||
|
||||
protected function loadBlueprints(array $files)
|
||||
{
|
||||
$filename = array_shift($files);
|
||||
$file = CompiledYamlFile::instance($filename);
|
||||
$this->object->embed($name, $file->content(), '/');
|
||||
$content = $file->content();
|
||||
$file->free();
|
||||
|
||||
$extends = isset($content['@extends']) ? (array) $content['@extends']
|
||||
: (isset($content['extends@']) ? (array) $content['extends@'] : null);
|
||||
|
||||
$data = isset($extends) ? $this->extendBlueprint($files, $extends) : [];
|
||||
$data[] = $content;
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
protected function extendBlueprint(array $parents, array $extends)
|
||||
{
|
||||
if (is_string(key($extends))) {
|
||||
$extends = [$extends];
|
||||
}
|
||||
|
||||
$data = [];
|
||||
foreach ($extends as $extendConfig) {
|
||||
// Accept array of type and context or a string.
|
||||
$extendType = !is_string($extendConfig)
|
||||
? !isset($extendConfig['type']) ? null : $extendConfig['type'] : $extendConfig;
|
||||
|
||||
if (!$extendType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($extendType === '@parent' || $extendType === 'parent@') {
|
||||
$files = $parents;
|
||||
|
||||
} else {
|
||||
if (strpos($extendType, '://')) {
|
||||
$path = $extendType;
|
||||
} elseif (empty($extendConfig['context'])) {
|
||||
$path = "blueprints://{$extendType}";
|
||||
} else {
|
||||
$separator = $extendConfig['context'][strlen($extendConfig['context'])-1] === '/' ? '' : '/';
|
||||
$path = $extendConfig['context'] . $separator . $extendType;
|
||||
}
|
||||
if (!preg_match('/\.yaml$/', $path)) {
|
||||
$path .= '.yaml';
|
||||
}
|
||||
|
||||
/** @var UniformResourceLocator $locator */
|
||||
$locator = Grav::instance()['locator'];
|
||||
|
||||
$files = $locator->findResources($path);
|
||||
}
|
||||
|
||||
if ($files) {
|
||||
$data = array_merge($data, $this->loadBlueprints($files));
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load and join all configuration files.
|
||||
*
|
||||
* @return bool
|
||||
* @internal
|
||||
*/
|
||||
protected function loadFiles()
|
||||
{
|
||||
$this->createObject();
|
||||
|
||||
// Convert file list into parent list.
|
||||
$list = [];
|
||||
foreach ($this->files as $files) {
|
||||
foreach ($files as $name => $item) {
|
||||
$list[$name][] = $this->path . $item['file'];
|
||||
}
|
||||
}
|
||||
|
||||
// Load files.
|
||||
foreach ($list as $name => $files) {
|
||||
$this->loadFile($name, $files);
|
||||
}
|
||||
|
||||
$this->finalizeObject();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user