mirror of
https://github.com/Karaka-Management/oms-Media.git
synced 2026-02-17 17:58:40 +00:00
improve media view
This commit is contained in:
parent
9563866507
commit
b1c868ade0
|
|
@ -13,36 +13,6 @@
|
||||||
"permission": { "permission": 2, "type": null, "element": null },
|
"permission": { "permission": 2, "type": null, "element": null },
|
||||||
"parent": 1006901001,
|
"parent": 1006901001,
|
||||||
"children": [
|
"children": [
|
||||||
{
|
|
||||||
"id": 1000402001,
|
|
||||||
"pid": "/media",
|
|
||||||
"type": 3,
|
|
||||||
"subtype": 1,
|
|
||||||
"name": "List",
|
|
||||||
"uri": "{/prefix}media/list?{?}",
|
|
||||||
"target": "self",
|
|
||||||
"icon": null,
|
|
||||||
"order": 1,
|
|
||||||
"from": "Media",
|
|
||||||
"permission": { "permission": 2, "type": null, "element": null },
|
|
||||||
"parent": 1000401001,
|
|
||||||
"children": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 1000403001,
|
|
||||||
"pid": "/media",
|
|
||||||
"type": 3,
|
|
||||||
"subtype": 5,
|
|
||||||
"name": "Create",
|
|
||||||
"uri": "{/prefix}media/create?{?}",
|
|
||||||
"target": "self",
|
|
||||||
"icon": null,
|
|
||||||
"order": 5,
|
|
||||||
"from": "Media",
|
|
||||||
"permission": { "permission": 4, "type": null, "element": null },
|
|
||||||
"parent": 1000401001,
|
|
||||||
"children": []
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,11 @@
|
||||||
"type": "TINYINT",
|
"type": "TINYINT",
|
||||||
"null": false
|
"null": false
|
||||||
},
|
},
|
||||||
|
"media_hidden": {
|
||||||
|
"name": "media_hidden",
|
||||||
|
"type": "TINYINT",
|
||||||
|
"null": false
|
||||||
|
},
|
||||||
"media_file": {
|
"media_file": {
|
||||||
"name": "media_file",
|
"name": "media_file",
|
||||||
"type": "VARCHAR(255)",
|
"type": "VARCHAR(255)",
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,7 @@ class Installer extends InstallerAbstract
|
||||||
$collection = new Collection();
|
$collection = new Collection();
|
||||||
$collection->setName((string) $data['name'] ?? '');
|
$collection->setName((string) $data['name'] ?? '');
|
||||||
$collection->setVirtualPath((string) $data['virtualPath'] ?? '/');
|
$collection->setVirtualPath((string) $data['virtualPath'] ?? '/');
|
||||||
|
$collection->setPath((string) $data['virtualPath'] ?? '/');
|
||||||
$collection->setCreatedBy((int) $data['user'] ?? 1);
|
$collection->setCreatedBy((int) $data['user'] ?? 1);
|
||||||
|
|
||||||
CollectionMapper::create($collection);
|
CollectionMapper::create($collection);
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,6 @@ return [
|
||||||
'type' => PermissionType::CREATE,
|
'type' => PermissionType::CREATE,
|
||||||
'state' => PermissionState::MEDIA,
|
'state' => PermissionState::MEDIA,
|
||||||
],
|
],
|
||||||
'data' => [
|
|
||||||
'field_name' => [
|
|
||||||
'type' => 'string', 'default' => 'Hello', 'validation' => '[\\w]*', 'required' => false,'annotation' => [],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'dest' => '\Modules\Media\Controller\ApiController:apiMediaUpdate',
|
'dest' => '\Modules\Media\Controller\ApiController:apiMediaUpdate',
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,9 @@ return [
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'^.*/media/create.*$' => [
|
'^.*/media/upload.*$' => [
|
||||||
[
|
[
|
||||||
'dest' => '\Modules\Media\Controller\BackendController:setUpFileUploader',
|
'dest' => '\Modules\Media\Controller\BackendController:viewMediaUpload',
|
||||||
'verb' => RouteVerb::GET,
|
'verb' => RouteVerb::GET,
|
||||||
'permission' => [
|
'permission' => [
|
||||||
'module' => BackendController::MODULE_NAME,
|
'module' => BackendController::MODULE_NAME,
|
||||||
|
|
@ -27,8 +27,21 @@ return [
|
||||||
'state' => PermissionState::MEDIA,
|
'state' => PermissionState::MEDIA,
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
],
|
||||||
|
'^.*/media/file/create.*$' => [
|
||||||
[
|
[
|
||||||
'dest' => '\Modules\Media\Controller\BackendController:viewMediaCreate',
|
'dest' => '\Modules\Media\Controller\BackendController:viewMediaFileCreate',
|
||||||
|
'verb' => RouteVerb::GET,
|
||||||
|
'permission' => [
|
||||||
|
'module' => BackendController::MODULE_NAME,
|
||||||
|
'type' => PermissionType::CREATE,
|
||||||
|
'state' => PermissionState::MEDIA,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'^.*/media/collection/create.*$' => [
|
||||||
|
[
|
||||||
|
'dest' => '\Modules\Media\Controller\BackendController:viewMediaCollectionCreate',
|
||||||
'verb' => RouteVerb::GET,
|
'verb' => RouteVerb::GET,
|
||||||
'permission' => [
|
'permission' => [
|
||||||
'module' => BackendController::MODULE_NAME,
|
'module' => BackendController::MODULE_NAME,
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ use Modules\Media\Models\CollectionMapper;
|
||||||
use Modules\Media\Models\Media;
|
use Modules\Media\Models\Media;
|
||||||
use Modules\Media\Models\MediaMapper;
|
use Modules\Media\Models\MediaMapper;
|
||||||
use Modules\Media\Models\NullCollection;
|
use Modules\Media\Models\NullCollection;
|
||||||
|
use Modules\Media\Models\PathSettings;
|
||||||
use Modules\Media\Models\PermissionState;
|
use Modules\Media\Models\PermissionState;
|
||||||
use Modules\Media\Models\UploadFile;
|
use Modules\Media\Models\UploadFile;
|
||||||
use Modules\Media\Models\UploadStatus;
|
use Modules\Media\Models\UploadStatus;
|
||||||
|
|
@ -102,7 +103,8 @@ final class ApiController extends Controller
|
||||||
(string) ($request->getData('path') ?? __DIR__ . '/../../../Modules/Media/Files'),
|
(string) ($request->getData('path') ?? __DIR__ . '/../../../Modules/Media/Files'),
|
||||||
(string) ($request->getData('virtualPath') ?? ''),
|
(string) ($request->getData('virtualPath') ?? ''),
|
||||||
(string) ($request->getData('password') ?? ''),
|
(string) ($request->getData('password') ?? ''),
|
||||||
(string) ($request->getData('encrypt') ?? '')
|
(string) ($request->getData('encrypt') ?? ''),
|
||||||
|
(int) ($request->getData('pathsettings') ?? PathSettings::RANDOM_PATH)
|
||||||
);
|
);
|
||||||
|
|
||||||
$ids = [];
|
$ids = [];
|
||||||
|
|
@ -114,10 +116,19 @@ final class ApiController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $name Name
|
* Upload a media file
|
||||||
* @param array $files Files
|
*
|
||||||
* @param int $account Uploader
|
* @param string $name Name
|
||||||
* @param string $basePath Base path
|
* @param array $files Files
|
||||||
|
* @param int $account Uploader
|
||||||
|
* @param string $basePath Base path. The path which is used for the upload.
|
||||||
|
* @param string $virtualPath Virtual path The path which is used to visually structure the files, like directories.
|
||||||
|
* The file storage on the system can be different
|
||||||
|
* @param string $password File password. The password to protect the file (only database)
|
||||||
|
* @param string $encryptionKey Encryption key. Used to encrypt the file on the local file storage.
|
||||||
|
* @param int $pathSettings Settings which describe where the file should be uploaded to (physically)
|
||||||
|
* RANDOM_PATH = random location in the base path
|
||||||
|
* FILE_PATH = combination of base path and virtual path
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*
|
*
|
||||||
|
|
@ -130,16 +141,28 @@ final class ApiController extends Controller
|
||||||
string $basePath = 'Modules/Media/Files',
|
string $basePath = 'Modules/Media/Files',
|
||||||
string $virtualPath = '',
|
string $virtualPath = '',
|
||||||
string $password = '',
|
string $password = '',
|
||||||
string $encryptionKey = ''
|
string $encryptionKey = '',
|
||||||
) : array
|
int $pathSettings = PathSettings::RANDOM_PATH
|
||||||
{
|
) : array {
|
||||||
$mediaCreated = [];
|
$mediaCreated = [];
|
||||||
|
|
||||||
if (!empty($files)) {
|
if (!empty($files)) {
|
||||||
$upload = new UploadFile();
|
$outputDir = '';
|
||||||
$upload->setOutputDir(self::createMediaPath($basePath));
|
$absolute = false;
|
||||||
|
|
||||||
$status = $upload->upload($files, $name, $encryptionKey);
|
if ($pathSettings === PathSettings::RANDOM_PATH) {
|
||||||
|
$outputDir = self::createMediaPath($basePath);
|
||||||
|
} elseif ($pathSettings === PathSettings::FILE_PATH) {
|
||||||
|
$outputDir = $basePath . $virtualPath;
|
||||||
|
$absolute = true;
|
||||||
|
} else {
|
||||||
|
return $mediaCreated;
|
||||||
|
}
|
||||||
|
|
||||||
|
$upload = new UploadFile();
|
||||||
|
$upload->setOutputDir($outputDir);
|
||||||
|
|
||||||
|
$status = $upload->upload($files, $name, $absolute, $encryptionKey);
|
||||||
$mediaCreated = $this->createDbEntries($status, $account, $virtualPath);
|
$mediaCreated = $this->createDbEntries($status, $account, $virtualPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -332,6 +355,7 @@ final class ApiController extends Controller
|
||||||
$mediaCollection->setCreatedBy($account);
|
$mediaCollection->setCreatedBy($account);
|
||||||
$mediaCollection->setSources($media);
|
$mediaCollection->setSources($media);
|
||||||
$mediaCollection->setVirtualPath('/Modules/Helper');
|
$mediaCollection->setVirtualPath('/Modules/Helper');
|
||||||
|
$mediaCollection->setPath('/Modules/Helper');
|
||||||
|
|
||||||
CollectionMapper::create($mediaCollection);
|
CollectionMapper::create($mediaCollection);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Modules\Media\Controller;
|
namespace Modules\Media\Controller;
|
||||||
|
|
||||||
|
use Modules\Admin\Models\Account;
|
||||||
use Modules\Media\Models\CollectionMapper;
|
use Modules\Media\Models\CollectionMapper;
|
||||||
use Modules\Media\Models\Media;
|
use Modules\Media\Models\Media;
|
||||||
use Modules\Media\Models\MediaMapper;
|
use Modules\Media\Models\MediaMapper;
|
||||||
use Modules\Media\Views\MediaView;
|
use Modules\Media\Views\MediaView;
|
||||||
|
|
||||||
use phpOMS\Asset\AssetType;
|
use phpOMS\Asset\AssetType;
|
||||||
use phpOMS\Contract\RenderableInterface;
|
use phpOMS\Contract\RenderableInterface;
|
||||||
use phpOMS\Message\RequestAbstract;
|
use phpOMS\Message\RequestAbstract;
|
||||||
|
|
@ -127,11 +127,34 @@ final class BackendController extends Controller
|
||||||
{
|
{
|
||||||
$view = new View($this->app->l11nManager, $request, $response);
|
$view = new View($this->app->l11nManager, $request, $response);
|
||||||
$view->setTemplate('/Modules/Media/Theme/Backend/media-list');
|
$view->setTemplate('/Modules/Media/Theme/Backend/media-list');
|
||||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000401001, $request, $response));
|
|
||||||
|
|
||||||
$path = (string) ($request->getData('path') ?? '/');
|
$path = (string) ($request->getData('path') ?? '/');
|
||||||
$media = MediaMapper::getByVirtualPath($path);
|
$media = MediaMapper::getByVirtualPath($path);
|
||||||
|
|
||||||
|
$collection = CollectionMapper::getParentCollection($path);
|
||||||
|
if (!empty($collection)) {
|
||||||
|
$media += $collection->getSources();
|
||||||
|
|
||||||
|
$glob = \glob(__DIR__ . '/../Files' . \trim($collection->getPath(), '/') . '/' . $collection->getName() . '/*');
|
||||||
|
|
||||||
|
foreach ($glob as $file) {
|
||||||
|
foreach ($media as $obj) {
|
||||||
|
if ($obj->getName() . '.' . $obj->getExtension() === \basename($file)){
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$pathinfo = \pathinfo($file);
|
||||||
|
|
||||||
|
$localMedia = new Media();
|
||||||
|
$localMedia->setName($pathinfo['filename']);
|
||||||
|
$localMedia->setExtension($pathinfo['extension']);
|
||||||
|
$localMedia->setCreatedBy(new Account());
|
||||||
|
|
||||||
|
$media[] = $localMedia;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$view->addData('media', $media);
|
$view->addData('media', $media);
|
||||||
$view->addData('path', $path);
|
$view->addData('path', $path);
|
||||||
|
|
||||||
|
|
@ -193,11 +216,50 @@ final class BackendController extends Controller
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
* @codeCoverageIgnore
|
* @codeCoverageIgnore
|
||||||
*/
|
*/
|
||||||
public function viewMediaCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
public function viewMediaUpload(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||||
{
|
{
|
||||||
$view = new View($this->app->l11nManager, $request, $response);
|
$view = new View($this->app->l11nManager, $request, $response);
|
||||||
$view->setTemplate('/Modules/Media/Theme/Backend/media-create');
|
$view->setTemplate('/Modules/Media/Theme/Backend/media-upload');
|
||||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000401001, $request, $response));
|
|
||||||
|
return $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Routing end-point for application behaviour.
|
||||||
|
*
|
||||||
|
* @param RequestAbstract $request Request
|
||||||
|
* @param ResponseAbstract $response Response
|
||||||
|
* @param mixed $data Generic data
|
||||||
|
*
|
||||||
|
* @return RenderableInterface
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
|
public function viewMediaFileCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||||
|
{
|
||||||
|
$view = new View($this->app->l11nManager, $request, $response);
|
||||||
|
$view->setTemplate('/Modules/Media/Theme/Backend/media-file-create');
|
||||||
|
|
||||||
|
return $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Routing end-point for application behaviour.
|
||||||
|
*
|
||||||
|
* @param RequestAbstract $request Request
|
||||||
|
* @param ResponseAbstract $response Response
|
||||||
|
* @param mixed $data Generic data
|
||||||
|
*
|
||||||
|
* @return RenderableInterface
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
|
public function viewMediaCollectionCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||||
|
{
|
||||||
|
$view = new View($this->app->l11nManager, $request, $response);
|
||||||
|
$view->setTemplate('/Modules/Media/Theme/Backend/media-collection-create');
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ class Collection extends Media implements \Iterator
|
||||||
/**
|
/**
|
||||||
* Resource id.
|
* Resource id.
|
||||||
*
|
*
|
||||||
* @var array<int|Media>
|
* @var array<int, int|Media>
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
private $sources = [];
|
private $sources = [];
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,14 @@ class Media implements \JsonSerializable
|
||||||
*/
|
*/
|
||||||
protected ?string $password = null;
|
protected ?string $password = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Media is hidden.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
protected bool $hidden = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
|
|
@ -494,6 +502,28 @@ class Media implements \JsonSerializable
|
||||||
$this->versioned = $versioned;
|
$this->versioned = $versioned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public function isHidden() : bool
|
||||||
|
{
|
||||||
|
return $this->hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $hidden File is hidden
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public function setHidden(bool $hidden) : void
|
||||||
|
{
|
||||||
|
$this->hidden = $hidden;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
|
|
@ -504,7 +534,9 @@ class Media implements \JsonSerializable
|
||||||
'name' => $this->name,
|
'name' => $this->name,
|
||||||
'description' => $this->description,
|
'description' => $this->description,
|
||||||
'extension' => $this->extension,
|
'extension' => $this->extension,
|
||||||
|
'virtualpath' => $this->virtualPath,
|
||||||
'size' => $this->size,
|
'size' => $this->size,
|
||||||
|
'hidden' => $this->hidden,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ class MediaMapper extends DataMapperAbstract
|
||||||
'media_description' => ['name' => 'media_description', 'type' => 'string', 'internal' => 'description', 'autocomplete' => true],
|
'media_description' => ['name' => 'media_description', 'type' => 'string', 'internal' => 'description', 'autocomplete' => true],
|
||||||
'media_description_raw' => ['name' => 'media_description_raw', 'type' => 'string', 'internal' => 'descriptionRaw'],
|
'media_description_raw' => ['name' => 'media_description_raw', 'type' => 'string', 'internal' => 'descriptionRaw'],
|
||||||
'media_versioned' => ['name' => 'media_versioned', 'type' => 'bool', 'internal' => 'versioned'],
|
'media_versioned' => ['name' => 'media_versioned', 'type' => 'bool', 'internal' => 'versioned'],
|
||||||
|
'media_hidden' => ['name' => 'media_hidden', 'type' => 'bool', 'internal' => 'hidden'],
|
||||||
'media_file' => ['name' => 'media_file', 'type' => 'string', 'internal' => 'path', 'autocomplete' => true],
|
'media_file' => ['name' => 'media_file', 'type' => 'string', 'internal' => 'path', 'autocomplete' => true],
|
||||||
'media_virtual' => ['name' => 'media_virtual', 'type' => 'string', 'internal' => 'virtualPath', 'autocomplete' => true],
|
'media_virtual' => ['name' => 'media_virtual', 'type' => 'string', 'internal' => 'virtualPath', 'autocomplete' => true],
|
||||||
'media_absolute' => ['name' => 'media_absolute', 'type' => 'bool', 'internal' => 'isAbsolute'],
|
'media_absolute' => ['name' => 'media_absolute', 'type' => 'bool', 'internal' => 'isAbsolute'],
|
||||||
|
|
@ -103,16 +104,44 @@ class MediaMapper extends DataMapperAbstract
|
||||||
* path if so desired without deleting or moving the orginal media files.
|
* path if so desired without deleting or moving the orginal media files.
|
||||||
*
|
*
|
||||||
* @param string $virtualPath Virtual path
|
* @param string $virtualPath Virtual path
|
||||||
|
* @param string $hidden Get hidden files
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public static function getByVirtualPath(string $virtualPath = '/') : array
|
public static function getByVirtualPath(string $virtualPath = '/', bool $hidden = false) : array
|
||||||
{
|
{
|
||||||
$query = self::getQuery();
|
$query = self::getQuery();
|
||||||
$query->where(self::$table . '.media_virtual', '=', $virtualPath);
|
$query->where(self::$table . '.media_virtual', '=', $virtualPath);
|
||||||
|
|
||||||
|
if ($hidden === false) {
|
||||||
|
$query->where(self::$table . '.media_hidden', '=', (int) $hidden);
|
||||||
|
}
|
||||||
|
|
||||||
return self::getAllByQuery($query);
|
return self::getAllByQuery($query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get parent collection
|
||||||
|
*
|
||||||
|
* @param string $path Virtual path
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public static function getParentCollection(string $path = '/')
|
||||||
|
{
|
||||||
|
$virtualPath = \substr($path, 0, \strripos($path, '/') + 1);
|
||||||
|
$name = \substr($path, \strripos($path, '/') + 1);
|
||||||
|
|
||||||
|
$query = self::getQuery();
|
||||||
|
$query->where(self::$table . '.media_virtual', '=', $virtualPath)
|
||||||
|
->andWhere(self::$table . '.media_name', '=', $name);
|
||||||
|
|
||||||
|
$objs = self::getAllByQuery($query);
|
||||||
|
|
||||||
|
return \count($objs) === 1 ? \reset($objs) : $objs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
32
Models/PathSettings.php
Normal file
32
Models/PathSettings.php
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Orange Management
|
||||||
|
*
|
||||||
|
* PHP Version 7.4
|
||||||
|
*
|
||||||
|
* @package Modules\Media\Models
|
||||||
|
* @copyright Dennis Eichhorn
|
||||||
|
* @license OMS License 1.0
|
||||||
|
* @version 1.0.0
|
||||||
|
* @link https://orange-management.org
|
||||||
|
*/
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\Media\Models;
|
||||||
|
|
||||||
|
use phpOMS\Stdlib\Base\Enum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path settings enum.
|
||||||
|
*
|
||||||
|
* @package Modules\Media\Models
|
||||||
|
* @license OMS License 1.0
|
||||||
|
* @link https://orange-management.org
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
abstract class PathSettings extends Enum
|
||||||
|
{
|
||||||
|
public const FILE_PATH = 1;
|
||||||
|
public const RANDOM_PATH = 2;
|
||||||
|
public const COLLECTION_PATH = 3;
|
||||||
|
}
|
||||||
|
|
@ -89,6 +89,7 @@ class UploadFile
|
||||||
*
|
*
|
||||||
* @param array $files File data ($_FILE)
|
* @param array $files File data ($_FILE)
|
||||||
* @param string $name File name
|
* @param string $name File name
|
||||||
|
* @param bool $absolute Use absolute path
|
||||||
* @param string $encryptionKey Encryption key
|
* @param string $encryptionKey Encryption key
|
||||||
* @param string $encoding Encoding used for uploaded file. Empty string will not convert file content.
|
* @param string $encoding Encoding used for uploaded file. Empty string will not convert file content.
|
||||||
*
|
*
|
||||||
|
|
@ -98,16 +99,21 @@ class UploadFile
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public function upload(array $files, string $name = '', string $encryptionKey = '', string $encoding = 'UTF-8') : array
|
public function upload(
|
||||||
{
|
array $files,
|
||||||
|
string $name = '',
|
||||||
|
bool $absolute = false,
|
||||||
|
string $encryptionKey = '',
|
||||||
|
string $encoding = 'UTF-8'
|
||||||
|
) : array {
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
if (\count($files) === \count($files, \COUNT_RECURSIVE)) {
|
if (\count($files) === \count($files, \COUNT_RECURSIVE)) {
|
||||||
$files = [$files];
|
$files = [$files];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\count($files) > 1) {
|
if (!$absolute && \count($files) > 1) {
|
||||||
$this->outputDir = $this->findOutputDir($files);
|
$this->outputDir = $this->findOutputDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
$path = $this->outputDir;
|
$path = $this->outputDir;
|
||||||
|
|
@ -308,13 +314,11 @@ class UploadFile
|
||||||
/**
|
/**
|
||||||
* Find unique output path for batch of files
|
* Find unique output path for batch of files
|
||||||
*
|
*
|
||||||
* @param array $files Array of files
|
|
||||||
*
|
|
||||||
* @return string
|
* @return string
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
private function findOutputDir(array $files) : string
|
private function findOutputDir() : string
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
$rndPath = \str_pad(\dechex(\mt_rand(0, 65535)), 4, '0', \STR_PAD_LEFT);
|
$rndPath = \str_pad(\dechex(\mt_rand(0, 65535)), 4, '0', \STR_PAD_LEFT);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
return ['Media' => [
|
return ['Media' => [
|
||||||
'Account' => 'Account',
|
'Account' => 'Account',
|
||||||
|
'AddToCollection' => 'Add to collection',
|
||||||
'Author' => 'Author',
|
'Author' => 'Author',
|
||||||
'Changed' => 'Changed',
|
'Changed' => 'Changed',
|
||||||
'Changedby' => 'Changed by',
|
'Changedby' => 'Changed by',
|
||||||
|
|
@ -24,11 +25,15 @@ return ['Media' => [
|
||||||
'Edit' => 'Edit',
|
'Edit' => 'Edit',
|
||||||
'Editability' => 'Editability',
|
'Editability' => 'Editability',
|
||||||
'Extension' => 'Extension',
|
'Extension' => 'Extension',
|
||||||
|
'FilePath' => 'File Path',
|
||||||
'Files' => 'Files',
|
'Files' => 'Files',
|
||||||
'Media' => 'Media',
|
'Media' => 'Media',
|
||||||
'Name' => 'Name',
|
'Name' => 'Name',
|
||||||
|
'Path' => 'Path',
|
||||||
|
'PathSettings' => 'Path Settings',
|
||||||
'Permission' => 'Permission',
|
'Permission' => 'Permission',
|
||||||
'Preview' => 'Preview',
|
'Preview' => 'Preview',
|
||||||
|
'RandomPath' => 'Random Path',
|
||||||
'Select' => 'Select',
|
'Select' => 'Select',
|
||||||
'Settings' => 'Settings',
|
'Settings' => 'Settings',
|
||||||
'Size' => 'Size',
|
'Size' => 'Size',
|
||||||
|
|
|
||||||
0
Theme/Backend/media-collection-create.tpl.php
Normal file
0
Theme/Backend/media-collection-create.tpl.php
Normal file
|
|
@ -1,39 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Orange Management
|
|
||||||
*
|
|
||||||
* PHP Version 7.4
|
|
||||||
*
|
|
||||||
* @package Modules\Media
|
|
||||||
* @copyright Dennis Eichhorn
|
|
||||||
* @license OMS License 1.0
|
|
||||||
* @version 1.0.0
|
|
||||||
* @link https://orange-management.org
|
|
||||||
*/
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo Orange-Management/Modules#58
|
|
||||||
* Implement drag/drop upload
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \phpOMS\Views\View $this
|
|
||||||
*/
|
|
||||||
echo $this->getData('nav')->render(); ?>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12 col-md-6">
|
|
||||||
<section class="box wf-100">
|
|
||||||
<header><h1><?= $this->getHtml('Upload') ?></h1></header>
|
|
||||||
<div class="inner">
|
|
||||||
<form method="POST" id="media-uploader" action="">
|
|
||||||
<table class="layout wf-100">
|
|
||||||
<tr><td><label for="iFiles"><?= $this->getHtml('Files') ?></label>
|
|
||||||
<tr><td><input type="file" id="iFiles" name="files" multiple><input name="media" type="hidden">
|
|
||||||
<tr><td><input type="submit" id="iMediaCreate" name="mediaCreateButton" value="<?= $this->getHtml('Create', '0', '0'); ?>">
|
|
||||||
</table>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
0
Theme/Backend/media-file-create.tpl.php
Normal file
0
Theme/Backend/media-file-create.tpl.php
Normal file
|
|
@ -12,6 +12,7 @@
|
||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Modules\Media\Models\Collection;
|
||||||
use phpOMS\Uri\UriFactory;
|
use phpOMS\Uri\UriFactory;
|
||||||
|
|
||||||
include __DIR__ . '/template-functions.php';
|
include __DIR__ . '/template-functions.php';
|
||||||
|
|
@ -26,8 +27,17 @@ $mediaPath = $this->getData('path') ?? '/';
|
||||||
* @var \Modules\Media\Models\Media[] $media
|
* @var \Modules\Media\Models\Media[] $media
|
||||||
*/
|
*/
|
||||||
$media = $this->getData('media');
|
$media = $this->getData('media');
|
||||||
|
?>
|
||||||
|
|
||||||
echo $this->getData('nav')->render(); ?>
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="box">
|
||||||
|
<a class="button" href="<?= UriFactory::build('{/prefix}media/upload?path={?path}'); ?>">Upload</a>
|
||||||
|
<a class="button" href="<?= UriFactory::build('{/prefix}media/file/create?path={?path}'); ?>">Create File</a>
|
||||||
|
<a class="button" href="<?= UriFactory::build('{/prefix}media/collection/create?path={?path}'); ?>">Create Collection</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
|
|
@ -72,12 +82,18 @@ echo $this->getData('nav')->render(); ?>
|
||||||
<?php $count = 0;
|
<?php $count = 0;
|
||||||
foreach ($media as $key => $value) :
|
foreach ($media as $key => $value) :
|
||||||
++$count;
|
++$count;
|
||||||
$url = UriFactory::build('{/prefix}media/single?id=' . $value->getId());
|
|
||||||
|
if ($value->getExtension() === 'collection') {
|
||||||
|
$url = UriFactory::build('{/prefix}media/list?path=' . \rtrim($value->getVirtualPath(), '/') . '/' . $value->getName());
|
||||||
|
} else {
|
||||||
|
$url = UriFactory::build('{/prefix}media/single?id=' . $value->getId());
|
||||||
|
}
|
||||||
$icon = $fileIconFunction(\phpOMS\System\File\FileUtils::getExtensionType($value->getExtension()));
|
$icon = $fileIconFunction(\phpOMS\System\File\FileUtils::getExtensionType($value->getExtension()));
|
||||||
?>
|
?>
|
||||||
<tr data-href="<?= $url; ?>">
|
<tr data-href="<?= $url; ?>">
|
||||||
<td data-label="<?= $this->getHtml('Type') ?>"><a href="<?= $url; ?>"><i class="fa fa-<?= $this->printHtml($icon); ?>"></i></a>
|
<td data-label="<?= $this->getHtml('Type') ?>"><a href="<?= $url; ?>"><i class="fa fa-<?= $this->printHtml($icon); ?>"></i></a>
|
||||||
<td data-label="<?= $this->getHtml('Name') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getName()); ?></a>
|
<td data-label="<?= $this->getHtml('Name') ?>"><a href="<?= $url; ?>"><?= $this->printHtml(
|
||||||
|
$value->getExtension() !== 'collection' ? $value->getName() . '.' . $value->getExtension() : $value->getName()); ?></a>
|
||||||
<td data-label="<?= $this->getHtml('Extension') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getExtension()); ?></a>
|
<td data-label="<?= $this->getHtml('Extension') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getExtension()); ?></a>
|
||||||
<td data-label="<?= $this->getHtml('Size') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getSize()); ?></a>
|
<td data-label="<?= $this->getHtml('Size') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getSize()); ?></a>
|
||||||
<td data-label="<?= $this->getHtml('Creator') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getCreatedBy()->getName1()); ?></a>
|
<td data-label="<?= $this->getHtml('Creator') ?>"><a href="<?= $url; ?>"><?= $this->printHtml($value->getCreatedBy()->getName1()); ?></a>
|
||||||
|
|
|
||||||
61
Theme/Backend/media-upload.tpl.php
Normal file
61
Theme/Backend/media-upload.tpl.php
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Orange Management
|
||||||
|
*
|
||||||
|
* PHP Version 7.4
|
||||||
|
*
|
||||||
|
* @package Modules\Media
|
||||||
|
* @copyright Dennis Eichhorn
|
||||||
|
* @license OMS License 1.0
|
||||||
|
* @version 1.0.0
|
||||||
|
* @link https://orange-management.org
|
||||||
|
*/
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Modules\Media\Models\PathSettings;
|
||||||
|
use phpOMS\Uri\UriFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo Orange-Management/Modules#58
|
||||||
|
* Implement drag/drop upload
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \phpOMS\Views\View $this
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="box">
|
||||||
|
<a class="button" href="<?= UriFactory::build('{/prefix}media/list?path={?path}'); ?>">Back</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12 col-md-6">
|
||||||
|
<section class="box wf-100">
|
||||||
|
<header><h1><?= $this->getHtml('Upload') ?></h1></header>
|
||||||
|
<div class="inner">
|
||||||
|
<form method="PUT" id="media-uploader" action="<?= UriFactory::build('{/api}media'); ?>">
|
||||||
|
<table class="layout wf-100">
|
||||||
|
<tr><td><label for="iPath"><?= $this->getHtml('Path') ?></label>
|
||||||
|
<tr><td><input type="text" id="iPath" name="virtualPath" value="<?= $this->request->getUri()->getQuery('path') ?? ''; ?>" disabled>
|
||||||
|
<tr><td><label><?= $this->getHtml('Settings') ?></label>
|
||||||
|
<tr><td><input type="checkbox" id="iAddCollection" name="addcollection" checked><label for="iAddCollection"><?= $this->getHtml('AddToCollection') ?></label>
|
||||||
|
<tr><td><label for="iPathSettings"><?= $this->getHtml('PathSettings') ?></label>
|
||||||
|
<tr><td>
|
||||||
|
<select id="iPathSettings" name="pathsettings">
|
||||||
|
<option value="<?= PathSettings::FILE_PATH ?>" selected><?= $this->getHtml('FilePath') ?>
|
||||||
|
<option value="<?= PathSettings::RANDOM_PATH ?>"><?= $this->getHtml('RandomPath') ?>
|
||||||
|
</select>
|
||||||
|
<tr><td><label for="iFiles"><?= $this->getHtml('Files') ?></label>
|
||||||
|
<tr><td><input type="file" id="iFiles" name="files" multiple>
|
||||||
|
<tr><td><input type="submit" id="iMediaCreate" name="mediaCreateButton" value="<?= $this->getHtml('Create', '0', '0'); ?>">
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Loading…
Reference in New Issue
Block a user