diff --git a/Admin/Install/db.json b/Admin/Install/db.json
index 8a89b19..12eca72 100755
--- a/Admin/Install/db.json
+++ b/Admin/Install/db.json
@@ -13,6 +13,11 @@
"name": "media_type_name",
"type": "VARCHAR(255)",
"null": false
+ },
+ "media_type_isvisible": {
+ "name": "media_type_isvisible",
+ "type": "TINYINT(1)",
+ "null": false
}
}
},
diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php
index 0517e88..f694ce4 100755
--- a/Admin/Routes/Web/Backend.php
+++ b/Admin/Routes/Web/Backend.php
@@ -18,6 +18,28 @@ use phpOMS\Account\PermissionType;
use phpOMS\Router\RouteVerb;
return [
+ '^.*/admin/module/settings\?id=Media$' => [
+ [
+ 'dest' => '\Modules\Media\Controller\BackendController:viewModuleSettings',
+ 'verb' => RouteVerb::GET,
+ 'permission' => [
+ 'module' => BackendController::NAME,
+ 'type' => PermissionType::READ,
+ 'state' => \Modules\Admin\Models\PermissionState::MODULE,
+ ],
+ ],
+ ],
+ '^.*/admin/module/settings\?id=Media&type=.*?$' => [
+ [
+ 'dest' => '\Modules\Media\Controller\BackendController:viewMediaTypeSettings',
+ 'verb' => RouteVerb::GET,
+ 'permission' => [
+ 'module' => BackendController::NAME,
+ 'type' => PermissionType::READ,
+ 'state' => \Modules\Admin\Models\PermissionState::MODULE,
+ ],
+ ],
+ ],
'^.*/media/list.*$' => [
[
'dest' => '\Modules\Media\Controller\BackendController:viewMediaList',
diff --git a/Admin/Settings/Theme/Backend/settings-type.tpl.php b/Admin/Settings/Theme/Backend/settings-type.tpl.php
new file mode 100644
index 0000000..e69de29
diff --git a/Admin/Settings/Theme/Backend/settings.tpl.php b/Admin/Settings/Theme/Backend/settings.tpl.php
new file mode 100644
index 0000000..b88485d
--- /dev/null
+++ b/Admin/Settings/Theme/Backend/settings.tpl.php
@@ -0,0 +1,85 @@
+getData('types') ?? [];
+
+echo $this->getData('nav')->render(); ?>
+
+
+
+
+
= $this->getHtml('Types'); ?>
+
+
+
+
diff --git a/Controller/ApiController.php b/Controller/ApiController.php
index b13862f..7124d71 100755
--- a/Controller/ApiController.php
+++ b/Controller/ApiController.php
@@ -642,7 +642,9 @@ final class ApiController extends Controller
$view = new View($this->app->l11nManager, $request, $response);
$view->setData('media', $media);
- $response->endAllOutputBuffering(); // for large files
+ if (!\headers_sent()) {
+ $response->endAllOutputBuffering(); // for large files
+ }
if (($type = $request->getData('type')) === null) {
$view->setTemplate('/Modules/Media/Theme/Api/render');
diff --git a/Controller/BackendController.php b/Controller/BackendController.php
index cfccd9b..fa0a59f 100755
--- a/Controller/BackendController.php
+++ b/Controller/BackendController.php
@@ -14,11 +14,15 @@ declare(strict_types=1);
namespace Modules\Media\Controller;
+use Model\NullSetting;
+use Model\SettingMapper;
use Modules\Admin\Models\Account;
use Modules\Media\Models\Collection;
use Modules\Media\Models\CollectionMapper;
use Modules\Media\Models\Media;
use Modules\Media\Models\MediaMapper;
+use Modules\Media\Models\MediaTypeMapper;
+use Modules\Media\Models\MediaTypeL11nMapper;
use Modules\Media\Models\NullMedia;
use Modules\Media\Theme\Backend\Components\Media\ElementView;
use Modules\Media\Theme\Backend\Components\Media\ListView;
@@ -262,6 +266,70 @@ final class BackendController extends Controller
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 viewModuleSettings(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
+ {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response));
+
+ $id = $request->getData('id') ?? '';
+
+ $settings = SettingMapper::getFor($id, 'module');
+ if (!($settings instanceof NullSetting)) {
+ $view->setData('settings', !\is_array($settings) ? [$settings] : $settings);
+ }
+
+ $types = MediaTypeMapper::with('language', $response->getLanguage())::getAll();
+ $view->setData('types', $types);
+
+ if (\is_file(__DIR__ . '/../Admin/Settings/Theme/Backend/settings.tpl.php')) {
+ $view->setTemplate('/Modules/' . static::NAME . '/Admin/Settings/Theme/Backend/settings');
+ } else {
+ $view->setTemplate('/Modules/Admin/Theme/Backend/modules-settings');
+ }
+
+ 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 viewMediaTypeSettings(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
+ {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Modules/' . static::NAME . '/Admin/Settings/Theme/Backend/settings-type');
+
+ $type = MediaTypeMapper::with('language', $response->getLanguage())::get((int) $request->getData('id'));
+
+ $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007501001, $request, $response));
+ $view->addData('type', $type);
+
+ $l11n = MediaTypeL11nMapper::with('tag', $type->getId())::getAll();
+ $view->addData('l11n', $l11n);
+
+ return $view;
+ }
+
/**
* Routing end-point for application behaviour.
*
diff --git a/Models/MediaType.php b/Models/MediaType.php
index 6541ed9..d6fdd14 100644
--- a/Models/MediaType.php
+++ b/Models/MediaType.php
@@ -45,6 +45,14 @@ class MediaType implements \JsonSerializable, ArrayableInterface
*/
public string $name = '';
+ /**
+ * Is this media type visible in lists or only internal?
+ *
+ * @var bool
+ * @since 1.0.0
+ */
+ public bool $isVisible = true;
+
/**
* Title.
*
diff --git a/Models/MediaTypeMapper.php b/Models/MediaTypeMapper.php
index 01d22e8..d7154ea 100644
--- a/Models/MediaTypeMapper.php
+++ b/Models/MediaTypeMapper.php
@@ -35,6 +35,7 @@ final class MediaTypeMapper extends DataMapperAbstract
protected static array $columns = [
'media_type_id' => ['name' => 'media_type_id', 'type' => 'int', 'internal' => 'id'],
'media_type_name' => ['name' => 'media_type_name', 'type' => 'string', 'internal' => 'name'],
+ 'media_type_isvisible' => ['name' => 'media_type_isvisible', 'type' => 'bool', 'internal' => 'isVisible'],
];
/**
diff --git a/tests/Controller/Api/ApiControllerMediaTrait.php b/tests/Controller/Api/ApiControllerMediaTrait.php
index 51c7daa..96fe96b 100755
--- a/tests/Controller/Api/ApiControllerMediaTrait.php
+++ b/tests/Controller/Api/ApiControllerMediaTrait.php
@@ -272,6 +272,8 @@ trait ApiControllerMediaTrait
$response = new HttpResponse();
$request = new HttpRequest(new HttpUri(''));
+ $response->header->lock();
+
$request->header->account = 1;
$request->setData('type', 'html');