From 9834a132ded404da9da8b10cb849970012b95b95 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 13 Jun 2023 18:55:51 +0000 Subject: [PATCH] Quick backup before crash --- .../defaultCsvExporter.csv.php | 3 +- .../spreadsheetTemplate.xls.php | 5 + .../defaultExcelExporter.xls.php | 15 +- .../PdfDefaultTemplate/pdfTemplate.pdf.php | 4 +- .../WordDefaultTemplate/docTemplate.doc.php | 32 ++++ .../defaultWordLetterExporter.doc.php | 12 +- .../defaultWordListExporter.doc.php | 4 + .../defaultWordExporter.doc.php | 4 +- Controller/ApiController.php | 167 ++++++++++-------- Controller/BackendController.php | 6 +- Models/AccountCredentialMapper.php | 3 + Models/AccountExternal.php | 2 +- Models/AccountExternalMapper.php | 2 +- Models/PermissionAbstractMapper.php | 2 +- Theme/Backend/accounts-single.tpl.php | 12 +- Theme/Backend/groups-single.tpl.php | 12 +- 16 files changed, 178 insertions(+), 107 deletions(-) diff --git a/Admin/Install/Media/CsvListExporter/defaultCsvExporter.csv.php b/Admin/Install/Media/CsvListExporter/defaultCsvExporter.csv.php index 6082e15..e263435 100755 --- a/Admin/Install/Media/CsvListExporter/defaultCsvExporter.csv.php +++ b/Admin/Install/Media/CsvListExporter/defaultCsvExporter.csv.php @@ -12,7 +12,8 @@ */ declare(strict_types=1); -$data = $this->getData('data') ?? []; +/** @var \phpOMS\Views\View $this */ +$data = $this->data['data'] ?? []; $out = \fopen('php://output', 'w'); if ($out !== false) { diff --git a/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php b/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php index 788fcc3..40602e2 100755 --- a/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php +++ b/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php @@ -18,6 +18,11 @@ use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; class DefaultExcel extends \PhpOffice\PhpSpreadsheet\Spreadsheet { + /** + * Constructor. + * + * @since 1.0.0 + */ public function __construct() { parent::__construct(); diff --git a/Admin/Install/Media/ExcelListExporter/defaultExcelExporter.xls.php b/Admin/Install/Media/ExcelListExporter/defaultExcelExporter.xls.php index a7a21c7..e835035 100755 --- a/Admin/Install/Media/ExcelListExporter/defaultExcelExporter.xls.php +++ b/Admin/Install/Media/ExcelListExporter/defaultExcelExporter.xls.php @@ -35,13 +35,14 @@ foreach ($data as $i => $row) { } $file = \tempnam(\sys_get_temp_dir(), 'oms_'); +if ($file !== false) { + $writer = IOFactory::createWriter($excel, 'Xlsx'); + $writer->save($file); -$writer = IOFactory::createWriter($excel, 'Xlsx'); -$writer->save($file); + $content = \file_get_contents($file); + if ($content !== false) { + echo $content; + } -$content = \file_get_contents($file); -if ($content !== false) { - echo $content; + \unlink($file); } - -\unlink($file); diff --git a/Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php b/Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php index caa6df2..5041c06 100755 --- a/Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php +++ b/Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php @@ -15,12 +15,14 @@ declare(strict_types=1); /** * Default PDF class. * + * The TCPDF class must be included previously in the parent code. + * * @package Modules\Media * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 * - * @phpstan-import-type TCPDF from ../../../../../Resources/tcpdf/tcpdf.php + * @link ../../../../../../Resources/tcpdf/tcpdf.php */ class DefaultPdf extends TCPDF { diff --git a/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php b/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php index f57276d..e753a5a 100755 --- a/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php +++ b/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php @@ -38,8 +38,20 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord */ public int $fontSize = 8; + /** + * Doc language + * + * @var string + * @since 1.0.0 + */ public string $language = 'en'; + /** + * Localization + * + * @var array + * @since 1.0.0 + */ public array $lang = [ 'en' => [ 'Page' => 'Page', @@ -59,6 +71,12 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord ], ]; + /** + * Attributes + * + * @var string[] + * @since 1.0.0 + */ public array $attributes = [ 'logo' => __DIR__ . '/../Web/Backend/img/logo.png', 'title_name' => 'Jingga', @@ -91,6 +109,13 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord $this->addTableStyle('FooterTableStyle', $generalTableStyle); } + /** + * Create the first page + * + * @return \PhpOffice\PhpWord\Element\Section + * + * @since 1.0.0 + */ public function createFirstPage() { $section = $this->addSection([ @@ -167,6 +192,13 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord return $section; } + /** + * Create second page + * + * @return \PhpOffice\PhpWord\Element\Section + * + * @since 1.0.0 + */ public function createSecondPage() { $section = $this->addSection([ diff --git a/Admin/Install/Media/WordLetterExporter/defaultWordLetterExporter.doc.php b/Admin/Install/Media/WordLetterExporter/defaultWordLetterExporter.doc.php index 8e83e76..3d58656 100755 --- a/Admin/Install/Media/WordLetterExporter/defaultWordLetterExporter.doc.php +++ b/Admin/Install/Media/WordLetterExporter/defaultWordLetterExporter.doc.php @@ -30,9 +30,11 @@ $section = $word->createFirstPage(); $file = \tempnam(\sys_get_temp_dir(), 'oms_'); //$writer->save($file); -$content = \file_get_contents($file); -if ($content !== false) { - echo $content; -} +if ($file !== false) { + $content = \file_get_contents($file); + if ($content !== false) { + echo $content; + } -\unlink($file); + \unlink($file); +} diff --git a/Admin/Install/Media/WordListExporter/defaultWordListExporter.doc.php b/Admin/Install/Media/WordListExporter/defaultWordListExporter.doc.php index 89fd47a..8992c61 100755 --- a/Admin/Install/Media/WordListExporter/defaultWordListExporter.doc.php +++ b/Admin/Install/Media/WordListExporter/defaultWordListExporter.doc.php @@ -52,6 +52,10 @@ $tbl .= ''; \PhpOffice\PhpWord\Shared\Html::addHtml($section, $tbl, false, false); $file = \tempnam(\sys_get_temp_dir(), 'oms_'); +if ($file === false) { + return ''; +} + $writer->save($file); echo \file_get_contents($file); diff --git a/Admin/Install/Media/WordPlainTemplate/defaultWordExporter.doc.php b/Admin/Install/Media/WordPlainTemplate/defaultWordExporter.doc.php index 08ac3f4..abc9121 100755 --- a/Admin/Install/Media/WordPlainTemplate/defaultWordExporter.doc.php +++ b/Admin/Install/Media/WordPlainTemplate/defaultWordExporter.doc.php @@ -35,6 +35,6 @@ if ($file !== false) { if ($content !== false) { echo $content; } -} -\unlink($file); + \unlink($file); +} diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 996abe7..3c7cbce 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -800,7 +800,7 @@ final class ApiController extends Controller ->execute(); if (($request->getData('localization_load') ?? '-1') !== '-1') { - $locale = \explode('_', $request->getData('localization_load')); + $locale = \explode('_', $request->getData('localization_load') ?? ''); $old = clone $account->l11n; $account->l11n->loadFromLanguage($locale[0], $locale[1]); @@ -1458,7 +1458,12 @@ final class ApiController extends Controller ); if (!empty($defaultGroupSettings)) { - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + $temp = \json_decode($defaultGroupSettings->content, true); + if (!\is_array($temp)) { + $temp = []; + } + + $defaultGroupIds = \array_merge($defaultGroupIds, $temp); } } @@ -1471,7 +1476,12 @@ final class ApiController extends Controller ); if (!empty($defaultGroupSettings)) { - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + $temp = \json_decode($defaultGroupSettings->content, true); + if (!\is_array($temp)) { + $temp = []; + } + + $defaultGroupIds = \array_merge($defaultGroupIds, $temp); } } @@ -1668,9 +1678,14 @@ final class ApiController extends Controller ); if (!empty($defaultGroupSettings)) { + $temp = \json_decode($defaultGroupSettings->content, true); + if (!\is_array($temp)) { + $temp = []; + } + $defaultGroupIds = \array_merge( $defaultGroupIds, - \json_decode($defaultGroupSettings->content, true) + $temp ); } } @@ -1684,9 +1699,14 @@ final class ApiController extends Controller ); if (!empty($defaultGroupSettings)) { + $temp = \json_decode($defaultGroupSettings->content, true); + if (!\is_array($temp)) { + $temp = []; + } + $defaultGroupIds = \array_merge( $defaultGroupIds, - \json_decode($defaultGroupSettings->content, true) + $temp ); } } @@ -1736,7 +1756,7 @@ final class ApiController extends Controller $request->setData('create_profile', (string) true); $request->setData('name1', !$request->hasData('name1') ? (!$request->hasData('user') - ? \explode('@', $request->getDataString('email'))[0] + ? \explode('@', $request->getDataString('email') ?? '')[0] : $request->getDataString('user') ) : $request->getDataString('name1') @@ -1768,6 +1788,61 @@ final class ApiController extends Controller ++$tries; } while ($dataChange->id === 0 && $tries < 5); + + $handler = $this->setUpServerMailHandler(); + + /** @var \Model\Setting[] $emailSettings */ + $emailSettings = $this->app->appSettings->get( + names: [SettingsEnum::MAIL_SERVER_ADDR, SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE], + module: 'Admin' + ); + + /** @var \Modules\Messages\Models\Email $mail */ + $mail = EmailMapper::get() + ->with('l11n') + ->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE]->content) + ->where('l11n/language', $response->header->l11n->language) + ->execute(); + + $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content); + $mail->addTo((string) $request->getData('email')); + + // @todo: load default l11n if no translation is available + $mailL11n = $mail->getL11nByLanguage($response->header->l11n->language); + + $mail->subject = $mailL11n->subject; + + // @todo: improve, the /tld link could be api.myurl.com which of course is not the url of the respective app. + // Maybe store the uri in the $app model? or store all urls in the config file + $mail->body = \str_replace( + [ + '{confirmation_link}', + '{user_name}', + ], + [ + UriFactory::hasQuery('/' . \strtolower($app->name)) + ? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()) + : UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()), + $account->login, + ], + $mailL11n->body + ); + + $mail->bodyAlt = \str_replace( + [ + '{confirmation_link}', + '{user_name}', + ], + [ + UriFactory::hasQuery('/' . \strtolower($app->name)) + ? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()) + : UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()), + $account->login, + ], + $mailL11n->bodyAlt + ); + + $handler->send($mail); } // Create client @@ -1794,60 +1869,6 @@ final class ApiController extends Controller } } - $handler = $this->setUpServerMailHandler(); - - $emailSettings = $this->app->appSettings->get( - names: [SettingsEnum::MAIL_SERVER_ADDR, SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE], - module: 'Admin' - ); - - /** @var \Modules\Messages\Models\Email $mail */ - $mail = EmailMapper::get() - ->with('l11n') - ->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE]->content) - ->where('l11n/language', $response->header->l11n->language) - ->execute(); - - $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content); - $mail->addTo((string) $request->getData('email')); - - // @todo: load default l11n if no translation is available - $mailL11n = $mail->getL11nByLanguage($response->header->l11n->language); - - $mail->subject = $mailL11n->subject; - - // @todo: improve, the /tld link could be api.myurl.com which of course is not the url of the respective app. - // Maybe store the uri in the $app model? or store all urls in the config file - $mail->body = \str_replace( - [ - '{confirmation_link}', - '{user_name}', - ], - [ - UriFactory::hasQuery('/' . \strtolower($app->name)) - ? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()) - : UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()), - $account->login, - ], - $mailL11n->body - ); - - $mail->bodyAlt = \str_replace( - [ - '{confirmation_link}', - '{user_name}', - ], - [ - UriFactory::hasQuery('/' . \strtolower($app->name)) - ? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()) - : UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()), - $account->login, - ], - $mailL11n->bodyAlt - ); - - $handler->send($mail); - $this->fillJsonResponse( $request, $response, @@ -2029,7 +2050,7 @@ final class ApiController extends Controller $account->l11n ->loadFromLanguage( $locale[0] ?? $this->app->l11nServer->language, - $locale[1] ?? $this->app->l11nServer->getCountry() + $locale[1] ?? $this->app->l11nServer->country ); } @@ -2527,12 +2548,12 @@ final class ApiController extends Controller ? new GroupPermission((int) $request->getData('permissionref')) : new AccountPermission((int) $request->getData('permissionref')); - $permission->setUnit($request->getDataInt('permissionunit')); - $permission->setApp($request->getDataInt('permissionapp')); - $permission->setModule($request->getDataString('permissionmodule')); - $permission->setCategory($request->getDataInt('permissioncategory')); - $permission->setElement($request->getDataInt('permissionelement')); - $permission->setComponent($request->getDataInt('permissioncomponent')); + $permission->unit = $request->getDataInt('permissionunit'); + $permission->app = $request->getDataInt('permissionapp'); + $permission->module = $request->getDataString('permissionmodule'); + $permission->category = $request->getDataInt('permissioncategory'); + $permission->element = $request->getDataInt('permissionelement'); + $permission->component = $request->getDataInt('permissioncomponent'); $permission->setPermission( ($request->getDataInt('permissionread') ?? 0) | ($request->getDataInt('permissioncreate') ?? 0) @@ -2613,12 +2634,12 @@ final class ApiController extends Controller */ private function updatePermissionFromRequest(RequestAbstract $request, PermissionAbstract $permission) : PermissionAbstract { - $permission->setUnit($request->getDataInt('permissionunit') ?? $permission->getUnit()); - $permission->setApp($request->getDataInt('permissionapp') ?? $permission->getApp()); - $permission->setModule($request->getDataString('permissionmodule') ?? $permission->getModule()); - $permission->setCategory($request->getDataInt('permissioncategory') ?? $permission->getCategory()); - $permission->setElement($request->getDataInt('permissionelement') ?? $permission->getElement()); - $permission->setComponent($request->getDataInt('permissioncomponent') ?? $permission->getComponent()); + $permission->unit = $request->getDataInt('permissionunit') ?? $permission->unit; + $permission->app = $request->getDataInt('permissionapp') ?? $permission->app; + $permission->module = $request->getDataString('permissionmodule') ?? $permission->module; + $permission->category = $request->getDataInt('permissioncategory') ?? $permission->category; + $permission->element = $request->getDataInt('permissionelement') ?? $permission->element; + $permission->component = $request->getDataInt('permissioncomponent') ?? $permission->component; $permission->setPermission(($request->getDataInt('permissioncreate') ?? 0) | ($request->getDataInt('permissionread') ?? 0) | ($request->getDataInt('permissionupdate') ?? 0) diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 2c7f768..6d626b5 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -694,10 +694,10 @@ final class BackendController extends Controller $id = $request->getDataString('id') ?? ''; - /** @var null|\Model\NullSetting|\Model\Setting[] $settings */ + /** @var \Model\Setting[] $settings */ $settings = SettingMapper::getAll()->where('module', $id)->execute(); - if ($settings->id > 0) { - $view->data['settings'] = \is_array($settings) ? $settings : [$settings]; + if (empty($settings)) { + $view->data['settings'] = $settings; } $class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum'; diff --git a/Models/AccountCredentialMapper.php b/Models/AccountCredentialMapper.php index f742ef3..3eac304 100755 --- a/Models/AccountCredentialMapper.php +++ b/Models/AccountCredentialMapper.php @@ -21,6 +21,9 @@ namespace Modules\Admin\Models; * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 + * + * @template T of Account + * @extends AccountMapper */ final class AccountCredentialMapper extends AccountMapper { diff --git a/Models/AccountExternal.php b/Models/AccountExternal.php index aaace80..d61d151 100755 --- a/Models/AccountExternal.php +++ b/Models/AccountExternal.php @@ -46,7 +46,7 @@ class AccountExternal * @var int * @since 1.0.0 */ - private int $subtype = AccountExternalSubtype::STRIPE; + public int $subtype = AccountExternalSubtype::STRIPE; /** * External status. diff --git a/Models/AccountExternalMapper.php b/Models/AccountExternalMapper.php index 9a4b73e..1260766 100755 --- a/Models/AccountExternalMapper.php +++ b/Models/AccountExternalMapper.php @@ -24,7 +24,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @link https://jingga.app * @since 1.0.0 * - * @template T of AccoutExternal + * @template T of AccountExternal * @extends DataMapperFactory */ class AccountExternalMapper extends DataMapperFactory diff --git a/Models/PermissionAbstractMapper.php b/Models/PermissionAbstractMapper.php index e637d00..66c69a7 100755 --- a/Models/PermissionAbstractMapper.php +++ b/Models/PermissionAbstractMapper.php @@ -25,7 +25,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @link https://jingga.app * @since 1.0.0 * - * @template T of PermissionAbstract + * @template T of \phpOMS\Account\PermissionAbstract * @extends DataMapperFactory */ final class PermissionAbstractMapper extends DataMapperFactory diff --git a/Theme/Backend/accounts-single.tpl.php b/Theme/Backend/accounts-single.tpl.php index 1a68a21..ea87f3c 100755 --- a/Theme/Backend/accounts-single.tpl.php +++ b/Theme/Backend/accounts-single.tpl.php @@ -318,12 +318,12 @@ echo $this->data['nav']->render(); ?> id; ?> - getUnit(); ?> - getApp(); ?> - getModule(); ?> - getCategory(); ?> - getElement(); ?> - getComponent(); ?> + printHtml($value->unit); ?> + printHtml($value->app); ?> + printHtml($value->module); ?> + printHtml($value->category); ?> + printHtml($value->element); ?> + printHtml($value->component); ?> diff --git a/Theme/Backend/groups-single.tpl.php b/Theme/Backend/groups-single.tpl.php index 1b7033d..eb2b495 100755 --- a/Theme/Backend/groups-single.tpl.php +++ b/Theme/Backend/groups-single.tpl.php @@ -269,12 +269,12 @@ echo $this->data['nav']->render(); ?> id; ?> - getUnit(); ?> - getApp(); ?> - getModule(); ?> - getCategory(); ?> - getElement(); ?> - getComponent(); ?> + printHtml($value->unit); ?> + printHtml($value->app); ?> + printHtml($value->module); ?> + printHtml($value->category); ?> + printHtml($value->element); ?> + printHtml($value->component); ?> C