mirror of
https://github.com/getgrav/grav-plugin-admin.git
synced 2025-10-29 09:16:48 +01:00
Fixed images from plugins/themes disappearing when saving twice
This commit is contained in:
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
1. [](#new)
|
1. [](#new)
|
||||||
* Updated SCSS compiler to v1.8
|
* Updated SCSS compiler to v1.8
|
||||||
|
2. [](#bugfix)
|
||||||
|
* Fixed images from plugins/themes disappearing when saving twice
|
||||||
|
|
||||||
# v1.10.22
|
# v1.10.22
|
||||||
## 09/16/2021
|
## 09/16/2021
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ use Grav\Framework\Route\RouteFactory;
|
|||||||
use Grav\Plugin\AdminPlugin;
|
use Grav\Plugin\AdminPlugin;
|
||||||
use Grav\Plugin\Login\Login;
|
use Grav\Plugin\Login\Login;
|
||||||
use Grav\Plugin\Login\TwoFactorAuth\TwoFactorAuth;
|
use Grav\Plugin\Login\TwoFactorAuth\TwoFactorAuth;
|
||||||
|
use JsonException;
|
||||||
use PicoFeed\Parser\MalformedXmlException;
|
use PicoFeed\Parser\MalformedXmlException;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use RocketTheme\Toolbox\Event\Event;
|
use RocketTheme\Toolbox\Event\Event;
|
||||||
@@ -873,7 +874,7 @@ class Admin
|
|||||||
public function data($type, array $post = [])
|
public function data($type, array $post = [])
|
||||||
{
|
{
|
||||||
if (!$post) {
|
if (!$post) {
|
||||||
$post = $this->grav['uri']->post()['data'] ?? [];
|
$post = $this->preparePost($this->grav['uri']->post()['data'] ?? []);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -2427,4 +2428,66 @@ class Admin
|
|||||||
|
|
||||||
return $changelog;
|
return $changelog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare and return POST data.
|
||||||
|
*
|
||||||
|
* @param array $post
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function preparePost($post): array
|
||||||
|
{
|
||||||
|
if (!is_array($post)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($post['task']);
|
||||||
|
|
||||||
|
// Decode JSON encoded fields and merge them to data.
|
||||||
|
if (isset($post['_json'])) {
|
||||||
|
$post = array_replace_recursive($post, $this->jsonDecode($post['_json']));
|
||||||
|
unset($post['_json']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->cleanDataKeys($post);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively JSON decode data.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return array
|
||||||
|
* @throws JsonException
|
||||||
|
*/
|
||||||
|
private function jsonDecode(array $data): array
|
||||||
|
{
|
||||||
|
foreach ($data as &$value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
$value = $this->jsonDecode($value);
|
||||||
|
} else {
|
||||||
|
$value = json_decode($value, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $source
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function cleanDataKeys(array $source): array
|
||||||
|
{
|
||||||
|
$out = [];
|
||||||
|
foreach ($source as $key => $value) {
|
||||||
|
$key = str_replace(['%5B', '%5D'], ['[', ']'], $key);
|
||||||
|
if (is_array($value)) {
|
||||||
|
$out[$key] = $this->cleanDataKeys($value);
|
||||||
|
} else {
|
||||||
|
$out[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ use Grav\Common\Plugin;
|
|||||||
use Grav\Common\Theme;
|
use Grav\Common\Theme;
|
||||||
use Grav\Framework\Controller\Traits\ControllerResponseTrait;
|
use Grav\Framework\Controller\Traits\ControllerResponseTrait;
|
||||||
use Grav\Framework\RequestHandler\Exception\RequestException;
|
use Grav\Framework\RequestHandler\Exception\RequestException;
|
||||||
|
use JsonException;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use RocketTheme\Toolbox\Event\Event;
|
use RocketTheme\Toolbox\Event\Event;
|
||||||
@@ -34,56 +35,31 @@ class AdminBaseController
|
|||||||
{
|
{
|
||||||
use ControllerResponseTrait;
|
use ControllerResponseTrait;
|
||||||
|
|
||||||
/**
|
/** @var Grav */
|
||||||
* @var Grav
|
|
||||||
*/
|
|
||||||
public $grav;
|
public $grav;
|
||||||
|
/** @var string */
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $view;
|
public $view;
|
||||||
|
/** @var string */
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $task;
|
public $task;
|
||||||
|
/** @var string */
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $route;
|
public $route;
|
||||||
|
/** @var array */
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $post;
|
public $post;
|
||||||
|
/** @var array|null */
|
||||||
/**
|
|
||||||
* @var array|null
|
|
||||||
*/
|
|
||||||
public $data;
|
public $data;
|
||||||
|
/** @var array */
|
||||||
|
public $blacklist_views = [];
|
||||||
|
|
||||||
/**
|
/** @var Uri */
|
||||||
* @var \Grav\Common\Uri
|
|
||||||
*/
|
|
||||||
protected $uri;
|
protected $uri;
|
||||||
|
/** @var Admin */
|
||||||
/**
|
|
||||||
* @var Admin
|
|
||||||
*/
|
|
||||||
protected $admin;
|
protected $admin;
|
||||||
|
/** @var string */
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $redirect;
|
protected $redirect;
|
||||||
|
/** @var int */
|
||||||
/**
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $redirectCode;
|
protected $redirectCode;
|
||||||
|
|
||||||
|
/** @var string[] */
|
||||||
protected $upload_errors = [
|
protected $upload_errors = [
|
||||||
0 => 'There is no error, the file uploaded with success',
|
0 => 'There is no error, the file uploaded with success',
|
||||||
1 => 'The uploaded file exceeds the max upload size',
|
1 => 'The uploaded file exceeds the max upload size',
|
||||||
@@ -95,9 +71,6 @@ class AdminBaseController
|
|||||||
8 => 'A PHP extension stopped the file upload'
|
8 => 'A PHP extension stopped the file upload'
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
public $blacklist_views = [];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a task.
|
* Performs a task.
|
||||||
*
|
*
|
||||||
@@ -105,6 +78,10 @@ class AdminBaseController
|
|||||||
*/
|
*/
|
||||||
public function execute()
|
public function execute()
|
||||||
{
|
{
|
||||||
|
if (null === $this->admin) {
|
||||||
|
$this->admin = $this->grav['admin'];
|
||||||
|
}
|
||||||
|
|
||||||
// Ignore blacklisted views.
|
// Ignore blacklisted views.
|
||||||
if (in_array($this->view, $this->blacklist_views, true)) {
|
if (in_array($this->view, $this->blacklist_views, true)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -671,7 +648,6 @@ class AdminBaseController
|
|||||||
* Prepare and return POST data.
|
* Prepare and return POST data.
|
||||||
*
|
*
|
||||||
* @param array $post
|
* @param array $post
|
||||||
*
|
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
protected function getPost($post)
|
protected function getPost($post)
|
||||||
@@ -688,25 +664,24 @@ class AdminBaseController
|
|||||||
unset($post['_json']);
|
unset($post['_json']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$post = $this->cleanDataKeys($post);
|
return $this->cleanDataKeys($post);
|
||||||
|
|
||||||
return $post;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively JSON decode data.
|
* Recursively JSON decode data.
|
||||||
*
|
*
|
||||||
* @param array $data
|
* @param array $data
|
||||||
*
|
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws JsonException
|
||||||
|
* @internal Do not use directly!
|
||||||
*/
|
*/
|
||||||
protected function jsonDecode(array $data)
|
protected function jsonDecode(array $data): array
|
||||||
{
|
{
|
||||||
foreach ($data as &$value) {
|
foreach ($data as &$value) {
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
$value = $this->jsonDecode($value);
|
$value = $this->jsonDecode($value);
|
||||||
} else {
|
} else {
|
||||||
$value = json_decode($value, true);
|
$value = json_decode($value, true, 512, JSON_THROW_ON_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,12 +691,11 @@ class AdminBaseController
|
|||||||
/**
|
/**
|
||||||
* @param array $source
|
* @param array $source
|
||||||
* @return array
|
* @return array
|
||||||
|
* @internal Do not use directly!
|
||||||
*/
|
*/
|
||||||
protected function cleanDataKeys($source = [])
|
protected function cleanDataKeys(array $source): array
|
||||||
{
|
{
|
||||||
$out = [];
|
$out = [];
|
||||||
|
|
||||||
if (is_array($source)) {
|
|
||||||
foreach ($source as $key => $value) {
|
foreach ($source as $key => $value) {
|
||||||
$key = str_replace(['%5B', '%5D'], ['[', ']'], $key);
|
$key = str_replace(['%5B', '%5D'], ['[', ']'], $key);
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
@@ -730,7 +704,6 @@ class AdminBaseController
|
|||||||
$out[$key] = $value;
|
$out[$key] = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ class AdminController extends AdminBaseController
|
|||||||
public function initialize(Grav $grav = null, $view = null, $task = null, $route = null, $post = null)
|
public function initialize(Grav $grav = null, $view = null, $task = null, $route = null, $post = null)
|
||||||
{
|
{
|
||||||
$this->grav = $grav;
|
$this->grav = $grav;
|
||||||
|
$this->admin = $this->grav['admin'];
|
||||||
$this->view = $view;
|
$this->view = $view;
|
||||||
$this->task = $task ?: 'display';
|
$this->task = $task ?: 'display';
|
||||||
if (isset($post['data'])) {
|
if (isset($post['data'])) {
|
||||||
@@ -67,7 +68,6 @@ class AdminController extends AdminBaseController
|
|||||||
}
|
}
|
||||||
$this->post = $this->getPost($post);
|
$this->post = $this->getPost($post);
|
||||||
$this->route = $route;
|
$this->route = $route;
|
||||||
$this->admin = $this->grav['admin'];
|
|
||||||
|
|
||||||
$this->grav->fireEvent('onAdminControllerInit', new Event(['controller' => &$this]));
|
$this->grav->fireEvent('onAdminControllerInit', new Event(['controller' => &$this]));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user