-
+
Jingga
diff --git a/app/web/Controllers/ApiController.php b/app/web/Controllers/ApiController.php
index c368510..bdb8bc9 100755
--- a/app/web/Controllers/ApiController.php
+++ b/app/web/Controllers/ApiController.php
@@ -7,6 +7,7 @@ namespace Controllers;
use Models\AccountMapper;
use phpOMS\Auth\LoginReturnType;
use phpOMS\Message\Http\RequestStatusCode;
+use phpOMS\Message\NotificationLevel;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Model\Message\Notify;
@@ -41,4 +42,20 @@ class ApiController
));
}
}
+
+ public function apiLogout(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void
+ {
+ $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
+
+ $this->app->sessionManager->remove('UID');
+ $this->app->sessionManager->save();
+
+ $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
+ $response->set($request->uri->__toString(), [
+ 'status' => NotificationLevel::OK,
+ 'title' => 'Logout successfull',
+ 'message' => 'You are redirected to the login page',
+ 'response' => null,
+ ]);
+ }
}
diff --git a/app/web/Controllers/BackendController.php b/app/web/Controllers/BackendController.php
index 5a2207b..ac0ddac 100644
--- a/app/web/Controllers/BackendController.php
+++ b/app/web/Controllers/BackendController.php
@@ -4,15 +4,26 @@ declare(strict_types=1);
namespace Controllers;
+use Models\AuditMapper;
use phpOMS\Contract\RenderableInterface;
+use phpOMS\DataStorage\Database\Query\OrderType;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
use phpOMS\Utils\Parser\Markdown\Markdown;
+use Views\TableView;
+use WebApplication;
class BackendController
{
+ private WebApplication $app;
+
+ public function __construct(WebApplication $app = null)
+ {
+ $this->app = $app;
+ }
+
public function signinView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null): RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
@@ -20,4 +31,742 @@ class BackendController
return $view;
}
+
+ public function dashboardView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null): RenderableInterface
+ {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/user-dashboard');
+
+ return $view;
+ }
+
+ public function adminOrganizationsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/admin-organizations');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function adminUsersView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/admin-users');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function adminResourcesView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/admin-resources');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function adminBillsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/admin-bills');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function adminLogsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/admin-logs');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function organizationSettingsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/organization-settings');
+
+ return $view;
+ }
+
+ public function organizationUsersEditView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/organization-users-edit');
+
+ return $view;
+ }
+
+ public function organizationUsersView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/organization-users');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function organizationResourcesView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/organization-resources');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function organizationBillsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/organization-bills');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+
+ public function userSettingsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/user-settings');
+
+ return $view;
+ }
+
+ public function userResourcesCreateView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/user-resources-create');
+
+ return $view;
+ }
+
+ public function userResourcesView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/user-resources');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
+ public function userReportsView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface {
+ $view = new View($this->app->l11nManager, $request, $response);
+ $view->setTemplate('/Applications/Backend/tpl/user-reports');
+
+ /* Table functionality */
+
+ $searchFieldData = $request->getLike('.*\-p\-.*');
+ $searchField = [];
+ foreach ($searchFieldData as $key => $data) {
+ if ($data === '1') {
+ $split = \explode('-', $key);
+ $member = \end($split);
+
+ $searchField[] = $member;
+ }
+ }
+
+ $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
+ $filterField = [];
+ foreach ($filterFieldData as $key => $type) {
+ $split = \explode('-', $key);
+ \end($split);
+
+ $member = \prev($split);
+
+ if (!empty($request->getData('auditlist-f-' . $member . '-f1'))) {
+ $filterField[$member] = [
+ 'type' => $type,
+ 'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
+ 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
+ 'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
+ 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
+ ];
+ }
+ }
+
+ $pageLimit = 25;
+ $view->addData('pageLimit', $pageLimit);
+
+ $mapper = AuditMapper::getAll()->with('createdBy');
+ $list = AuditMapper::find(
+ search: $request->getData('search'),
+ mapper: $mapper,
+ id: (int) ($request->getData('id') ?? 0),
+ secondaryId: (string) ($request->getData('subid') ?? ''),
+ type: $request->getData('pType'),
+ pageLimit: empty((int) ($request->getData('limit') ?? 0)) ? 100 : ((int) $request->getData('limit')),
+ sortBy: $request->getData('sort_by') ?? '',
+ sortOrder: $request->getData('sort_order') ?? OrderType::DESC,
+ searchFields: $searchField,
+ filters: $filterField
+ );
+
+ $view->setData('audits', $list['data']);
+
+ $tableView = new TableView($this->app->l11nManager, $request, $response);
+ $tableView->module = 'Auditor';
+ $tableView->theme = 'Backend';
+ $tableView->setTitleTemplate('/Templates/table-title');
+ $tableView->setColumnHeaderElementTemplate('/Templates/header-element-table');
+ $tableView->setFilterTemplate('/Templates/popup-filter-table');
+ $tableView->setSortTemplate('/Templates/sort-table');
+ $tableView->setData('hasPrevious', $list['hasPrevious']);
+ $tableView->setData('hasNext', $list['hasNext']);
+
+ $view->addData('tableView', $tableView);
+
+ return $view;
+ }
+
}
diff --git a/app/web/Controllers/FrontController.php b/app/web/Controllers/FrontController.php
index 53a4b39..7806223 100755
--- a/app/web/Controllers/FrontController.php
+++ b/app/web/Controllers/FrontController.php
@@ -10,9 +10,17 @@ use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
use phpOMS\Utils\Parser\Markdown\Markdown;
+use WebApplication;
class FrontController
{
+ private WebApplication $app;
+
+ public function __construct(WebApplication $app = null)
+ {
+ $this->app = $app;
+ }
+
public function frontView(RequestAbstract $request, ResponseAbstract $response, mixed $data = null): RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
diff --git a/app/web/Install/Templates/DistRoutes.php b/app/web/Install/Templates/DistRoutes.php
index 1c5650a..5d871b5 100644
--- a/app/web/Install/Templates/DistRoutes.php
+++ b/app/web/Install/Templates/DistRoutes.php
@@ -28,51 +28,4 @@ return [
'verb' => RouteVerb::GET,
],
],
-
- '^/*$' => [
- [
- 'dest' => '\Controllers\FrontController:frontView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/features' => [
- [
- 'dest' => '\Controllers\FrontController:featureView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/pricing' => [
- [
- 'dest' => '\Controllers\FrontController:pricingView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/signin' => [
- [
- 'dest' => '\Controllers\BackendController:signinView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/signup' => [
- [
- 'dest' => '\Controllers\FrontController:signupView',
- 'verb' => RouteVerb::GET,
- ],
- ],
-
- '.*?/api/download' => [
- [
- 'dest' => '\Controllers\ApiController:downloadView',
- 'verb' => RouteVerb::GET,
- ],
- ],
-
- '^.*?/login(\?.*|$)' => [
- [
- 'dest' => '\Controllers\ApiController:apiLogin',
- 'verb' => RouteVerb::SET,
- 'permission' => [
- ],
- ],
- ],
];
diff --git a/app/web/Models/Audit.php b/app/web/Models/Audit.php
new file mode 100644
index 0000000..76d1735
--- /dev/null
+++ b/app/web/Models/Audit.php
@@ -0,0 +1,268 @@
+createdAt = new \DateTimeImmutable('now');
+ $this->createdBy = $account ?? new NullAccount();
+ $this->old = $old;
+ $this->new = $new;
+ $this->type = $type;
+ $this->trigger = $trigger;
+ $this->module = $module;
+ $this->ref = $ref;
+ $this->content = $content;
+ $this->ip = $ip;
+ }
+
+ /**
+ * Get id.
+ *
+ * @return int
+ *
+ * @since 1.0.0
+ */
+ public function getId() : int
+ {
+ return $this->id;
+ }
+
+ /**
+ * Get type.
+ *
+ * @return int
+ *
+ * @since 1.0.0
+ */
+ public function getType() : int
+ {
+ return $this->type;
+ }
+
+ /**
+ * Get subtype.
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function getTrigger() : string
+ {
+ return $this->trigger;
+ }
+
+ /**
+ * Get Module.
+ *
+ * @return null|string
+ *
+ * @since 1.0.0
+ */
+ public function getModule() : ?string
+ {
+ return $this->module;
+ }
+
+ /**
+ * Get reference.
+ *
+ * If existing this can be a reference to another model
+ *
+ * @return null|string
+ *
+ * @since 1.0.0
+ */
+ public function getRef() : ?string
+ {
+ return $this->ref;
+ }
+
+ /**
+ * Get content.
+ *
+ * @return null|string
+ *
+ * @since 1.0.0
+ */
+ public function getContent() : ?string
+ {
+ return $this->content;
+ }
+
+ /**
+ * Get old value.
+ *
+ * @return null|string
+ *
+ * @since 1.0.0
+ */
+ public function getOld() : ?string
+ {
+ return $this->old;
+ }
+
+ /**
+ * Get new value.
+ *
+ * @return null|string
+ *
+ * @since 1.0.0
+ */
+ public function getNew() : ?string
+ {
+ return $this->new;
+ }
+
+ /**
+ * Get ip.
+ *
+ * @return int
+ *
+ * @since 1.0.0
+ */
+ public function getIp() : int
+ {
+ return $this->ip;
+ }
+}
diff --git a/app/web/Models/AuditMapper.php b/app/web/Models/AuditMapper.php
new file mode 100644
index 0000000..2969148
--- /dev/null
+++ b/app/web/Models/AuditMapper.php
@@ -0,0 +1,55 @@
+ ['name' => 'auditor_audit_id', 'type' => 'int', 'internal' => 'id'],
+ 'auditor_audit_created_by' => ['name' => 'auditor_audit_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true],
+ 'auditor_audit_created_at' => ['name' => 'auditor_audit_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true],
+ 'auditor_audit_ip' => ['name' => 'auditor_audit_ip', 'type' => 'int', 'internal' => 'ip', 'annotations' => ['gdpr' => true]],
+ 'auditor_audit_module' => ['name' => 'auditor_audit_module', 'type' => 'string', 'internal' => 'module'],
+ 'auditor_audit_ref' => ['name' => 'auditor_audit_ref', 'type' => 'string', 'internal' => 'ref'],
+ 'auditor_audit_type' => ['name' => 'auditor_audit_type', 'type' => 'int', 'internal' => 'type'],
+ 'auditor_audit_trigger' => ['name' => 'auditor_audit_trigger', 'type' => 'string', 'internal' => 'trigger'],
+ 'auditor_audit_content' => ['name' => 'auditor_audit_content', 'type' => 'string', 'internal' => 'content'],
+ 'auditor_audit_old' => ['name' => 'auditor_audit_old', 'type' => 'compress', 'internal' => 'old'],
+ 'auditor_audit_new' => ['name' => 'auditor_audit_new', 'type' => 'compress', 'internal' => 'new'],
+ ];
+
+ /**
+ * Belongs to.
+ *
+ * @var array
+ * @since 1.0.0
+ */
+ public const BELONGS_TO = [
+ 'createdBy' => [
+ 'mapper' => AccountMapper::class,
+ 'external' => 'auditor_audit_created_by',
+ ],
+ ];
+
+ public const MODEL = Audit::class;
+
+ public const TABLE = 'auditor_audit';
+
+ public const PRIMARYFIELD ='auditor_audit_id';
+
+ public const CREATED_AT = 'auditor_audit_created_at';
+}
diff --git a/app/web/Models/NullAudit.php b/app/web/Models/NullAudit.php
new file mode 100644
index 0000000..1be3a01
--- /dev/null
+++ b/app/web/Models/NullAudit.php
@@ -0,0 +1,24 @@
+id = $id;
+ parent::__construct();
+ }
+}
diff --git a/app/web/Routes.php b/app/web/Routes.php
index bbd6167..5d871b5 100755
--- a/app/web/Routes.php
+++ b/app/web/Routes.php
@@ -28,29 +28,4 @@ return [
'verb' => RouteVerb::GET,
],
],
-
- '^/*$' => [
- [
- 'dest' => '\Controllers\FrontController:frontView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/features' => [
- [
- 'dest' => '\Controllers\FrontController:featureView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/pricing' => [
- [
- 'dest' => '\Controllers\FrontController:pricingView',
- 'verb' => RouteVerb::GET,
- ],
- ],
- '.*?/signup' => [
- [
- 'dest' => '\Controllers\FrontController:signupView',
- 'verb' => RouteVerb::GET,
- ],
- ],
];
diff --git a/app/web/Templates/header-element-table.tpl.php b/app/web/Templates/header-element-table.tpl.php
new file mode 100644
index 0000000..ee02f95
--- /dev/null
+++ b/app/web/Templates/header-element-table.tpl.php
@@ -0,0 +1,14 @@
+
+= $data[4] ? $this->renderSort(...$data) : ''; ?>
+= $data[5] ? $this->renderFilter(...$data) : ''; ?>
\ No newline at end of file
diff --git a/app/web/Templates/popup-filter-table.tpl.php.php b/app/web/Templates/popup-filter-table.tpl.php.php
new file mode 100644
index 0000000..b28a468
--- /dev/null
+++ b/app/web/Templates/popup-filter-table.tpl.php.php
@@ -0,0 +1,54 @@
+
+
+
\ No newline at end of file
diff --git a/app/web/Templates/sort-table.tpl.php b/app/web/Templates/sort-table.tpl.php
new file mode 100644
index 0000000..56cf55d
--- /dev/null
+++ b/app/web/Templates/sort-table.tpl.php
@@ -0,0 +1,29 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/web/Templates/table-title.tpl.php b/app/web/Templates/table-title.tpl.php
new file mode 100644
index 0000000..933ffbb
--- /dev/null
+++ b/app/web/Templates/table-title.tpl.php
@@ -0,0 +1,39 @@
+getPreviousLink(
+ $this->request,
+ empty($this->objects) || !$this->getData('hasPrevious') ? null : \reset($this->objects)
+);
+
+$next = $this->getNextLink(
+ $this->request,
+ empty($this->objects) ? null : \end($this->objects),
+ $this->getData('hasNext') ?? false
+);
+
+$search = $this->getSearchLink(
+ $this->id . '-searchbox'
+);
+?>
+
+ getData('hasPrevious') ?? false) : ?>
+
+
+ = $data[0]; ?>
+ getData('hasNext') ?? false) : ?>
+
+
+
+
+
+
diff --git a/app/web/Views/TableView.php b/app/web/Views/TableView.php
new file mode 100644
index 0000000..2db1ba8
--- /dev/null
+++ b/app/web/Views/TableView.php
@@ -0,0 +1,329 @@
+objects = $objects;
+ }
+
+ /**
+ * Set title template
+ *
+ * @param string $template Path to template
+ * @param string $extension Template extension
+ *
+ * @return void
+ *
+ * @since 1.0.0
+ */
+ public function setTitleTemplate(string $template, string $extension = 'tpl.php') : void
+ {
+ $this->titleTemplate = self::BASE_PATH . $template . '.' . $extension;
+ }
+
+ /**
+ * Set column header template
+ *
+ * @param string $template Path to template
+ * @param string $extension Template extension
+ *
+ * @return void
+ *
+ * @since 1.0.0
+ */
+ public function setColumnHeaderElementTemplate(string $template, string $extension = 'tpl.php') : void
+ {
+ $this->columnHeaderElementTemplate = self::BASE_PATH . $template . '.' . $extension;
+ }
+
+ /**
+ * Set filter template
+ *
+ * @param string $template Path to template
+ * @param string $extension Template extension
+ *
+ * @return void
+ *
+ * @since 1.0.0
+ */
+ public function setFilterTemplate(string $template, string $extension = 'tpl.php') : void
+ {
+ $this->filterTemplate = self::BASE_PATH . $template . '.' . $extension;
+ }
+
+ /**
+ * Set sort template
+ *
+ * @param string $template Path to template
+ * @param string $extension Template extension
+ *
+ * @return void
+ *
+ * @since 1.0.0
+ */
+ public function setSortTemplate(string $template, string $extension = 'tpl.php') : void
+ {
+ $this->sortTemplate = self::BASE_PATH . $template . '.' . $extension;
+ }
+
+ /**
+ * Define columns
+ *
+ * @param array $columns Column definitions
+ *
+ * @return void
+ *
+ * @since 1.0.0
+ */
+ public function setColumns(array $columns) : void
+ {
+ $this->columns = $columns;
+ }
+
+ /**
+ * Get link to previous table page
+ *
+ * @param RequestAbstract $request Request
+ * @param null|object $obj Object from table element
+ * @param bool $hasPrevious Has previous page
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function getPreviousLink(RequestAbstract $request, object $obj = null, bool $hasPrevious = false) : string
+ {
+ return $this->baseUri . (
+ $obj === null
+ ? '?element={?element}&sort_by={?sort_by}&sort_order={?sort_order}'
+ . (!empty($request->getData('search'))
+ ? '&search=' . $request->getData('search')
+ : '')
+ : '?{?}&id='
+ . $obj->getId()
+ . (!empty($request->getData('search'))
+ ? '&search=' . $request->getData('search')
+ : '')
+ . ($request->getData('sort_by') !== 'id' && \property_exists($obj, $request->getData('sort_by') ?? '')
+ ? '&subid=' . $obj->{$request->getData('sort_by')}
+ : '')
+ . '&ptype=p'
+ );
+ }
+
+ /**
+ * Get link to next table page
+ *
+ * @param RequestAbstract $request Request
+ * @param null|object $obj Object from table element
+ * @param bool $hasNext Has next page
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function getNextLink(RequestAbstract $request, object $obj = null, $hasNext = false) : string
+ {
+ return $this->baseUri . (
+ $obj === null
+ ? '?element={?element}&sort_by={?sort_by}&sort_order={?sort_order}'
+ . (!empty($request->getData('search'))
+ ? '&search=' . $request->getData('search')
+ : '')
+ : '?{?}&id='
+ . ($hasNext ? $obj->getId() : $request->getData('id'))
+ . (!empty($request->getData('search'))
+ ? '&search=' . $request->getData('search')
+ : '')
+ . ($request->getData('sort_by') !== 'id' && \property_exists($obj, $request->getData('sort_by') ?? '')
+ ? '&subid=' . $obj->{$request->getData('sort_by')}
+ : '')
+ . '&ptype=n'
+ );
+ }
+
+ /**
+ * Get link for GET search
+ *
+ * @param string $id Element id
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function getSearchLink(
+ string $id
+ ) : string
+ {
+ return $this->baseUri . '?sort_by={?sort_by}&sort_order={?sort_order}';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function render(mixed ...$data) : string
+ {
+ $this->id = $data[0];
+ return parent::render();
+ }
+
+ /**
+ * Render table title
+ *
+ * @param mixed ...$data Data to pass to renderer
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function renderTitle(mixed ...$data) : string
+ {
+ $data[0] ??= 'ERROR'; // string
+ $data[1] ??= true; // render search
+
+ return $this->renderTemplate($this->titleTemplate, ...$data);
+ }
+
+ /**
+ * Render table header
+ *
+ * @param mixed ...$data Data to pass to renderer
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function renderHeaderElement(mixed ...$data) : string
+ {
+ ++$this->counter;
+
+ $data[0] ??= ''; // model name
+ $data[1] ??= 'ERROR'; // string
+ $data[2] ??= 'text'; // filter type, '' = don't render
+ $data[3] ??= []; // filter options
+ $data[4] ??= true; // render sort
+ $data[5] ??= true; // render filter
+ $data[6] ??= true; // render search
+
+ return $this->renderTemplate($this->columnHeaderElementTemplate, ...$data);
+ }
+
+ /**
+ * Render table filter
+ *
+ * @param mixed ...$data Data to pass to renderer
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function renderFilter(mixed ...$data) : string
+ {
+ return $this->renderTemplate($this->filterTemplate, ...$data);
+ }
+
+ /**
+ * Render table sort
+ *
+ * @param mixed ...$data Data to pass to renderer
+ *
+ * @return string
+ *
+ * @since 1.0.0
+ */
+ public function renderSort(mixed ...$data) : string
+ {
+ return $this->renderTemplate($this->sortTemplate, ...$data);
+ }
+}
diff --git a/app/web/WebApplication.php b/app/web/WebApplication.php
index 1bf15f1..c5085a1 100755
--- a/app/web/WebApplication.php
+++ b/app/web/WebApplication.php
@@ -24,9 +24,9 @@ class WebApplication extends ApplicationAbstract
$this->logger = FileLogger::getInstance($config['log']['file']['path'], false);
- UriFactory::setQuery('/prefix', '');
- UriFactory::setQuery('/backend', 'backend/');
- UriFactory::setQuery('/api', 'api/');
+ UriFactory::setQuery('/prefix', '', true);
+ UriFactory::setQuery('/backend', 'backend/', true);
+ UriFactory::setQuery('/api', 'api/', true);
$applicationName = $this->getApplicationName(HttpUri::fromCurrent(), $config['app'], $config['page']['root']);
$request = $this->initRequest($config['page']['root'], $config['app']);
$response = $this->initResponse($request, $config);
@@ -123,21 +123,26 @@ class WebApplication extends ApplicationAbstract
}
$defaultLang = $config['app']['domains'][$request->uri->host]['lang'] ?? $config['app']['default']['lang'];
- $uriLang = \strtolower($request->uri->getPathElement(0));
+
+ $uriLang = \strtolower($request->uri->getPathElement(0));
+ $uriLang = ISO639x1Enum::isValidValue($uriLang) && \in_array($uriLang, $config['language'])
+ ? $uriLang
+ : \strtolower($request->uri->getPathElement(0, false));
+
$requestLang = $request->getLanguage();
- $langCode = ISO639x1Enum::isValidValue($requestLang) && \in_array($requestLang, $config['language'])
- ? $requestLang
- : (ISO639x1Enum::isValidValue($uriLang) && \in_array($uriLang, $config['language'])
- ? $uriLang
+ $langCode = ISO639x1Enum::isValidValue($uriLang) && \in_array($uriLang, $config['language'])
+ ? $uriLang
+ : (ISO639x1Enum::isValidValue($requestLang) && \in_array($requestLang, $config['language'])
+ ? $requestLang
: $defaultLang
);
$response->header->l11n->loadFromLanguage($langCode, \explode('_', $request->getLocale())[1] ?? '*');
- UriFactory::setQuery('/lang', $request->getLanguage());
+ UriFactory::setQuery('/lang', $request->getLanguage(), true);
if (ISO639x1Enum::isValidValue($uriLang)) {
- UriFactory::setQuery('/prefix', $uriLang . '/' . (empty(UriFactory::getQuery('/prefix')) ? '' : UriFactory::getQuery('/prefix')));
- UriFactory::setQuery('/api', $uriLang . '/' . (empty(UriFactory::getQuery('/api')) ? '' : UriFactory::getQuery('/api')));
+ UriFactory::setQuery('/prefix', $uriLang . '/' . (empty(UriFactory::getQuery('/prefix')) ? '' : UriFactory::getQuery('/prefix')), true);
+ UriFactory::setQuery('/api', $uriLang . '/' . (empty(UriFactory::getQuery('/api')) ? '' : UriFactory::getQuery('/api')), true);
}
return $response;
@@ -164,7 +169,8 @@ class WebApplication extends ApplicationAbstract
'/prefix',
empty(UriFactory::getQuery('/prefix')
? ''
- : UriFactory::getQuery('/prefix') . '/') . $uri->getPathElement($subDirDepth + 1) . '/'
+ : UriFactory::getQuery('/prefix') . '/') . $uri->getPathElement($subDirDepth + 1) . '/',
+ true
);
return $appName;
@@ -180,7 +186,8 @@ class WebApplication extends ApplicationAbstract
'/prefix',
empty(UriFactory::getQuery('/prefix')
? ''
- : UriFactory::getQuery('/prefix') . '/') . $uri->getPathElement($subDirDepth + 1) . '/'
+ : UriFactory::getQuery('/prefix') . '/') . $uri->getPathElement($subDirDepth + 1) . '/',
+ true
);
return $appName;