Files
FreshRSS/docs/fr/developers/Minz/index.md
maTh 2bcc090622 configurable notification timeout (#7942)
Ref #7931
Ref #5466
Ref #6409

added configuration in "Display"
<img width="636" height="167" alt="grafik" src="https://github.com/user-attachments/assets/7bbc9f26-d91b-4dd2-b715-1d3f9b7a9ad3" />

* i18n: fr

* Update app/i18n/pl/conf.php

Co-authored-by: Inverle <inverle@proton.me>

* make fix-all

* max()

* Minor whitespace
(I am not a fan of excessive vertical indenting)

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Co-authored-by: Inverle <inverle@proton.me>
2025-10-01 10:48:07 +02:00

250 lines
8.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Minz
Cette fiche technique devrait renvoyer vers la documentation officielle de
FreshRSS et de Minz (le framework PHP sur lequel repose
FreshRSS). Malheureusement cette documentation nexiste pas encore. Voici
donc en quelques mots les principaux éléments à connaître. Il nest pas
nécessaire de lire lensemble des chapitres de cette section si vous navez
pas à utiliser une fonctionnalité dans votre extension (si vous navez pas
besoin de traduire votre extension, pas besoin den savoir plus sur le
module `Minz_Translate` par exemple).
## Architecture MVC
Minz repose et impose une architecture MVC pour les projets lutilisant. On
distingue dans cette architecture trois composants principaux :
* Le Modèle : cest lobjet de base que lon va manipuler. Dans FreshRSS,
les catégories, les flux et les articles sont des modèles. La partie du
code qui permet de les manipuler en base de données fait aussi partie du
modèle mais est séparée du modèle de base : on parle de DAO (pour « Data
Access Object »). Les modèles sont stockés dans un répertoire `Models`.
* La Vue : cest ce qui représente ce que verra lutilisateur. La vue est
donc simplement du code HTML que lon mixe avec du PHP pour afficher les
informations dynamiques. Les vues sont stockées dans un répertoire
`views`.
* Le Contrôleur : cest ce qui permet de lier modèles et vues entre
eux. Typiquement, un contrôleur va charger des modèles à partir de la base
de données (une liste darticles par exemple) pour les « passer » à une
vue afin quelle les affiche. Les contrôleurs sont stockés dans un
répertoire `Controllers`.
## Routage
Afin de lier une URL à un contrôleur, on doit passer par une phase dite de «
routage ». Dans FreshRSS, cela est particulièrement simple car il suffit
dindiquer le nom du contrôleur à charger dans lURL à laide dun paramètre `c`.
Par exemple, ladresse <http://exemple.com?c=hello> va exécuter le code
contenu dans le contrôleur `hello`.
Une notion qui na pas encore été évoquée est le système d'« actions ». Une
action est exécutée *sur* un contrôleur. Concrètement, un contrôleur va être
représenté par une classe et ses actions par des méthodes. Pour exécuter une
action, il est nécessaire dindiquer un paramètre `a` dans lURL.
Exemple de code :
```php
<?php
class FreshRSS_hello_Controller extends FreshRSS_ActionController {
public function indexAction() {
$this->view->a_variable = 'FooBar';
}
public function worldAction() {
$this->view->a_variable = 'Hello World!';
}
}
?>
```
Si lon charge ladresse <http://exemple.com?c=hello&a=world>, laction
`world` va donc être exécutée sur le contrôleur `hello`.
Note : si `c` ou `a` nest pas précisée, la valeur par défaut de chacune de
ces variables est `index`. Ainsi ladresse <http://exemple.com?c=hello> va
exécuter laction `index` du contrôleur `hello`.
Plus loin, sera utilisée la convention `hello/world` pour évoquer un couple
contrôleur/action.
## Vues
Chaque vue est associée à un contrôleur et à une action. La vue associée à
`hello/world` va être stockée dans un fichier bien spécifique :
`views/hello/world.phtml`. Cette convention est imposée par Minz.
Comme expliqué plus haut, les vues sont du code HTML mixé à du PHP. Exemple
de code :
```html
<p>
Phrase passée en paramètre : <?= $this->a_variable ?>
</p>
```
La variable `$this->a_variable` a été passée précédemment par le contrôleur (voir exemple précédent). La différence est que dans le contrôleur il est nécessaire de passer par `$this->view` et que dans la vue `$this` suffit.
## Accéder aux paramètres GET / POST
Il est souvent nécessaire de profiter des paramètres passés par GET ou par
POST. Dans Minz, ces paramètres sont accessibles de façon indistincts à
laide de la classe `Minz_Request`. Exemple de code :
```php
<?php
$default_value = 'foo';
$param = Minz_Request::paramString('bar') ?: $default_value;
// Affichera la valeur du paramètre `bar` (passé via GET ou POST)
// ou "foo" si le paramètre nexiste pas.
echo $param;
// Force la valeur du paramètre `bar`
Minz_Request::_param('bar', 'baz');
// Affichera forcément "baz" puisque nous venons de forcer sa valeur.
// Notez que le second paramètre (valeur par défaut) est facultatif.
echo Minz_Request::paramString('bar');
?>
```
La méthode `Minz_Request::isPost()` peut être utile pour nexécuter un
morceau de code que sil sagit dune requête POST.
Note : il est préférable de nutiliser `Minz_Request` que dans les
contrôleurs. Il est probable que vous rencontriez cette méthode dans les
vues de FreshRSS, voire dans les modèles, mais sachez quil ne sagit
**pas** dune bonne pratique.
## Accéder aux paramètres de session
Laccès aux paramètres de session est étrangement similaire aux paramètres
GET / POST mais passe par la classe `Minz_Session` cette fois-ci ! Il ny a
pas dexemple ici car vous pouvez reprendre le précédent en changeant tous
les `Minz_Request` par des `Minz_Session`.
## Gestion des URL
Pour profiter pleinement du système de routage de Minz, il est fortement
déconseillé décrire les URL en dur dans votre code. Par exemple, la vue
suivante doit être évitée :
```html
<p>
Accéder à la page <a href="http://exemple.com?c=hello&amp;a=world">Hello world</a>!
</p>
```
Si un jour il est décidé dutiliser un système d'« url rewriting » pour
avoir des adresses au format <http://exemple.com/controller/action>, toutes
les adresses précédentes deviendraient ineffectives !
Préférez donc lutilisation de la classe `Minz_Url` et de sa méthode
`display()`. `Minz_Url::display()` prend en paramètre un tableau de la forme
suivante :
```php
<?php
$url_array = [
'c' => 'hello',
'a' => 'world',
'params' => [
'foo' => 'bar',
],
];
// Affichera quelque chose comme .?c=hello&amp;a=world&amp;foo=bar
echo Minz_Url::display($url_array);
?>
```
Comme cela peut devenir un peu pénible à utiliser à la longue, surtout dans
les vues, il est préférable dutiliser le raccourci `_url()` :
```php
<?php
// Affichera la même chose que précédemment
echo _url('hello', 'world', 'foo', 'bar');
?>
```
Note : en règle générale, la forme raccourcie (`_url()`) doit être utilisée
dans les vues tandis que la forme longue (`Minz_Url::display()`) doit être
utilisée dans les contrôleurs.
## Redirections
Il est souvent nécessaire de rediriger un utilisateur vers une autre
page. Pour cela, la classe `Minz_Request` dispose dune autre méthode utile
: `forward()`. Cette méthode prend en argument le même format dURL que
celui vu juste avant.
Exemple de code :
```php
<?php
$url_array = [
'c' => 'hello',
'a' => 'world',
];
// Indique à Minz de rediriger lutilisateur vers la page hello/world.
// Notez quil sagit dune redirection au sens Minz du terme, pas dune redirection que le navigateur va avoir à gérer (code HTTP 301 ou 302)
// Le code qui suit forward() va ainsi être exécuté !
Minz_Request::forward($url_array);
// Pour effectuer une redirection type 302, ajoutez "true".
// Le code qui suivra ne sera alors jamais exécuté.
Minz_Request::forward($url_array, true);
?>
```
Il est très fréquent de vouloir effectuer une redirection tout en affichant
un message à lutilisateur pour lui indiquer comment sest déroulée laction
effectuée juste avant (validation dun formulaire par exemple). Un tel
message est passé par une variable de session `notification` (note : nous
parlerons plutôt de « feedback » désormais pour éviter la confusion avec une
notification qui peut survenir à tout moment). Pour faciliter ce genre
daction très fréquente, il existe deux raccourcis qui effectuent tout deux
une redirection type 302 en affectant un message de feedback :
```php
<?php
$url_array = [
'c' => 'hello',
'a' => 'world',
];
$feedback_good = 'Tout sest bien passé !';
$feedback_bad = 'Oups, quelque chose na pas marché.';
Minz_Request::good($feedback_good, $url_array, showNotification: FreshRSS_Context::userConf()->good_notification_timeout > 0);
// ou
Minz_Request::bad($feedback_bad, $url_array);
?>
```
## Gestion de la traduction
Cette partie est [expliquée dans la page dédiée](/docs/fr/internationalization.md).
## Migration
Existing documentation includes:
* [How to manage migrations](migrations.md)