aboutsummaryrefslogtreecommitdiff
path: root/app/Models
diff options
context:
space:
mode:
authorGravatar Stefan <11146296+tryallthethings@users.noreply.github.com> 2025-06-22 00:36:32 +0200
committerGravatar GitHub <noreply@github.com> 2025-06-22 00:36:32 +0200
commit51298cd6bc100b1cc6508abb602a59c01a9e2c04 (patch)
treedc3ac061d48242ddb1dd4aaada009f531e2e08a7 /app/Models
parentbea9ca12adf58896a95959c4a1fbb48f4bbc144b (diff)
Exposed the reading modes for extensions through Minz (#7668)
* + Exposed the reading modes for extensions through Minz. Now extensions can add a custom view mode. Graceful fallback to normal view in case the extension was disabled without resetting the view_mode through the uninstall method. In that case the user will be informed via Minz_Request::setBadNotification that the view has been reset to normal. + Added translation strings for de, en and en-us for the notification * + Added missing, generated translations * Simplify indexAction, performance * Minor settings htmlspecialchars * i18n: fr * Minor wording * Doc * Fix i18n --------- Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Diffstat (limited to 'app/Models')
-rw-r--r--app/Models/View.php4
-rw-r--r--app/Models/ViewMode.php65
2 files changed, 69 insertions, 0 deletions
diff --git a/app/Models/View.php b/app/Models/View.php
index dd616b888..11ca3a105 100644
--- a/app/Models/View.php
+++ b/app/Models/View.php
@@ -132,4 +132,8 @@ class FreshRSS_View extends Minz_View {
public string $errorMessage;
/** @var array<string,string> */
public array $message;
+
+ // View modes
+ /** @var array<FreshRSS_ViewMode> */
+ public array $viewModes;
}
diff --git a/app/Models/ViewMode.php b/app/Models/ViewMode.php
new file mode 100644
index 000000000..54379b130
--- /dev/null
+++ b/app/Models/ViewMode.php
@@ -0,0 +1,65 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * Represents a view mode option for the reading configuration
+ */
+final class FreshRSS_ViewMode {
+ private string $id;
+ private string $name;
+ private string $controller;
+ private string $action;
+
+ public function __construct(string $id, string $name, string $controller = 'index', string $action = '') {
+ $this->id = $id;
+ $this->name = $name;
+ $this->controller = $controller;
+ $this->action = $action ?: $id;
+ }
+
+ public function id(): string {
+ return $this->id;
+ }
+
+ public function name(): string {
+ return $this->name;
+ }
+
+ public function controller(): string {
+ return $this->controller;
+ }
+
+ public function action(): string {
+ return $this->action;
+ }
+
+ /**
+ * @return array<string,FreshRSS_ViewMode> Mode ID => FreshRSS_ViewMode
+ */
+ public static function getDefaultModes(): array {
+ return [
+ 'normal' => new self(id: 'normal', name: _t('conf.reading.view.normal'), controller: 'index', action: 'normal'),
+ 'reader' => new self(id: 'reader', name: _t('conf.reading.view.reader'), controller: 'index', action: 'reader'),
+ 'global' => new self(id: 'global', name: _t('conf.reading.view.global'), controller: 'index', action: 'global'),
+ ];
+ }
+
+ /**
+ * @return array<string,FreshRSS_ViewMode> Mode ID => FreshRSS_ViewMode
+ */
+ public static function getAllModes(): array {
+ $modes = self::getDefaultModes();
+
+ // Allow extensions to add their own view modes
+ $extensionModes = Minz_ExtensionManager::callHook('view_modes', []);
+ if (is_array($extensionModes)) {
+ foreach ($extensionModes as $mode) {
+ if ($mode instanceof FreshRSS_ViewMode) {
+ $modes[$mode->id()] = $mode;
+ }
+ }
+ }
+
+ return $modes;
+ }
+}