l11n, unit/app and simplification fixes

This commit is contained in:
Dennis Eichhorn 2023-01-07 19:00:32 +01:00
parent 36e6f0f8c1
commit 81519fe144
16 changed files with 171 additions and 365 deletions

View File

@ -174,6 +174,30 @@
"foreignTable": "media",
"foreignKey": "media_id"
},
"media_unit": {
"name": "media_unit",
"type": "INT",
"default": null,
"null": true,
"foreignTable": "organization_unit",
"foreignKey": "organization_unit_id"
},
"media_language": {
"name": "media_language",
"type": "VARCHAR(2)",
"null": true,
"default": null,
"foreignTable": "language",
"foreignKey": "language_639_1"
},
"media_country": {
"name": "media_country",
"type": "VARCHAR(2)",
"null": true,
"default": null,
"foreignTable": "country",
"foreignKey": "country_code2"
},
"media_created_by": {
"name": "media_created_by",
"type": "INT",

View File

@ -210,6 +210,11 @@ final class Installer extends InstallerAbstract
$request->header->account = 1;
$request->setData('name', $data['name'] ?? '');
if (!empty($data['l11n'])) {
$request->setData('title', \reset($data['l11n'])['title']);
$request->setData('lang', \reset($data['l11n'])['lang']);
}
$module->apiMediaTypeCreate($request, $response);
$responseData = $response->get('');
@ -220,7 +225,13 @@ final class Installer extends InstallerAbstract
$type = $responseData['response'];
$id = $type->getId();
$isFirst = true;
foreach ($data['l11n'] as $l11n) {
if ($isFirst) {
$isFirst = false;
continue;
}
$response = new HttpResponse();
$request = new HttpRequest(new HttpUri(''));

View File

@ -22,7 +22,7 @@ use Modules\Media\Models\Media;
use Modules\Media\Models\MediaContent;
use Modules\Media\Models\MediaMapper;
use Modules\Media\Models\MediaType;
use Modules\Media\Models\MediaTypeL11n;
use phpOMS\Localization\BaseStringL11n;
use Modules\Media\Models\MediaTypeL11nMapper;
use Modules\Media\Models\MediaTypeMapper;
use Modules\Media\Models\NullCollection;
@ -52,7 +52,6 @@ use phpOMS\System\File\Local\Directory;
use phpOMS\System\MimeType;
use phpOMS\Utils\ImageUtils;
use phpOMS\Utils\Parser\Markdown\Markdown;
use phpOMS\Utils\Parser\Pdf\PdfParser;
use phpOMS\Views\View;
/**
@ -81,16 +80,19 @@ final class ApiController extends Controller
public function apiMediaUpload(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
{
$uploads = $this->uploadFiles(
names: $request->getDataList('names'),
fileNames: $request->getDataList('filenames'),
files: $request->getFiles(),
account: $request->header->account,
basePath: __DIR__ . '/../../../Modules/Media/Files' . \urldecode((string) ($request->getData('path') ?? '')),
virtualPath: \urldecode((string) ($request->getData('virtualpath') ?? '')),
type: $request->getData('type', 'int'),
password: (string) ($request->getData('password') ?? ''),
encryptionKey: (string) ($request->getData('encrypt') ?? ''),
pathSettings: (int) ($request->getData('pathsettings') ?? PathSettings::RANDOM_PATH) // IMPORTANT!!!
names: $request->getDataList('names'),
fileNames: $request->getDataList('filenames'),
files: $request->getFiles(),
account: $request->header->account,
basePath: __DIR__ . '/../../../Modules/Media/Files' . \urldecode((string) ($request->getData('path') ?? '')),
virtualPath: \urldecode((string) ($request->getData('virtualpath') ?? '')),
type: $request->getData('type', 'int'),
password: (string) ($request->getData('password') ?? ''),
encryptionKey: (string) ($request->getData('encrypt') ?? ''),
pathSettings: (int) ($request->getData('pathsettings') ?? PathSettings::RANDOM_PATH), // IMPORTANT!!!
hasAccountRelation: (bool) ($request->getData('link_account') ?? false),
readContent: (bool) ($request->getData('parse_content') ?? false),
unit: $request->getData('unit', 'int')
);
$ids = [];
@ -166,7 +168,9 @@ final class ApiController extends Controller
string $password = '',
string $encryptionKey = '',
int $pathSettings = PathSettings::RANDOM_PATH,
bool $hasAccountRelation = true
bool $hasAccountRelation = true,
bool $readContent = false,
int $unit = null
) : array
{
if (empty($files)) {
@ -208,7 +212,9 @@ final class ApiController extends Controller
$account,
$virtualPath,
$type,
app: $hasAccountRelation ? $this->app : null
app: $hasAccountRelation ? $this->app : null,
readContent: $readContent,
unit: $unit
);
}
@ -265,6 +271,7 @@ final class ApiController extends Controller
* @param null|int $type Media type (internal categorization)
* @param string $ip Ip of the origin
* @param null|ApplicationAbstract $app Should create relation to uploader
* @param bool $readContent Should the content of the file be stored in the db
*
* @return Media
*
@ -276,7 +283,9 @@ final class ApiController extends Controller
string $virtualPath = '',
int $type = null,
string $ip = '127.0.0.1',
ApplicationAbstract $app = null
ApplicationAbstract $app = null,
bool $readContent = false,
int $unit = null
) : Media
{
if (!isset($status['status']) || $status['status'] !== UploadStatus::OK) {
@ -291,9 +300,10 @@ final class ApiController extends Controller
$media->createdBy = new NullAccount($account);
$media->extension = $status['extension'];
$media->type = $type === null ? null : new NullMediaType($type);
$media->unit = $unit;
$media->setVirtualPath($virtualPath);
if (\is_file($media->getAbsolutePath())) {
if ($readContent && \is_file($media->getAbsolutePath())) {
$content = self::loadFileContent($media->getAbsolutePath(), $media->extension);
if (!empty($content)) {
@ -335,23 +345,36 @@ final class ApiController extends Controller
*
* @since 1.0.0
*/
private static function loadFileContent(string $path, string $extension) : string
public static function loadFileContent(string $path, string $extension, string $output = 'html') : string
{
switch ($extension) {
case 'pdf':
return PdfParser::pdf2text($path, __DIR__ . '/../../../Tools/OCRImageOptimizer/bin/App');
return \phpOMS\Utils\Parser\Pdf\PdfParser::pdf2text($path/*, __DIR__ . '/../../../Tools/OCRImageOptimizer/bin/OCRImageOptimizerApp'*/);
case 'doc':
case 'docx':
Autoloader::addPath(__DIR__ . '/../../../Resources/');
if (!Autoloader::inPaths($include = \realpath(__DIR__ . '/../../../Resources/'))) {
Autoloader::addPath($include);
}
$reader = IOFactory::createReader('Word2007');
$doc = $reader->load($path);
return \phpOMS\Utils\Parser\Document\DocumentParser::parseDocument($path, $output);
case 'ppt':
case 'pptx':
if (!Autoloader::inPaths($include = \realpath(__DIR__ . '/../../../Resources/'))) {
Autoloader::addPath($include);
}
$writer = new HTML($doc);
return $writer->getContent();
return \phpOMS\Utils\Parser\Presentation\PresentationParser::parsePresentation($path, $output);
case 'xls':
case 'xlsx':
if (!Autoloader::inPaths($include = \realpath(__DIR__ . '/../../../Resources/'))) {
Autoloader::addPath($include);
}
return \phpOMS\Utils\Parser\Spreadsheet\SpreadsheetParser::parseSpreadsheet($path, $output);
case 'txt':
case 'md':
$contents = \file_get_contents($path);
return $contents === false ? '' : $contents;
default:
return '';
@ -710,7 +733,8 @@ final class ApiController extends Controller
$virtualPath,
$request->getData('type', 'int'),
$request->getOrigin(),
$this->app
$this->app,
unit: $request->getData('unit', 'int')
);
$ids[] = $created->getId();
@ -1015,15 +1039,15 @@ final class ApiController extends Controller
*
* @param RequestAbstract $request Request
*
* @return MediaTypeL11n
* @return BaseStringL11n
*
* @since 1.0.0
*/
private function createMediaTypeL11nFromRequest(RequestAbstract $request) : MediaTypeL11n
private function createMediaTypeL11nFromRequest(RequestAbstract $request) : BaseStringL11n
{
$l11nMediaType = new MediaTypeL11n();
$l11nMediaType->type = (int) ($request->getData('type') ?? 0);
$l11nMediaType->title = (string) ($request->getData('title') ?? '');
$l11nMediaType = new BaseStringL11n();
$l11nMediaType->ref = (int) ($request->getData('type') ?? 0);
$l11nMediaType->content = (string) ($request->getData('title') ?? '');
$l11nMediaType->setLanguage((string) (
$request->getData('language') ?? $request->getLanguage()
));

View File

@ -406,7 +406,7 @@ final class BackendController extends Controller
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/' . static::NAME . '/Admin/Settings/Theme/Backend/settings-type');
/** @var \Modules\Media\Models\MediaType $type */
/** @var \phpOMS\Localization\BaseStringL11n $type */
$type = MediaTypeMapper::get()
->with('title')
->where('title/language', $response->getLanguage())

View File

@ -181,6 +181,14 @@ class Media implements \JsonSerializable
*/
public int $class = MediaClass::FILE;
/**
* Unit
*
* @var null|int
* @since 1.0.0
*/
public ?int $unit = null;
/**
* Tags.
*
@ -189,6 +197,22 @@ class Media implements \JsonSerializable
*/
protected array $tags = [];
/**
* Language.
*
* @var null|string
* @since 1.0.0
*/
protected ?string $language = null;
/**
* Country.
*
* @var null|string
* @since 1.0.0
*/
protected ?string $country = null;
/**
* Constructor.
*

View File

@ -53,6 +53,9 @@ class MediaMapper extends DataMapperFactory
'media_size' => ['name' => 'media_size', 'type' => 'int', 'internal' => 'size'],
'media_source' => ['name' => 'media_source', 'type' => 'int', 'internal' => 'source'],
'media_class' => ['name' => 'media_class', 'type' => 'int', 'internal' => 'class'],
'media_language' => ['name' => 'media_language', 'type' => 'string', 'internal' => 'language'],
'media_country' => ['name' => 'media_country', 'type' => 'string', 'internal' => 'country'],
'media_unit' => ['name' => 'media_unit', 'type' => 'int', 'internal' => 'unit', 'readonly' => true],
'media_created_by' => ['name' => 'media_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true],
'media_created_at' => ['name' => 'media_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true],
];

View File

@ -15,6 +15,7 @@ declare(strict_types=1);
namespace Modules\Media\Models;
use phpOMS\Localization\ISO639x1Enum;
use phpOMS\Localization\BaseStringL11n;
/**
* Media type class.
@ -55,10 +56,10 @@ class MediaType implements \JsonSerializable
/**
* Title.
*
* @var string|MediaTypeL11n
* @var string|BaseStringL11n
* @since 1.0.0
*/
protected $title = '';
protected string | BaseStringL11n $title = '';
/**
* Constructor.
@ -91,28 +92,29 @@ class MediaType implements \JsonSerializable
*/
public function getL11n() : string
{
return $this->title instanceof MediaTypeL11n ? $this->title->title : $this->title;
return $this->title instanceof BaseStringL11n ? $this->title->content : $this->title;
}
/**
* Set title
*
* @param string|MediaTypeL11n $title Media article title
* @param string $lang Language
* @param string|BaseStringL11n $title Media article title
* @param string $lang Language
*
* @return void
*
* @since 1.0.0
*/
public function setL11n(string | MediaTypeL11n $title, string $lang = ISO639x1Enum::_EN) : void
public function setL11n(string | BaseStringL11n $title, string $lang = ISO639x1Enum::_EN) : void
{
if ($title instanceof MediaTypeL11n) {
if ($title instanceof BaseStringL11n) {
$this->title = $title;
} elseif ($this->title instanceof MediaTypeL11n) {
$this->title->title = $title;
} elseif ($this->title instanceof BaseStringL11n) {
$this->title->content = $title;
} else {
$this->title = new MediaTypeL11n();
$this->title->title = $title;
$this->title = new BaseStringL11n();
$this->title->ref = $this->id;
$this->title->content = $title;
$this->title->setLanguage($lang);
}
}

View File

@ -1,132 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\Media\Models
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\Media\Models;
use phpOMS\Localization\ISO639x1Enum;
/**
* Media type l11n class.
*
* @package Modules\Media\Models
* @license OMS License 1.0
* @link https://jingga.app
* @since 1.0.0
*/
class MediaTypeL11n implements \JsonSerializable
{
/**
* ID.
*
* @var int
* @since 1.0.0
*/
protected int $id = 0;
/**
* Type ID.
*
* @var int
* @since 1.0.0
*/
public int $type = 0;
/**
* Language.
*
* @var string
* @since 1.0.0
*/
protected string $language = ISO639x1Enum::_EN;
/**
* Title.
*
* @var string
* @since 1.0.0
*/
public string $title = '';
/**
* Constructor.
*
* @param string $title Title
*
* @since 1.0.0
*/
public function __construct(string $title = '', string $language = ISO639x1Enum::_EN)
{
$this->title = $title;
$this->language = $language;
}
/**
* Get id
*
* @return int
*
* @since 1.0.0
*/
public function getId() : int
{
return $this->id;
}
/**
* Get language
*
* @return string
*
* @since 1.0.0
*/
public function getLanguage() : string
{
return $this->language;
}
/**
* Set language
*
* @param string $language Language
*
* @return void
*
* @since 1.0.0
*/
public function setLanguage(string $language) : void
{
$this->language = $language;
}
/**
* {@inheritdoc}
*/
public function toArray() : array
{
return [
'id' => $this->id,
'title' => $this->title,
'type' => $this->type,
'language' => $this->language,
];
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return $this->toArray();
}
}

View File

@ -15,6 +15,7 @@ declare(strict_types=1);
namespace Modules\Media\Models;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
use phpOMS\Localization\BaseStringL11n;
/**
* Media type l11n mapper class.
@ -34,8 +35,8 @@ final class MediaTypeL11nMapper extends DataMapperFactory
*/
public const COLUMNS = [
'media_type_l11n_id' => ['name' => 'media_type_l11n_id', 'type' => 'int', 'internal' => 'id'],
'media_type_l11n_title' => ['name' => 'media_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true],
'media_type_l11n_type' => ['name' => 'media_type_l11n_type', 'type' => 'int', 'internal' => 'type'],
'media_type_l11n_title' => ['name' => 'media_type_l11n_title', 'type' => 'string', 'internal' => 'content', 'autocomplete' => true],
'media_type_l11n_type' => ['name' => 'media_type_l11n_type', 'type' => 'int', 'internal' => 'ref'],
'media_type_l11n_language' => ['name' => 'media_type_l11n_language', 'type' => 'string', 'internal' => 'language'],
];
@ -54,4 +55,12 @@ final class MediaTypeL11nMapper extends DataMapperFactory
* @since 1.0.0
*/
public const PRIMARYFIELD ='media_type_l11n_id';
/**
* Model to use by the mapper.
*
* @var string
* @since 1.0.0
*/
public const MODEL = BaseStringL11n::class;
}

View File

@ -1,47 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\Media\Models
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\Media\Models;
/**
* Media type l11n class.
*
* @package Modules\Media\Models
* @license OMS License 1.0
* @link https://jingga.app
* @since 1.0.0
*/
final class NullMediaTypeL11n extends MediaTypeL11n
{
/**
* Constructor
*
* @param int $id Model id
*
* @since 1.0.0
*/
public function __construct(int $id = 0)
{
$this->id = $id;
parent::__construct();
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return ['id' => $this->id];
}
}

View File

@ -15,18 +15,10 @@ declare(strict_types=1);
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Html;
use phpOMS\Autoloader;
use phpOMS\Utils\Parser\Spreadsheet\SpreadsheetParser;
Autoloader::addPath(__DIR__ . '/../../../../Resources/');
$media = $this->getData('media');
$reader = IOFactory::createReaderforFile(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath());
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath());
$writer = new Html($spreadsheet);
$writer->writeAllSheets();
$writer->save('php://output');
echo '<style>body { margin: 0; } table { width: 100%; } table .n, table .s { text-align: left; } td { padding: .5rem; }</style>';
echo SpreadsheetParser::parseSpreadsheet(($media->isAbsolute ? '' : __DIR__ . '/../../../../') . $media->getPath(), 'html');

View File

@ -12,7 +12,31 @@
*/
declare(strict_types=1);
require_once __DIR__ . '/../../../../../../phpOMS/Autoloader.php';
use phpOMS\Autoloader;
use phpOMS\Uri\UriFactory;
use phpOMS\Utils\Parser\Presentation\PresentationParser;
Autoloader::addPath(__DIR__ . '/../../../../../../Resources/');
?>
<section id="mediaFile" class="portlet">
<div class="portlet-body">
<div id="media" class="tabview tab-2 m-editor">
<ul class="tab-links">
<li><label tabindex="0" for="media-c-tab-1"><?= $this->getHtml('Preview', 'Media'); ?></label>
<li><label tabindex="0" for="media-c-tab-2">Status</label>
</ul>
<div class="tab-content">
<input type="radio" id="media-c-tab-1" name="tabular-1" checked>
<div class="tab">
<iframe src="<?= UriFactory::build('{/api}media/export?id=' . $this->media->getId()); ?>&type=html"></iframe>
</div>
<input type="radio" id="media-c-tab-2" name="tabular-1" checked>
<div class="tab">
<?php
echo PresentationParser::parsePresentation($this->media->getPath(), 'html');
?>
</div>
</div>
</div>
</div>
</section>

View File

@ -14,10 +14,11 @@
"name": "Karaka",
"website": "jingga.app"
},
"description": "The profile module.",
"description": "The media module.",
"directory": "Media",
"dependencies": {
"Admin": "1.0.0",
"Organization": "1.0.0",
"Home": "1.0.0",
"Tag": "1.0.0"
},

View File

@ -1,87 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package tests
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\Media\tests\Models;
use Modules\Media\Models\MediaTypeL11n;
use phpOMS\Localization\ISO639x1Enum;
/**
* @internal
*/
final class MediaTypeL11nTest extends \PHPUnit\Framework\TestCase
{
private MediaTypeL11n $l11n;
/**
* {@inheritdoc}
*/
protected function setUp() : void
{
$this->l11n = new MediaTypeL11n();
}
/**
* @covers Modules\Media\Models\MediaTypeL11n
* @group module
*/
public function testDefault() : void
{
self::assertEquals(0, $this->l11n->getId());
self::assertEquals('', $this->l11n->title);
self::assertEquals(0, $this->l11n->type);
self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage());
}
/**
* @covers Modules\Media\Models\MediaTypeL11n
* @group module
*/
public function testNameInputOutput() : void
{
$this->l11n->title = 'TestName';
self::assertEquals('TestName', $this->l11n->title);
}
/**
* @covers Modules\Media\Models\MediaTypeL11n
* @group module
*/
public function testLanguageInputOutput() : void
{
$this->l11n->setLanguage(ISO639x1Enum::_DE);
self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage());
}
/**
* @covers Modules\Media\Models\MediaTypeL11n
* @group module
*/
public function testSerialize() : void
{
$this->l11n->title = 'Title';
$this->l11n->type = 2;
$this->l11n->setLanguage(ISO639x1Enum::_DE);
self::assertEquals(
[
'id' => 0,
'title' => 'Title',
'type' => 2,
'language' => ISO639x1Enum::_DE,
],
$this->l11n->jsonSerialize()
);
}
}

View File

@ -15,7 +15,7 @@ declare(strict_types=1);
namespace Modules\Media\tests\Models;
use Modules\Media\Models\MediaType;
use Modules\Media\Models\MediaTypeL11n;
use phpOMS\Localization\BaseStringL11n;
/**
* @internal
@ -51,7 +51,7 @@ final class MediaTypeTest extends \PHPUnit\Framework\TestCase
$this->type->setL11n('Test1');
self::assertEquals('Test1', $this->type->getL11n());
$this->type->setL11n(new MediaTypeL11n('Test2'));
$this->type->setL11n(new BaseStringL11n('Test2'));
self::assertEquals('Test2', $this->type->getL11n());
}

View File

@ -1,42 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package tests
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\Media\tests\Models;
use Modules\Media\Models\NullMediaTypeL11n;
/**
* @internal
*/
final class NullMediaTypeL11nTest extends \PHPUnit\Framework\TestCase
{
/**
* @covers Modules\Media\Models\NullMediaTypeL11n
* @group framework
*/
public function testNull() : void
{
self::assertInstanceOf('\Modules\Media\Models\MediaTypeL11n', new NullMediaTypeL11n());
}
/**
* @covers Modules\Media\Models\NullMediaTypeL11n
* @group framework
*/
public function testId() : void
{
$null = new NullMediaTypeL11n(2);
self::assertEquals(2, $null->getId());
}
}