mirror of
https://github.com/getgrav/grav-plugin-admin.git
synced 2025-11-02 03:16:11 +01:00
Fixed configuration save location to point to existing config folder [#2176]
This commit is contained in:
@@ -2,7 +2,9 @@
|
|||||||
## mm/dd/2021
|
## mm/dd/2021
|
||||||
|
|
||||||
1. [](#improved)
|
1. [](#improved)
|
||||||
* Composer update
|
* Improved `Admin:data()` and `Admin::getConfigurationData()` to be more strict
|
||||||
|
2. [](#bugfix)
|
||||||
|
* Fixed configuration save location to point to existing config folder [#2176](https://github.com/getgrav/grav-plugin-admin/issues/2176)
|
||||||
|
|
||||||
# v1.10.20
|
# v1.10.20
|
||||||
## 09/01/2021
|
## 09/01/2021
|
||||||
|
|||||||
@@ -867,115 +867,20 @@ class Admin
|
|||||||
*
|
*
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @param array $post
|
* @param array $post
|
||||||
* @return mixed
|
* @return object
|
||||||
* @throws \RuntimeException
|
* @throws \RuntimeException
|
||||||
*/
|
*/
|
||||||
public function data($type, array $post = [])
|
public function data($type, array $post = [])
|
||||||
{
|
{
|
||||||
static $data = [];
|
|
||||||
|
|
||||||
if (isset($data[$type])) {
|
|
||||||
return $data[$type];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$post) {
|
if (!$post) {
|
||||||
$post = $this->grav['uri']->post();
|
$post = $this->grav['uri']->post()['data'] ?? [];
|
||||||
$post = $post['data'] ?? [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if a data type is plugin-provided, before looking into core ones
|
try {
|
||||||
$event = $this->grav->fireEvent('onAdminData', new Event(['type' => &$type]));
|
return $this->getConfigurationData($type, $post);
|
||||||
if ($event) {
|
} catch (\RuntimeException $e) {
|
||||||
if (isset($event['data_type'])) {
|
return new Data\Data();
|
||||||
return $event['data_type'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_string($event['type'])) {
|
|
||||||
$type = $event['type'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var UniformResourceLocator $locator */
|
|
||||||
$locator = $this->grav['locator'];
|
|
||||||
$filename = $locator->findResource("config://{$type}.yaml", true, true);
|
|
||||||
$file = CompiledYamlFile::instance($filename);
|
|
||||||
|
|
||||||
if (preg_match('|plugins/|', $type)) {
|
|
||||||
/** @var Plugins $plugins */
|
|
||||||
$plugins = $this->grav['plugins'];
|
|
||||||
$obj = $plugins->get(preg_replace('|plugins/|', '', $type));
|
|
||||||
|
|
||||||
if (!$obj) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$obj->merge($post);
|
|
||||||
$obj->file($file);
|
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|themes/|', $type)) {
|
|
||||||
/** @var Themes $themes */
|
|
||||||
$themes = $this->grav['themes'];
|
|
||||||
$obj = $themes->get(preg_replace('|themes/|', '', $type));
|
|
||||||
|
|
||||||
if (!$obj) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$obj->merge($post);
|
|
||||||
$obj->file($file);
|
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|users?/|', $type)) {
|
|
||||||
/** @var UserCollectionInterface $users */
|
|
||||||
$users = $this->grav['accounts'];
|
|
||||||
|
|
||||||
$obj = $users->load(preg_replace('|users?/|', '', $type));
|
|
||||||
$obj->update($this->cleanUserPost($post));
|
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|config/|', $type)) {
|
|
||||||
$type = preg_replace('|config/|', '', $type);
|
|
||||||
$blueprints = $this->blueprints("config/{$type}");
|
|
||||||
$config = $this->grav['config'];
|
|
||||||
$obj = new Data\Data($config->get($type, []), $blueprints);
|
|
||||||
$obj->merge($post);
|
|
||||||
|
|
||||||
// FIXME: We shouldn't allow user to change configuration files in system folder!
|
|
||||||
$filename = $this->grav['locator']->findResource("config://{$type}.yaml")
|
|
||||||
?: $this->grav['locator']->findResource("config://{$type}.yaml", true, true);
|
|
||||||
$file = CompiledYamlFile::instance($filename);
|
|
||||||
$obj->file($file);
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|media-manager/|', $type)) {
|
|
||||||
$filename = base64_decode(preg_replace('|media-manager/|', '', $type));
|
|
||||||
|
|
||||||
$file = File::instance($filename);
|
|
||||||
|
|
||||||
$pages = static::enablePages();
|
|
||||||
|
|
||||||
$obj = new \stdClass();
|
|
||||||
$obj->title = $file->basename();
|
|
||||||
$obj->path = $file->filename();
|
|
||||||
$obj->file = $file;
|
|
||||||
$obj->page = $pages->get(dirname($obj->path));
|
|
||||||
|
|
||||||
$fileInfo = pathinfo($obj->title);
|
|
||||||
$filename = str_replace(['@3x', '@2x'], '', $fileInfo['filename']);
|
|
||||||
if (isset($fileInfo['extension'])) {
|
|
||||||
$filename .= '.' . $fileInfo['extension'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($obj->page && isset($obj->page->media()[$filename])) {
|
|
||||||
$obj->metadata = new Data\Data($obj->page->media()[$filename]->metadata());
|
|
||||||
}
|
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} else {
|
|
||||||
throw new \RuntimeException("Data type '{$type}' doesn't exist!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data[$type];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -993,7 +898,16 @@ class Admin
|
|||||||
static $data = [];
|
static $data = [];
|
||||||
|
|
||||||
if (isset($data[$type])) {
|
if (isset($data[$type])) {
|
||||||
return $data[$type];
|
$obj = $data[$type];
|
||||||
|
if ($post) {
|
||||||
|
if ($obj instanceof Data\Data) {
|
||||||
|
$obj = $this->mergePost($obj, $post);
|
||||||
|
} elseif ($obj instanceof UserInterface) {
|
||||||
|
$obj->update($this->cleanUserPost($post));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if a data type is plugin-provided, before looking into core ones
|
// Check to see if a data type is plugin-provided, before looking into core ones
|
||||||
@@ -1010,61 +924,48 @@ class Admin
|
|||||||
|
|
||||||
/** @var UniformResourceLocator $locator */
|
/** @var UniformResourceLocator $locator */
|
||||||
$locator = $this->grav['locator'];
|
$locator = $this->grav['locator'];
|
||||||
$filename = $locator->findResource("config://{$type}.yaml", true, true);
|
|
||||||
|
// Configuration file will be saved to the existing config stream.
|
||||||
|
$filename = $locator->findResource('config://') . "/{$type}.yaml";
|
||||||
$file = CompiledYamlFile::instance($filename);
|
$file = CompiledYamlFile::instance($filename);
|
||||||
|
|
||||||
if (preg_match('|plugins/|', $type)) {
|
if (preg_match('|plugins/|', $type)) {
|
||||||
$obj = Plugins::get(preg_replace('|plugins/|', '', $type));
|
$obj = Plugins::get(preg_replace('|plugins/|', '', $type));
|
||||||
if (null === $obj) {
|
if (null === $obj) {
|
||||||
return new \stdClass();
|
throw new \RuntimeException("Plugin '{$type}' doesn't exist!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($post) {
|
|
||||||
$obj = $this->mergePost($obj, $post);
|
|
||||||
}
|
|
||||||
|
|
||||||
$obj->file($file);
|
$obj->file($file);
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|themes/|', $type)) {
|
} elseif (preg_match('|themes/|', $type)) {
|
||||||
/** @var Themes $themes */
|
/** @var Themes $themes */
|
||||||
$themes = $this->grav['themes'];
|
$themes = $this->grav['themes'];
|
||||||
$obj = $themes->get(preg_replace('|themes/|', '', $type));
|
$obj = $themes->get(preg_replace('|themes/|', '', $type));
|
||||||
if (null === $obj) {
|
if (null === $obj) {
|
||||||
return new \stdClass();
|
throw new \RuntimeException("Theme '{$type}' doesn't exist!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($post) {
|
|
||||||
$obj = $this->mergePost($obj, $post);
|
|
||||||
}
|
|
||||||
|
|
||||||
$obj->file($file);
|
$obj->file($file);
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|users?/|', $type)) {
|
} elseif (preg_match('|users?/|', $type)) {
|
||||||
/** @var UserCollectionInterface $users */
|
/** @var UserCollectionInterface $users */
|
||||||
$users = $this->grav['accounts'];
|
$users = $this->grav['accounts'];
|
||||||
|
|
||||||
$obj = $users->load(preg_replace('|users?/|', '', $type));
|
$obj = $users->load(preg_replace('|users?/|', '', $type));
|
||||||
$obj->update($this->cleanUserPost($post));
|
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|config/|', $type)) {
|
} elseif (preg_match('|config/|', $type)) {
|
||||||
$type = preg_replace('|config/|', '', $type);
|
$type = preg_replace('|config/|', '', $type);
|
||||||
$blueprints = $this->blueprints("config/{$type}");
|
$blueprints = $this->blueprints("config/{$type}");
|
||||||
|
if (!$blueprints->form()) {
|
||||||
|
throw new \RuntimeException("Configuration type '{$type}' doesn't exist!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configuration file will be saved to the existing config stream.
|
||||||
|
$filename = $locator->findResource('config://') . "/{$type}.yaml";
|
||||||
|
$file = CompiledYamlFile::instance($filename);
|
||||||
|
|
||||||
$config = $this->grav['config'];
|
$config = $this->grav['config'];
|
||||||
$obj = new Data\Data($config->get($type, []), $blueprints);
|
$obj = new Data\Data($config->get($type, []), $blueprints);
|
||||||
if ($post) {
|
|
||||||
$obj = $this->mergePost($obj, $post);
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: We shouldn't allow user to change configuration files in system folder!
|
|
||||||
$filename = $this->grav['locator']->findResource("config://{$type}.yaml")
|
|
||||||
?: $this->grav['locator']->findResource("config://{$type}.yaml", true, true);
|
|
||||||
$file = CompiledYamlFile::instance($filename);
|
|
||||||
$obj->file($file);
|
$obj->file($file);
|
||||||
$data[$type] = $obj;
|
|
||||||
} elseif (preg_match('|media-manager/|', $type)) {
|
} elseif (preg_match('|media-manager/|', $type)) {
|
||||||
$filename = base64_decode(preg_replace('|media-manager/|', '', $type));
|
$filename = base64_decode(preg_replace('|media-manager/|', '', $type));
|
||||||
|
|
||||||
@@ -1088,12 +989,20 @@ class Admin
|
|||||||
$obj->metadata = new Data\Data($obj->page->media()[$filename]->metadata());
|
$obj->metadata = new Data\Data($obj->page->media()[$filename]->metadata());
|
||||||
}
|
}
|
||||||
|
|
||||||
$data[$type] = $obj;
|
|
||||||
} else {
|
} else {
|
||||||
throw new \RuntimeException("Data type '{$type}' doesn't exist!");
|
throw new \RuntimeException("Data type '{$type}' doesn't exist!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data[$type];
|
$data[$type] = $obj;
|
||||||
|
if ($post) {
|
||||||
|
if ($obj instanceof Data\Data) {
|
||||||
|
$obj = $this->mergePost($obj, $post);
|
||||||
|
} elseif ($obj instanceof UserInterface) {
|
||||||
|
$obj->update($this->cleanUserPost($post));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -174,11 +174,11 @@ class AdminController extends AdminBaseController
|
|||||||
*/
|
*/
|
||||||
protected function saveDefault()
|
protected function saveDefault()
|
||||||
{
|
{
|
||||||
// Handle standard data types.
|
|
||||||
$type = $this->getDataType();
|
|
||||||
$obj = $this->admin->getConfigurationData($type, $this->data);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Handle standard data types.
|
||||||
|
$type = $this->getDataType();
|
||||||
|
|
||||||
|
$obj = $this->admin->getConfigurationData($type, $this->data);
|
||||||
$obj->validate();
|
$obj->validate();
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
/** @var Debugger $debugger */
|
/** @var Debugger $debugger */
|
||||||
|
|||||||
Reference in New Issue
Block a user