- {#each filteredPlugins as plugin}
+
+ {#each filteredPlugins as plugin (plugin.snake_name)}
{/each}
diff --git a/resources/components/plugins/PluginOptionItem.svelte b/resources/components/plugins/PluginOptionItem.svelte
index b30e323d0..101991c44 100644
--- a/resources/components/plugins/PluginOptionItem.svelte
+++ b/resources/components/plugins/PluginOptionItem.svelte
@@ -1,6 +1,6 @@
diff --git a/resources/components/plugins/options/SelectOption.svelte b/resources/components/plugins/options/SelectOption.svelte
index 45d3d2279..92409154a 100644
--- a/resources/components/plugins/options/SelectOption.svelte
+++ b/resources/components/plugins/options/SelectOption.svelte
@@ -8,7 +8,7 @@
let {
id,
name,
- value = '',
+ value = $bindable(''),
option = {},
multiple = false,
clearable = false
diff --git a/resources/components/types.ts b/resources/components/types.ts
new file mode 100644
index 000000000..d09f8be54
--- /dev/null
+++ b/resources/components/types.ts
@@ -0,0 +1,35 @@
+import type { Snippet } from 'svelte';
+
+export interface Button {
+ tag: string;
+ icon: string;
+ children: Snippet;
+}
+
+export interface Poster {
+ id: number;
+ name: string;
+ avatar: string;
+}
+
+export interface Comment {
+ authorial: boolean;
+ can_edit: boolean;
+ created_at: number;
+ extra_buttons: string[];
+ human_date: string;
+ id: number;
+ message: string;
+ page_id: number;
+ parent_id: number;
+ poster: Poster;
+ published_at: string;
+ replies: Comment[];
+}
+
+export interface Pagination {
+ start: number;
+ totalItems: number;
+ itemsPerPage: number;
+ totalVisible: number;
+}
diff --git a/resources/js/app.js b/resources/js/app.js
index cf976c8b7..742ca75b0 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -27,7 +27,7 @@ window.loadExternalScript = (url, isModule = false) => {
}
window.loadPortalScript = (url, isModule = false) => {
- return loadExternalScript(smf_default_theme_url + '/scripts/light_portal/' + url, isModule);
+ return loadExternalScript(window.smf_default_theme_url + '/scripts/light_portal/' + url, isModule);
}
window.usePortalApi = (endpoint, scriptName) => {
diff --git a/resources/js/helpers.js b/resources/js/helpers.js
index 86603de5e..d59053441 100644
--- a/resources/js/helpers.js
+++ b/resources/js/helpers.js
@@ -1,9 +1,8 @@
-import { get } from 'svelte/store';
-import { useContextStore } from './stores.js';
+import { contextState } from './states.svelte.js';
-const { pageUrl } = get(useContextStore);
+const { pageUrl } = contextState;
-class CommentManager {
+class CommentApi {
constructor(url) {
this.workUrl = url;
}
@@ -125,7 +124,7 @@ class ObjectHelper {
}
}
-const api = new CommentManager(pageUrl);
+const api = new CommentApi(pageUrl);
const helper = new ObjectHelper();
export { api, helper };
diff --git a/resources/js/states.svelte.js b/resources/js/states.svelte.js
new file mode 100644
index 000000000..f4122269a
--- /dev/null
+++ b/resources/js/states.svelte.js
@@ -0,0 +1,14 @@
+const { context, user, icons, settings, plugins } = portalJson;
+
+export const appState = $state({
+ baseUrl: window.smf_scripturl,
+ loading: window.ajax_notification_text,
+ sessionId: window.smf_session_id,
+ sessionVar: window.smf_session_var,
+});
+
+export const contextState = $state(context);
+export const userState = $state(user);
+export const iconState = $state(icons);
+export const settingState = $state(settings);
+export const pluginState = $state(plugins);
diff --git a/resources/js/stores.js b/resources/js/stores.js
index 0b146224f..8d82206c5 100644
--- a/resources/js/stores.js
+++ b/resources/js/stores.js
@@ -1,28 +1,8 @@
-import { readable, writable } from 'svelte/store';
+import { writable } from 'svelte/store';
-const { context, user, icons, settings, plugins } = portalJson;
-
-export const useAppStore = readable({
- baseUrl: smf_scripturl,
- loading: ajax_notification_text,
- sessionId: smf_session_id,
- sessionVar: smf_session_var,
-});
-
-export const useContextStore = readable(context);
-
-export const useUserStore = readable(user);
-
-export const useIconStore = readable(icons);
-
-export const useSettingStore = readable(settings);
-
-export const usePluginStore = readable(plugins);
-
-export const useLocalStorage = (key, initialValue) => {
+export const localStore = (key, initialValue) => {
const storedValue = localStorage.getItem(key);
- const initial = storedValue !== null ? storedValue : initialValue;
- const store = writable(initial);
+ const store = writable(storedValue !== null ? storedValue : initialValue);
store.subscribe((value) => {
localStorage.setItem(key, value.toString());
diff --git a/src/Sources/LightPortal/Actions/Category.php b/src/Sources/LightPortal/Actions/Category.php
index 8e403c833..d192df315 100644
--- a/src/Sources/LightPortal/Actions/Category.php
+++ b/src/Sources/LightPortal/Actions/Category.php
@@ -101,7 +101,7 @@ public function show(): void
->setPosition(RowPosition::TOP_OF_LIST)
);
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
Utils::obExit();
}
@@ -185,7 +185,7 @@ public function showAll(): void
'name' => Utils::$context['page_title'],
];
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('categories', Utils::$context['page_title'])
->withParams(
Setting::get('defaultMaxListItems', 'int', 50),
diff --git a/src/Sources/LightPortal/Actions/Comment.php b/src/Sources/LightPortal/Actions/Comment.php
index 6ec5a973d..db5cd5e95 100644
--- a/src/Sources/LightPortal/Actions/Comment.php
+++ b/src/Sources/LightPortal/Actions/Comment.php
@@ -18,14 +18,15 @@
use Bugo\LightPortal\Enums\AlertAction;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Repositories\CommentRepository;
use Bugo\LightPortal\Utils\Avatar;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\DateTime;
use Bugo\LightPortal\Utils\Notify;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use WPLake\Typed\Typed;
@@ -34,7 +35,6 @@
use function count;
use function date;
use function http_response_code;
-use function json_encode;
use function trim;
use const LP_BASE_URL;
@@ -46,6 +46,7 @@ final class Comment implements ActionInterface
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
private string $pageSlug;
@@ -89,9 +90,7 @@ private function get(): never
app(EventManagerFactory::class)()->dispatch(
PortalHook::commentButtons,
- new Event(new class ($comment, $comment['extra_buttons']) {
- public function __construct(public readonly array $comment, public array &$buttons) {}
- })
+ new EventArgs(['comment' => $comment, 'buttons' => &$comment['extra_buttons']])
);
return $comment;
@@ -118,7 +117,7 @@ public function __construct(public readonly array $comment, public array &$butto
'limit' => $limit,
];
- exit(json_encode($result));
+ $this->response()->json($result);
}
private function add(): never
@@ -127,13 +126,15 @@ private function add(): never
'id' => null,
];
- if (empty(User::$info['id']))
- exit(json_encode($result));
+ if (empty(User::$info['id'])) {
+ $this->response()->json($result);
+ }
$data = $this->request()->json();
- if (empty($data['message']))
- exit(json_encode($result));
+ if (empty($data['message'])) {
+ $this->response()->json($result);
+ }
$parentId = VarType::INTEGER->filter($data['parent_id']);
$message = Utils::htmlspecialchars($data['message']);
@@ -141,8 +142,9 @@ private function add(): never
$pageId = Utils::$context['lp_page']['id'];
$pageUrl = Utils::$context['canonical_url'];
- if (empty($pageId) || empty($message))
- exit(json_encode($result));
+ if (empty($pageId) || empty($message)) {
+ $this->response()->json($result);
+ }
$item = $this->repository->save([
'parent_id' => $parentId,
@@ -187,7 +189,7 @@ private function add(): never
http_response_code(201);
- exit(json_encode($result));
+ $this->response()->json($result);
}
private function update(): never
@@ -198,15 +200,17 @@ private function update(): never
'success' => false,
];
- if (empty($data) || Utils::$context['user']['is_guest'])
- exit(json_encode($result));
+ if (empty($data) || Utils::$context['user']['is_guest']) {
+ $this->response()->json($result);
+ }
$item = $data['comment_id'];
$message = trim((string) $data['message']);
$message = Utils::htmlspecialchars($message);
- if (empty($item) || $message === '')
- exit(json_encode($result));
+ if (empty($item) || $message === '') {
+ $this->response()->json($result);
+ }
$this->repository->update([
'message' => Utils::shorten($message, 65531),
@@ -221,7 +225,7 @@ private function update(): never
$this->cache()->forget('page_' . $this->pageSlug . '_comments');
- exit(json_encode($result));
+ $this->response()->json($result);
}
private function remove(): never
@@ -229,14 +233,14 @@ private function remove(): never
$item = (int) $this->request()->json('comment_id');
if (empty($item)) {
- exit(json_encode(['success' => false]));
+ $this->response()->json(['success' => false]);
}
$items = $this->repository->remove($item, $this->pageSlug);
$this->cache()->forget('page_' . $this->pageSlug . '_comments');
- exit(json_encode(['success' => true, 'items' => $items]));
+ $this->response()->json(['success' => true, 'items' => $items]);
}
private function getTree(array $data): array
diff --git a/src/Sources/LightPortal/Actions/FrontPage.php b/src/Sources/LightPortal/Actions/FrontPage.php
index eabdd06da..7fb2aa1c5 100644
--- a/src/Sources/LightPortal/Actions/FrontPage.php
+++ b/src/Sources/LightPortal/Actions/FrontPage.php
@@ -24,8 +24,8 @@
use Bugo\LightPortal\Articles\PageArticle;
use Bugo\LightPortal\Articles\TopicArticle;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Renderers\RendererInterface;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\DateTime;
@@ -71,9 +71,7 @@ public function show(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontModes,
- new Event(new class ($this->modes) {
- public function __construct(public array &$modes) {}
- })
+ new EventArgs(['modes' => &$this->modes])
);
if (array_key_exists(Config::$modSettings['lp_frontpage_mode'], $this->modes)) {
@@ -150,11 +148,6 @@ public function prepare(ArticleInterface $article): void
app(EventManagerFactory::class)()->dispatch(PortalHook::frontAssets);
}
- public function getLayouts(): array
- {
- return $this->renderer->getLayouts();
- }
-
public function prepareTemplates(): void
{
if (empty(Utils::$context['lp_frontpage_articles'])) {
@@ -165,7 +158,7 @@ public function prepareTemplates(): void
: 'layout';
}
- Utils::$context['lp_frontpage_layouts'] = $this->getLayouts();
+ Utils::$context['lp_frontpage_layouts'] = $this->renderer->getLayouts();
$this->prepareLayoutSwitcher();
@@ -180,13 +173,7 @@ public function prepareTemplates(): void
// You can add your own logic here
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontLayouts,
- new Event(new class ($this->renderer, $currentLayout, $params) {
- public function __construct(
- public RendererInterface &$renderer,
- public string &$layout,
- public array &$params
- ) {}
- })
+ new EventArgs(['renderer' => &$this->renderer, 'layout' => &$currentLayout, 'params' => &$params])
);
Utils::$context['lp_layout_content'] = $this->renderer->render($currentLayout, $params);
diff --git a/src/Sources/LightPortal/Actions/Page.php b/src/Sources/LightPortal/Actions/Page.php
index 2ce0ac83b..f90c86257 100644
--- a/src/Sources/LightPortal/Actions/Page.php
+++ b/src/Sources/LightPortal/Actions/Page.php
@@ -20,13 +20,14 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\TitleList;
use Bugo\LightPortal\Repositories\PageRepository;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Content;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\SessionTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -39,7 +40,6 @@
use function explode;
use function header;
use function implode;
-use function json_encode;
use function time;
use const LP_BASE_URL;
@@ -53,6 +53,7 @@ final class Page implements ActionInterface
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
use SessionTrait;
public function __construct(private readonly PageRepository $repository) {}
@@ -133,7 +134,7 @@ private function handleEmptySlug(): void
private function handleNonEmptySlug(string $slug): void
{
if (Setting::isFrontpage($slug)) {
- Utils::redirectexit('action=' . LP_ACTION);
+ $this->response()->redirect('action=' . LP_ACTION);
}
Utils::$context['lp_page'] = $this->getDataBySlug($slug);
@@ -229,7 +230,7 @@ private function handlePromoteAction(): void
'lp_frontpage_pages' => implode(',', $frontPages)
]);
- Utils::redirectexit(Utils::$context['canonical_url']);
+ $this->response()->redirect(Utils::$context['canonical_url']);
}
private function prepareMetadata(): void
@@ -356,7 +357,7 @@ private function handleApi(): void
header('Content-Type: application/json; charset=utf-8');
- exit(json_encode($this->preparedData()));
+ $this->response()->json($this->preparedData());
}
private function preparedData(): array
diff --git a/src/Sources/LightPortal/Actions/Tag.php b/src/Sources/LightPortal/Actions/Tag.php
index 9679004d0..578d3f47b 100644
--- a/src/Sources/LightPortal/Actions/Tag.php
+++ b/src/Sources/LightPortal/Actions/Tag.php
@@ -88,7 +88,7 @@ public function show(): void
$builder->setItems($this->getPages(...));
$builder->setCount(fn() => $this->getTotalCount());
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
Utils::obExit();
}
@@ -185,7 +185,7 @@ public function showAll(): void
'name' => Utils::$context['page_title'],
];
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('tags', Utils::$context['page_title'])
->withParams(
Setting::get('defaultMaxListItems', 'int', 50),
diff --git a/src/Sources/LightPortal/Areas/BlockArea.php b/src/Sources/LightPortal/Areas/BlockArea.php
index 4f47cc37b..cd66549cc 100644
--- a/src/Sources/LightPortal/Areas/BlockArea.php
+++ b/src/Sources/LightPortal/Areas/BlockArea.php
@@ -20,15 +20,12 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Areas\Traits\AreaTrait;
use Bugo\LightPortal\Areas\Validators\BlockValidator;
-use Bugo\LightPortal\Args\ObjectArgs;
-use Bugo\LightPortal\Args\OptionsTypeArgs;
-use Bugo\LightPortal\Args\ParamsArgs;
use Bugo\LightPortal\Enums\ContentType;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\Tab;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Models\BlockModel;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Repositories\BlockRepository;
use Bugo\LightPortal\UI\Fields\CheckboxField;
use Bugo\LightPortal\UI\Fields\CustomField;
@@ -41,11 +38,9 @@
use Bugo\LightPortal\UI\Partials\PermissionSelect;
use Bugo\LightPortal\UI\Partials\PlacementSelect;
use Bugo\LightPortal\UI\Partials\TitleClassSelect;
-use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Content;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\Language;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
use WPLake\Typed\Typed;
@@ -57,7 +52,6 @@
use function array_multisort;
use function in_array;
use function is_array;
-use function json_encode;
use function ob_get_clean;
use function ob_start;
use function sprintf;
@@ -72,8 +66,6 @@
final class BlockArea
{
use AreaTrait;
- use CacheTrait;
- use RequestTrait;
public function __construct(private readonly BlockRepository $repository) {}
@@ -163,7 +155,7 @@ public function edit(): void
if ($this->request()->has('remove')) {
$this->repository->remove([$item]);
- Utils::redirectexit('action=admin;area=lp_blocks;sa=main');
+ $this->response()->redirect('action=admin;area=lp_blocks;sa=main');
}
$this->validateData();
@@ -220,7 +212,7 @@ private function makeCopy(int $item): void
$this->cache()->forget('active_blocks');
- exit(json_encode($result));
+ $this->response()->json($result);
}
private function getParams(): array
@@ -238,7 +230,7 @@ private function getParams(): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareBlockParams,
- new Event(new ParamsArgs($params, Utils::$context['current_block']['type']))
+ new EventArgs(['params' => &$params, 'type' => Utils::$context['current_block']['type']])
);
return array_merge($baseParams, $params);
@@ -357,7 +349,10 @@ private function prepareFormFields(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareBlockFields,
- new Event(new OptionsTypeArgs(Utils::$context['lp_block']['options'], Utils::$context['current_block']['type']))
+ new EventArgs([
+ 'options' => Utils::$context['lp_block']['options'],
+ 'type' => Utils::$context['current_block']['type']
+ ])
);
$this->preparePostFields();
@@ -392,7 +387,7 @@ private function prepareEditor(): void
{
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareEditor,
- new Event(new ObjectArgs(Utils::$context['lp_block']))
+ new EventArgs(['object' => Utils::$context['lp_block']])
);
}
diff --git a/src/Sources/LightPortal/Areas/CategoryArea.php b/src/Sources/LightPortal/Areas/CategoryArea.php
index 95bbef482..28d27c3df 100644
--- a/src/Sources/LightPortal/Areas/CategoryArea.php
+++ b/src/Sources/LightPortal/Areas/CategoryArea.php
@@ -34,10 +34,8 @@
use Bugo\LightPortal\UI\Tables\PortalTableBuilder;
use Bugo\LightPortal\UI\Tables\StatusColumn;
use Bugo\LightPortal\UI\Tables\TitleColumn;
-use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\Language;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\Str;
use WPLake\Typed\Typed;
@@ -49,8 +47,6 @@
final class CategoryArea
{
use AreaTrait;
- use CacheTrait;
- use RequestTrait;
public function __construct(private readonly CategoryRepository $repository) {}
@@ -90,7 +86,7 @@ public function main(): void
ContextMenuColumn::make()
]);
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
}
public function add(): void
@@ -150,7 +146,7 @@ public function edit(): void
$this->cache()->flush();
- Utils::redirectexit('action=admin;area=lp_categories');
+ $this->response()->redirect('action=admin;area=lp_categories');
}
$this->validateData();
diff --git a/src/Sources/LightPortal/Areas/ConfigArea.php b/src/Sources/LightPortal/Areas/ConfigArea.php
index 9cd562d40..bee992215 100644
--- a/src/Sources/LightPortal/Areas/ConfigArea.php
+++ b/src/Sources/LightPortal/Areas/ConfigArea.php
@@ -12,7 +12,6 @@
namespace Bugo\LightPortal\Areas;
-use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
use Bugo\Compat\Theme;
@@ -33,11 +32,10 @@
use Bugo\LightPortal\Areas\Imports\PageImport;
use Bugo\LightPortal\Areas\Imports\PluginImport;
use Bugo\LightPortal\Areas\Imports\TagImport;
-use Bugo\LightPortal\Args\AreasArgs;
use Bugo\LightPortal\Enums\Hook;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\RequestTrait;
@@ -214,17 +212,12 @@ public function adminAreas(array &$areas): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updateAdminAreas,
- new Event(new AreasArgs($areas['lp_portal']['areas']))
+ new EventArgs(['areas' => &$areas['lp_portal']['areas']])
);
}
public function helpadmin(): void
{
- Lang::$txt['lp_standalone_url_help'] = Lang::getTxt('lp_standalone_url_help', [
- Config::$boardurl . '/portal.php',
- Config::$scripturl
- ]);
-
Lang::$txt['lp_menu_separate_subsection_title_help'] = Lang::getTxt('lp_menu_separate_subsection_title_help', [
'
{lp_pages}',
'
$txt[`lp_pages`]',
@@ -294,7 +287,7 @@ public function blockAreas(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updateBlockAreas,
- new Event(new AreasArgs($areas))
+ new EventArgs(['areas' => &$areas])
);
$this->callActionFromAreas($areas);
@@ -314,7 +307,7 @@ public function pageAreas(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updatePageAreas,
- new Event(new AreasArgs($areas))
+ new EventArgs(['areas' => &$areas])
);
$this->callActionFromAreas($areas);
@@ -334,7 +327,7 @@ public function categoryAreas(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updateCategoryAreas,
- new Event(new AreasArgs($areas))
+ new EventArgs(['areas' => &$areas])
);
$this->callActionFromAreas($areas);
@@ -354,7 +347,7 @@ public function tagAreas(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updateTagAreas,
- new Event(new AreasArgs($areas))
+ new EventArgs(['areas' => &$areas])
);
$this->callActionFromAreas($areas);
@@ -375,7 +368,7 @@ public function pluginAreas(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::updatePluginAreas,
- new Event(new AreasArgs($areas))
+ new EventArgs(['areas' => &$areas])
);
$this->callActionFromAreas($areas);
diff --git a/src/Sources/LightPortal/Areas/Configs/AbstractConfig.php b/src/Sources/LightPortal/Areas/Configs/AbstractConfig.php
index f08608d32..f012411f8 100644
--- a/src/Sources/LightPortal/Areas/Configs/AbstractConfig.php
+++ b/src/Sources/LightPortal/Areas/Configs/AbstractConfig.php
@@ -12,10 +12,8 @@
namespace Bugo\LightPortal\Areas\Configs;
-use Bugo\Compat\Actions\Permissions;
-use Bugo\Compat\Config;
-use Bugo\Compat\Lang;
-use Bugo\Compat\Utils;
+use Bugo\Compat\Actions\Admin\Permissions;
+use Bugo\Compat\{Config, Lang, Utils};
use Bugo\LightPortal\Areas\Traits\AreaTrait;
use Bugo\LightPortal\UI\Fields\CheckboxField;
use Bugo\LightPortal\UI\Fields\CustomField;
diff --git a/src/Sources/LightPortal/Areas/Configs/BasicConfig.php b/src/Sources/LightPortal/Areas/Configs/BasicConfig.php
index ea0e05453..042a0f258 100644
--- a/src/Sources/LightPortal/Areas/Configs/BasicConfig.php
+++ b/src/Sources/LightPortal/Areas/Configs/BasicConfig.php
@@ -12,23 +12,17 @@
namespace Bugo\LightPortal\Areas\Configs;
-use Bugo\Compat\Actions\ACP;
-use Bugo\Compat\Config;
-use Bugo\Compat\Lang;
-use Bugo\Compat\Theme;
-use Bugo\Compat\Time;
-use Bugo\Compat\User;
-use Bugo\Compat\Utils;
-use Bugo\Compat\WebFetchApi;
-use Bugo\LightPortal\Actions\FrontPage;
+use Bugo\LightPortal\Renderers\RendererInterface;
+use Bugo\Compat\{Config, Lang, Theme};
+use Bugo\Compat\{Time, User, Utils};
+use Bugo\Compat\Actions\Admin\ACP;
+use Bugo\Compat\WebFetch\WebFetchApi;
use Bugo\LightPortal\Areas\Traits\QueryTrait;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\UI\Partials\ActionSelect;
-use Bugo\LightPortal\Utils\CacheTrait;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\SessionTrait;
use Bugo\LightPortal\Utils\Str;
@@ -46,9 +40,7 @@
final class BasicConfig extends AbstractConfig
{
- use CacheTrait;
use QueryTrait;
- use RequestTrait;
use SessionTrait;
public const TAB_BASE = 'base';
@@ -87,6 +79,11 @@ public function show(): void
Utils::$context['session_id'],
);
+ Lang::$txt['lp_standalone_url_help'] = Lang::getTxt('lp_standalone_url_help', [
+ Config::$boardurl . '/portal.php',
+ Config::$scripturl
+ ]);
+
$configVars = [
[
'select',
@@ -152,7 +149,7 @@ public function show(): void
[
'select',
'lp_frontpage_layout',
- app(FrontPage::class)->getLayouts(),
+ app(RendererInterface::class)->getLayouts(),
'postinput' => $templateEditLink,
'tab' => self::TAB_CARDS,
],
@@ -240,9 +237,7 @@ public function show(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::extendBasicConfig,
- new Event(new class ($configVars) {
- public function __construct(public array &$configVars) {}
- })
+ new EventArgs(['configVars' => &$configVars])
);
// Save
@@ -275,7 +270,7 @@ public function __construct(public array &$configVars) {}
$this->session()->put('adm-save', true);
$this->cache()->flush();
- Utils::redirectexit('action=admin;area=lp_settings;sa=basic');
+ $this->response()->redirect('action=admin;area=lp_settings;sa=basic');
}
ACP::prepareDBSettingContext($configVars);
diff --git a/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php b/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php
index 43ce7adda..7742472e3 100644
--- a/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php
+++ b/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php
@@ -12,15 +12,10 @@
namespace Bugo\LightPortal\Areas\Configs;
-use Bugo\Compat\Actions\ACP;
-use Bugo\Compat\Config;
-use Bugo\Compat\Lang;
-use Bugo\Compat\Theme;
-use Bugo\Compat\User;
-use Bugo\Compat\Utils;
+use Bugo\Compat\Actions\Admin\ACP;
+use Bugo\Compat\{Config, Lang, Theme};
+use Bugo\Compat\{User, Utils};
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\Utils\CacheTrait;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\SessionTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -32,8 +27,6 @@
final class ExtraConfig extends AbstractConfig
{
- use CacheTrait;
- use RequestTrait;
use SessionTrait;
public function show(): void
@@ -171,7 +164,7 @@ public function show(): void
$this->session()->put('adm-save', true);
$this->cache()->flush();
- Utils::redirectexit('action=admin;area=lp_settings;sa=extra');
+ $this->response()->redirect('action=admin;area=lp_settings;sa=extra');
}
ACP::prepareDBSettingContext($configVars);
diff --git a/src/Sources/LightPortal/Areas/Configs/MiscConfig.php b/src/Sources/LightPortal/Areas/Configs/MiscConfig.php
index ba6110082..36afc6eee 100644
--- a/src/Sources/LightPortal/Areas/Configs/MiscConfig.php
+++ b/src/Sources/LightPortal/Areas/Configs/MiscConfig.php
@@ -12,12 +12,9 @@
namespace Bugo\LightPortal\Areas\Configs;
-use Bugo\Compat\Actions\ACP;
-use Bugo\Compat\Config;
-use Bugo\Compat\Db;
-use Bugo\Compat\Lang;
-use Bugo\Compat\User;
-use Bugo\Compat\Utils;
+use Bugo\Compat\Actions\Admin\ACP;
+use Bugo\Compat\{Config, Db, Lang};
+use Bugo\Compat\{User, Utils};
use Bugo\LightPortal\Tasks\Maintainer;
use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\SessionTrait;
@@ -91,7 +88,7 @@ public function show(): void
$this->session()->put('adm-save', true);
- Utils::redirectexit('action=admin;area=lp_settings;sa=misc');
+ $this->response()->redirect('action=admin;area=lp_settings;sa=misc');
}
ACP::prepareDBSettingContext($configVars);
diff --git a/src/Sources/LightPortal/Areas/Configs/PanelConfig.php b/src/Sources/LightPortal/Areas/Configs/PanelConfig.php
index 34247bec4..a67a1b472 100644
--- a/src/Sources/LightPortal/Areas/Configs/PanelConfig.php
+++ b/src/Sources/LightPortal/Areas/Configs/PanelConfig.php
@@ -12,12 +12,9 @@
namespace Bugo\LightPortal\Areas\Configs;
-use Bugo\Compat\Actions\ACP;
-use Bugo\Compat\Config;
-use Bugo\Compat\Lang;
-use Bugo\Compat\Theme;
-use Bugo\Compat\User;
-use Bugo\Compat\Utils;
+use Bugo\Compat\Actions\Admin\ACP;
+use Bugo\Compat\{Config, Lang, Theme};
+use Bugo\Compat\{User, Utils};
use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\SessionTrait;
use Bugo\LightPortal\Utils\Setting;
@@ -87,7 +84,7 @@ public function show(): void
$this->session()->put('adm-save', true);
- Utils::redirectexit('action=admin;area=lp_settings;sa=panels');
+ $this->response()->redirect('action=admin;area=lp_settings;sa=panels');
}
ACP::prepareDBSettingContext($configVars);
diff --git a/src/Sources/LightPortal/Areas/CreditArea.php b/src/Sources/LightPortal/Areas/CreditArea.php
index e6dbc8b42..9cbc1b5ec 100644
--- a/src/Sources/LightPortal/Areas/CreditArea.php
+++ b/src/Sources/LightPortal/Areas/CreditArea.php
@@ -19,8 +19,8 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\Hook;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\SMFHookTrait;
use Bugo\LightPortal\Utils\Str;
@@ -91,16 +91,17 @@ private function prepareComponents(): void
User::mustHavePermission('light_portal_view');
Utils::$context['portal_translations'] = [
- 'Polish' => ['Adrek', 'jsqx'],
+ 'Polish' => ['Adrek', 'jsqx', 'cieplutki'],
'Spanish' => ['Rock Lee', 'Diego Andrés'],
'French' => ['Papoune57'],
- 'Turkish' => ['gevv'],
+ 'Turkish' => ['gevv', 'Elmacik'],
'Ukrainian' => ['valciriya1986'],
'German' => ['trucker2006', 'm4z'],
'Italian' => ['Darknico'],
'Portuguese' => ['Costa'],
'Greek' => ['Panoulis64'],
'Dutch' => ['TeamKC'],
+ 'Slovenian' => ['grega'],
];
Utils::$context['consultants'] = [
@@ -279,9 +280,7 @@ private function prepareComponents(): void
// Adding copyrights of used plugins
app(EventManagerFactory::class)()->dispatch(
PortalHook::credits,
- new Event(new class ($links) {
- public function __construct(public array &$links) {}
- })
+ new EventArgs(['links' => &$links])
);
Utils::$context['lp_components'] = $links;
diff --git a/src/Sources/LightPortal/Areas/Exports/AbstractExport.php b/src/Sources/LightPortal/Areas/Exports/AbstractExport.php
index d68941d51..3714241d1 100644
--- a/src/Sources/LightPortal/Areas/Exports/AbstractExport.php
+++ b/src/Sources/LightPortal/Areas/Exports/AbstractExport.php
@@ -59,8 +59,9 @@ protected function run(): void
header('Content-Length: ' . filesize($file));
if ($fd = fopen($file, 'rb')) {
- while (! feof($fd))
+ while (! feof($fd)) {
print fread($fd, 1024);
+ }
fclose($fd);
}
diff --git a/src/Sources/LightPortal/Areas/Exports/CategoryExport.php b/src/Sources/LightPortal/Areas/Exports/CategoryExport.php
index 8922de1f2..9d2c18000 100644
--- a/src/Sources/LightPortal/Areas/Exports/CategoryExport.php
+++ b/src/Sources/LightPortal/Areas/Exports/CategoryExport.php
@@ -55,7 +55,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('lp_categories', Lang::$txt['lp_categories_export'])
->setDefaultSortColumn('id')
->setItems($this->repository->getAll(...))
diff --git a/src/Sources/LightPortal/Areas/Exports/PageExport.php b/src/Sources/LightPortal/Areas/Exports/PageExport.php
index 1a1e8f59c..9e0a533c1 100644
--- a/src/Sources/LightPortal/Areas/Exports/PageExport.php
+++ b/src/Sources/LightPortal/Areas/Exports/PageExport.php
@@ -59,7 +59,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('lp_pages', Lang::$txt['lp_pages_export'])
->setDefaultSortColumn('id')
->setItems($this->repository->getAll(...))
diff --git a/src/Sources/LightPortal/Areas/Exports/TagExport.php b/src/Sources/LightPortal/Areas/Exports/TagExport.php
index 1f57c1596..74aa5c437 100644
--- a/src/Sources/LightPortal/Areas/Exports/TagExport.php
+++ b/src/Sources/LightPortal/Areas/Exports/TagExport.php
@@ -55,7 +55,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('lp_tags', Lang::$txt['lp_tags_export'])
->setDefaultSortColumn('id')
->setItems($this->repository->getAll(...))
diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php
index 15f4b0248..f6805c6b0 100644
--- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php
+++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php
@@ -12,10 +12,9 @@
namespace Bugo\LightPortal\Areas\Imports;
use Bugo\Compat\Config;
-use Bugo\LightPortal\Args\ItemsTitlesArgs;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
if (! defined('SMF'))
die('No direct access...');
@@ -28,7 +27,7 @@ protected function importItems(array &$items, array &$titles): array
{
app(EventManagerFactory::class)()->dispatch(
PortalHook::importBlocks,
- new Event(new ItemsTitlesArgs($items, $titles))
+ new EventArgs(['items' => &$items, 'titles' => &$titles])
);
foreach ($items as $id => $item) {
diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php
index d2b2ad02e..514830646 100644
--- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php
+++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php
@@ -12,10 +12,9 @@
namespace Bugo\LightPortal\Areas\Imports;
use Bugo\Compat\Config;
-use Bugo\LightPortal\Args\ItemsTitlesArgs;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
if (! defined('SMF'))
die('No direct access...');
@@ -28,7 +27,7 @@ protected function importItems(array &$items, array &$titles): array
{
app(EventManagerFactory::class)()->dispatch(
PortalHook::importCategories,
- new Event(new ItemsTitlesArgs($items, $titles))
+ new EventArgs(['items' => &$items, 'titles' => &$titles])
);
foreach ($items as $id => $item) {
diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php
index c66b97d29..b8429b6b9 100644
--- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php
+++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php
@@ -13,8 +13,8 @@
use Bugo\LightPortal\Areas\Imports\Traits\WithCommentsTrait;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
if (! defined('SMF'))
die('No direct access...');
@@ -33,14 +33,12 @@ protected function importItems(array &$items, array &$titles): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::importPages,
- new Event(new class ($items, $titles, $params, $comments) {
- public function __construct(
- public array &$items,
- public array &$titles,
- public array &$params,
- public array &$comments
- ) {}
- })
+ new EventArgs([
+ 'items' => &$items,
+ 'titles' => &$titles,
+ 'params' => &$params,
+ 'comments' => &$comments
+ ])
);
$results = $this->insertData(
diff --git a/src/Sources/LightPortal/Areas/Imports/PluginImport.php b/src/Sources/LightPortal/Areas/Imports/PluginImport.php
index 6862ada81..c576f6cd3 100644
--- a/src/Sources/LightPortal/Areas/Imports/PluginImport.php
+++ b/src/Sources/LightPortal/Areas/Imports/PluginImport.php
@@ -66,7 +66,7 @@ protected function extractPackage(): bool
{
$file = $this->files()->get('import_file');
- if ($file['error'] !== UPLOAD_ERR_OK)
+ if (empty($file) || $file['error'] !== UPLOAD_ERR_OK)
return false;
switch ($file['type']) {
diff --git a/src/Sources/LightPortal/Areas/PageArea.php b/src/Sources/LightPortal/Areas/PageArea.php
index edecb1f58..84cf9a744 100644
--- a/src/Sources/LightPortal/Areas/PageArea.php
+++ b/src/Sources/LightPortal/Areas/PageArea.php
@@ -26,18 +26,15 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Areas\Traits\AreaTrait;
use Bugo\LightPortal\Areas\Validators\PageValidator;
-use Bugo\LightPortal\Args\ObjectArgs;
-use Bugo\LightPortal\Args\OptionsTypeArgs;
-use Bugo\LightPortal\Args\ParamsArgs;
use Bugo\LightPortal\Enums\ContentType;
use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\Status;
use Bugo\LightPortal\Enums\Tab;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\CategoryList;
use Bugo\LightPortal\Models\PageModel;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Repositories\PageRepository;
use Bugo\LightPortal\UI\Fields\CheckboxField;
use Bugo\LightPortal\UI\Fields\CustomField;
@@ -61,11 +58,9 @@
use Bugo\LightPortal\UI\Tables\PageTypeSelectRow;
use Bugo\LightPortal\UI\Tables\PortalTableBuilder;
use Bugo\LightPortal\UI\Tables\TitleColumn;
-use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Content;
use Bugo\LightPortal\Utils\DateTime;
use Bugo\LightPortal\Utils\Language;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
use WPLake\Typed\Typed;
@@ -91,8 +86,6 @@
final class PageArea
{
use AreaTrait;
- use CacheTrait;
- use RequestTrait;
private array $params = [];
@@ -190,7 +183,7 @@ public function main(): void
->addColumn(CheckboxColumn::make(name: 'mass', entity: 'items'))
->addRow(PageButtonsRow::make());
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
$this->changeTableTitle();
}
@@ -274,7 +267,7 @@ public function edit(): void
$this->cache()->flush();
- Utils::redirectexit('action=admin;area=lp_pages');
+ $this->response()->redirect('action=admin;area=lp_pages');
}
$this->validateData();
@@ -340,7 +333,7 @@ private function massActions(): void
$this->cache()->flush();
- Utils::redirectexit($redirect);
+ $this->response()->redirect($redirect);
}
private function calculateParams(): void
@@ -485,7 +478,7 @@ private function getParams(): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::preparePageParams,
- new Event(new ParamsArgs($params, Utils::$context['lp_current_page']['type']))
+ new EventArgs(['params' => &$params, 'type' => Utils::$context['lp_current_page']['type']])
);
return array_merge($baseParams, $params);
@@ -641,7 +634,10 @@ private function prepareFormFields(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::preparePageFields,
- new Event(new OptionsTypeArgs(Utils::$context['lp_page']['options'], Utils::$context['lp_page']['type']))
+ new EventArgs([
+ 'options' => Utils::$context['lp_page']['options'],
+ 'type' => Utils::$context['lp_page']['type']
+ ])
);
$this->preparePostFields();
@@ -651,7 +647,7 @@ private function prepareEditor(): void
{
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareEditor,
- new Event(new ObjectArgs(Utils::$context['lp_page']))
+ new EventArgs(['object' => Utils::$context['lp_page']])
);
}
@@ -690,7 +686,7 @@ private function preparePreview(): void
private function checkUser(): void
{
if (Utils::$context['allow_light_portal_manage_pages_any'] === false && $this->request()->hasNot('u')) {
- Utils::redirectexit('action=admin;area=lp_pages;u=' . User::$info['id']);
+ $this->response()->redirect('action=admin;area=lp_pages;u=' . User::$info['id']);
}
}
diff --git a/src/Sources/LightPortal/Areas/PluginArea.php b/src/Sources/LightPortal/Areas/PluginArea.php
index 14d4e6af1..a19e5ddb9 100644
--- a/src/Sources/LightPortal/Areas/PluginArea.php
+++ b/src/Sources/LightPortal/Areas/PluginArea.php
@@ -17,18 +17,18 @@
use Bugo\Compat\Theme;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
-use Bugo\Compat\WebFetchApi;
-use Bugo\LightPortal\Args\SettingsArgs;
+use Bugo\Compat\WebFetch\WebFetchApi;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\PluginList;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Repositories\PluginRepository;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\Language;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -44,7 +44,6 @@
use function implode;
use function in_array;
use function is_array;
-use function json_encode;
use function ksort;
use function sort;
use function sprintf;
@@ -60,6 +59,7 @@ final class PluginArea
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
public function __construct(private readonly PluginRepository $repository) {}
@@ -97,7 +97,7 @@ public function main(): void
// Plugin authors can add settings here
app(EventManagerFactory::class)(Utils::$context['lp_plugins'])->dispatch(
PortalHook::addSettings,
- new Event(new SettingsArgs($settings))
+ new EventArgs(['settings' => &$settings])
);
$this->handleSave($settings);
@@ -140,7 +140,7 @@ private function handleToggle(): void
$this->cache()->flush();
- exit(json_encode(['success' => true]));
+ $this->response()->json(['success' => true]);
}
private function handleSave(array $configVars): void
@@ -172,12 +172,12 @@ private function handleSave(array $configVars): void
// Plugin authors can do additional actions after settings saving
app(EventManagerFactory::class)(Utils::$context['lp_plugins'])->dispatch(
PortalHook::saveSettings,
- new Event(new SettingsArgs($settings))
+ new EventArgs(['settings' => &$settings])
);
$this->repository->changeSettings($name, $settings);
- exit(json_encode(['success' => true]));
+ $this->response()->json(['success' => true]);
}
private function prepareAddonList(array $configVars): void
@@ -272,7 +272,7 @@ private function handleApi(): void
header('Content-Type: application/json; charset=utf-8');
- exit(json_encode($this->preparedData()));
+ $this->response()->json($this->preparedData());
}
private function preparedData(): array
@@ -280,6 +280,8 @@ private function preparedData(): array
$txtData = [
'plugins' => Lang::$txt['lp_plugins'],
'apply_filter' => Lang::$txt['apply_filter'],
+ 'list_view' => Lang::$txt['lp_list_view'],
+ 'card_view' => Lang::$txt['lp_card_view'],
'all' => Lang::$txt['all'],
'lp_active_only' => Lang::$txt['lp_active_only'],
'lp_plugins_desc' => Lang::$txt['lp_plugins_desc'],
@@ -338,8 +340,8 @@ private function preparedData(): array
private function removeAssets(): void
{
- unlink(Theme::$current->settings['default_theme_dir'] . '/css/light_portal/plugins.css');
- unlink(Theme::$current->settings['default_theme_dir'] . '/scripts/light_portal/plugins.js');
+ @unlink(Theme::$current->settings['default_theme_dir'] . '/css/light_portal/plugins.css');
+ @unlink(Theme::$current->settings['default_theme_dir'] . '/scripts/light_portal/plugins.js');
}
private function extendPluginList(): void
diff --git a/src/Sources/LightPortal/Areas/TagArea.php b/src/Sources/LightPortal/Areas/TagArea.php
index 773c49696..c461e0c18 100644
--- a/src/Sources/LightPortal/Areas/TagArea.php
+++ b/src/Sources/LightPortal/Areas/TagArea.php
@@ -32,10 +32,8 @@
use Bugo\LightPortal\UI\Tables\PortalTableBuilder;
use Bugo\LightPortal\UI\Tables\StatusColumn;
use Bugo\LightPortal\UI\Tables\TitleColumn;
-use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\Language;
-use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\Str;
use WPLake\Typed\Typed;
@@ -47,8 +45,6 @@
final class TagArea
{
use AreaTrait;
- use CacheTrait;
- use RequestTrait;
public function __construct(private readonly TagRepository $repository) {}
@@ -78,7 +74,7 @@ public function main(): void
ContextMenuColumn::make()
]);
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
}
public function add(): void
@@ -138,7 +134,7 @@ public function edit(): void
$this->cache()->flush();
- Utils::redirectexit('action=admin;area=lp_tags');
+ $this->response()->redirect('action=admin;area=lp_tags');
}
$this->validateData();
diff --git a/src/Sources/LightPortal/Areas/Traits/QueryTrait.php b/src/Sources/LightPortal/Areas/Traits/QueryTrait.php
index 3a22c51d4..21bce8fa0 100644
--- a/src/Sources/LightPortal/Areas/Traits/QueryTrait.php
+++ b/src/Sources/LightPortal/Areas/Traits/QueryTrait.php
@@ -16,16 +16,16 @@
use Bugo\Compat\Lang;
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\IconList;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
use function array_filter;
-use function json_encode;
use function sprintf;
use function str_contains;
use function strtolower;
@@ -39,6 +39,7 @@ trait QueryTrait
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
private function prepareIconList(): void
{
@@ -56,9 +57,7 @@ private function prepareIconList(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareIconList,
- new Event(new class ($icons, $template) {
- public function __construct(public array &$icons, public string &$template) {}
- })
+ new EventArgs(['icons' => &$icons, 'template' => &$template])
);
$icons = array_filter($icons, static fn($item) => str_contains((string) $item, $search));
@@ -71,7 +70,7 @@ public function __construct(public array &$icons, public string &$template) {}
];
}
- exit(json_encode($results));
+ $this->response()->json($results);
}
private function getFaIcons(): array
@@ -129,7 +128,7 @@ private function prepareTopicList(): void
Db::$db->free_result($result);
- exit(json_encode($topics));
+ $this->response()->json($topics);
}
private function prepareMemberList(): void
@@ -150,7 +149,7 @@ private function prepareMemberList(): void
FROM {db_prefix}members
WHERE {raw:real_name} LIKE {string:search}
AND is_activated IN (1, 11)
- LIMIT 1000',
+ LIMIT 100',
[
'real_name' => Utils::$smcFunc['db_case_sensitive'] ? 'LOWER(real_name)' : 'real_name',
'search' => $search,
@@ -171,6 +170,6 @@ private function prepareMemberList(): void
Db::$db->free_result($result);
- exit(json_encode($members));
+ $this->response()->json($members);
}
}
diff --git a/src/Sources/LightPortal/Areas/Validators/AbstractValidator.php b/src/Sources/LightPortal/Areas/Validators/AbstractValidator.php
index 7351fab9e..d8e5150ce 100644
--- a/src/Sources/LightPortal/Areas/Validators/AbstractValidator.php
+++ b/src/Sources/LightPortal/Areas/Validators/AbstractValidator.php
@@ -12,7 +12,29 @@
namespace Bugo\LightPortal\Areas\Validators;
+use Bugo\Compat\Lang;
+use Bugo\Compat\Utils;
+use Bugo\LightPortal\Utils\RequestTrait;
+
abstract class AbstractValidator
{
+ use RequestTrait;
+
+ protected array $errors = [];
+
abstract public function validate(): array;
+
+ protected function handleErrors(): void
+ {
+ if ($this->errors === [])
+ return;
+
+ $this->request()->put('preview', true);
+
+ Utils::$context['post_errors'] = [];
+
+ foreach ($this->errors as $error) {
+ Utils::$context['post_errors'][] = Lang::$txt['lp_post_error_' . $error];
+ }
+ }
}
diff --git a/src/Sources/LightPortal/Areas/Validators/BaseValidateTrait.php b/src/Sources/LightPortal/Areas/Validators/BaseValidateTrait.php
index b44b2c883..25032db10 100644
--- a/src/Sources/LightPortal/Areas/Validators/BaseValidateTrait.php
+++ b/src/Sources/LightPortal/Areas/Validators/BaseValidateTrait.php
@@ -13,7 +13,6 @@
namespace Bugo\LightPortal\Areas\Validators;
use Bugo\Compat\Config;
-use Bugo\Compat\Lang;
use Bugo\Compat\Utils;
use Bugo\LightPortal\Utils\RequestTrait;
@@ -40,24 +39,15 @@ public function validate(): array
return $data;
}
- private function findErrors(array $data): void
+ protected function findErrors(array $data): void
{
- $errors = [];
-
if (
(Config::$modSettings['userLanguage'] && empty($data['title_' . Config::$language]))
|| empty($data['title_' . Utils::$context['user']['language']])
) {
- $errors[] = 'no_title';
+ $this->errors[] = 'no_title';
}
- if ($errors) {
- $this->request()->put('preview', true);
- Utils::$context['post_errors'] = [];
-
- foreach ($errors as $error) {
- Utils::$context['post_errors'][] = Lang::$txt['lp_post_error_' . $error];
- }
- }
+ $this->handleErrors();
}
}
diff --git a/src/Sources/LightPortal/Areas/Validators/BlockValidator.php b/src/Sources/LightPortal/Areas/Validators/BlockValidator.php
index aadf38dfd..cf71942cc 100644
--- a/src/Sources/LightPortal/Areas/Validators/BlockValidator.php
+++ b/src/Sources/LightPortal/Areas/Validators/BlockValidator.php
@@ -12,15 +12,11 @@
namespace Bugo\LightPortal\Areas\Validators;
-use Bugo\Compat\Lang;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ErrorsDataArgs;
-use Bugo\LightPortal\Args\ParamsArgs;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
-use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use function array_keys;
use function array_merge;
@@ -29,8 +25,6 @@
class BlockValidator extends AbstractValidator
{
- use RequestTrait;
-
protected array $args = [
'block_id' => FILTER_VALIDATE_INT,
'icon' => FILTER_DEFAULT,
@@ -64,7 +58,7 @@ public function validate(): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::validateBlockParams,
- new Event(new ParamsArgs($params, Utils::$context['current_block']['type']))
+ new EventArgs(['params' => &$params, 'type' => Utils::$context['current_block']['type']])
);
$params = array_merge($this->params, $params);
@@ -77,12 +71,11 @@ public function validate(): array
return [$data, $params];
}
- private function findErrors(array $data): void
+ protected function findErrors(array $data): void
{
- $errors = [];
-
- if (empty($data['areas']))
- $errors[] = 'no_areas';
+ if (empty($data['areas'])) {
+ $this->errors[] = 'no_areas';
+ }
if (
$data['areas']
@@ -90,21 +83,14 @@ private function findErrors(array $data): void
'options' => ['regexp' => '/' . LP_AREAS_PATTERN . '/']
]))
) {
- $errors[] = 'no_valid_areas';
+ $this->errors[] = 'no_valid_areas';
}
app(EventManagerFactory::class)()->dispatch(
PortalHook::findBlockErrors,
- new Event(new ErrorsDataArgs($errors, $data))
+ new EventArgs(['errors' => &$this->errors, 'data' => $data])
);
- if ($errors) {
- $this->request()->put('preview', true);
- Utils::$context['post_errors'] = [];
-
- foreach ($errors as $error) {
- Utils::$context['post_errors'][] = Lang::$txt['lp_post_error_' . $error];
- }
- }
+ $this->handleErrors();
}
}
diff --git a/src/Sources/LightPortal/Areas/Validators/PageValidator.php b/src/Sources/LightPortal/Areas/Validators/PageValidator.php
index 2ed609a54..88833c83c 100644
--- a/src/Sources/LightPortal/Areas/Validators/PageValidator.php
+++ b/src/Sources/LightPortal/Areas/Validators/PageValidator.php
@@ -14,15 +14,11 @@
use Bugo\Compat\Config;
use Bugo\Compat\Db;
-use Bugo\Compat\Lang;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ErrorsDataArgs;
-use Bugo\LightPortal\Args\ParamsArgs;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\VarType;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
-use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use function array_merge;
use function explode;
@@ -30,8 +26,6 @@
class PageValidator extends AbstractValidator
{
- use RequestTrait;
-
protected array $args = [
'page_id' => FILTER_VALIDATE_INT,
'category_id' => FILTER_VALIDATE_INT,
@@ -68,7 +62,7 @@ public function validate(): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::validatePageParams,
- new Event(new ParamsArgs($params, Utils::$context['lp_current_page']['type']))
+ new EventArgs(['params' => &$params, 'type' => Utils::$context['lp_current_page']['type']])
);
$params = array_merge($this->params, $params);
@@ -82,19 +76,18 @@ public function validate(): array
return [$data, $params];
}
- private function findErrors(array $data): void
+ protected function findErrors(array $data): void
{
- $errors = [];
-
if (
(Config::$modSettings['userLanguage'] && empty($data['title_' . Config::$language]))
|| empty($data['title_' . Utils::$context['user']['language']])
) {
- $errors[] = 'no_title';
+ $this->errors[] = 'no_title';
}
- if (empty($data['slug']))
- $errors[] = 'no_slug';
+ if (empty($data['slug'])) {
+ $this->errors[] = 'no_slug';
+ }
if (
$data['slug']
@@ -102,25 +95,23 @@ private function findErrors(array $data): void
'options' => ['regexp' => '/' . LP_ALIAS_PATTERN . '/']
]))
) {
- $errors[] = 'no_valid_slug';
+ $this->errors[] = 'no_valid_slug';
}
- if ($data['slug'] && ! $this->isUnique($data))
- $errors[] = 'no_unique_slug';
-
- if (empty($data['content']))
- $errors[] = 'no_content';
+ if ($data['slug'] && ! $this->isUnique($data)) {
+ $this->errors[] = 'no_unique_slug';
+ }
- app(EventManagerFactory::class)()->dispatch(PortalHook::findPageErrors, new Event(new ErrorsDataArgs($errors, $data)));
+ if (empty($data['content'])) {
+ $this->errors[] = 'no_content';
+ }
- if ($errors) {
- $this->request()->put('preview', true);
- Utils::$context['post_errors'] = [];
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::findPageErrors,
+ new EventArgs(['errors' => &$this->errors, 'data' => $data])
+ );
- foreach ($errors as $error) {
- Utils::$context['post_errors'][] = Lang::$txt['lp_post_error_' . $error];
- }
- }
+ $this->handleErrors();
}
private function isUnique(array $data): bool
diff --git a/src/Sources/LightPortal/Args/ArticlesArgs.php b/src/Sources/LightPortal/Args/ArticlesArgs.php
deleted file mode 100644
index c71c8d81b..000000000
--- a/src/Sources/LightPortal/Args/ArticlesArgs.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ArticlesArgs
-{
- public function __construct(
- public array &$columns,
- public array &$tables,
- public array &$params,
- public array &$wheres,
- public array &$orders
- ) {}
-}
diff --git a/src/Sources/LightPortal/Args/ArticlesRowArgs.php b/src/Sources/LightPortal/Args/ArticlesRowArgs.php
deleted file mode 100644
index d24341e11..000000000
--- a/src/Sources/LightPortal/Args/ArticlesRowArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ArticlesRowArgs
-{
- public function __construct(public array &$articles, public readonly array $row) {}
-}
diff --git a/src/Sources/LightPortal/Args/ErrorsDataArgs.php b/src/Sources/LightPortal/Args/ErrorsDataArgs.php
deleted file mode 100644
index 8c230e04d..000000000
--- a/src/Sources/LightPortal/Args/ErrorsDataArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ErrorsDataArgs
-{
- public function __construct(public array &$errors, public readonly array $data) {}
-}
diff --git a/src/Sources/LightPortal/Args/ItemsArgs.php b/src/Sources/LightPortal/Args/ItemsArgs.php
deleted file mode 100644
index 47fa8b6b4..000000000
--- a/src/Sources/LightPortal/Args/ItemsArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ItemsArgs
-{
- public function __construct(public readonly array $items) {}
-}
diff --git a/src/Sources/LightPortal/Args/ItemsTitlesArgs.php b/src/Sources/LightPortal/Args/ItemsTitlesArgs.php
deleted file mode 100644
index 351fd381c..000000000
--- a/src/Sources/LightPortal/Args/ItemsTitlesArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ItemsTitlesArgs
-{
- public function __construct(public array &$items, public array &$titles) {}
-}
diff --git a/src/Sources/LightPortal/Args/ObjectArgs.php b/src/Sources/LightPortal/Args/ObjectArgs.php
deleted file mode 100644
index bb55b109d..000000000
--- a/src/Sources/LightPortal/Args/ObjectArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ObjectArgs
-{
- public function __construct(public readonly array $object) {}
-}
diff --git a/src/Sources/LightPortal/Args/OptionsTypeArgs.php b/src/Sources/LightPortal/Args/OptionsTypeArgs.php
deleted file mode 100644
index e38a3f630..000000000
--- a/src/Sources/LightPortal/Args/OptionsTypeArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class OptionsTypeArgs
-{
- public function __construct(public readonly array $options, public readonly string $type) {}
-}
diff --git a/src/Sources/LightPortal/Args/ParamsArgs.php b/src/Sources/LightPortal/Args/ParamsArgs.php
deleted file mode 100644
index 0cde407d2..000000000
--- a/src/Sources/LightPortal/Args/ParamsArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class ParamsArgs
-{
- public function __construct(public array &$params, public readonly string $type) {}
-}
diff --git a/src/Sources/LightPortal/Args/SettingsArgs.php b/src/Sources/LightPortal/Args/SettingsArgs.php
deleted file mode 100644
index fde3a993a..000000000
--- a/src/Sources/LightPortal/Args/SettingsArgs.php
+++ /dev/null
@@ -1,18 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Args;
-
-class SettingsArgs
-{
- public function __construct(public array &$settings) {}
-}
diff --git a/src/Sources/LightPortal/Articles/BoardArticle.php b/src/Sources/LightPortal/Articles/BoardArticle.php
index aefeb113d..378325d3c 100644
--- a/src/Sources/LightPortal/Articles/BoardArticle.php
+++ b/src/Sources/LightPortal/Articles/BoardArticle.php
@@ -12,16 +12,15 @@
namespace Bugo\LightPortal\Articles;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ArticlesArgs;
-use Bugo\LightPortal\Args\ArticlesRowArgs;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -59,13 +58,13 @@ public function init(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontBoards,
- new Event(new ArticlesArgs(
- $this->columns,
- $this->tables,
- $this->params,
- $this->wheres,
- $this->orders
- ))
+ new EventArgs([
+ 'columns' => &$this->columns,
+ 'tables' => &$this->tables,
+ 'params' => &$this->params,
+ 'wheres' => &$this->wheres,
+ 'orders' => &$this->orders
+ ])
);
}
@@ -139,7 +138,7 @@ public function getData(int $start, int $limit): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontBoardsRow,
- new Event(new ArticlesRowArgs($boards, $row))
+ new EventArgs(['articles' => &$boards, 'row' => $row])
);
}
diff --git a/src/Sources/LightPortal/Articles/PageArticle.php b/src/Sources/LightPortal/Articles/PageArticle.php
index 98af4babd..a11112cf8 100644
--- a/src/Sources/LightPortal/Articles/PageArticle.php
+++ b/src/Sources/LightPortal/Articles/PageArticle.php
@@ -12,21 +12,19 @@
namespace Bugo\LightPortal\Articles;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ArticlesArgs;
-use Bugo\LightPortal\Args\ArticlesRowArgs;
use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Enums\Permission;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\Status;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\TitleList;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Utils\Avatar;
use Bugo\LightPortal\Utils\Content;
use Bugo\LightPortal\Utils\Icon;
@@ -78,13 +76,13 @@ public function init(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontPages,
- new Event(new ArticlesArgs(
- $this->columns,
- $this->tables,
- $this->params,
- $this->wheres,
- $this->orders
- ))
+ new EventArgs([
+ 'columns' => &$this->columns,
+ 'tables' => &$this->tables,
+ 'params' => &$this->params,
+ 'wheres' => &$this->wheres,
+ 'orders' => &$this->orders
+ ])
);
}
@@ -157,7 +155,7 @@ public function getData(int $start, int $limit): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontPagesRow,
- new Event(new ArticlesRowArgs($pages, $row))
+ new EventArgs(['articles' => &$pages, 'row' => $row])
);
}
diff --git a/src/Sources/LightPortal/Articles/TopicArticle.php b/src/Sources/LightPortal/Articles/TopicArticle.php
index 9c9762aab..21d6c44cf 100644
--- a/src/Sources/LightPortal/Articles/TopicArticle.php
+++ b/src/Sources/LightPortal/Articles/TopicArticle.php
@@ -12,16 +12,14 @@
namespace Bugo\LightPortal\Articles;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\Compat\User;
-use Bugo\LightPortal\Args\ArticlesArgs;
-use Bugo\LightPortal\Args\ArticlesRowArgs;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\Avatar;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -62,13 +60,13 @@ public function init(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontTopics,
- new Event(new ArticlesArgs(
- $this->columns,
- $this->tables,
- $this->params,
- $this->wheres,
- $this->orders
- ))
+ new EventArgs([
+ 'columns' => &$this->columns,
+ 'tables' => &$this->tables,
+ 'params' => &$this->params,
+ 'wheres' => &$this->wheres,
+ 'orders' => &$this->orders
+ ])
);
}
@@ -154,7 +152,7 @@ public function getData(int $start, int $limit): array
app(EventManagerFactory::class)()->dispatch(
PortalHook::frontTopicsRow,
- new Event(new ArticlesRowArgs($topics, $row))
+ new EventArgs(['articles' => &$topics, 'row' => $row])
);
}
diff --git a/src/Sources/LightPortal/Enums/Permission.php b/src/Sources/LightPortal/Enums/Permission.php
index eaef5ed12..649c06b8c 100644
--- a/src/Sources/LightPortal/Enums/Permission.php
+++ b/src/Sources/LightPortal/Enums/Permission.php
@@ -76,7 +76,9 @@ public static function isGroupMember(int $groupId): bool
private static function getBoardModerators(): array
{
- if (($moderators = app(Cache::class)->get('board_moderators')) === null) {
+ $cache = new Cache();
+
+ if (($moderators = $cache->get('board_moderators')) === null) {
$result = Db::$db->query('', /** @lang text */ '
SELECT id_member
FROM {db_prefix}moderators',
@@ -88,7 +90,7 @@ private static function getBoardModerators(): array
$moderators = array_column($items, 'id_member');
- app(Cache::class)->put('board_moderators', $moderators);
+ $cache->put('board_moderators', $moderators);
}
return $moderators;
diff --git a/src/Sources/LightPortal/Args/ItemArgs.php b/src/Sources/LightPortal/Events/EventArgs.php
similarity index 57%
rename from src/Sources/LightPortal/Args/ItemArgs.php
rename to src/Sources/LightPortal/Events/EventArgs.php
index 785337fc1..b5bccaed5 100644
--- a/src/Sources/LightPortal/Args/ItemArgs.php
+++ b/src/Sources/LightPortal/Events/EventArgs.php
@@ -10,9 +10,16 @@
* @version 2.9
*/
-namespace Bugo\LightPortal\Args;
+namespace Bugo\LightPortal\Events;
-class ItemArgs
+use stdClass;
+
+class EventArgs extends stdClass
{
- public function __construct(public readonly int $item) {}
+ public function __construct(array $args = [])
+ {
+ foreach ($args as $key => &$value) {
+ $this->$key = &$value;
+ }
+ }
}
diff --git a/src/Sources/LightPortal/EventManager.php b/src/Sources/LightPortal/Events/EventManager.php
similarity index 85%
rename from src/Sources/LightPortal/EventManager.php
rename to src/Sources/LightPortal/Events/EventManager.php
index 7fd5e4849..ffd57cec0 100644
--- a/src/Sources/LightPortal/EventManager.php
+++ b/src/Sources/LightPortal/Events/EventManager.php
@@ -10,7 +10,7 @@
* @version 2.9
*/
-namespace Bugo\LightPortal;
+namespace Bugo\LightPortal\Events;
use Bugo\LightPortal\Enums\PluginType;
use Bugo\LightPortal\Enums\PortalHook;
@@ -18,8 +18,8 @@
use Bugo\LightPortal\Plugins\PluginInterface;
use Doctrine\Common\EventManager as DoctrineEventManager;
-use function array_map;
use function array_filter;
+use function array_map;
use function in_array;
use function method_exists;
@@ -48,23 +48,23 @@ public function addListeners(array $hooks, PluginInterface $listener): void
$this->eventManager->addEventListener($hooks, $listener);
}
- public function dispatch(PortalHook $hook, ?Event $e = null): void
+ public function dispatch(PortalHook $hook, ?EventArgs $args = null): void
{
/* @var PluginInterface $listener */
foreach ($this->getAll($hook->name) as $listener) {
if (
$listener->type !== PluginType::BLOCK_OPTIONS->name()
&& in_array($hook, $this->contentHooks)
- && isset($e->args->type)
+ && isset($args->type)
) {
- if ($e->args->type !== $listener->getShortName()) {
+ if ($args->type !== $listener->getSnakeName()) {
continue;
}
}
- $e ??= new Event(new class {});
+ $event = new Event($args ?: new class {});
- $listener->{$hook->name}($e);
+ $listener->{$hook->name}($event);
}
}
diff --git a/src/Sources/LightPortal/EventManagerFactory.php b/src/Sources/LightPortal/Events/EventManagerFactory.php
similarity index 95%
rename from src/Sources/LightPortal/EventManagerFactory.php
rename to src/Sources/LightPortal/Events/EventManagerFactory.php
index fde3c787d..27e9154a9 100644
--- a/src/Sources/LightPortal/EventManagerFactory.php
+++ b/src/Sources/LightPortal/Events/EventManagerFactory.php
@@ -10,7 +10,7 @@
* @version 2.9
*/
-namespace Bugo\LightPortal;
+namespace Bugo\LightPortal\Events;
use Bugo\LightPortal\Plugins\PluginHandler;
diff --git a/src/Sources/LightPortal/Args/index.php b/src/Sources/LightPortal/Events/index.php
similarity index 100%
rename from src/Sources/LightPortal/Args/index.php
rename to src/Sources/LightPortal/Events/index.php
diff --git a/src/Sources/LightPortal/Hooks/Actions.php b/src/Sources/LightPortal/Hooks/Actions.php
index 819769304..223f88f7e 100644
--- a/src/Sources/LightPortal/Hooks/Actions.php
+++ b/src/Sources/LightPortal/Hooks/Actions.php
@@ -13,7 +13,6 @@
namespace Bugo\LightPortal\Hooks;
use Bugo\Compat\Config;
-use Bugo\Compat\Theme;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
use Bugo\LightPortal\Actions\BoardIndex;
@@ -22,7 +21,6 @@
use Bugo\LightPortal\Actions\Tag;
use Bugo\LightPortal\Enums\Action;
use Bugo\LightPortal\Utils\Setting;
-use Bugo\LightPortal\Utils\RequestTrait;
use function array_search;
use function implode;
@@ -35,7 +33,6 @@
class Actions
{
use CommonChecks;
- use RequestTrait;
public function __invoke(array &$actions): void
{
@@ -45,8 +42,6 @@ public function __invoke(array &$actions): void
$actions[Action::FORUM->value] = [false, [app(BoardIndex::class), 'show']];
- Theme::load();
-
if ($this->request()->is(LP_ACTION) && Utils::$context['current_subaction'] === 'categories') {
app(Category::class)->show();
}
@@ -73,18 +68,18 @@ protected function promoteTopic(): void
$topic = $this->request()->get('t');
- $frontpageTopics = Setting::getFrontpageTopics();
+ $homeTopics = Setting::getFrontpageTopics();
- if (($key = array_search($topic, $frontpageTopics)) !== false) {
- unset($frontpageTopics[$key]);
+ if (($key = array_search($topic, $homeTopics)) !== false) {
+ unset($homeTopics[$key]);
} else {
- $frontpageTopics[] = $topic;
+ $homeTopics[] = $topic;
}
Config::updateModSettings(
- ['lp_frontpage_topics' => implode(',', $frontpageTopics)]
+ ['lp_frontpage_topics' => implode(',', $homeTopics)]
);
- Utils::redirectexit('topic=' . $topic);
+ $this->response()->redirect('topic=' . $topic);
}
}
diff --git a/src/Sources/LightPortal/Hooks/CommonChecks.php b/src/Sources/LightPortal/Hooks/CommonChecks.php
index b84b23cf6..f2c07f8f9 100644
--- a/src/Sources/LightPortal/Hooks/CommonChecks.php
+++ b/src/Sources/LightPortal/Hooks/CommonChecks.php
@@ -16,6 +16,7 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\Action;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use function array_flip;
@@ -29,6 +30,7 @@
trait CommonChecks
{
use RequestTrait;
+ use ResponseTrait;
protected function isPortalCanBeLoaded(): bool
{
@@ -75,7 +77,7 @@ protected function redirectFromDisabledActions(): void
return;
if (array_key_exists(Utils::$context['current_action'], Utils::$context['lp_disabled_actions'])) {
- Utils::redirectexit();
+ $this->response()->redirect();
}
}
diff --git a/src/Sources/LightPortal/Hooks/DefaultAction.php b/src/Sources/LightPortal/Hooks/DefaultAction.php
index aaa04384c..ede35a4b0 100644
--- a/src/Sources/LightPortal/Hooks/DefaultAction.php
+++ b/src/Sources/LightPortal/Hooks/DefaultAction.php
@@ -13,6 +13,7 @@
namespace Bugo\LightPortal\Hooks;
use Bugo\Compat\Config;
+use Bugo\LightPortal\Actions\ActionInterface;
use Bugo\LightPortal\Actions\BoardIndex;
use Bugo\LightPortal\Actions\FrontPage;
use Bugo\LightPortal\Actions\Page;
@@ -31,15 +32,20 @@ class DefaultAction
use RequestTrait;
public function __invoke(): mixed
+ {
+ return call_user_func([$this->determineAction(), 'show']);
+ }
+
+ private function determineAction(): ActionInterface
{
if ($this->request()->isNotEmpty(LP_PAGE_PARAM)) {
- return call_user_func([app(Page::class), 'show']);
+ return app(Page::class);
}
if (empty(Config::$modSettings['lp_frontpage_mode']) || Setting::isStandaloneMode()) {
- return call_user_func([app(BoardIndex::class), 'show']);
+ return app(BoardIndex::class);
}
- return call_user_func([app(FrontPage::class), 'show']);
+ return app(FrontPage::class);
}
}
diff --git a/src/Sources/LightPortal/Hooks/DownloadRequest.php b/src/Sources/LightPortal/Hooks/DownloadRequest.php
index 41582c8d1..ab358ee60 100644
--- a/src/Sources/LightPortal/Hooks/DownloadRequest.php
+++ b/src/Sources/LightPortal/Hooks/DownloadRequest.php
@@ -14,8 +14,8 @@
use Bugo\Compat\Lang;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
if (! defined('SMF'))
die('No direct access...');
@@ -28,9 +28,7 @@ public function __invoke(mixed &$attachRequest): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::downloadRequest,
- new Event(new class ($attachRequest) {
- public function __construct(public mixed &$attachRequest) {}
- })
+ new EventArgs(['attachRequest' => &$attachRequest])
);
}
}
diff --git a/src/Sources/LightPortal/Hooks/Init.php b/src/Sources/LightPortal/Hooks/Init.php
index 3fea6f6c8..ce92f9185 100644
--- a/src/Sources/LightPortal/Hooks/Init.php
+++ b/src/Sources/LightPortal/Hooks/Init.php
@@ -35,7 +35,7 @@ public function __invoke(): void
Utils::$context['lp_load_time'] ??= microtime(true);
define('LP_NAME', (new DateTime())->format('m-d') === '04-01' ? 'Lazy Panda' : 'Light Portal');
- define('LP_VERSION', '2.9.1');
+ define('LP_VERSION', '2.9.2');
define('LP_PLUGIN_LIST', 'https://d8d75ea98b25aa12.mokky.dev/json');
define('LP_ADDON_DIR', dirname(__DIR__) . '/Plugins');
define('LP_ADDON_URL', Config::$boardurl . '/Sources/LightPortal/Plugins');
diff --git a/src/Sources/LightPortal/Hooks/LoadTheme.php b/src/Sources/LightPortal/Hooks/LoadTheme.php
index 0a3fae58a..1aeb47531 100644
--- a/src/Sources/LightPortal/Hooks/LoadTheme.php
+++ b/src/Sources/LightPortal/Hooks/LoadTheme.php
@@ -24,7 +24,7 @@
use Bugo\LightPortal\Enums\PluginType;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\TitleClass;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Repositories\BlockRepository;
use Bugo\LightPortal\Utils\RequestTrait;
use Bugo\LightPortal\Utils\SessionManager;
@@ -45,7 +45,6 @@ public function __invoke(): void
Lang::load('LightPortal/LightPortal');
$this->defineVars();
-
$this->loadAssets();
// Run all init methods for active plugins
diff --git a/src/Sources/LightPortal/Hooks/MenuButtons.php b/src/Sources/LightPortal/Hooks/MenuButtons.php
index 469a5ae44..8e17db743 100644
--- a/src/Sources/LightPortal/Hooks/MenuButtons.php
+++ b/src/Sources/LightPortal/Hooks/MenuButtons.php
@@ -52,14 +52,12 @@ public function __invoke(array &$buttons): void
$this->prepareAdminButtons($buttons);
$this->prepareModerationButtons($buttons);
$this->preparePageButtons($buttons);
-
$this->showDebugInfo();
if (empty(Config::$modSettings['lp_frontpage_mode']))
return;
$this->preparePortalButtons($buttons);
-
$this->fixCanonicalUrl();
$this->fixLinktree();
}
diff --git a/src/Sources/LightPortal/Hooks/PermissionsList.php b/src/Sources/LightPortal/Hooks/PermissionsList.php
index 52bbb4bb5..8ccfbd83a 100644
--- a/src/Sources/LightPortal/Hooks/PermissionsList.php
+++ b/src/Sources/LightPortal/Hooks/PermissionsList.php
@@ -12,7 +12,7 @@
namespace Bugo\LightPortal\Hooks;
-use Bugo\Compat\Actions\Permissions;
+use Bugo\Compat\Actions\Admin\Permissions;
use Bugo\Compat\Lang;
use const LP_NAME;
diff --git a/src/Sources/LightPortal/Hooks/PreCssOutput.php b/src/Sources/LightPortal/Hooks/PreCssOutput.php
index f5fdf964a..0e417d200 100644
--- a/src/Sources/LightPortal/Hooks/PreCssOutput.php
+++ b/src/Sources/LightPortal/Hooks/PreCssOutput.php
@@ -15,8 +15,8 @@
use Bugo\Compat\Config;
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\Str;
if (! defined('SMF'))
@@ -47,9 +47,7 @@ public function __invoke(): void
app(EventManagerFactory::class)()->dispatch(
PortalHook::preloadStyles,
- new Event(new class ($styles) {
- public function __construct(public array &$styles) {}
- })
+ new EventArgs(['styles' => &$styles])
);
foreach ($styles as $style) {
diff --git a/src/Sources/LightPortal/Lists/IconList.php b/src/Sources/LightPortal/Lists/IconList.php
index 92a635106..a3a561375 100644
--- a/src/Sources/LightPortal/Lists/IconList.php
+++ b/src/Sources/LightPortal/Lists/IconList.php
@@ -14,8 +14,8 @@
use Bugo\FontAwesome\Enums\Icon as IconEnum;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Utils\Icon;
use function array_map;
@@ -106,9 +106,7 @@ public function __invoke(): array
// Plugin authors can extend the icon set
app(EventManagerFactory::class)()->dispatch(
PortalHook::changeIconSet,
- new Event(new class ($set) {
- public function __construct(public array &$set) {}
- })
+ new EventArgs(['set' => &$set])
);
return array_map(static fn($icon): string => Icon::parse($icon), $set);
diff --git a/src/Sources/LightPortal/Models/BlockModel.php b/src/Sources/LightPortal/Models/BlockModel.php
index 684579174..46ad8c445 100644
--- a/src/Sources/LightPortal/Models/BlockModel.php
+++ b/src/Sources/LightPortal/Models/BlockModel.php
@@ -13,6 +13,8 @@
namespace Bugo\LightPortal\Models;
use Bugo\Compat\Utils;
+use Bugo\LightPortal\Enums\Permission;
+use Bugo\LightPortal\Enums\Placement;
use Bugo\LightPortal\Enums\Status;
use Bugo\LightPortal\Utils\Setting;
@@ -63,13 +65,13 @@ public function __construct(array $postData, array $currentBlock)
$this->content = $postData['content'] ?? $currentBlock['content'] ?? '';
- $this->placement = $postData['placement'] ?? $currentBlock['placement'] ?? 'top';
+ $this->placement = $postData['placement'] ?? $currentBlock['placement'] ?? Placement::TOP->name();
$this->priority = $postData['priority'] ?? $currentBlock['priority'] ?? 0;
$this->permissions = $postData['permissions']
?? $currentBlock['permissions']
- ?? Setting::get('lp_permissions_default', 'int', 2);
+ ?? Setting::get('lp_permissions_default', 'int', Permission::MEMBER->value);
$this->status = $currentBlock['status'] ?? Status::ACTIVE->value;
diff --git a/src/Sources/LightPortal/Models/PageModel.php b/src/Sources/LightPortal/Models/PageModel.php
index 319c0c525..438ca0a7c 100644
--- a/src/Sources/LightPortal/Models/PageModel.php
+++ b/src/Sources/LightPortal/Models/PageModel.php
@@ -14,6 +14,8 @@
use Bugo\Compat\User;
use Bugo\Compat\Utils;
+use Bugo\LightPortal\Enums\EntryType;
+use Bugo\LightPortal\Enums\Permission;
use Bugo\LightPortal\Enums\Status;
use Bugo\LightPortal\Utils\Setting;
@@ -76,10 +78,10 @@ public function __construct(array $postData, array $currentPage)
$this->type = $postData['type'] ?? $currentPage['type'] ?? 'bbc';
- $this->entryType = $postData['entry_type'] ?? $currentPage['entry_type'] ?? 'default';
+ $this->entryType = $postData['entry_type'] ?? $currentPage['entry_type'] ?? EntryType::DEFAULT->name();
$this->permissions = $postData['permissions'] ?? $currentPage['permissions']
- ?? Setting::get('lp_permissions_default', 'int', 2);
+ ?? Setting::get('lp_permissions_default', 'int', Permission::MEMBER->value);
$this->status = $postData['status'] ?? $currentPage['status']
?? (
diff --git a/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php b/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php
index 120669200..c37c223dd 100644
--- a/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php
+++ b/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php
@@ -13,12 +13,12 @@
namespace Bugo\LightPortal\Plugins\ArticleList;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Enums\Permission;
use Bugo\LightPortal\Enums\Status;
diff --git a/src/Sources/LightPortal/Plugins/AssetHandler.php b/src/Sources/LightPortal/Plugins/AssetHandler.php
index 919170937..200cf9ad8 100644
--- a/src/Sources/LightPortal/Plugins/AssetHandler.php
+++ b/src/Sources/LightPortal/Plugins/AssetHandler.php
@@ -13,7 +13,7 @@
namespace Bugo\LightPortal\Plugins;
use Bugo\Compat\Theme;
-use Bugo\Compat\WebFetchApi;
+use Bugo\Compat\WebFetch\WebFetchApi;
use Bugo\LightPortal\Utils\Setting;
use MatthiasMullie\Minify\CSS;
use MatthiasMullie\Minify\JS;
diff --git a/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php b/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php
index 5a473ecc2..1b1af2022 100644
--- a/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php
+++ b/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\BlogMode;
@@ -251,7 +251,7 @@ public function showBlogEntries(int $memID): void
->setHtml(Str::html('span', ['class' => 'main_icons modify_button'])), 'centertext'),
);
- TablePresenter::show($builder);
+ app(TablePresenter::class)->show($builder);
}
public function profilePopup(array &$items): void
diff --git a/src/Sources/LightPortal/Plugins/DummyArticleCards/langs/english.php b/src/Sources/LightPortal/Plugins/DummyArticleCards/langs/english.php
index 8f1d0a84e..e3082618e 100644
--- a/src/Sources/LightPortal/Plugins/DummyArticleCards/langs/english.php
+++ b/src/Sources/LightPortal/Plugins/DummyArticleCards/langs/english.php
@@ -3,5 +3,5 @@
return [
'description' => 'The plugin generates fake cards on the frontpage, for testing templates.',
'use_lorem_ipsum' => 'Use Lorem Ipsum for cards',
- 'keywords' => 'Image keywords (only for Lorem Ipsum)',
+ 'keywords' => 'Image keywords',
];
diff --git a/src/Sources/LightPortal/Plugins/EhPortalMigration/BlockImport.php b/src/Sources/LightPortal/Plugins/EhPortalMigration/BlockImport.php
index 7201d8471..407e275b5 100644
--- a/src/Sources/LightPortal/Plugins/EhPortalMigration/BlockImport.php
+++ b/src/Sources/LightPortal/Plugins/EhPortalMigration/BlockImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\EhPortalMigration;
@@ -49,7 +49,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('ep_blocks', Lang::$txt['lp_blocks_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/EhPortalMigration/CategoryImport.php b/src/Sources/LightPortal/Plugins/EhPortalMigration/CategoryImport.php
index 4cc94a648..ac8dfbdaa 100644
--- a/src/Sources/LightPortal/Plugins/EhPortalMigration/CategoryImport.php
+++ b/src/Sources/LightPortal/Plugins/EhPortalMigration/CategoryImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\EhPortalMigration;
@@ -45,7 +45,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('ep_categories', Lang::$txt['lp_categories_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php b/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php
index 2dc54c5cc..3a3120e42 100644
--- a/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php
+++ b/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 23.01.25
*/
namespace Bugo\LightPortal\Plugins\EhPortalMigration;
@@ -50,7 +50,7 @@ public function updateAdminAreas(Event $e): void
public function updateBlockAreas(Event $e): void
{
- $e->args->areas[self::AREA] = [new BlockImport, 'main'];
+ $e->args->areas[self::AREA] = [new BlockImport(), 'main'];
}
public function updatePageAreas(Event $e): void
diff --git a/src/Sources/LightPortal/Plugins/EhPortalMigration/PageImport.php b/src/Sources/LightPortal/Plugins/EhPortalMigration/PageImport.php
index 81ac62cb0..e2fc7a438 100644
--- a/src/Sources/LightPortal/Plugins/EhPortalMigration/PageImport.php
+++ b/src/Sources/LightPortal/Plugins/EhPortalMigration/PageImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\EhPortalMigration;
@@ -51,7 +51,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('eh_pages', Lang::$txt['lp_pages_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/EzPortalMigration/BlockImport.php b/src/Sources/LightPortal/Plugins/EzPortalMigration/BlockImport.php
index 5cb672ecb..6dcdaa910 100644
--- a/src/Sources/LightPortal/Plugins/EzPortalMigration/BlockImport.php
+++ b/src/Sources/LightPortal/Plugins/EzPortalMigration/BlockImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\EzPortalMigration;
@@ -49,7 +49,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('ez_blocks', Lang::$txt['lp_blocks_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php b/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php
index 4de46596b..7ed9d823a 100644
--- a/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php
+++ b/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 23.01.25
*/
namespace Bugo\LightPortal\Plugins\EzPortalMigration;
@@ -46,7 +46,7 @@ public function updateAdminAreas(Event $e): void
public function updateBlockAreas(Event $e): void
{
- $e->args->areas[self::AREA] = [new BlockImport, 'main'];
+ $e->args->areas[self::AREA] = [new BlockImport(), 'main'];
}
public function updatePageAreas(Event $e): void
diff --git a/src/Sources/LightPortal/Plugins/EzPortalMigration/PageImport.php b/src/Sources/LightPortal/Plugins/EzPortalMigration/PageImport.php
index 832b16def..f9fc052ef 100644
--- a/src/Sources/LightPortal/Plugins/EzPortalMigration/PageImport.php
+++ b/src/Sources/LightPortal/Plugins/EzPortalMigration/PageImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\EzPortalMigration;
@@ -51,7 +51,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('ez_pages', Lang::$txt['lp_pages_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php b/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php
index 551d208e3..55a61dffe 100644
--- a/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php
+++ b/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 19.01.25
*/
namespace Bugo\LightPortal\Plugins\HelloPortal;
@@ -22,6 +22,7 @@
use Bugo\LightPortal\Plugins\Plugin;
use function array_combine;
+use function function_exists;
use function str_contains;
if (! defined('LP_NAME'))
@@ -135,6 +136,9 @@ private function getStepData(): string
{
$this->setTemplate('steps');
+ if (! function_exists('getSteps'))
+ return '';
+
$steps = getSteps($this->txt, Config::$modSettings);
if ($this->isCurrentArea('lp_settings', 'basic'))
diff --git a/src/Sources/LightPortal/Plugins/HelloPortal/steps.php b/src/Sources/LightPortal/Plugins/HelloPortal/steps.php
index fad00b904..82a6038b9 100644
--- a/src/Sources/LightPortal/Plugins/HelloPortal/steps.php
+++ b/src/Sources/LightPortal/Plugins/HelloPortal/steps.php
@@ -1,4 +1,4 @@
-name = $this->getShortName();
+ $this->name = $this->getSnakeName();
$this->context = &Utils::$context['lp_' . $this->name . '_plugin'];
$this->txt = &Lang::$txt['lp_' . $this->name];
}
- public function getShortName(): string
+ public function __toString(): string
{
- return Str::getSnakeName(basename(str_replace('\\', '/', static::class)));
+ return $this->getCamelName();
+ }
+
+ public function getCamelName(): string
+ {
+ return basename(static::class);
+ }
+
+ public function getSnakeName(): string
+ {
+ return Str::getSnakeName($this->getCamelName());
}
public function getFromSSI(string $function, ...$params)
diff --git a/src/Sources/LightPortal/Plugins/PluginHandler.php b/src/Sources/LightPortal/Plugins/PluginHandler.php
index ddf5602f4..271a3f558 100644
--- a/src/Sources/LightPortal/Plugins/PluginHandler.php
+++ b/src/Sources/LightPortal/Plugins/PluginHandler.php
@@ -14,11 +14,15 @@
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManager;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManager;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
+use function array_map;
+use function array_merge;
use function class_exists;
+use function get_object_vars;
use const DIRECTORY_SEPARATOR;
@@ -27,8 +31,6 @@
final class PluginHandler
{
- private readonly PluginRegistry $registry;
-
private readonly AssetHandler $assetHandler;
private readonly ConfigHandler $configHandler;
@@ -39,23 +41,31 @@ final class PluginHandler
public function __construct(array $plugins = [])
{
- $this->registry = app(PluginRegistry::class);
- $this->manager = app(EventManager::class);
-
- $this->assetHandler = new AssetHandler();
- $this->configHandler = new ConfigHandler();
- $this->langHandler = new LangHandler();
+ $this->manager = app(EventManager::class);
+ $this->assetHandler = app(AssetHandler::class);
+ $this->configHandler = app(ConfigHandler::class);
+ $this->langHandler = app(LangHandler::class);
$this->prepareListeners($plugins);
$this->prepareAssets();
$this->assetHandler->minify();
- Utils::$context['lp_loaded_addons'] = $this->registry->getAll();
+ Utils::$context['lp_loaded_addons'] = $this->getLoadedPlugins();
}
- public function getRegistry(): PluginRegistry
+ public function getLoadedPlugins(): array
{
- return $this->registry;
+ if (! app()->has('plugins')) {
+ return [];
+ }
+
+ $plugins = array_map(function (PluginInterface $plugin) {
+ $data = get_object_vars($plugin);
+ $data['name'] = $plugin->getCamelName();
+ return [$plugin->getSnakeName() => $data];
+ }, app()->get('plugins'));
+
+ return array_merge(...$plugins);
}
public function getManager(): EventManager
@@ -69,9 +79,7 @@ private function prepareAssets(): void
$this->manager->dispatch(
PortalHook::prepareAssets,
- new Event(new class ($assets) {
- public function __construct(public array &$assets) {}
- })
+ new EventArgs(['assets' => &$assets])
);
$this->assetHandler->prepare($assets);
@@ -87,30 +95,25 @@ private function prepareListeners(array $plugins = []): void
foreach ($plugins as $pluginName) {
$className = __NAMESPACE__ . "\\$pluginName\\$pluginName";
- if (! class_exists($className))
+ if (! class_exists($className) || app()->has($className))
continue;
- $snakeName = Str::getSnakeName($pluginName);
+ $this->handlePlugin($pluginName);
- if (! $this->registry->has($snakeName)) {
- $path = __DIR__ . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR;
+ app()->add($className)->addTag('plugins');
- $this->assetHandler->handle($path, $pluginName);
- $this->configHandler->handle($snakeName);
- $this->langHandler->handle($path, $snakeName);
+ $this->manager->addListeners(PortalHook::cases(), app($className));
+ }
+ }
- /** @var Plugin $className */
- $class = new $className();
+ private function handlePlugin(string $pluginName): void
+ {
+ $snakeName = Str::getSnakeName($pluginName);
- $this->manager->addListeners(PortalHook::cases(), $class);
+ $path = __DIR__ . DIRECTORY_SEPARATOR . $pluginName . DIRECTORY_SEPARATOR;
- $this->registry->add($snakeName, [
- 'name' => $pluginName,
- 'icon' => $class->icon,
- 'type' => $class->type,
- 'saveable' => $class->saveable,
- ]);
- }
- }
+ $this->assetHandler->handle($path, $pluginName);
+ $this->configHandler->handle($snakeName);
+ $this->langHandler->handle($path, $snakeName);
}
}
diff --git a/src/Sources/LightPortal/Plugins/PluginInterface.php b/src/Sources/LightPortal/Plugins/PluginInterface.php
index b760eabfd..1900a31c9 100644
--- a/src/Sources/LightPortal/Plugins/PluginInterface.php
+++ b/src/Sources/LightPortal/Plugins/PluginInterface.php
@@ -14,5 +14,7 @@
interface PluginInterface
{
- public function getShortName(): string;
+ public function getCamelName(): string;
+
+ public function getSnakeName(): string;
}
diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php
index c356620ad..cbb0fbf10 100644
--- a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php
+++ b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 21.12.24
+ * @version 24.01.25
*/
namespace Bugo\LightPortal\Plugins\PluginMaker;
@@ -97,8 +97,9 @@ public function prepareForumLanguages(): void
if (empty(Config::$modSettings['userLanguage'])) {
Utils::$context['lp_languages'] = ['english' => $temp[Language::getFallbackValue()]];
- if ($baseLang !== 'english')
+ if ($baseLang !== 'english') {
Utils::$context['lp_languages'][$baseLang] = $temp[Config::$language];
+ }
return;
}
@@ -141,8 +142,9 @@ private function validateData(): void
'options' => Utils::$context['lp_plugin']['options'] ?? []
];
- if (Utils::$context['lp_plugin']['type'] !== 'block' || Utils::$context['lp_plugin']['icon'] === 'undefined')
+ if (Utils::$context['lp_plugin']['type'] !== 'block' || Utils::$context['lp_plugin']['icon'] === 'undefined') {
Utils::$context['lp_plugin']['icon'] = '';
+ }
if (! empty($postData['option_name'])) {
foreach ($postData['option_name'] as $id => $option) {
@@ -169,8 +171,9 @@ private function validateData(): void
if (! empty($postData['option_translations'][$lang])) {
foreach ($postData['option_translations'][$lang] as $id => $translation) {
- if (! empty($translation))
+ if (! empty($translation)) {
Utils::$context['lp_plugin']['options'][$id]['translations'][$lang] = $translation;
+ }
}
}
}
@@ -334,7 +337,7 @@ private function setData(): void
$this->saveAuthorData();
- Utils::redirectexit('action=admin;area=lp_plugins;sa=main');
+ $this->response()->redirect('action=admin;area=lp_plugins;sa=main');
}
private function saveAuthorData(): void
diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php
index 6930ede34..7205abae7 100644
--- a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php
+++ b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 09.01.25
+ * @version 24.01.25
*/
namespace Bugo\LightPortal\Plugins\PluginMaker;
@@ -18,15 +18,12 @@
use Bugo\LightPortal\Areas\Validators\AbstractValidator;
use Bugo\LightPortal\Enums\VarType;
use Bugo\LightPortal\Lists\PluginList;
-use Bugo\LightPortal\Utils\RequestTrait;
if (! defined('LP_NAME'))
die('No direct access...');
class Validator extends AbstractValidator
{
- use RequestTrait;
-
protected array $args = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'type' => FILTER_DEFAULT,
@@ -83,12 +80,10 @@ public function validate(): array
return $data;
}
- private function findErrors(array $data): void
+ protected function findErrors(array $data): void
{
- $errors = [];
-
if (empty($data['name'])) {
- $errors[] = 'no_name';
+ $this->errors[] = 'no_name';
}
if (
@@ -97,21 +92,21 @@ private function findErrors(array $data): void
'options' => ['regexp' => '/' . LP_ADDON_PATTERN . '/']
]))
) {
- $errors[] = 'no_valid_name';
+ $this->errors[] = 'no_valid_name';
}
if (! empty($data['name']) && ! $this->isUnique($data['name'])) {
- $errors[] = 'no_unique_name';
+ $this->errors[] = 'no_unique_name';
}
if (empty($data['description_english'])) {
- $errors[] = 'no_description';
+ $this->errors[] = 'no_description';
}
- if (! empty($errors)) {
+ if (! empty($this->errors)) {
Utils::$context['post_errors'] = [];
- foreach ($errors as $error) {
+ foreach ($this->errors as $error) {
Utils::$context['post_errors'][]
= Lang::$txt['lp_post_error_' . $error] ?? Lang::$txt['lp_plugin_maker'][$error];
}
diff --git a/src/Sources/LightPortal/Plugins/PluginRegistry.php b/src/Sources/LightPortal/Plugins/PluginRegistry.php
deleted file mode 100644
index 2c32cbbfd..000000000
--- a/src/Sources/LightPortal/Plugins/PluginRegistry.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- * @copyright 2019-2025 Bugo
- * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
- *
- * @version 2.9
- */
-
-namespace Bugo\LightPortal\Plugins;
-
-class PluginRegistry
-{
- private array $plugins = [];
-
- public function add(string $name, array $plugin): void
- {
- if (! $this->has($name)) {
- $this->plugins[$name] = $plugin;
- }
- }
-
- public function has(string $name): bool
- {
- return isset($this->plugins[$name]);
- }
-
- public function get(string $name): ?array
- {
- return $this->plugins[$name] ?? null;
- }
-
- public function getAll(): array
- {
- return $this->plugins;
- }
-}
diff --git a/src/Sources/LightPortal/Plugins/PrettyUrls/PrettyUrls.php b/src/Sources/LightPortal/Plugins/PrettyUrls/PrettyUrls.php
index 16cfac1bd..2c071235a 100644
--- a/src/Sources/LightPortal/Plugins/PrettyUrls/PrettyUrls.php
+++ b/src/Sources/LightPortal/Plugins/PrettyUrls/PrettyUrls.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 30.01.25
*/
namespace Bugo\LightPortal\Plugins\PrettyUrls;
@@ -60,11 +60,12 @@ public function init(): void
'enabled' => 0,
'filter' => [
'priority' => self::PRIORITY,
- 'callback' => $this->filter(...),
+ 'callback' => [$this, 'filter'],
],
'rewrite' => [
'priority' => self::PRIORITY,
- 'rule' => 'RewriteRule ^' . LP_PAGE_PARAM . '/([^/]+)/?$ ./index.php?pretty;' . LP_PAGE_PARAM . '=$1 [L,QSA]',
+ 'rule' => 'RewriteRule ^pages/' . LP_ALIAS_PATTERN . ' ./index.php?pretty;' . LP_PAGE_PARAM . '=$1 [L,QSA]',
+ "nginx" => 'rewrite ^pages/' . LP_ALIAS_PATTERN . ' "/index.php?pretty;' . LP_PAGE_PARAM . '=$1" last;'
],
'title' => Str::html('a')
->href('https://custom.simplemachines.org/mods/index.php?mod=4244')
@@ -83,7 +84,7 @@ public function init(): void
public function filter(array $urls): array
{
$pattern = '`' . Config::$scripturl . '(.*)' . LP_PAGE_PARAM . '=([^;]+)`S';
- $replacement = Config::$boardurl . '/' . LP_PAGE_PARAM . '/$2/$1';
+ $replacement = Config::$boardurl . '/pages/$2/$1';
foreach ($urls as $id => $url) {
if (! isset($url['replacement']) && preg_match($pattern, (string) $url['url'])) {
diff --git a/src/Sources/LightPortal/Plugins/Search/Search.php b/src/Sources/LightPortal/Plugins/Search/Search.php
index 0adc367b5..a019f337e 100644
--- a/src/Sources/LightPortal/Plugins/Search/Search.php
+++ b/src/Sources/LightPortal/Plugins/Search/Search.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 02.02.25
*/
namespace Bugo\LightPortal\Plugins\Search;
@@ -83,7 +83,7 @@ private function prepareQuickResults(): void
$query = Utils::$smcFunc['htmltrim'](Utils::htmlspecialchars($data['phrase']));
- exit(json_encode($this->query($query)));
+ $this->response()->json($this->query($query));
}
private function getResults(): array
diff --git a/src/Sources/LightPortal/Plugins/SimpleChat/Chat.php b/src/Sources/LightPortal/Plugins/SimpleChat/Chat.php
index d523adb29..f02fd9239 100644
--- a/src/Sources/LightPortal/Plugins/SimpleChat/Chat.php
+++ b/src/Sources/LightPortal/Plugins/SimpleChat/Chat.php
@@ -8,22 +8,22 @@
* @license https://opensource.org/licenses/MIT MIT
*
* @category plugin
- * @version 22.12.24
+ * @version 02.02.25
*/
namespace Bugo\LightPortal\Plugins\SimpleChat;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Time;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\LightPortal\Utils\Avatar;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
-use function json_encode;
use function time;
if (! defined('LP_NAME'))
@@ -33,6 +33,7 @@ class Chat
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
public function __construct(private readonly string $name) {}
@@ -163,7 +164,7 @@ public function addMessage(): void
],
];
- exit(json_encode($result));
+ $this->response()->json($result);
}
public function deleteMessage(): void
diff --git a/src/Sources/LightPortal/Plugins/TinyPortalMigration/BlockImport.php b/src/Sources/LightPortal/Plugins/TinyPortalMigration/BlockImport.php
index 1db4d0b03..fbd032f69 100644
--- a/src/Sources/LightPortal/Plugins/TinyPortalMigration/BlockImport.php
+++ b/src/Sources/LightPortal/Plugins/TinyPortalMigration/BlockImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\TinyPortalMigration;
@@ -50,7 +50,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('tp_blocks', Lang::$txt['lp_blocks_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/TinyPortalMigration/CategoryImport.php b/src/Sources/LightPortal/Plugins/TinyPortalMigration/CategoryImport.php
index fa7482769..c35aef648 100644
--- a/src/Sources/LightPortal/Plugins/TinyPortalMigration/CategoryImport.php
+++ b/src/Sources/LightPortal/Plugins/TinyPortalMigration/CategoryImport.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\TinyPortalMigration;
@@ -44,7 +44,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('tp_categories', Lang::$txt['lp_categories_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/TinyPortalMigration/PageImport.php b/src/Sources/LightPortal/Plugins/TinyPortalMigration/PageImport.php
index 4c47adb65..0498722bf 100644
--- a/src/Sources/LightPortal/Plugins/TinyPortalMigration/PageImport.php
+++ b/src/Sources/LightPortal/Plugins/TinyPortalMigration/PageImport.php
@@ -8,19 +8,19 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 24.12.24
+ * @version 31.01.25
*/
namespace Bugo\LightPortal\Plugins\TinyPortalMigration;
use Bugo\Bricks\Presenters\TablePresenter;
use Bugo\Bricks\Tables\IdColumn;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\Db;
use Bugo\Compat\Lang;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\LightPortal\Areas\Imports\AbstractCustomPageImport;
use Bugo\LightPortal\Enums\Permission;
use Bugo\LightPortal\UI\Tables\CheckboxColumn;
@@ -52,7 +52,7 @@ public function main(): void
$this->run();
- TablePresenter::show(
+ app(TablePresenter::class)->show(
PortalTableBuilder::make('tp_pages', Lang::$txt['lp_pages_import'])
->withParams(
50,
diff --git a/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php b/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php
index 9a4cfd8cf..20e121734 100644
--- a/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php
+++ b/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php
@@ -8,7 +8,7 @@
* @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
*
* @category plugin
- * @version 22.12.24
+ * @version 23.01.25
*/
namespace Bugo\LightPortal\Plugins\TinyPortalMigration;
@@ -51,17 +51,17 @@ public function updateAdminAreas(Event $e): void
public function updateBlockAreas(Event $e): void
{
- $e->args->areas[self::AREA] = [new BlockImport, 'main'];
+ $e->args->areas[self::AREA] = [new BlockImport(), 'main'];
}
public function updatePageAreas(Event $e): void
{
- $e->args->areas[self::AREA] = [new PageImport, 'main'];
+ $e->args->areas[self::AREA] = [new PageImport(), 'main'];
}
public function updateCategoryAreas(Event $e): void
{
- $e->args->areas[self::AREA] = [new CategoryImport, 'main'];
+ $e->args->areas[self::AREA] = [new CategoryImport(), 'main'];
}
public function importPages(Event $e): void
diff --git a/src/Sources/LightPortal/Plugins/TwigLayouts/TwigRenderer.php b/src/Sources/LightPortal/Plugins/TwigLayouts/TwigRenderer.php
index 530637d5b..5894bb5d4 100644
--- a/src/Sources/LightPortal/Plugins/TwigLayouts/TwigRenderer.php
+++ b/src/Sources/LightPortal/Plugins/TwigLayouts/TwigRenderer.php
@@ -13,10 +13,10 @@
namespace Bugo\LightPortal\Plugins\TwigLayouts;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\Config;
use Bugo\Compat\ErrorHandler;
use Bugo\Compat\Sapi;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\LightPortal\Renderers\AbstractRenderer;
use Bugo\LightPortal\Utils\Icon;
use Twig\Environment;
diff --git a/src/Sources/LightPortal/PortalApp.php b/src/Sources/LightPortal/PortalApp.php
new file mode 100644
index 000000000..2d7471a9a
--- /dev/null
+++ b/src/Sources/LightPortal/PortalApp.php
@@ -0,0 +1,32 @@
+
+ * @copyright 2019-2025 Bugo
+ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
+ *
+ * @version 2.9
+ */
+
+namespace Bugo\LightPortal;
+
+use Bugo\LightPortal\Areas\ConfigArea;
+use Bugo\LightPortal\Areas\CreditArea;
+
+if (! defined('SMF'))
+ die('No direct access...');
+
+final class PortalApp
+{
+ public function __construct()
+ {
+ if (SMF === 'BACKGROUND')
+ return;
+
+ app(Integration::class)();
+ app(ConfigArea::class)();
+ app(CreditArea::class)();
+ }
+}
diff --git a/src/Sources/LightPortal/Renderers/AbstractRenderer.php b/src/Sources/LightPortal/Renderers/AbstractRenderer.php
index a85ebf5b3..d6cb43640 100644
--- a/src/Sources/LightPortal/Renderers/AbstractRenderer.php
+++ b/src/Sources/LightPortal/Renderers/AbstractRenderer.php
@@ -15,8 +15,8 @@
use Bugo\Compat\Lang;
use Bugo\Compat\Theme;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use function array_combine;
use function array_merge;
@@ -46,6 +46,16 @@ public function getLayouts(): array
{
Theme::loadTemplate('LightPortal/ViewFrontPage');
+ $layouts = $this->collectLayouts();
+
+ $default = $layouts[static::DEFAULT_TEMPLATE];
+ unset($layouts[static::DEFAULT_TEMPLATE]);
+
+ return array_merge([static::DEFAULT_TEMPLATE => $default], $layouts);
+ }
+
+ private function collectLayouts(): array
+ {
$layouts = glob($this->templateDir . '/*' . static::DEFAULT_EXTENSION);
$extensions = [static::DEFAULT_EXTENSION];
@@ -53,9 +63,7 @@ public function getLayouts(): array
// You can add custom extensions for layouts
app(EventManagerFactory::class)()->dispatch(
PortalHook::layoutExtensions,
- new Event(new class ($extensions) {
- public function __construct(public array &$extensions) {}
- })
+ new EventArgs(['extensions' => &$extensions])
);
foreach ($extensions as $extension) {
@@ -65,6 +73,11 @@ public function __construct(public array &$extensions) {}
);
}
+ return $this->processLayouts($layouts);
+ }
+
+ private function processLayouts(array $layouts): array
+ {
$values = $titles = [];
foreach ($layouts as $layout) {
@@ -77,10 +90,6 @@ public function __construct(public array &$extensions) {}
: str_replace('_', ' ', $shortName);
}
- $layouts = array_combine($values, $titles);
- $default = $layouts[static::DEFAULT_TEMPLATE];
- unset($layouts[static::DEFAULT_TEMPLATE]);
-
- return array_merge([static::DEFAULT_TEMPLATE => $default], $layouts);
+ return array_combine($values, $titles);
}
}
diff --git a/src/Sources/LightPortal/Repositories/BlockRepository.php b/src/Sources/LightPortal/Repositories/BlockRepository.php
index c4057e318..b74855067 100644
--- a/src/Sources/LightPortal/Repositories/BlockRepository.php
+++ b/src/Sources/LightPortal/Repositories/BlockRepository.php
@@ -19,16 +19,15 @@
use Bugo\Compat\Msg;
use Bugo\Compat\Security;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ItemArgs;
-use Bugo\LightPortal\Args\ItemsArgs;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\Status;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\PluginList;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -48,6 +47,7 @@ final class BlockRepository extends AbstractRepository
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
protected string $entity = 'block';
@@ -177,11 +177,11 @@ public function setData(int $item = 0)
$this->session('lp')->free('active_blocks');
if ($this->request()->has('save_exit')) {
- Utils::redirectexit('action=admin;area=lp_blocks;sa=main');
+ $this->response()->redirect('action=admin;area=lp_blocks;sa=main');
}
if ($this->request()->has('save')) {
- Utils::redirectexit('action=admin;area=lp_blocks;sa=edit;id=' . $item);
+ $this->response()->redirect('action=admin;area=lp_blocks;sa=edit;id=' . $item);
}
}
@@ -190,7 +190,10 @@ public function remove(array $items): void
if ($items === [])
return;
- app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockRemoving, new Event(new ItemsArgs($items)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onBlockRemoving,
+ new EventArgs(['items' => $items])
+ );
Db::$db->query('', '
DELETE FROM {db_prefix}lp_blocks
@@ -351,7 +354,10 @@ private function addData(): int
return 0;
}
- app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onBlockSaving,
+ new EventArgs(['item' => $item])
+ );
$this->saveTitles($item);
$this->saveOptions($item);
@@ -385,7 +391,10 @@ private function updateData(int $item): void
]
);
- app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onBlockSaving,
+ new EventArgs(['item' => $item])
+ );
$this->saveTitles($item, 'replace');
$this->saveOptions($item, 'replace');
diff --git a/src/Sources/LightPortal/Repositories/CategoryRepository.php b/src/Sources/LightPortal/Repositories/CategoryRepository.php
index d0a6641e6..334711560 100644
--- a/src/Sources/LightPortal/Repositories/CategoryRepository.php
+++ b/src/Sources/LightPortal/Repositories/CategoryRepository.php
@@ -22,6 +22,7 @@
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use function array_filter;
@@ -32,6 +33,7 @@ final class CategoryRepository extends AbstractRepository
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
protected string $entity = 'category';
@@ -151,11 +153,11 @@ public function setData(int $item = 0): void
$this->session('lp')->free('active_categories');
if ($this->request()->has('save_exit')) {
- Utils::redirectexit('action=admin;area=lp_categories;sa=main');
+ $this->response()->redirect('action=admin;area=lp_categories;sa=main');
}
if ($this->request()->has('save')) {
- Utils::redirectexit('action=admin;area=lp_categories;sa=edit;id=' . $item);
+ $this->response()->redirect('action=admin;area=lp_categories;sa=edit;id=' . $item);
}
}
diff --git a/src/Sources/LightPortal/Repositories/PageRepository.php b/src/Sources/LightPortal/Repositories/PageRepository.php
index a9cc25c18..18ff44d6e 100644
--- a/src/Sources/LightPortal/Repositories/PageRepository.php
+++ b/src/Sources/LightPortal/Repositories/PageRepository.php
@@ -20,22 +20,22 @@
use Bugo\Compat\Security;
use Bugo\Compat\User;
use Bugo\Compat\Utils;
-use Bugo\LightPortal\Args\ItemArgs;
use Bugo\LightPortal\Enums\AlertAction;
use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Enums\Permission;
use Bugo\LightPortal\Enums\PortalHook;
use Bugo\LightPortal\Enums\Status;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\CategoryList;
use Bugo\LightPortal\Lists\TitleList;
-use Bugo\LightPortal\Plugins\Event;
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Content;
use Bugo\LightPortal\Utils\DateTime;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\Notify;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
use Bugo\LightPortal\Utils\Setting;
use Bugo\LightPortal\Utils\Str;
@@ -64,6 +64,7 @@ final class PageRepository extends AbstractRepository
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
protected string $entity = 'page';
@@ -238,11 +239,11 @@ public function setData(int $item = 0): void
$this->session()->free('lp');
if ($this->request()->has('save_exit')) {
- Utils::redirectexit('action=admin;area=lp_pages;sa=main');
+ $this->response()->redirect('action=admin;area=lp_pages;sa=main');
}
if ($this->request()->has('save')) {
- Utils::redirectexit('action=admin;area=lp_pages;sa=edit;id=' . $item);
+ $this->response()->redirect('action=admin;area=lp_pages;sa=edit;id=' . $item);
}
}
@@ -286,7 +287,10 @@ public function removePermanently(array $items): void
if ($items === [])
return;
- app(EventManagerFactory::class)()->dispatch(PortalHook::onPageRemoving, new Event(new ItemsArgs($items)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onPageRemoving,
+ new EventArgs(['items' => $items])
+ );
Db::$db->query('', '
DELETE FROM {db_prefix}lp_pages
@@ -559,16 +563,15 @@ public function prepareData(?array &$data): void
}
if (! empty($data['category_id'])) {
- $data['category'] = app(CategoryList::class)[$data['category_id']]['title'];
+ $categories = app(CategoryList::class);
+ $data['category'] = $categories[$data['category_id']]['title'];
}
$data['tags'] = $this->getTags($data['id']);
app(EventManagerFactory::class)()->dispatch(
PortalHook::preparePageData,
- new Event(new class ($data, $isAuthor) {
- public function __construct(public array &$data, public readonly bool $isAuthor) {}
- })
+ new EventArgs(['data' => &$data, 'isAuthor' => $isAuthor])
);
}
@@ -611,13 +614,16 @@ private function addData(): int
return 0;
}
- app(EventManagerFactory::class)()->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onPageSaving,
+ new EventArgs(['item' => $item])
+ );
$this->saveTitles($item);
$this->saveTags($item);
$this->saveOptions($item);
- Db::$db->transaction('commit');
+ Db::$db->transaction();
// Notify page moderators about new page
$title = Utils::$context['lp_page']['titles'][User::$info['language']]
@@ -664,7 +670,10 @@ private function updateData(int $item): void
]
);
- app(EventManagerFactory::class)()->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item)));
+ app(EventManagerFactory::class)()->dispatch(
+ PortalHook::onPageSaving,
+ new EventArgs(['item' => $item])
+ );
$this->saveTitles($item, 'replace');
$this->saveTags($item, 'replace');
@@ -677,7 +686,7 @@ private function updateData(int $item): void
]);
}
- Db::$db->transaction('commit');
+ Db::$db->transaction();
}
private function getTags(int $item): array
diff --git a/src/Sources/LightPortal/Repositories/TagRepository.php b/src/Sources/LightPortal/Repositories/TagRepository.php
index 52fa938da..9c3a071e6 100644
--- a/src/Sources/LightPortal/Repositories/TagRepository.php
+++ b/src/Sources/LightPortal/Repositories/TagRepository.php
@@ -21,6 +21,7 @@
use Bugo\LightPortal\Utils\CacheTrait;
use Bugo\LightPortal\Utils\Icon;
use Bugo\LightPortal\Utils\RequestTrait;
+use Bugo\LightPortal\Utils\ResponseTrait;
if (! defined('SMF'))
die('No direct access...');
@@ -29,6 +30,7 @@ final class TagRepository extends AbstractRepository
{
use CacheTrait;
use RequestTrait;
+ use ResponseTrait;
protected string $entity = 'tag';
@@ -142,11 +144,11 @@ public function setData(int $item = 0): void
$this->session('lp')->free('active_tags');
if ($this->request()->has('save_exit')) {
- Utils::redirectexit('action=admin;area=lp_tags;sa=main');
+ $this->response()->redirect('action=admin;area=lp_tags;sa=main');
}
if ($this->request()->has('save')) {
- Utils::redirectexit('action=admin;area=lp_tags;sa=edit;id=' . $item);
+ $this->response()->redirect('action=admin;area=lp_tags;sa=edit;id=' . $item);
}
}
diff --git a/src/Sources/LightPortal/ServiceProvider.php b/src/Sources/LightPortal/ServiceProvider.php
index 93f79dd68..ccdf63d0d 100644
--- a/src/Sources/LightPortal/ServiceProvider.php
+++ b/src/Sources/LightPortal/ServiceProvider.php
@@ -12,6 +12,7 @@
namespace Bugo\LightPortal;
+use Bugo\Bricks\Presenters\TablePresenter;
use Bugo\LightPortal\Actions\Block;
use Bugo\LightPortal\Actions\BoardIndex;
use Bugo\LightPortal\Actions\CardList;
@@ -23,6 +24,8 @@
use Bugo\LightPortal\Actions\Tag;
use Bugo\LightPortal\Areas\BlockArea;
use Bugo\LightPortal\Areas\CategoryArea;
+use Bugo\LightPortal\Areas\ConfigArea;
+use Bugo\LightPortal\Areas\CreditArea;
use Bugo\LightPortal\Areas\Exports\BlockExport;
use Bugo\LightPortal\Areas\Exports\CategoryExport;
use Bugo\LightPortal\Areas\Exports\PageExport;
@@ -36,14 +39,18 @@
use Bugo\LightPortal\Areas\PageArea;
use Bugo\LightPortal\Areas\PluginArea;
use Bugo\LightPortal\Areas\TagArea;
+use Bugo\LightPortal\Events\EventManager;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\CategoryList;
use Bugo\LightPortal\Lists\IconList;
use Bugo\LightPortal\Lists\PageList;
use Bugo\LightPortal\Lists\PluginList;
use Bugo\LightPortal\Lists\TagList;
use Bugo\LightPortal\Lists\TitleList;
+use Bugo\LightPortal\Plugins\AssetHandler;
+use Bugo\LightPortal\Plugins\ConfigHandler;
+use Bugo\LightPortal\Plugins\LangHandler;
use Bugo\LightPortal\Plugins\PluginHandler;
-use Bugo\LightPortal\Plugins\PluginRegistry;
use Bugo\LightPortal\Renderers\Blade;
use Bugo\LightPortal\Renderers\RendererInterface;
use Bugo\LightPortal\Repositories\BlockRepository;
@@ -52,10 +59,12 @@
use Bugo\LightPortal\Repositories\PageRepository;
use Bugo\LightPortal\Repositories\PluginRepository;
use Bugo\LightPortal\Repositories\TagRepository;
+use Bugo\LightPortal\UI\Tables\TableRenderer;
use Bugo\LightPortal\Utils\Cache;
use Bugo\LightPortal\Utils\File;
use Bugo\LightPortal\Utils\Post;
use Bugo\LightPortal\Utils\Request;
+use Bugo\LightPortal\Utils\Response;
use Bugo\LightPortal\Utils\Session;
use Bugo\LightPortal\Utils\SessionManager;
use Bugo\LightPortal\Utils\Weaver;
@@ -65,72 +74,90 @@
class ServiceProvider extends AbstractServiceProvider
{
+ private array $services = [
+ AssetHandler::class,
+ Block::class,
+ BlockArea::class,
+ BlockExport::class,
+ BlockImport::class,
+ BlockRepository::class,
+ BoardIndex::class,
+ Cache::class,
+ CardListInterface::class,
+ Category::class,
+ CategoryArea::class,
+ CategoryExport::class,
+ CategoryImport::class,
+ CategoryList::class,
+ CategoryRepository::class,
+ Comment::class,
+ CommentRepository::class,
+ ConfigArea::class,
+ ConfigHandler::class,
+ CreditArea::class,
+ EventManager::class,
+ EventManagerFactory::class,
+ File::class,
+ FrontPage::class,
+ IconList::class,
+ Integration::class,
+ LangHandler::class,
+ Page::class,
+ PageArea::class,
+ PageExport::class,
+ PageImport::class,
+ PageList::class,
+ PageRepository::class,
+ PluginArea::class,
+ PluginExport::class,
+ PluginHandler::class,
+ PluginImport::class,
+ PluginList::class,
+ PluginRepository::class,
+ PortalApp::class,
+ Post::class,
+ RendererInterface::class,
+ Request::class,
+ Response::class,
+ Session::class,
+ SessionManager::class,
+ TablePresenter::class,
+ TableRenderer::class,
+ Tag::class,
+ TagArea::class,
+ TagExport::class,
+ TagImport::class,
+ TagList::class,
+ TagRepository::class,
+ TitleList::class,
+ Weaver::class,
+ ];
+
public function provides(string $id): bool
{
- $services = [
- RendererInterface::class,
- EventManager::class,
- EventManagerFactory::class,
- PluginHandler::class,
- PluginRegistry::class,
- CategoryList::class,
- PageList::class,
- TagList::class,
- TitleList::class,
- IconList::class,
- PluginList::class,
- SessionManager::class,
- Request::class,
- Post::class,
- File::class,
- Cache::class,
- Session::class,
- BlockRepository::class,
- CategoryRepository::class,
- CommentRepository::class,
- PageRepository::class,
- PluginRepository::class,
- TagRepository::class,
- BlockArea::class,
- BlockExport::class,
- BlockImport::class,
- PageArea::class,
- PageExport::class,
- PageImport::class,
- CategoryArea::class,
- CategoryExport::class,
- CategoryImport::class,
- TagArea::class,
- TagExport::class,
- TagImport::class,
- PluginArea::class,
- PluginExport::class,
- PluginImport::class,
- BoardIndex::class,
- FrontPage::class,
- Block::class,
- Page::class,
- Comment::class,
- Category::class,
- Tag::class,
- CardListInterface::class,
- Weaver::class,
- ];
-
- return in_array($id, $services);
+ return in_array($id, $this->services);
}
public function register(): void
{
+ $this->getContainer()->add(PortalApp::class);
+ $this->getContainer()->add(Integration::class);
+ $this->getContainer()->add(ConfigArea::class);
+ $this->getContainer()->add(CreditArea::class);
+
$this->getContainer()->add(RendererInterface::class, Blade::class);
+ $this->getContainer()->add(TablePresenter::class)->addArgument(TableRenderer::class);
+ $this->getContainer()->add(TableRenderer::class);
$this->getContainer()->add(EventManager::class);
+ $this->getContainer()->add(AssetHandler::class);
+ $this->getContainer()->add(ConfigHandler::class);
+ $this->getContainer()->add(LangHandler::class);
$this->getContainer()->add(EventManagerFactory::class);
$this->getContainer()->add(PluginHandler::class, fn() => fn(array $plugins = []) => new PluginHandler($plugins));
- $this->getContainer()->add(PluginRegistry::class);
$this->getContainer()->add(CategoryList::class, fn() => (new CategoryList())());
- $this->getContainer()->add(PageList::class, fn() => (new PageList($this->getContainer()->get(PageRepository::class)))());
+ $this->getContainer()->add(PageList::class, fn() => (new PageList(app(PageRepository::class)))());
$this->getContainer()->add(TagList::class, fn() => (new TagList())());
$this->getContainer()->add(TitleList::class, fn() => (new TitleList())());
$this->getContainer()->add(IconList::class, fn() => (new IconList())());
@@ -138,6 +165,7 @@ public function register(): void
$this->getContainer()->add(SessionManager::class, fn() => (new SessionManager())());
$this->getContainer()->add(Request::class);
+ $this->getContainer()->add(Response::class);
$this->getContainer()->add(Post::class);
$this->getContainer()->add(File::class);
$this->getContainer()->add(Cache::class, fn() => fn(?string $key = null) => new Cache($key));
diff --git a/src/Sources/LightPortal/Tasks/Maintainer.php b/src/Sources/LightPortal/Tasks/Maintainer.php
index 672fa3246..926223606 100644
--- a/src/Sources/LightPortal/Tasks/Maintainer.php
+++ b/src/Sources/LightPortal/Tasks/Maintainer.php
@@ -14,7 +14,6 @@
use Bugo\Compat\Tasks\BackgroundTask;
use Bugo\Compat\Db;
-
use Bugo\LightPortal\Repositories\CommentRepository;
use function array_keys;
diff --git a/src/Sources/LightPortal/UI/Partials/EntryTypeSelect.php b/src/Sources/LightPortal/UI/Partials/EntryTypeSelect.php
index 0fbea4d08..117067ebb 100644
--- a/src/Sources/LightPortal/UI/Partials/EntryTypeSelect.php
+++ b/src/Sources/LightPortal/UI/Partials/EntryTypeSelect.php
@@ -31,7 +31,7 @@ public function __invoke(): string
$data = [];
foreach ($params['data'] as $value => $label) {
- if (Utils::$context['user']['is_admin'] === false && $value === 'internal')
+ if (Utils::$context['user']['is_admin'] === false && $value === EntryType::INTERNAL->name())
continue;
$data[] = [
diff --git a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php
index 2d326b361..cb187d6c9 100644
--- a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php
+++ b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php
@@ -16,6 +16,7 @@
use Bugo\Bricks\Tables\RowPosition;
use Bugo\Compat\Lang;
use Bugo\Compat\Utils;
+use Bugo\LightPortal\Enums\EntryType;
use Bugo\LightPortal\Utils\Request;
use Bugo\LightPortal\Utils\Str;
@@ -25,7 +26,7 @@ public static function make(string $value = '', ?string $class = null): static
{
$types = '';
foreach (Utils::$context['lp_page_types'] as $type => $text) {
- if (Utils::$context['user']['is_admin'] === false && $type === 'internal')
+ if (Utils::$context['user']['is_admin'] === false && $type === EntryType::INTERNAL->name())
continue;
$types .= Str::html('option', [
diff --git a/src/Sources/LightPortal/UI/Tables/TableRenderer.php b/src/Sources/LightPortal/UI/Tables/TableRenderer.php
new file mode 100644
index 000000000..849b00639
--- /dev/null
+++ b/src/Sources/LightPortal/UI/Tables/TableRenderer.php
@@ -0,0 +1,28 @@
+
+ * @copyright 2019-2025 Bugo
+ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
+ *
+ * @version 2.9
+ */
+
+namespace Bugo\LightPortal\UI\Tables;
+
+use Bugo\Bricks\Renderers\RendererInterface;
+use Bugo\Compat\ItemList;
+use Bugo\Compat\Utils;
+
+class TableRenderer implements RendererInterface
+{
+ public function render(array $data): void
+ {
+ new ItemList($data);
+
+ Utils::$context['sub_template'] = 'show_list';
+ Utils::$context['default_list'] = $data['id'];
+ }
+}
diff --git a/src/Sources/LightPortal/Utils/Cache.php b/src/Sources/LightPortal/Utils/Cache.php
index 5d52c29cd..cee4324a8 100644
--- a/src/Sources/LightPortal/Utils/Cache.php
+++ b/src/Sources/LightPortal/Utils/Cache.php
@@ -12,7 +12,7 @@
namespace Bugo\LightPortal\Utils;
-use Bugo\Compat\CacheApi;
+use Bugo\Compat\Cache\CacheApi;
if (! defined('SMF'))
die('No direct access...');
diff --git a/src/Sources/LightPortal/Utils/Content.php b/src/Sources/LightPortal/Utils/Content.php
index a8c4ec36a..163f2b4a5 100644
--- a/src/Sources/LightPortal/Utils/Content.php
+++ b/src/Sources/LightPortal/Utils/Content.php
@@ -12,14 +12,14 @@
namespace Bugo\LightPortal\Utils;
-use Bugo\Compat\BBCodeParser;
use Bugo\Compat\IntegrationHook;
+use Bugo\Compat\Parsers\BBCodeParser;
use Bugo\Compat\Sapi;
use Bugo\Compat\Utils;
use Bugo\LightPortal\Enums\ContentType;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
-use Bugo\LightPortal\Plugins\Event;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use ParseError;
use function file_put_contents;
@@ -49,14 +49,12 @@ public static function prepare(
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareContent,
- new Event(new class ($type, $block_id, $cache_time, $parameters) {
- public function __construct(
- public readonly string $type,
- public readonly int $id,
- public readonly int $cacheTime,
- public readonly ParamWrapper $parameters
- ) {}
- })
+ new EventArgs([
+ 'type' => $type,
+ 'id' => $block_id,
+ 'cacheTime' => $cache_time,
+ 'parameters' => $parameters
+ ])
);
return ob_get_clean();
@@ -98,9 +96,7 @@ public static function parse(string $content, string $type = 'bbc'): string
app(EventManagerFactory::class)()->dispatch(
PortalHook::parseContent,
- new Event(new class ($content, $type) {
- public function __construct(public string &$content, public readonly string $type) {}
- })
+ new EventArgs(['content' => &$content, 'type' => $type])
);
return $content;
diff --git a/src/Sources/LightPortal/Utils/Icon.php b/src/Sources/LightPortal/Utils/Icon.php
index 0f351b39a..acad4f0b0 100644
--- a/src/Sources/LightPortal/Utils/Icon.php
+++ b/src/Sources/LightPortal/Utils/Icon.php
@@ -14,9 +14,9 @@
use Bugo\FontAwesome\IconBuilder;
use Bugo\LightPortal\Enums\PortalHook;
-use Bugo\LightPortal\EventManagerFactory;
+use Bugo\LightPortal\Events\EventArgs;
+use Bugo\LightPortal\Events\EventManagerFactory;
use Bugo\LightPortal\Lists\IconList;
-use Bugo\LightPortal\Plugins\Event;
use function str_replace;
@@ -45,9 +45,7 @@ public static function parse(?string $icon = ''): string
app(EventManagerFactory::class)()->dispatch(
PortalHook::prepareIconTemplate,
- new Event(new class ($template, $icon) {
- public function __construct(public string &$template, public readonly string $icon) {}
- })
+ new EventArgs(['template' => &$template, 'icon' => $icon])
);
return $template;
diff --git a/src/Sources/LightPortal/Utils/Response.php b/src/Sources/LightPortal/Utils/Response.php
new file mode 100644
index 000000000..d796cf965
--- /dev/null
+++ b/src/Sources/LightPortal/Utils/Response.php
@@ -0,0 +1,33 @@
+
+ * @copyright 2019-2025 Bugo
+ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later
+ *
+ * @version 2.9
+ */
+
+namespace Bugo\LightPortal\Utils;
+
+use Bugo\Compat\Utils;
+
+use function header;
+use function json_encode;
+
+class Response
+{
+ public function json(mixed $data, int $flags = 0): never
+ {
+ header('Content-Type: application/json; charset=utf-8');
+
+ exit(json_encode($data, $flags));
+ }
+
+ public function redirect(string $url = ''): void
+ {
+ Utils::redirectexit($url);
+ }
+}
diff --git a/src/Sources/LightPortal/Args/AreasArgs.php b/src/Sources/LightPortal/Utils/ResponseTrait.php
similarity index 60%
rename from src/Sources/LightPortal/Args/AreasArgs.php
rename to src/Sources/LightPortal/Utils/ResponseTrait.php
index fdf1f1550..4bea55592 100644
--- a/src/Sources/LightPortal/Args/AreasArgs.php
+++ b/src/Sources/LightPortal/Utils/ResponseTrait.php
@@ -1,4 +1,4 @@
-session('lp')->get('active_blocks') === null) {
$result = Db::$db->query('', '
@@ -59,7 +59,7 @@ public function getActiveBlocksCount(): int
return $this->session('lp')->get('active_blocks') ?? 0;
}
- public function getActivePagesCount(): int
+ private function getActivePagesCount(): int
{
$key = Utils::$context['allow_light_portal_manage_pages_any'] ? '' : ('_u' . User::$info['id']);
@@ -86,7 +86,7 @@ public function getActivePagesCount(): int
return $this->session('lp')->get('active_pages' . $key) ?? 0;
}
- public function getMyPagesCount(): int
+ private function getMyPagesCount(): int
{
$key = Utils::$context['allow_light_portal_manage_pages_any'] ? '' : ('_u' . User::$info['id']);
@@ -111,7 +111,7 @@ public function getMyPagesCount(): int
return $this->session('lp')->get('my_pages' . $key) ?? 0;
}
- public function getUnapprovedPagesCount(): int
+ private function getUnapprovedPagesCount(): int
{
if ($this->session('lp')->get('unapproved_pages') === null) {
$result = Db::$db->query('', '
@@ -134,7 +134,7 @@ public function getUnapprovedPagesCount(): int
return $this->session('lp')->get('unapproved_pages') ?? 0;
}
- public function getDeletedPagesCount(): int
+ private function getDeletedPagesCount(): int
{
if ($this->session('lp')->get('deleted_pages') === null) {
$result = Db::$db->query('', /** @lang text */ '
@@ -153,7 +153,7 @@ public function getDeletedPagesCount(): int
return $this->session('lp')->get('deleted_pages') ?? 0;
}
- public function getActiveCategoriesCount(): int
+ private function getActiveCategoriesCount(): int
{
if ($this->session('lp')->get('active_categories') === null) {
$result = Db::$db->query('', '
@@ -175,7 +175,7 @@ public function getActiveCategoriesCount(): int
return $this->session('lp')->get('active_categories') ?? 0;
}
- public function getActiveTagsCount(): int
+ private function getActiveTagsCount(): int
{
if ($this->session('lp')->get('active_tags') === null) {
$result = Db::$db->query('', '
diff --git a/src/Sources/LightPortal/Utils/Setting.php b/src/Sources/LightPortal/Utils/Setting.php
index 254fde983..5f32a3e54 100644
--- a/src/Sources/LightPortal/Utils/Setting.php
+++ b/src/Sources/LightPortal/Utils/Setting.php
@@ -26,7 +26,12 @@
class Setting
{
- public static function get(string $key, string $type = 'string', mixed $default = null, string $from = 'string'): mixed
+ public static function get(
+ string $key,
+ string $type = 'string',
+ mixed $default = null,
+ string $from = 'string'
+ ): mixed
{
if (! isset(Config::$modSettings[$key])) {
return $default;
diff --git a/src/Sources/LightPortal/app.php b/src/Sources/LightPortal/app.php
index 50438b8b3..021f6b025 100644
--- a/src/Sources/LightPortal/app.php
+++ b/src/Sources/LightPortal/app.php
@@ -15,34 +15,18 @@
require_once __DIR__ . '/Libs/autoload.php';
-use Bugo\LightPortal\Areas\ConfigArea;
-use Bugo\LightPortal\Areas\CreditArea;
use Bugo\LightPortal\Container;
-use Bugo\LightPortal\Integration;
-
-// This is the way
-$app = new class {
- public function __construct()
- {
- if (SMF === 'BACKGROUND')
- return;
-
- (new Integration())();
- (new ConfigArea())();
- (new CreditArea())();
- }
-};
-
-new $app;
+use Bugo\LightPortal\PortalApp;
// Helper to work with Container
-function app(string $service, array $params = []): mixed
+function app(string $service = ''): mixed
{
- $instance = Container::get($service);
-
- if ($service === 'events') {
- return $instance($params);
+ if (empty($service)) {
+ return Container::getInstance();
}
- return $instance;
+ return Container::get($service);
}
+
+// This is the way
+app(PortalApp::class);
diff --git a/src/Sources/LightPortal/composer.json b/src/Sources/LightPortal/composer.json
index f70a169a1..d30a95e8b 100644
--- a/src/Sources/LightPortal/composer.json
+++ b/src/Sources/LightPortal/composer.json
@@ -5,9 +5,9 @@
"ext-intl": "*",
"ext-simplexml": "*",
"ext-zip": "*",
- "bugo/fa-php-helper": "^0.4",
- "bugo/smf-bricks": "^0.1",
- "bugo/smf-compat": "^0.2",
+ "bugo/fa-php-helper": "^0.5",
+ "bugo/smf-bricks": "^0.4",
+ "bugo/smf-compat": "^0.3",
"doctrine/event-manager": "^2.0",
"eftec/bladeone": "^4.13",
"league/container": "^4.2",
diff --git a/src/Themes/default/LightPortal/ManageBlocks.template.php b/src/Themes/default/LightPortal/ManageBlocks.template.php
index f82685348..6f797d80e 100644
--- a/src/Themes/default/LightPortal/ManageBlocks.template.php
+++ b/src/Themes/default/LightPortal/ManageBlocks.template.php
@@ -1,6 +1,7 @@
';
}
diff --git a/src/Themes/default/LightPortal/ViewBlocks.template.php b/src/Themes/default/LightPortal/ViewBlocks.template.php
index d7b745abe..9d444e454 100644
--- a/src/Themes/default/LightPortal/ViewBlocks.template.php
+++ b/src/Themes/default/LightPortal/ViewBlocks.template.php
@@ -1,9 +1,7 @@