Added universal media support instead of being locked into pages

This commit is contained in:
Matias Griese
2018-05-08 13:11:41 +03:00
parent 06fb445101
commit 1fcf6a05c3
2 changed files with 51 additions and 20 deletions

View File

@@ -19,6 +19,7 @@ use Grav\Common\Backup\ZipBackup;
use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\File\File;
use RocketTheme\Toolbox\File\JsonFile;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml;
@@ -1510,11 +1511,10 @@ class AdminController extends AdminBaseController
return false;
}
$page = $this->admin->page(true);
if (!$page) {
$media = $this->getMedia();
if (!$media) {
$this->admin->json_response = [
'status' => 'error',
'status' => 'error',
'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')
];
@@ -1522,8 +1522,6 @@ class AdminController extends AdminBaseController
}
$media_list = [];
$media = new Media($page->path());
foreach ($media->all() as $name => $medium) {
$metadata = [];
@@ -1543,6 +1541,27 @@ class AdminController extends AdminBaseController
return true;
}
/**
* @return bool
*/
protected function getMedia()
{
$this->uri = $this->uri ?: $this->grav['uri'];
$uri = $this->uri->post('uri');
if ($uri) {
/** @var UniformResourceLocator $locator */
$locator = $this->grav['locator'];
$media_path = $locator->isStream($uri) ? $uri : null;
} else {
$page = $this->admin->page(true);
$media_path = $page ? $page->path() : null;
}
return $media_path ? new Media($media_path) : null;
}
/**
* Handles adding a media file to a page
*
@@ -1554,8 +1573,6 @@ class AdminController extends AdminBaseController
return false;
}
$page = $this->admin->page(true);
/** @var Config $config */
$config = $this->grav['config'];
@@ -1633,9 +1650,20 @@ class AdminController extends AdminBaseController
return false;
}
$media = $this->getMedia();
if (!$media) {
$this->admin->json_response = [
'status' => 'error',
'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')
];
return false;
}
// Upload it
if (!move_uploaded_file($_FILES['file']['tmp_name'],
sprintf('%s/%s', $page->path(), $_FILES['file']['name']))
sprintf('%s/%s', $media->path(), $_FILES['file']['name']))
) {
$this->admin->json_response = [
'status' => 'error',
@@ -1645,9 +1673,6 @@ class AdminController extends AdminBaseController
return false;
}
// reinitialize media to trigger availability
$media = $page->media();
// Add metadata if needed
$include_metadata = Grav::instance()['config']->get('system.media.auto_metadata_exif', false);
$filename = $fileParts['basename'];
@@ -1662,7 +1687,10 @@ class AdminController extends AdminBaseController
}
}
$this->grav->fireEvent('onAdminAfterAddMedia', new Event(['page' => $page]));
$page = $this->admin->page(true);
if ($page) {
$this->grav->fireEvent('onAdminAfterAddMedia', new Event(['page' => $page]));
}
$this->admin->json_response = [
'status' => 'success',
@@ -1684,9 +1712,8 @@ class AdminController extends AdminBaseController
return false;
}
$page = $this->admin->page(true);
if (!$page) {
$media = $this->getMedia();
if (!$media) {
$this->admin->json_response = [
'status' => 'error',
'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')
@@ -1706,7 +1733,7 @@ class AdminController extends AdminBaseController
return false;
}
$targetPath = $page->path() . '/' . $filename;
$targetPath = $media->path() . '/' . $filename;
$fileParts = pathinfo($filename);
$found = false;
@@ -1726,9 +1753,9 @@ class AdminController extends AdminBaseController
}
// Remove Extra Files
foreach (scandir($page->path()) as $file) {
foreach (scandir($media->path(), SCANDIR_SORT_NONE) as $file) {
if (preg_match("/{$fileParts['filename']}@\d+x\.{$fileParts['extension']}(?:\.meta\.yaml)?$|{$filename}\.meta\.yaml$/", $file)) {
$result = unlink($page->path() . '/' . $file);
$result = unlink($media->path() . '/' . $file);
if (!$result) {
$this->admin->json_response = [
@@ -1752,7 +1779,10 @@ class AdminController extends AdminBaseController
return false;
}
$this->grav->fireEvent('onAdminAfterDelMedia', new Event(['page' => $page]));
$page = $this->admin->page(true);
if ($page) {
$this->grav->fireEvent('onAdminAfterDelMedia', new Event(['page' => $page]));
}
$this->admin->json_response = [
'status' => 'success',