From fe7d9bbcd68660a59b813346c236b61b25a51c80 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Thu, 11 May 2023 12:53:32 +0200 Subject: Typed view model classes (#5380) * Typed view model classes * Add ability to provide a typed view model class to a controller * Use `::class` instead of string for referring to classes * Examplified with `stats` and `javascript` controllers / views (more to do) * Also useful for extensions (my usecase today), which did not have the ability to define own view model attributes before. * Typo --- app/Controllers/javascriptController.php | 7 ++++ app/Controllers/statsController.php | 7 ++++ app/FreshRSS.php | 2 +- app/Models/View.php | 44 ----------------------- app/Models/ViewJavascript.php | 16 +++++++++ app/Models/ViewStats.php | 55 +++++++++++++++++++++++++++++ app/views/javascript/actualize.phtml | 2 +- app/views/javascript/nbUnreadsPerFeed.phtml | 3 +- app/views/javascript/nonce.phtml | 2 +- app/views/stats/idle.phtml | 2 +- app/views/stats/index.phtml | 2 +- app/views/stats/repartition.phtml | 2 +- 12 files changed, 93 insertions(+), 51 deletions(-) create mode 100644 app/Models/ViewJavascript.php create mode 100644 app/Models/ViewStats.php (limited to 'app') diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php index ce25d03c9..d3f73b2f9 100644 --- a/app/Controllers/javascriptController.php +++ b/app/Controllers/javascriptController.php @@ -2,6 +2,13 @@ class FreshRSS_javascript_Controller extends FreshRSS_ActionController { + /** @var FreshRSS_ViewJavascript */ + protected $view; + + public function __construct() { + parent::__construct(FreshRSS_ViewJavascript::class); + } + public function firstAction(): void { $this->view->_layout(null); } diff --git a/app/Controllers/statsController.php b/app/Controllers/statsController.php index 79facbbf6..d9c4fe5f4 100644 --- a/app/Controllers/statsController.php +++ b/app/Controllers/statsController.php @@ -5,6 +5,13 @@ */ class FreshRSS_stats_Controller extends FreshRSS_ActionController { + /** @var FreshRSS_ViewStats */ + protected $view; + + public function __construct() { + parent::__construct(FreshRSS_ViewStats::class); + } + /** * This action is called before every other action in that class. It is * the common boilerplate for every action. It is triggered by the diff --git a/app/FreshRSS.php b/app/FreshRSS.php index 2e7ef6faa..12390b626 100644 --- a/app/FreshRSS.php +++ b/app/FreshRSS.php @@ -23,7 +23,7 @@ class FreshRSS extends Minz_FrontController { Minz_Session::init('FreshRSS'); } - Minz_ActionController::$viewType = 'FreshRSS_View'; + Minz_ActionController::$defaultViewType = FreshRSS_View::class; FreshRSS_Context::initSystem(); if (FreshRSS_Context::$system_conf == null) { diff --git a/app/Models/View.php b/app/Models/View.php index 3c56afa0e..cfa06da62 100644 --- a/app/Models/View.php +++ b/app/Models/View.php @@ -109,10 +109,6 @@ class FreshRSS_View extends Minz_View { // Form login /** @var int */ public $cookie_days; - /** @var string */ - public $nonce; - /** @var string */ - public $salt1; // Registration /** @var bool */ @@ -174,44 +170,4 @@ class FreshRSS_View extends Minz_View { /** @var array */ public $message; - // Statistics - /** @var float */ - public $average; - /** @var float */ - public $averageDayOfWeek; - /** @var float */ - public $averageHour; - /** @var float */ - public $averageMonth; - /** @var array */ - public $days; - /** @var array> */ - public $entryByCategory; - /** @var array */ - public $entryCount; - /** @var array> */ - public $feedByCategory; - /** @var array */ - public $hours24Labels; - /** @var array>> */ - public $idleFeeds; - /** @var array */ - public $last30DaysLabel; - /** @var array */ - public $last30DaysLabels; - /** @var array */ - public $months; - /** @var array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false */ - public $repartition; - /** @var array{'main_stream':array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false,'all_feeds':array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false} */ - public $repartitions; - /** @var array */ - public $repartitionDayOfWeek; - /** @var array|array */ - public $repartitionHour; - /** @var array */ - public $repartitionMonth; - /** @var array */ - public $topFeed; - } diff --git a/app/Models/ViewJavascript.php b/app/Models/ViewJavascript.php new file mode 100644 index 000000000..f14810572 --- /dev/null +++ b/app/Models/ViewJavascript.php @@ -0,0 +1,16 @@ + */ + public $categories; + /** @var array */ + public $feeds; + /** @var array */ + public $tags; + + /** @var string */ + public $nonce; + /** @var string */ + public $salt1; +} diff --git a/app/Models/ViewStats.php b/app/Models/ViewStats.php new file mode 100644 index 000000000..03e0bc00d --- /dev/null +++ b/app/Models/ViewStats.php @@ -0,0 +1,55 @@ + */ + public $categories; + /** @var FreshRSS_Feed|null */ + public $feed; + /** @var array */ + public $feeds; + /** @var bool */ + public $displaySlider; + + /** @var float */ + public $average; + /** @var float */ + public $averageDayOfWeek; + /** @var float */ + public $averageHour; + /** @var float */ + public $averageMonth; + /** @var array */ + public $days; + /** @var array> */ + public $entryByCategory; + /** @var array */ + public $entryCount; + /** @var array> */ + public $feedByCategory; + /** @var array */ + public $hours24Labels; + /** @var array>> */ + public $idleFeeds; + /** @var array */ + public $last30DaysLabel; + /** @var array */ + public $last30DaysLabels; + /** @var array */ + public $months; + /** @var array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false */ + public $repartition; + /** @var array{'main_stream':array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false,'all_feeds':array{'total':int,'count_unreads':int,'count_reads':int,'count_favorites':int}|false} */ + public $repartitions; + /** @var array */ + public $repartitionDayOfWeek; + /** @var array|array */ + public $repartitionHour; + /** @var array */ + public $repartitionMonth; + /** @var array */ + public $topFeed; + +} diff --git a/app/views/javascript/actualize.phtml b/app/views/javascript/actualize.phtml index 73890dd40..1a8af6e49 100644 --- a/app/views/javascript/actualize.phtml +++ b/app/views/javascript/actualize.phtml @@ -1,5 +1,5 @@ categories as $category) { diff --git a/app/views/javascript/nbUnreadsPerFeed.phtml b/app/views/javascript/nbUnreadsPerFeed.phtml index 261f2a179..4864b429a 100644 --- a/app/views/javascript/nbUnreadsPerFeed.phtml +++ b/app/views/javascript/nbUnreadsPerFeed.phtml @@ -1,5 +1,6 @@ - array(), 'tags' => array(), diff --git a/app/views/javascript/nonce.phtml b/app/views/javascript/nonce.phtml index f565baa85..df1389f15 100644 --- a/app/views/javascript/nonce.phtml +++ b/app/views/javascript/nonce.phtml @@ -1,3 +1,3 @@ - $this->salt1, 'nonce' => $this->nonce)); diff --git a/app/views/stats/idle.phtml b/app/views/stats/idle.phtml index d94256860..37cc92144 100644 --- a/app/views/stats/idle.phtml +++ b/app/views/stats/idle.phtml @@ -1,5 +1,5 @@ partial('aside_subscription'); ?> diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml index a9958ee54..f4c87315f 100644 --- a/app/views/stats/index.phtml +++ b/app/views/stats/index.phtml @@ -1,5 +1,5 @@ partial('aside_subscription'); ?> diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml index 400cdd7fa..80e3c1a6a 100644 --- a/app/views/stats/repartition.phtml +++ b/app/views/stats/repartition.phtml @@ -1,5 +1,5 @@ partial('aside_subscription'); ?> -- cgit v1.2.3