commit b68fc816ee80206c11634dceb1e521fcf1a607f6 Author: Dennis Eichhorn Date: Sun Nov 29 21:57:18 2015 +0100 Init diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php new file mode 100644 index 0000000..d21b062 --- /dev/null +++ b/Admin/Install/Navigation.php @@ -0,0 +1,38 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Admin\Install; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Navigation +{ + public static function install($dbPool) + { + $navData = json_decode(file_get_contents(__DIR__ . '/nav.install.json'), true); + + $class = '\\Modules\\Navigation\\Admin\\Installer'; + $class::installExternal($dbPool, $navData); + } +} diff --git a/Admin/Install/nav.install.json b/Admin/Install/nav.install.json new file mode 100644 index 0000000..e366015 --- /dev/null +++ b/Admin/Install/nav.install.json @@ -0,0 +1,78 @@ +[ + { + "id": 1000401001, + "pid": "754a08ddf8bcb1cf22f310f09206dd783d42f7dd", + "type": 2, + "subtype": 1, + "name": "Media", + "uri": "/{/lang}/backend/media/list", + "target": "self", + "icon": null, + "order": 20, + "from": "Media", + "permission": null, + "parent": 1000201001, + "children": [ + { + "id": 1000402001, + "pid": "1ba288c868cacf14e56f8205efef31d697301d02", + "type": 3, + "subtype": 1, + "name": "List", + "uri": "/{/lang}/backend/media/list", + "target": "self", + "icon": null, + "order": 1, + "from": "Media", + "permission": null, + "parent": 1000401001, + "children": [] + }, + { + "id": 1000403001, + "pid": "1ba288c868cacf14e56f8205efef31d697301d02", + "type": 3, + "subtype": 5, + "name": "Create", + "uri": "/{/lang}/backend/media/create", + "target": "self", + "icon": null, + "order": 5, + "from": "Media", + "permission": null, + "parent": 1000401001, + "children": [] + } + ] + }, + { + "id": 1000410001, + "pid": "722846d6c55f46fd3d372bba7311a150acd1f23c", + "type": 2, + "subtype": 2, + "name": "Media", + "uri": "/{/lang}/backend/profile/single/media", + "target": "self", + "icon": null, + "order": 3, + "from": "Media", + "permission": null, + "parent": 1000301001, + "children": [] + }, + { + "id": 1000410002, + "pid": "f277f11a122129a52d36f788f42e5c09766cf4ae", + "type": 3, + "subtype": 1, + "name": "Media", + "uri": "/{/lang}/backend/admin/account/single/media", + "target": "self", + "icon": null, + "order": 3, + "from": "Media", + "permission": null, + "parent": 1000104001, + "children": [] + } +] diff --git a/Admin/Installer.php b/Admin/Installer.php new file mode 100644 index 0000000..e2a2baa --- /dev/null +++ b/Admin/Installer.php @@ -0,0 +1,102 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Admin; + +use phpOMS\DataStorage\Database\DatabaseType; +use phpOMS\DataStorage\Database\Pool; +use phpOMS\Module\InstallerAbstract; + +/** + * Media install class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Installer extends InstallerAbstract +{ + + /** + * {@inheritdoc} + */ + public static function install(Pool $dbPool, array $info) + { + parent::install($dbPool, $info); + + switch ($dbPool->get('core')->getType()) { + case DatabaseType::MYSQL: + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'media` ( + `media_id` int(11) NOT NULL AUTO_INCREMENT, + `media_name` varchar(100) NOT NULL, + `media_versioned` tinyint(1) NOT NULL, + `media_file` varchar(255) NOT NULL, + `media_extension` varchar(10) NULL, + `media_collection` tinyint(1) NULL, + `media_size` int(11) NULL, + `media_created_by` int(11) DEFAULT NULL, + `media_created_at` datetime DEFAULT NULL, + PRIMARY KEY (`media_id`), + KEY `media_created_by` (`media_created_by`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'media` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'media_ibfk_1` FOREIGN KEY (`media_created_by`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'media_relation` ( + `media_relation_id` int(11) NOT NULL AUTO_INCREMENT, + `media_relation_src` int(11) NULL, + `media_relation_dst` int(11) NULL, + PRIMARY KEY (`media_relation_id`), + KEY `media_relation_src` (`media_relation_src`), + KEY `media_relation_dst` (`media_relation_dst`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'media_relation` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'media_relation_ibfk_1` FOREIGN KEY (`media_relation_src`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`), + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'media_relation_ibfk_2` FOREIGN KEY (`media_relation_dst`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'media_permission` ( + `media_permission_id` int(11) NOT NULL AUTO_INCREMENT, + `media_permission_type` tinyint(1) NOT NULL, + `media_permission_reference` int(11) NOT NULL, + `media_permission_permission` tinyint(2) NOT NULL, + `media_permission_media` int(11) NOT NULL, + PRIMARY KEY (`media_permission_id`), + KEY `media_permission_media` (`media_permission_media`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'media_permission` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'media_permission_ibfk_1` FOREIGN KEY (`media_permission_media`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`);' + )->execute(); + break; + } + } +} diff --git a/Controller.js b/Controller.js new file mode 100644 index 0000000..54d4ec5 --- /dev/null +++ b/Controller.js @@ -0,0 +1,41 @@ +(function (jsOMS, undefined) { + jsOMS.Modules.Media = function (app) { + this.app = app; + }; + + jsOMS.Modules.Media.prototype.bind = function () { + var forms = document.getElementsByTagName('form'); + + /* Handle media forms */ + for (var c = 0; c < forms.length; c++) { + var self = this; + + this.app.uiManager.getFormManager().injectSubmit(forms[c].id, function (e) { + var fileFields = e.querySelectorAll('input[type=file]'), + uploader = new jsOMS.Modules.Models.Media.Upload(self.app.responseManager); + + uploader.setSuccess(e.id, function (type, response) { + e.querySelector('input[type=file]+input[type=hidden]').value = JSON.stringify(response.uploads); + + var data = self.app.uiManager.getFormManager().getData(e); + self.app.uiManager.getFormManager().submit(e, data); + }); + + uploader.setUri('http://127.0.0.1/en/api/media.php'); + + for (var i = 0; i < fileFields.length; i++) { + for (var j = 0; j < fileFields[i].files.length; j++) { + uploader.addFile(fileFields[i].files[j]); + } + } + + uploader.upload(e.id); + }); + } + } +}(window.jsOMS = window.jsOMS || {})); + +jsOMS.ready(function () { + window.omsApp.moduleManager.initModule('Media'); + window.omsApp.moduleManager.get('Media').bind(); +}); diff --git a/Controller.php b/Controller.php new file mode 100644 index 0000000..ce2b1b7 --- /dev/null +++ b/Controller.php @@ -0,0 +1,217 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media; + +use Modules\Media\Models\Media; +use Modules\Media\Models\MediaMapper; +use Modules\Media\Models\UploadFile; +use Modules\Media\Models\UploadStatus; +use Modules\Navigation\Models\Navigation; +use Modules\Navigation\Views\NavigationView; +use phpOMS\Contract\RenderableInterface; +use phpOMS\Message\RequestAbstract; +use phpOMS\Message\RequestDestination; +use phpOMS\Message\ResponseAbstract; +use phpOMS\Module\ModuleAbstract; +use phpOMS\Module\WebInterface; +use phpOMS\Views\View; +use phpOMS\Views\ViewLayout; + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Controller extends ModuleAbstract implements WebInterface +{ + + /** + * Module name. + * + * @var \string + * @since 1.0.0 + */ + protected static $module = 'Media'; + + /** + * Localization files. + * + * @var \string + * @since 1.0.0 + */ + protected static $localization = [ + RequestDestination::BACKEND => ['backend'], + ]; + + /** + * Providing. + * + * @var \string + * @since 1.0.0 + */ + protected static $providing = [ + 'Content', + ]; + + /** + * Dependencies. + * + * @var \string + * @since 1.0.0 + */ + protected static $dependencies = []; + + /** + * Routing elements. + * + * @var array + * @since 1.0.0 + */ + protected static $routes = [ + '^.*/backend/media/list.*$' => [['dest' => '\Modules\Media\Controller:viewMediaList', 'method' => 'GET', 'type' => ViewLayout::MAIN],], + '^.*/backend/media/create.*$' => [['dest' => '\Modules\Media\Controller:viewMediaCreate', 'method' => 'GET', 'type' => ViewLayout::MAIN],], + + '^.*/api/media/file/create.*$' => [['dest' => '\Modules\Media\Controller:apiFileCreate', 'method' => 'POST', 'type' => ViewLayout::MAIN],], + '^.*/api/media/collection/create.*$' => [['dest' => '\Modules\Media\Controller:apiCollectionCreate', 'method' => 'POST', 'type' => ViewLayout::MAIN],], + '^.*/api/media/upload.*$' => [['dest' => '\Modules\Media\Controller:apiMediaUpload', 'method' => 'POST', 'type' => ViewLayout::NULL],], + ]; + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewMediaList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Media/Theme/backend/media-list'); + $view->addData('nav', $this->createNavigation(1000401001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewMediaCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Media/Theme/backend/media-create'); + $view->addData('nav', $this->createNavigation(1000401001, $request, $response)); + + return $view; + } + + /** + * Shows api content. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function apiMediaUpload(RequestAbstract $request, ResponseAbstract $response, $data = null) + { + $uploads = $this->uploadFiles($_FILES, $request->getAccount()); + + $response->set($request->__toString(), [['uploads' => $uploads, 'type' => 'UI']]); + } + + /** + * @param array $files Files + * @param int $account Uploader + * + * @return array + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function uploadFiles(array $files, \int $account) : array + { + $mediaCreated = []; + + if (isset($files)) { + $upload = new UploadFile(); + $rndPath = str_pad(dechex(rand(0, 65535)), 4, '0', STR_PAD_LEFT); + $path = '/Modules/Media/Files/' . $rndPath[0] . $rndPath[1] . '/' . $rndPath[2] . $rndPath[3]; + $upload->setOutputDir($path); + $upload->setFileName(false); + $status = $upload->upload($files); + + $mediaMapper = new MediaMapper($this->app->dbPool->get()); + + foreach ($status as $uFile) { + if ($uFile['status'] === UploadStatus::OK) { + $media = new Media(); + $media->setPath($uFile['path'] . '/' . $uFile['filename']); + $media->setName($uFile['filename']); + $media->setSize($uFile['size']); + $media->setCreatedBy($account); + $media->setCreatedAt(new \DateTime('NOW')); + $media->setExtension($uFile['extension']); + + $mediaCreated[] = $mediaMapper->create($media); + } + } + } + + return $mediaCreated; + } + + /** + * @param int $pageId Page/parent Id for navigation + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * + * @return RenderableInterface + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + private function createNavigation(\int $pageId, RequestAbstract $request, ResponseAbstract $response) + { + $nav = Navigation::getInstance($request, $this->app->dbPool); + $navView = new NavigationView($this->app, $request, $response); + $navView->setTemplate('/Modules/Navigation/Theme/backend/mid'); + $navView->setNav($nav->getNav()); + $navView->setLanguage($request->getL11n()->language); + $navView->setParent($pageId); + + return $navView; + } +} diff --git a/Models/Collection.php b/Models/Collection.php new file mode 100644 index 0000000..68c147c --- /dev/null +++ b/Models/Collection.php @@ -0,0 +1,94 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + + + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Collection extends Media +{ + + /** + * Resource id. + * + * @var \int[] + * @since 1.0.0 + */ + private $sources = []; + + /** + * Constructor. + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function __construct() + { + } + + /** + * Set sources. + * + * @param array $sources Source array + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setSources(array $sources) + { + $this->sources = $sources; + } + + /** + * Set sources. + * + * @param \int $source Source + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function addSource(\int $source) + { + $this->sources[] = $source; + } + + /** + * Get sources. + * + * @return array + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getSources() : array + { + return $this->sources; + } +} diff --git a/Models/CollectionMapper.php b/Models/CollectionMapper.php new file mode 100644 index 0000000..36a7bbc --- /dev/null +++ b/Models/CollectionMapper.php @@ -0,0 +1,68 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\DataStorage\Database\Query\Column; + +class CollectionMapper extends MediaMapper +{ + protected static $hasMany = [ + 'source' => [ + 'mapper' => null, + 'table' => 'media_relation', + 'dst' => 'media_relation_dst', + 'src' => 'media_relation_src' + ] + ]; + + /** + * Primary table. + * + * @var \string + * @since 1.0.0 + */ + protected static $table = 'media'; + + protected static $createdAt = 'media_created_at'; + + /** + * Primary field name. + * + * @var \string + * @since 1.0.0 + */ + protected static $primaryField = 'media_id'; + + /** + * Find. + * + * @param array $columns Columns to select + * + * @return Builder + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function find(...$columns) : Builder + { + return parent::find(...$columns)->from('account_permission') + ->where('account_permission.account_permission_for', '=', 'news') + ->where('account_permission.account_permission_id1', '=', 1) + ->where('news.news_id', '=', new Column('account_permission.account_permission_id2')) + ->where('account_permission.account_permission_r', '=', 1); + } +} diff --git a/Models/FileStorageInterface.php b/Models/FileStorageInterface.php new file mode 100644 index 0000000..6584837 --- /dev/null +++ b/Models/FileStorageInterface.php @@ -0,0 +1,15 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ // TODO: implement file storage interface diff --git a/Models/FileUploaderTrait.php b/Models/FileUploaderTrait.php new file mode 100644 index 0000000..03616e8 --- /dev/null +++ b/Models/FileUploaderTrait.php @@ -0,0 +1,49 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +use phpOMS\Asset\AssetType; +use phpOMS\Message\RequestAbstract; +use phpOMS\Message\ResponseAbstract; + +/** + * Options trait. + * + * @category Framework + * @package phpOMS\Config + * @since 1.0.0 + */ +trait FileUploaderTrait +{ + + /** + * Setup file uploader. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Misc. data + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setUpFileUploader(RequestAbstract $request, ResponseAbstract $response, $data = null) + { + $head = $response->getHead(); + $head->addAsset(AssetType::JS, $request->getUri()->getBase() . 'Modules/Media/ModuleMedia.js'); + } +} diff --git a/Models/FtpFileStorage.php b/Models/FtpFileStorage.php new file mode 100644 index 0000000..8c68a3e --- /dev/null +++ b/Models/FtpFileStorage.php @@ -0,0 +1,15 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ // TODO: implement filestorage on remote ftp server diff --git a/Models/LocalFileStorage.php b/Models/LocalFileStorage.php new file mode 100644 index 0000000..ec9c329 --- /dev/null +++ b/Models/LocalFileStorage.php @@ -0,0 +1,15 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ // TODO: implement local file storage diff --git a/Models/Media.php b/Models/Media.php new file mode 100644 index 0000000..c714623 --- /dev/null +++ b/Models/Media.php @@ -0,0 +1,346 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Media +{ + + /** + * ID. + * + * @var \int + * @since 1.0.0 + */ + protected $id = 0; + + /** + * Name. + * + * @var \string + * @since 1.0.0 + */ + protected $name = ''; + + /** + * Extension. + * + * @var \string + * @since 1.0.0 + */ + protected $extension = ''; + + /** + * File size in bytes. + * + * @var \int + * @since 1.0.0 + */ + protected $size = 0; + + /** + * Author. + * + * @var \int + * @since 1.0.0 + */ + protected $createdBy = 0; + + /** + * Uploaded. + * + * @var \DateTime + * @since 1.0.0 + */ + protected $createdAt = null; + + /** + * Resource path. + * + * @var \string + * @since 1.0.0 + */ + protected $path = ''; + + /** + * Is versioned. + * + * @var \bool + * @since 1.0.0 + */ + protected $versioned = false; + + /** + * Media Description. + * + * @var \string + * @since 1.0.0 + */ + protected $description = ''; + + /** + * Permissions. + * + * @var array + * @since 1.0.0 + */ + protected $permissions = [ + 'r' => ['groups' => [], + 'users' => [],], + 'w' => ['groups' => [], + 'users' => [],], + 'p' => ['groups' => [], + 'users' => [],], + 'd' => ['groups' => [], + 'users' => [],], + ]; + + /** + * Constructor. + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function __construct() + { + } + + /** + * @return \int + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getId() : \int + { + return $this->id; + } + + /** + * @param \int $id Id + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setId(\int $id) + { + $this->id = $id; + } + + /** + * @return \int + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getCreatedBy() : \int + { + return $this->createdBy; + } + + /** + * @return \DateTime + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getCreatedAt() : \DateTime + { + return $this->createdAt; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getExtension() : \string + { + return $this->extension; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getPath() : \string + { + return $this->path; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getName() : \string + { + return $this->name; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getDescription() : \string + { + return $this->description; + } + + /** + * @return \int + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getSize() : \int + { + return $this->size; + } + + /** + * @param \int $createdBy Creator + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setCreatedBy(\int $createdBy) + { + $this->createdBy = $createdBy; + } + + /** + * @param \DateTime $createdAt Creation date + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setCreatedAt(\DateTime $createdAt) + { + $this->createdAt = $createdAt; + } + + /** + * @param \string $extension Extension + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setExtension(\string $extension) + { + $this->extension = $extension; + } + + /** + * @param \string $path $filepath + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setPath(\string $path) + { + $this->path = $path; + } + + /** + * @param \string $name Media name (not file name) + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setName(\string $name) + { + $this->name = $name; + } + + /** + * @param \string $description Media description + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setDescription(\string $description) + { + $this->description = $description; + } + + /** + * @param \int $size Filesize + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setSize(\int $size) + { + $this->size = $size; + } + + /** + * @param \bool $versioned File is version controlled + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setVersioned(\bool $versioned) + { + $this->versioned = $versioned; + } + + /** + * @return \bool + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getVersioned() : \bool + { + return $this->versioned; + } +} diff --git a/Models/MediaMapper.php b/Models/MediaMapper.php new file mode 100644 index 0000000..f45d99f --- /dev/null +++ b/Models/MediaMapper.php @@ -0,0 +1,120 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\DataStorage\Database\Query\Column; + +class MediaMapper extends DataMapperAbstract +{ + + /** + * Columns. + * + * @var array + * @since 1.0.0 + */ + protected static $columns = [ + 'media_id' => ['name' => 'media_id', 'type' => 'int', 'internal' => 'id'], + 'media_name' => ['name' => 'media_name', 'type' => 'string', 'internal' => 'name'], + 'media_versioned' => ['name' => 'media_versioned', 'type' => 'bool', 'internal' => 'versioned'], + 'media_file' => ['name' => 'media_file', 'type' => 'string', 'internal' => 'path'], + 'media_extension' => ['name' => 'media_extension', 'type' => 'string', 'internal' => 'extension'], + 'media_collection' => ['name' => 'media_collection', 'type' => 'int', 'internal' => 'collection'], + 'media_size' => ['name' => 'media_size', 'type' => 'int', 'internal' => 'size'], + 'media_created_by' => ['name' => 'media_created_by', 'type' => 'int', 'internal' => 'createdBy'], + 'media_created_at' => ['name' => 'media_created_at', 'type' => 'DateTime', 'internal' => 'createdAt'], + ]; + + /** + * Primary table. + * + * @var \string + * @since 1.0.0 + */ + protected static $table = 'media'; + + protected static $createdAt = 'media_created_at'; + + /** + * Primary field name. + * + * @var \string + * @since 1.0.0 + */ + protected static $primaryField = 'media_id'; + + /** + * Create media. + * + * @param Media $obj Media + * + * @return \bool + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function create(&$obj) + { + try { + $objId = parent::create($obj); + $query = new Builder($this->db); + $query->prefix($this->db->getPrefix()) + ->insert( + 'account_permission_account', + 'account_permission_from', + 'account_permission_for', + 'account_permission_id1', + 'account_permission_id2', + 'account_permission_r', + 'account_permission_w', + 'account_permission_m', + 'account_permission_d', + 'account_permission_p' + ) + ->into('account_permission') + ->values($obj->getCreatedBy(), 'media', 'media', 1, $objId, 1, 1, 1, 1, 1); + + $this->db->con->prepare($query->toSql())->execute(); + } catch (\Exception $e) { + var_dump($e); + + return false; + } + + return $objId; + } + + /** + * Find. + * + * @param array $columns Columns to select + * + * @return Builder + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function find(...$columns) : Builder + { + return parent::find(...$columns)->from('account_permission') + ->where('account_permission.account_permission_for', '=', 'media') + ->where('account_permission.account_permission_id1', '=', 1) + ->where('media.media_id', '=', new Column('account_permission.account_permission_id2')) + ->where('account_permission.account_permission_r', '=', 1); + } +} diff --git a/Models/NullCollection.php b/Models/NullCollection.php new file mode 100644 index 0000000..0e76639 --- /dev/null +++ b/Models/NullCollection.php @@ -0,0 +1,31 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class NullCollection extends Collection +{ +} diff --git a/Models/NullMedia.php b/Models/NullMedia.php new file mode 100644 index 0000000..f75b531 --- /dev/null +++ b/Models/NullMedia.php @@ -0,0 +1,31 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class NullMedia extends Media +{ +} diff --git a/Models/Upload.js b/Models/Upload.js new file mode 100644 index 0000000..cffbe6f --- /dev/null +++ b/Models/Upload.js @@ -0,0 +1,75 @@ +(function (jsOMS, undefined) { + jsOMS.Modules.Models.Media = typeof jsOMS.Modules.Models.Media == 'undefined' ? {} : jsOMS.Modules.Models.Media; + + jsOMS.Modules.Models.Media.Upload = function (responseManager) { + this.responseManager = responseManager; + this.success = []; + + this.uri = ''; + this.allowedTypes = []; + this.maxFileSize = 0; + this.files = []; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setSuccess = function (id, callback) { + this.success[id] = callback; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setUri = function (uri) { + this.uri = uri; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setAllowedTypes = function (allowed) { + this.allowedTypes = allowed; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.addAllowedType = function (allowed) { + this.allowedTypes.push(allowed); + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setMaxFileSize = function (size) { + this.maxFileSize = size; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.addFile = function (file) { + this.files.push(file); + }; + + jsOMS.Modules.Models.Media.Upload.prototype.upload = function (formId) { + // TODO: validate file type + file size + + var request = new jsOMS.Request(), + formData = new FormData(), + self = this; + + this.files.forEach(function (element, index) { + formData.append('file' + index, element); + }); + + request.setData(formData); + request.setType('raw'); + request.setUri(this.uri); + request.setMethod('POST'); + request.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); + request.setSuccess(function (xhr) { + console.log(xhr); // TODO: remove this is for error checking + var o = JSON.parse(xhr.response), + response = Object.keys(o).map(function (k) { + return o[k]; + }); + + console.log(response); + + for (var k = 0; k < response.length; k++) { + if (response[k] !== null) { + if (!self.success[formId]) { + self.responseManager.execute(response[k].type, response[k]); + } else { + self.success[formId](response[k].type, response[k]); + } + } + } + }); + request.send(); + }; +}(window.jsOMS = window.jsOMS || {})); diff --git a/Models/UploadFile.php b/Models/UploadFile.php new file mode 100644 index 0000000..b79de2d --- /dev/null +++ b/Models/UploadFile.php @@ -0,0 +1,317 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + + +/** + * Upload. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class UploadFile +{ + + /** + * Upload max size. + * + * @var \int + * @since 1.0.0 + */ + private $maxSize = 50000000; + + /** + * Allowed mime types. + * + * @var array + * @since 1.0.0 + */ + private $allowedTypes = []; + + /** + * Output directory. + * + * @var \string + * @since 1.0.0 + */ + private $outputDir = '/Modules/Media/Files'; + + /** + * Output file name. + * + * @var \string + * @since 1.0.0 + */ + private $fileName = ''; + + /** + * Output file name. + * + * @var \bool + * @since 1.0.0 + */ + private $preserveFileName = true; + + /** + * Upload file to server. + * + * @param array $files File data ($_FILE) + * + * @return array + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function upload(array $files) : array + { + $result = []; + + if (count($files) == count($files, COUNT_RECURSIVE)) { + $files = [$files]; + } + + if (count($files) > 1) { + do { + $rndPath = str_pad(dechex(rand(0, 65535)), 4, '0', STR_PAD_LEFT); + } while (file_exists($this->outputDir . '/' . $rndPath)); + + $this->outputDir = $this->outputDir . '/' . $rndPath; + } + + $rpath = $this->outputDir; + + foreach ($files as $key => $f) { + $result[$key] = []; + + if (!isset($f['error'])) { + // TODO: handle wrong parameters + $result[$key]['status'] = UploadStatus::WRONG_PARAMETERS; + + return $result; + } + + switch ($f['error']) { + case UPLOAD_ERR_OK: + break; + case UPLOAD_ERR_NO_FILE: + // TODO: no file sent + $result[$key]['status'] = UploadStatus::NOTHING_UPLOADED; + + return $result; + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + // too large + $result[$key]['status'] = UploadStatus::UPLOAD_SIZE; + + return $result; + default: + $result[$key]['status'] = UploadStatus::UNKNOWN_ERROR; + + return $result; + } + + $result[$key]['size'] = $f['size']; + + if ($f['size'] > $this->maxSize) { + // too large2 + $result[$key]['status'] = UploadStatus::CONFIG_SIZE; + + return $result; + } + // TODO: do I need pecl fileinfo? + if (!empty($this->allowedTypes) && false === $ext = array_search($f['type'], $this->allowedTypes, true)) { + // wrong file format + $result[$key]['status'] = UploadStatus::WRONG_EXTENSION; + + return $result; + } + + $path = __DIR__ . '/../../..' . $this->outputDir; + + if ($this->preserveFileName) { + $this->fileName = $f['name']; + } + + $split = explode('.', $f['name']); + $extension = count($split) > 1 ? $split[count($split) - 1] : ''; + $result[$key]['extension'] = $extension; + + if (!$this->fileName || empty($this->fileName) || file_exists($path . '/' . $this->fileName)) { + $rnd = ''; + + do { + $sha = sha1_file($f['tmp_name'] . $rnd); + $sha .= '.' . $extension; + + if ($sha === false) { + $result[$key]['status'] = UploadStatus::FAILED_HASHING; + + return $result; + } + + $this->fileName = $sha; + $rnd = rand(); + } while (file_exists($path . '/' . $this->fileName)); + } + + $result[$key]['filename'] = $this->fileName; + + if (!is_dir($path)) { + \mkdir($path, '0655', true); + } + + if (!move_uploaded_file($f['tmp_name'], $path . '/' . $this->fileName)) { + // couldn't move + $result[$key]['status'] = UploadStatus::NOT_MOVABLE; + + return $result; + } + + $result[$key]['path'] = $rpath; + + $result[$key]['status'] = UploadStatus::OK; + } + + return $result; + } + + /** + * @return \int + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getMaxSize() : \int + { + return $this->maxSize; + } + + /** + * @param \int $maxSize + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setMaxSize(\int $maxSize) + { + $this->maxSize = $maxSize; + } + + /** + * @return array + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getAllowedTypes() : array + { + return $this->allowedTypes; + } + + /** + * @param array $allowedTypes + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setAllowedTypes(array $allowedTypes) + { + $this->allowedTypes = $allowedTypes; + } + + /** + * @param array $allowedTypes + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function addAllowedTypes($allowedTypes) + { + $this->allowedTypes[] = $allowedTypes; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getOutputDir() : \string + { + return $this->outputDir; + } + + /** + * @param \string $outputDir + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setOutputDir(\string $outputDir) + { + $this->outputDir = $outputDir; + } + + /** + * @return \string + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function getFileName() : \string + { + return $this->fileName; + } + + /** + * @param \string $fileName + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setFileName(\string $fileName) + { + $this->fileName = $fileName; + } + + /** + * @param \bool $preserveFileName + * + * @return void + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function setPreserveFileName(\bool $preserveFileName) + { + $this->preserveFileName = $preserveFileName; + } +} diff --git a/Models/UploadStatus.php b/Models/UploadStatus.php new file mode 100644 index 0000000..303e200 --- /dev/null +++ b/Models/UploadStatus.php @@ -0,0 +1,42 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Models; + +use phpOMS\Datatypes\Enum; + +/** + * Upload status. + * + * @category Framework + * @package phpOMS\DataStorage\Database + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +abstract class UploadStatus extends Enum +{ + const OK = 0; + const WRONG_PARAMETERS = -1; + const NOTHING_UPLOADED = -2; + const UPLOAD_SIZE = -3; + const UNKNOWN_ERROR = -4; + const CONFIG_SIZE = -5; + const WRONG_EXTENSION = -6; + const NOT_MOVABLE = -7; + const FAILED_HASHING = -8; +} diff --git a/ModuleMedia.js b/ModuleMedia.js new file mode 100644 index 0000000..65fa2da --- /dev/null +++ b/ModuleMedia.js @@ -0,0 +1,115 @@ +(function (jsOMS, undefined) { + jsOMS.Modules.Models.Media = typeof jsOMS.Modules.Models.Media == 'undefined' ? {} : jsOMS.Modules.Models.Media; + + jsOMS.Modules.Models.Media.Upload = function (responseManager) { + this.responseManager = responseManager; + this.success = []; + + this.uri = ''; + this.allowedTypes = []; + this.maxFileSize = 0; + this.files = []; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setSuccess = function (id, callback) { + this.success[id] = callback; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setUri = function (uri) { + this.uri = uri; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setAllowedTypes = function (allowed) { + this.allowedTypes = allowed; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.addAllowedType = function (allowed) { + this.allowedTypes.push(allowed); + }; + + jsOMS.Modules.Models.Media.Upload.prototype.setMaxFileSize = function (size) { + this.maxFileSize = size; + }; + + jsOMS.Modules.Models.Media.Upload.prototype.addFile = function (file) { + this.files.push(file); + }; + + jsOMS.Modules.Models.Media.Upload.prototype.upload = function (formId) { + // TODO: validate file type + file size + + var request = new jsOMS.Request(), + formData = new FormData(), + self = this; + + this.files.forEach(function (element, index) { + formData.append('file' + index, element); + }); + + request.setData(formData); + request.setType('raw'); + request.setUri(this.uri); + request.setMethod('POST'); + request.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); + request.setSuccess(function (xhr) { + console.log(xhr); // TODO: remove this is for error checking + var o = JSON.parse(xhr.response), + response = Object.keys(o).map(function (k) { + return o[k]; + }); + + console.log(response); + + for (var k = 0; k < response.length; k++) { + if (response[k] !== null) { + if (!self.success[formId]) { + self.responseManager.execute(response[k].type, response[k]); + } else { + self.success[formId](response[k].type, response[k]); + } + } + } + }); + request.send(); + }; +}(window.jsOMS = window.jsOMS || {})); +(function (jsOMS, undefined) { + jsOMS.Modules.Media = function (app) { + this.app = app; + }; + + jsOMS.Modules.Media.prototype.bind = function () { + var forms = document.getElementsByTagName('form'); + + /* Handle media forms */ + for (var c = 0; c < forms.length; c++) { + var self = this; + + this.app.uiManager.getFormManager().injectSubmit(forms[c].id, function (e) { + var fileFields = e.querySelectorAll('input[type=file]'), + uploader = new jsOMS.Modules.Models.Media.Upload(self.app.responseManager); + + uploader.setSuccess(e.id, function (type, response) { + e.querySelector('input[type=file]+input[type=hidden]').value = JSON.stringify(response.uploads); + + var data = self.app.uiManager.getFormManager().getData(e); + self.app.uiManager.getFormManager().submit(e, data); + }); + + uploader.setUri('http://127.0.0.1/en/api/media.php'); + + for (var i = 0; i < fileFields.length; i++) { + for (var j = 0; j < fileFields[i].files.length; j++) { + uploader.addFile(fileFields[i].files[j]); + } + } + + uploader.upload(e.id); + }); + } + } +}(window.jsOMS = window.jsOMS || {})); + +jsOMS.ready(function () { + window.omsApp.moduleManager.get('Media').bind(); +}); diff --git a/README.md b/README.md new file mode 100644 index 0000000..27f632f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Media # diff --git a/Theme/backend/Elements/media-create-directory.tpl.php b/Theme/backend/Elements/media-create-directory.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/backend/Elements/media-select.tpl.php b/Theme/backend/Elements/media-select.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/backend/Elements/media-upload.tpl.php b/Theme/backend/Elements/media-upload.tpl.php new file mode 100644 index 0000000..78c288d --- /dev/null +++ b/Theme/backend/Elements/media-upload.tpl.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Theme/backend/media-create.tpl.php b/Theme/backend/media-create.tpl.php new file mode 100644 index 0000000..c30c285 --- /dev/null +++ b/Theme/backend/media-create.tpl.php @@ -0,0 +1,34 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + */ + +echo $this->getData('nav')->render(); ?> +
+

l11n->lang['Media']['Upload']; ?>

+
+
+ +
+
+
+
+
+
+
+
+
diff --git a/Theme/backend/media-list.tpl.php b/Theme/backend/media-list.tpl.php new file mode 100644 index 0000000..0b3de86 --- /dev/null +++ b/Theme/backend/media-list.tpl.php @@ -0,0 +1,47 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + */ + + +$footerView = new \Web\Views\Lists\PaginationView($this->app, $this->request, $this->response); +$footerView->setTemplate('/Web/Templates/Lists/Footer/PaginationBig'); +$footerView->setPages(20); +$footerView->setPage(1); + +echo $this->getData('nav')->render(); ?> +
+ + + + + + + + $value) : $count++; ?> + + +
l11n->lang['Media']['Media']; ?>
l11n->lang['Media']['Name']; ?> + l11n->lang['Media']['Type']; ?> + l11n->lang['Media']['Size']; ?> + l11n->lang['Media']['Creator']; ?> + l11n->lang['Media']['Created']; ?> +
render(); ?> +
l11n->lang[0]['Empty']; ?> + +
+
diff --git a/Theme/backend/media-single.tpl.php b/Theme/backend/media-single.tpl.php new file mode 100644 index 0000000..978b210 --- /dev/null +++ b/Theme/backend/media-single.tpl.php @@ -0,0 +1,88 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** @noinspection PhpUndefinedMethodInspection */ +\phpOMS\Module\ModuleFactory::$loaded['Navigation']->call([\Modules\Navigation\Models\NavigationType::CONTENT, + 1000401001,]); +?> + +
+

+ app->accountManager->get($request->getAccount())->getL11n()->lang['Media']['Preview']; ?> + + +

+ +
+
+
+ +
+

+ app->accountManager->get($request->getAccount())->getL11n()->lang['Media']['Data']; ?> + + +

+ +
+ + + + + + + + + +
+ getName(); ?> +
+ getExtension(); ?> +
+ getSize()); ?> +
+ getAuthor(); ?> +
+ getCreated()->format('Y-m-d H:i:s'); ?> +
+ asldkf +
+ asldkf +
+ +
+
+ + +
+

+ app->accountManager->get($request->getAccount())->getL11n()->lang['Media']['Settings']; ?> + + +

+ +
+
    +
  • + +
  • + +
  • + +
  • +
+
+
diff --git a/Theme/lang/api.en.lang.php b/Theme/lang/api.en.lang.php new file mode 100644 index 0000000..d53f90f --- /dev/null +++ b/Theme/lang/api.en.lang.php @@ -0,0 +1,18 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +$MODLANG[1] = [ + 'i:ModuleInstalled' => 'Installation of the module {$1} was successful.', +]; diff --git a/Theme/lang/backend.en.lang.php b/Theme/lang/backend.en.lang.php new file mode 100644 index 0000000..9e8d3d4 --- /dev/null +++ b/Theme/lang/backend.en.lang.php @@ -0,0 +1,36 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +$MODLANG['Media'] = [ + 'Account' => 'Account', + 'Author' => 'Author', + 'Changed' => 'Changed', + 'Changedby' => 'Changed by', + 'Created' => 'Created', + 'Creator' => 'Creator', + 'Data' => 'Data', + 'Editability' => 'Editability', + 'Extension' => 'Extension', + 'Files' => 'Files', + 'Media' => 'Media', + 'Name' => 'Name', + 'Permission' => 'Permission', + 'Preview' => 'Preview', + 'Settings' => 'Settings', + 'Size' => 'Size', + 'Type' => 'Type', + 'Upload' => 'Upload', + 'Visibility' => 'Visibility', +]; diff --git a/Theme/lang/nav.backend.en.lang.php b/Theme/lang/nav.backend.en.lang.php new file mode 100644 index 0000000..265ac74 --- /dev/null +++ b/Theme/lang/nav.backend.en.lang.php @@ -0,0 +1,20 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +$MODLANG['Navigation'] = [ + 'Create' => 'Create', + 'List' => 'List', + 'Media' => 'Media', +]; diff --git a/Views/MediaCreateView.php b/Views/MediaCreateView.php new file mode 100644 index 0000000..b945a52 --- /dev/null +++ b/Views/MediaCreateView.php @@ -0,0 +1,33 @@ + + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media\Views; + +use phpOMS\Views\View; + +/** + * Media list view. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class MediaCreateView extends View +{ +} diff --git a/img/module_teaser_small.png b/img/module_teaser_small.png new file mode 100644 index 0000000..f56e6ff Binary files /dev/null and b/img/module_teaser_small.png differ diff --git a/info.json b/info.json new file mode 100644 index 0000000..165b10b --- /dev/null +++ b/info.json @@ -0,0 +1,80 @@ +{ + "name": { + "id": 1000400000, + "internal": "Media", + "external": "OMS Media" + }, + "version": "1.0.0", + "requirements": { + "phpOMS": "1.0.0", + "phpOMS-db": "1.0.0" + }, + "creator": { + "name": "Orange Management", + "website": "www.spl1nes.com" + }, + "description": "The profile module.", + "directory": "Media", + "dependencies": {}, + "providing": { + "Navigation": "*" + }, + "load": [ + { + "pid": [ + "1ba288c868cacf14e56f8205efef31d697301d02" + ], + "type": 4, + "for": "Content", + "file": "Media", + "from": "Media" + }, + { + "pid": [ + "15b5e54cc7b2f8bdb84ed667d9931d758c6bc108" + ], + "type": 4, + "for": "CostUnitAccounting", + "file": "Media", + "from": "Media" + }, + { + "pid": [ + "e56f238d391b804975e0f47f26d20b6d2d675200" + ], + "type": 4, + "for": "Admin", + "file": "Media", + "from": "Media" + }, + { + "pid": [ + "1ba288c868cacf14e56f8205efef31d697301d02", + "e269b5109994852366c276ad5f6bb4ef89f45d2e", + "e56f238d391b804975e0f47f26d20b6d2d675200" + ], + "type": 5, + "for": "Content", + "file": "backend", + "from": "Media" + }, + { + "pid": [ + "15b5e54cc7b2f8bdb84ed667d9931d758c6bc108" + ], + "type": 5, + "for": "CostUnitAccounting", + "file": "api", + "from": "Media" + }, + { + "pid": [ + "754a08ddf8bcb1cf22f310f09206dd783d42f7dd" + ], + "type": 5, + "from": "Media", + "for": "Navigation", + "file": "nav.backend" + } + ] +}