@fraza/core 0.3.8 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/THIRD-PARTY-NOTICES.md +2 -2
- package/changelog.json +86 -0
- package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
- package/dist/docs/01-demarrage/01-installation.md +9 -15
- package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
- package/dist/docs/01-demarrage/03-configuration.md +1 -1
- package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
- package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
- package/dist/docs/02-guides/blocs-personnalises.md +1 -1
- package/dist/docs/02-guides/etendre-l-admin.md +2 -2
- package/dist/docs/02-guides/gerer-les-medias.md +1 -1
- package/dist/docs/02-guides/index.md +1 -1
- package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
- package/dist/docs/03-reference/01-cores/templates.md +3 -3
- package/dist/docs/03-reference/02-features/admin.md +13 -2
- package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
- package/dist/docs/03-reference/04-partage/composants.md +2 -0
- package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
- package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
- package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
- package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
- package/dist/docs/04-architecture/05-securite.md +1 -1
- package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
- package/dist/docs/05-contribution/03-redaction.md +10 -0
- package/dist/docs/05-contribution/05-publication.md +0 -1
- package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
- package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
- package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
- package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
- package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
- package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
- package/dist/docs/06-modules/booking/index.md +22 -12
- package/dist/docs/06-modules/drive/01-installation.md +92 -0
- package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
- package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
- package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
- package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
- package/dist/docs/06-modules/drive/index.md +23 -13
- package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
- package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
- package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
- package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
- package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
- package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
- package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
- package/dist/docs/06-modules/facturation/index.md +26 -16
- package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
- package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
- package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
- package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
- package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
- package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
- package/dist/docs/06-modules/forms/index.md +26 -14
- package/dist/docs/06-modules/index.md +2 -2
- package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
- package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
- package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
- package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
- package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
- package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
- package/dist/docs/06-modules/medias/index.md +25 -13
- package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
- package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
- package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
- package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
- package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
- package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
- package/dist/docs/06-modules/pages/index.md +21 -9
- package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
- package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
- package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
- package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
- package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
- package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
- package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
- package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
- package/dist/docs/06-modules/posts/index.md +25 -13
- package/dist/docs/assets/decouverte/tableau-de-bord.dark.webp +0 -0
- package/dist/docs/assets/decouverte/tableau-de-bord.light.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.dark.webp +0 -0
- package/dist/docs/assets/demarrage/connexion.light.webp +0 -0
- package/dist/docs/assets/demarrage/roles.dark.webp +0 -0
- package/dist/docs/assets/demarrage/roles.light.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.dark.webp +0 -0
- package/dist/docs/assets/demarrage/tableau-de-bord-neuf.light.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.dark.webp +0 -0
- package/dist/docs/assets/modules/booking/agenda.light.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.dark.webp +0 -0
- package/dist/docs/assets/modules/drive/navigateur.light.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.dark.webp +0 -0
- package/dist/docs/assets/modules/facturation/factures.light.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.dark.webp +0 -0
- package/dist/docs/assets/modules/forms/constructeur.light.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.dark.webp +0 -0
- package/dist/docs/assets/modules/medias/mediatheque.light.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/pages/liste.light.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.dark.webp +0 -0
- package/dist/docs/assets/modules/posts/liste.light.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.dark.webp +0 -0
- package/dist/docs/assets/reference/liste-compacte.light.webp +0 -0
- package/dist/features/admin/components/dashboard/DashboardGrid.client.js +34 -23
- package/dist/shared/lib/version.js +1 -1
- package/package.json +1 -1
- package/supported.json +1 -1
- package/dist/docs/06-modules/drive/installation.md +0 -69
- /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
|
@@ -4,28 +4,40 @@ description: Pages CMS hiérarchiques rendues à la racine du site, éditées au
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/pages/installation
|
|
8
|
-
- 06-modules/pages/configuration
|
|
7
|
+
- 06-modules/pages/01-installation
|
|
8
|
+
- 06-modules/pages/02-configuration
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
`@fraza/module-pages` ajoute une section « Pages » à l'admin et rend chaque page publiée à la racine du site, à l'URL construite depuis sa chaîne de parents. Le contenu est édité au `BlockEditor` du core et rendu par un template fourni par le projet hôte.
|
|
12
12
|
|
|
13
|
+
```bash
|
|
14
|
+
npm i @fraza/module-pages
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Paquet | `@fraza/module-pages` |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Licence | MIT, Fraza Libre. |
|
|
20
|
+
| Registre | npmjs, sans compte ni configuration. |
|
|
21
|
+
| Activation | `FRAZA_MODULE_PAGES=true` |
|
|
22
|
+
|
|
23
|
+
L'activation, la création de la table et le rendu public sont dans [Installation](./01-installation.md).
|
|
24
|
+
|
|
13
25
|
Le module est indépendant de `@fraza/module-posts`. Les deux peuvent cohabiter : pages sert de repli sur toute URL non réclamée, posts réserve son préfixe.
|
|
14
26
|
|
|
15
27
|

|
|
16
28
|
|
|
17
|
-
La liste range chaque page sous son parent, décalée d'un cran par niveau, et affiche sous le titre le chemin public reconstruit depuis la chaîne des parents. La colonne SEO n'apparaît que si `FRAZA_SEO` est actif. Le détail de l'écran est dans [Administration](./admin.md).
|
|
29
|
+
La liste range chaque page sous son parent, décalée d'un cran par niveau, et affiche sous le titre le chemin public reconstruit depuis la chaîne des parents. La colonne SEO n'apparaît que si `FRAZA_SEO` est actif. Le détail de l'écran est dans [Administration](./03-admin.md).
|
|
18
30
|
|
|
19
31
|
## Pages de cette section
|
|
20
32
|
|
|
21
33
|
| Page | Contenu |
|
|
22
34
|
|---|---|
|
|
23
|
-
| [Installation](./installation.md) | Installer le module, créer la table, brancher le rendu public. |
|
|
24
|
-
| [Configuration](./configuration.md) | Variables d'environnement, permissions, entrée d'admin. |
|
|
25
|
-
| [Administration](./admin.md) | Liste arborescente, formulaire, parent, dates et enregistrement. |
|
|
26
|
-
| [Modèle de données](./modele-de-donnees.md) | Table `fraza_pages_page`, hiérarchie, règles de slug et de visibilité. |
|
|
27
|
-
| [Templates](./templates.md) | Écrire un template de page et les propriétés qu'il reçoit. |
|
|
28
|
-
| [API](./api.md) | Routes HTTP et fonctions serveur importables. |
|
|
35
|
+
| [Installation](./01-installation.md) | Installer le module, créer la table, brancher le rendu public. |
|
|
36
|
+
| [Configuration](./02-configuration.md) | Variables d'environnement, permissions, entrée d'admin. |
|
|
37
|
+
| [Administration](./03-admin.md) | Liste arborescente, formulaire, parent, dates et enregistrement. |
|
|
38
|
+
| [Modèle de données](./04-modele-de-donnees.md) | Table `fraza_pages_page`, hiérarchie, règles de slug et de visibilité. |
|
|
39
|
+
| [Templates](./05-templates.md) | Écrire un template de page et les propriétés qu'il reçoit. |
|
|
40
|
+
| [API](./06-api.md) | Routes HTTP et fonctions serveur importables. |
|
|
29
41
|
|
|
30
42
|
## Ce que le module apporte
|
|
31
43
|
|
|
@@ -4,16 +4,16 @@ description: Installer @fraza/module-posts, déclarer un premier type, créer le
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/types-et-champs
|
|
8
|
-
- 06-modules/posts/configuration
|
|
7
|
+
- 06-modules/posts/03-types-et-champs
|
|
8
|
+
- 06-modules/posts/02-configuration
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
Cette page
|
|
11
|
+
Cette page installe `@fraza/module-posts` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
|
|
12
12
|
|
|
13
13
|
## Prérequis
|
|
14
14
|
|
|
15
|
-
- Un projet
|
|
16
|
-
-
|
|
15
|
+
- Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
|
|
16
|
+
- Aucun compte : le paquet est publié sur npmjs.
|
|
17
17
|
|
|
18
18
|
## Installer
|
|
19
19
|
|
|
@@ -21,33 +21,29 @@ Cette page couvre l'installation de `@fraza/module-posts` dans un projet déjà
|
|
|
21
21
|
npm i @fraza/module-posts
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Ajouter la variable d'activation et un premier type à `.env.local`, et aux variables de la plateforme en production :
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
```bash
|
|
26
|
+
```dotenv
|
|
29
27
|
#------ MODULE - POSTS ------#
|
|
30
28
|
FRAZA_MODULE_POSTS=true
|
|
31
29
|
FRAZA_MODULE_POSTS_TYPES=blogue:Blogue:MoonIcon
|
|
32
30
|
FRAZA_MODULE_POSTS_TYPE_BLOGUE=title:title|slug:slug|date:date:now:sidebar|content:editor:Contenu
|
|
33
31
|
```
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
Sans le drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Contrairement aux autres modules, le drapeau seul ne suffit pas : sans type déclaré, le module ne crée aucune section d'admin et ne rend rien.
|
|
36
34
|
|
|
37
|
-
La syntaxe complète est dans [Types et champs](./types-et-champs.md).
|
|
35
|
+
Les trois lignes viennent dans cet ordre : le drapeau d'activation, la liste des types, puis les champs de chaque type. Le nom de la variable de champs est dérivé de la clé du type en majuscules. La syntaxe complète est dans [Types et champs](./03-types-et-champs.md).
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
Régénérer les manifestes, puis créer les tables :
|
|
40
38
|
|
|
41
39
|
```bash
|
|
42
40
|
npx fraza-modules sync # déclenché automatiquement au postinstall
|
|
43
41
|
npx fraza-db init # crée les tables du module
|
|
44
42
|
```
|
|
45
43
|
|
|
46
|
-
`fraza-db init` est
|
|
47
|
-
|
|
48
|
-
Conséquence directe : après avoir ajouté une taxonomie ou une relation à un type existant, il faut relancer `npx fraza-db init`. La commande est idempotente, elle ne touche pas aux données en place.
|
|
44
|
+
`fraza-db init` est idempotent : sur une base qui a déjà les tables, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les permissions `posts.view` et `posts.manage`, et les attribue au rôle `admin`.
|
|
49
45
|
|
|
50
|
-
Voir [Modèle de données](./modele-de-donnees.md)
|
|
46
|
+
Pour ce module, `fraza-db init` est **sensible à la configuration**. Il ne crée les tables de taxonomies que si au moins un type déclare un champ `taxonomy`, et la table des relations que si au moins un type déclare un champ `relation`. Après avoir ajouté une taxonomie ou une relation à un type existant, relancer `npx fraza-db init`. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
51
47
|
|
|
52
48
|
## Brancher le rendu public
|
|
53
49
|
|
|
@@ -59,28 +55,17 @@ app/(public)/[...slug]/page.js
|
|
|
59
55
|
|
|
60
56
|
Ce fichier itère les résolveurs de [`core/public-content`](../../03-reference/01-cores/public-content.md). Le module y enregistre le sien au boot, à la priorité 10. **Il n'y a donc rien à importer** : l'installation suffit.
|
|
61
57
|
|
|
62
|
-
Le sous-chemin `@fraza/module-posts/public` exporte bien une vue par défaut, `PostPublicView({ postType, slug })`, mais elle sert de repli de débogage pour un projet qui voudrait court-circuiter le registre. Le start template ne l'utilise pas : une URL de post porte toujours son type en premier segment, elle ne se prête donc pas à un fichier de route fixe. Voir [API](./api.md).
|
|
58
|
+
Le sous-chemin `@fraza/module-posts/public` exporte bien une vue par défaut, `PostPublicView({ postType, slug })`, mais elle sert de repli de débogage pour un projet qui voudrait court-circuiter le registre. Le start template ne l'utilise pas : une URL de post porte toujours son type en premier segment, elle ne se prête donc pas à un fichier de route fixe. Voir [API](./08-api.md).
|
|
63
59
|
|
|
64
60
|
## Fournir un template
|
|
65
61
|
|
|
66
62
|
Le module enregistre lui-même un template `default` par type, qui rend le titre puis les blocs bruts via `BlockListRenderer`. C'est suffisant pour vérifier l'installation, pas pour un site.
|
|
67
63
|
|
|
68
|
-
Pour reprendre la main sur la mise en page, écrire un template dans `components/fraza/templates/` et le déclarer sur le type. Voir [Templates](./templates.md).
|
|
69
|
-
|
|
70
|
-
## Vérifier
|
|
71
|
-
|
|
72
|
-
1. La connexion à la base répond :
|
|
73
|
-
```bash
|
|
74
|
-
npx fraza-db test
|
|
75
|
-
```
|
|
76
|
-
2. Une section `Blogue` apparaît dans la barre latérale de l'admin, avec un item `Posts`.
|
|
77
|
-
3. Créer un post depuis `/admin/posts/blogue/list`, le laisser en visibilité publique, puis l'ouvrir à `/blogue/<slug>`. Voir [Administration](./admin.md).
|
|
64
|
+
Pour reprendre la main sur la mise en page, écrire un template dans `components/fraza/templates/` et le déclarer sur le type. Voir [Templates](./07-templates.md).
|
|
78
65
|
|
|
79
|
-
|
|
66
|
+
## Ajouter les médias
|
|
80
67
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
Si un type déclare un champ `image`, `thumbnail` ou `gallery` sans que `@fraza/module-medias` soit installé et activé, le module journalise un avertissement au boot listant les champs concernés. Le module démarre quand même, mais le sélecteur d'image reste indisponible dans l'éditeur.
|
|
68
|
+
Si un type déclare un champ `image`, `thumbnail` ou `gallery` sans que `@fraza/module-medias` soit installé et activé, le module journalise au boot un avertissement qui liste les champs concernés. Le module démarre quand même, mais le sélecteur d'image reste indisponible dans l'éditeur.
|
|
84
69
|
|
|
85
70
|
Le module déclare `@fraza/module-medias` comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque, sans en faire un constat bloquant. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
|
|
86
71
|
|
|
@@ -90,21 +75,30 @@ npm i @fraza/module-medias
|
|
|
90
75
|
|
|
91
76
|
Puis, dans `.env.local` :
|
|
92
77
|
|
|
93
|
-
```
|
|
78
|
+
```dotenv
|
|
94
79
|
FRAZA_MODULE_MEDIAS=true
|
|
95
80
|
```
|
|
96
81
|
|
|
97
82
|
Voir [Module Médias](../medias/index.md).
|
|
98
83
|
|
|
84
|
+
## Vérifier
|
|
85
|
+
|
|
86
|
+
1. La connexion à la base répond :
|
|
87
|
+
```bash
|
|
88
|
+
npx fraza-db test
|
|
89
|
+
```
|
|
90
|
+
2. Une section `Blogue` apparaît dans la barre latérale de l'admin, avec un item `Posts`.
|
|
91
|
+
3. Créer un post depuis `/admin/posts/blogue/list`, le laisser en visibilité publique, puis l'ouvrir à `/blogue/<slug>`. Voir [Administration](./05-admin.md).
|
|
92
|
+
|
|
99
93
|
## Mettre à jour
|
|
100
94
|
|
|
101
95
|
```bash
|
|
102
96
|
npx fraza-update
|
|
103
97
|
```
|
|
104
98
|
|
|
105
|
-
La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois
|
|
99
|
+
La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-posts` seul, par `npm i`, laisserait le core et les autres modules en arrière.
|
|
106
100
|
|
|
107
|
-
Les notes de version sont livrées avec le
|
|
101
|
+
Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-posts/CHANGELOG.md`.
|
|
108
102
|
|
|
109
103
|
## Notes
|
|
110
104
|
|
|
@@ -4,11 +4,11 @@ description: Variables d'environnement, permissions et intégration à l'admin d
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/types-et-champs
|
|
7
|
+
- 06-modules/posts/03-types-et-champs
|
|
8
8
|
- 03-reference/06-configuration/variables-d-environnement
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
Le module inverse la répartition habituelle : la **structure** du contenu vit dans les variables d'environnement, le **contenu** vit en base. Cette page couvre les variables globales, les permissions et l'admin. La syntaxe de déclaration des types est traitée à part, dans [Types et champs](./types-et-champs.md).
|
|
11
|
+
Le module inverse la répartition habituelle : la **structure** du contenu vit dans les variables d'environnement, le **contenu** vit en base. Cette page couvre les variables globales, les permissions et l'admin. La syntaxe de déclaration des types est traitée à part, dans [Types et champs](./03-types-et-champs.md).
|
|
12
12
|
|
|
13
13
|
## Variables d'environnement
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ Le module inverse la répartition habituelle : la **structure** du contenu vit d
|
|
|
16
16
|
|---|---|---|
|
|
17
17
|
| `FRAZA_MODULE_POSTS` | oui | `true` active le module. Absente ou fausse, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. |
|
|
18
18
|
| `FRAZA_MODULE_POSTS_TYPES` | non | Liste des types de contenu. Absente, le module est actif mais ne déclare rien. |
|
|
19
|
-
| `FRAZA_MODULE_POSTS_TYPE_<CLÉ>` | non | Champs d'un type. Voir [Types et champs](./types-et-champs.md). Une erreur de déclaration fait échouer le démarrage. |
|
|
19
|
+
| `FRAZA_MODULE_POSTS_TYPE_<CLÉ>` | non | Champs d'un type. Voir [Types et champs](./03-types-et-champs.md). Une erreur de déclaration fait échouer le démarrage. |
|
|
20
20
|
| `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_PRIVATE` | non | Champs retirés des réponses publiques et du rendu public. Chaque nom doit désigner un champ déclaré du type. |
|
|
21
21
|
| `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_LIST` | non | Colonnes du tableau d'admin. |
|
|
22
22
|
| `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_ORDERABLE` | non | `true` active le réordonnancement manuel. |
|
|
@@ -38,7 +38,7 @@ Quand le drapeau est actif :
|
|
|
38
38
|
- Les valeurs sont stockées sous la clé `seo` des données du post.
|
|
39
39
|
- Le rendu public transforme cet objet en métadonnées Next.js avec `buildSeoMetadata`, en `ogType: 'article'`.
|
|
40
40
|
- Le jeton `seo` devient utilisable comme colonne dans `_LIST`, affichant une pastille de score.
|
|
41
|
-
- Les champs laissés vides retombent sur le contenu du post : la méta description est dérivée d'un champ `text` ou `editor`, l'image de partage d'un champ `thumbnail` ou `image`. Voir [Repli SEO automatique](./types-et-champs.md#repli-seo-automatique).
|
|
41
|
+
- Les champs laissés vides retombent sur le contenu du post : la méta description est dérivée d'un champ `text` ou `editor`, l'image de partage d'un champ `thumbnail` ou `image`. Voir [Repli SEO automatique](./03-types-et-champs.md#repli-seo-automatique).
|
|
42
42
|
|
|
43
43
|
Drapeau inactif, la page publique n'expose que son titre comme métadonnée, et aucun repli n'est calculé.
|
|
44
44
|
|
|
@@ -64,13 +64,13 @@ Le module enregistre **une section de navigation par type déclaré**, et non un
|
|
|
64
64
|
| Propriété | Valeur |
|
|
65
65
|
|---|---|
|
|
66
66
|
| Titre de section | Libellé du type, ou clé capitalisée si aucun libellé n'est donné. |
|
|
67
|
-
| Icône | Troisième segment de la déclaration du type, `BookIcon` par défaut. Un nom du jeu `@fraza/icons`, ou une icône exportée par `components/fraza/icons.js`. Voir [Types et champs](./types-et-champs.md#déclarer-un-type). |
|
|
67
|
+
| Icône | Troisième segment de la déclaration du type, `BookIcon` par défaut. Un nom du jeu `@fraza/icons`, ou une icône exportée par `components/fraza/icons.js`. Voir [Types et champs](./03-types-et-champs.md#déclarer-un-type). |
|
|
68
68
|
| Ordre | 300 pour le premier type, puis 301, 302, dans l'ordre de déclaration. |
|
|
69
69
|
| Chemin de la liste | `/admin/posts/<clé>/list` |
|
|
70
70
|
| Chemin d'une taxonomie | `/admin/posts/<clé>/taxonomies/<clé de taxonomie>` |
|
|
71
71
|
| Permission | `posts.view` sur tous les items. |
|
|
72
72
|
|
|
73
|
-
Les écrans desservis par ces entrées sont décrits dans [Administration](./admin.md).
|
|
73
|
+
Les écrans desservis par ces entrées sont décrits dans [Administration](./05-admin.md).
|
|
74
74
|
|
|
75
75
|
L'ordre des sections suit donc l'ordre de `FRAZA_MODULE_POSTS_TYPES`, et les types occupent une plage continue à partir de 300. Un autre module ne peut pas s'intercaler entre deux types : il se place avant en prenant un ordre inférieur à 300, ou après en prenant un ordre supérieur à la plage occupée. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
|
|
76
76
|
|
|
@@ -4,9 +4,9 @@ description: Syntaxe de déclaration d'un type de contenu, catalogue des types d
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/taxonomies-et-relations
|
|
8
|
-
- 06-modules/posts/admin
|
|
9
|
-
- 06-modules/posts/modele-de-donnees
|
|
7
|
+
- 06-modules/posts/04-taxonomies-et-relations
|
|
8
|
+
- 06-modules/posts/05-admin
|
|
9
|
+
- 06-modules/posts/06-modele-de-donnees
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
Un type de contenu se déclare entièrement en variables d'environnement. Le module en dérive le formulaire d'édition, le tableau d'admin, les colonnes de tri, les routes publiques et le rendu.
|
|
@@ -89,8 +89,8 @@ Déclarer le champ le rend en revanche obligatoire à la saisie : le formulaire
|
|
|
89
89
|
|
|
90
90
|
Un type sans titre change trois choses :
|
|
91
91
|
|
|
92
|
-
- le slug, s'il est déclaré, n'a plus de source à laquelle se rattacher. Il est généré sous la forme `post-<id>` et reste modifiable à la main. Voir [Modèle de données](./modele-de-donnees.md) ;
|
|
93
|
-
- la liste d'admin affiche un extrait du contenu à la place du titre. Voir [Administration](./admin.md) ;
|
|
92
|
+
- le slug, s'il est déclaré, n'a plus de source à laquelle se rattacher. Il est généré sous la forme `post-<id>` et reste modifiable à la main. Voir [Modèle de données](./06-modele-de-donnees.md) ;
|
|
93
|
+
- la liste d'admin affiche un extrait du contenu à la place du titre. Voir [Administration](./05-admin.md) ;
|
|
94
94
|
- les métadonnées publiques retombent sur le slug. Renseignez le titre SEO du post pour en donner un vrai.
|
|
95
95
|
|
|
96
96
|
Combiné à l'absence de `slug`, vous obtenez un type sans titre ni URL, consommé uniquement par l'API ou par une relation depuis un autre post.
|
|
@@ -105,13 +105,13 @@ FRAZA_MODULE_POSTS_TYPE_ENCARTS=contenu:editor:Contenu
|
|
|
105
105
|
|
|
106
106
|
C'est l'interrupteur qui distingue un type destiné au site d'un type purement interne, par exemple une liste de références utilisée uniquement par des relations.
|
|
107
107
|
|
|
108
|
-
Les règles de génération et d'unicité du slug sont dans [Modèle de données](./modele-de-donnees.md).
|
|
108
|
+
Les règles de génération et d'unicité du slug sont dans [Modèle de données](./06-modele-de-donnees.md).
|
|
109
109
|
|
|
110
110
|
### Le champ `created`
|
|
111
111
|
|
|
112
112
|
Il expose `created_at` en écriture. La valeur soumise est refusée si elle n'est pas une date valide, et refusée si elle est dans le futur. Utile pour importer des archives ou antidater une publication.
|
|
113
113
|
|
|
114
|
-
Il n'est modifiable qu'après coup : la création ignore toute valeur soumise et laisse la base poser l'horodatage courant. Le contrôle n'apparaît donc pas dans le formulaire de création, seulement dans celui d'édition. Voir [Administration](./admin.md).
|
|
114
|
+
Il n'est modifiable qu'après coup : la création ignore toute valeur soumise et laisse la base poser l'horodatage courant. Le contrôle n'apparaît donc pas dans le formulaire de création, seulement dans celui d'édition. Voir [Administration](./05-admin.md).
|
|
115
115
|
|
|
116
116
|
### Les champs `image` et `thumbnail`
|
|
117
117
|
|
|
@@ -119,7 +119,7 @@ Les deux ouvrent le sélecteur du [registre média](../../03-reference/03-regist
|
|
|
119
119
|
|
|
120
120
|
La valeur stockée est l'**identifiant** du média. À la lecture, le module l'enrichit en `{ id, filename, alt_text, caption, mime_type }`. Une référence orpheline renvoie `{ id, filename: null }` plutôt qu'une erreur.
|
|
121
121
|
|
|
122
|
-
Voir [Intégrer les médias](../medias/integration.md).
|
|
122
|
+
Voir [Intégrer les médias](../medias/05-integration.md).
|
|
123
123
|
|
|
124
124
|
### Le champ `gallery`
|
|
125
125
|
|
|
@@ -241,7 +241,7 @@ Chaque nom est résolu d'abord contre les champs déclarés du type, puis contre
|
|
|
241
241
|
|
|
242
242
|
Le jeton `order` sert uniquement à choisir la position de la poignée. Sur un type réordonnable qui ne le liste pas, la poignée est ajoutée d'office en tête de tableau ; sur un type qui ne l'est pas, le jeton est écarté même s'il est listé.
|
|
243
243
|
|
|
244
|
-
Variable absente ou vide, l'admin affiche tous les champs déclarés du type, à l'exception des champs `slug` et `editor`. Le détail du rendu de chaque colonne est dans [Administration](./admin.md).
|
|
244
|
+
Variable absente ou vide, l'admin affiche tous les champs déclarés du type, à l'exception des champs `slug` et `editor`. Le détail du rendu de chaque colonne est dans [Administration](./05-admin.md).
|
|
245
245
|
|
|
246
246
|
## Ordre manuel
|
|
247
247
|
|
|
@@ -251,7 +251,7 @@ FRAZA_MODULE_POSTS_TYPE_EXPERTISES_ORDERABLE=true
|
|
|
251
251
|
|
|
252
252
|
La comparaison est stricte : seule la chaîne `true` active le drapeau.
|
|
253
253
|
|
|
254
|
-
Voir [Taxonomies et relations](./taxonomies-et-relations.md) pour l'effet sur le tri et sur la hiérarchie.
|
|
254
|
+
Voir [Taxonomies et relations](./04-taxonomies-et-relations.md) pour l'effet sur le tri et sur la hiérarchie.
|
|
255
255
|
|
|
256
256
|
## Exemple complet
|
|
257
257
|
|
|
@@ -270,6 +270,6 @@ Ce fichier déclare deux types : un blogue plat avec deux niveaux de classement
|
|
|
270
270
|
|
|
271
271
|
## Notes
|
|
272
272
|
|
|
273
|
-
- Le champ `template` n'est pas déclarable. Il est ajouté d'office à chaque post, vaut `default` en l'absence de choix, et sélectionne le template de rendu. Voir [Templates](./templates.md).
|
|
273
|
+
- Le champ `template` n'est pas déclarable. Il est ajouté d'office à chaque post, vaut `default` en l'absence de choix, et sélectionne le template de rendu. Voir [Templates](./07-templates.md).
|
|
274
274
|
- Le champ `seo` n'est pas déclarable non plus. Il est ajouté par le core quand `FRAZA_SEO` est actif. Le drapeau `seo` d'un champ déclaré est autre chose : il désigne la source du repli automatique, il ne crée pas de champ.
|
|
275
275
|
- Le manifeste du module décrit les types de champs disponibles dans sa propre documentation de variable, mais cette liste y est incomplète : elle omet `link` et `parent`, tous deux valides. Le catalogue de cette page fait foi.
|
package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md}
RENAMED
|
@@ -4,8 +4,8 @@ description: Classer des posts par termes, les relier entre eux, les imbriquer e
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/modele-de-donnees
|
|
8
|
-
- 06-modules/posts/api
|
|
7
|
+
- 06-modules/posts/06-modele-de-donnees
|
|
8
|
+
- 06-modules/posts/08-api
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Trois mécanismes relient un post à un autre contenu : les **taxonomies** le classent par termes, les **relations** le lient à des posts d'un autre type, la **hiérarchie** l'imbrique sous un post du même type. Les trois se déclarent comme des champs, et sont stockés hors des données JSON.
|
|
@@ -32,7 +32,7 @@ Le titre est unique dans sa taxonomie : un index unique porte sur `(type de post
|
|
|
32
32
|
|
|
33
33
|
### Administration
|
|
34
34
|
|
|
35
|
-
Chaque taxonomie obtient son propre item dans la section d'admin du type, sous le libellé donné à la déclaration et avec l'icône `LayersIcon`. La liste des termes affiche pour chacun le nombre de posts qui l'utilisent. Voir [Administration](./admin.md).
|
|
35
|
+
Chaque taxonomie obtient son propre item dans la section d'admin du type, sous le libellé donné à la déclaration et avec l'icône `LayersIcon`. La liste des termes affiche pour chacun le nombre de posts qui l'utilisent. Voir [Administration](./05-admin.md).
|
|
36
36
|
|
|
37
37
|
Un terme utilisé par au moins un post **ne peut pas être supprimé**. La suppression échoue en `409`, code `term_in_use`, avec « Ce terme est utilisé par N post(s). L'en retirer avant de le supprimer. ». Le désactiver via `is_active` le retire des sélecteurs et de la route publique tout en conservant les classements existants.
|
|
38
38
|
|
|
@@ -99,7 +99,7 @@ Supprimer un parent ne supprime pas ses enfants : leur `parent_id` est remis à
|
|
|
99
99
|
|
|
100
100
|
### Fil d'Ariane
|
|
101
101
|
|
|
102
|
-
La chaîne d'ascendants est calculée une fois par rendu et passée au template sous la propriété `breadcrumb`, de la racine jusqu'au post courant inclus. Pour un type sans champ `parent`, il est tiré du post lui-même, sans requête. Voir [Templates](./templates.md).
|
|
102
|
+
La chaîne d'ascendants est calculée une fois par rendu et passée au template sous la propriété `breadcrumb`, de la racine jusqu'au post courant inclus. Pour un type sans champ `parent`, il est tiré du post lui-même, sans requête. Voir [Templates](./07-templates.md).
|
|
103
103
|
|
|
104
104
|
## Ordre manuel
|
|
105
105
|
|
|
@@ -123,7 +123,7 @@ Sans `sortBy`, la route applique déjà ce tri quand le type est réordonnable.
|
|
|
123
123
|
|
|
124
124
|
## Notes
|
|
125
125
|
|
|
126
|
-
- Les taxonomies et les relations n'existent en base que si au moins un type les déclare. Après avoir ajouté le premier champ de ce genre, relancer `npx fraza-db init`. Voir [Modèle de données](./modele-de-donnees.md).
|
|
126
|
+
- Les taxonomies et les relations n'existent en base que si au moins un type les déclare. Après avoir ajouté le premier champ de ce genre, relancer `npx fraza-db init`. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
127
127
|
- Une taxonomie retirée de la déclaration d'un type cesse d'apparaître dans l'admin, mais ses termes et ses classements restent en base.
|
|
128
128
|
- La recherche textuelle des routes de liste ne porte que sur le champ de titre. Ni les termes de taxonomie, ni les données des autres champs ne sont interrogés.
|
|
129
129
|
- Le chemin public et le fil d'Ariane sont tronqués au-delà de 64 niveaux de hiérarchie.
|
|
@@ -4,14 +4,14 @@ description: Tuile du tableau de bord, écrans du module, liste paginée et arbo
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/taxonomies-et-relations
|
|
8
|
-
- 06-modules/posts/templates
|
|
9
|
-
- 06-modules/posts/api
|
|
7
|
+
- 06-modules/posts/04-taxonomies-et-relations
|
|
8
|
+
- 06-modules/posts/07-templates
|
|
9
|
+
- 06-modules/posts/08-api
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
Le module ajoute une section d'admin par type déclaré, et en dérive l'interface d'édition. Un formulaire de post n'est donc jamais écrit à la main : il est reconstruit à chaque chargement depuis la déclaration du type. Cette page décrit ce que fait l'interface, y compris les quelques comportements qui surprennent.
|
|
13
13
|
|
|
14
|
-
La structure du formulaire vient de [Types et champs](./types-et-champs.md). Ce qui suit couvre le rendu, pas la déclaration.
|
|
14
|
+
La structure du formulaire vient de [Types et champs](./03-types-et-champs.md). Ce qui suit couvre le rendu, pas la déclaration.
|
|
15
15
|
|
|
16
16
|
## Écrans
|
|
17
17
|
|
|
@@ -25,7 +25,7 @@ La structure du formulaire vient de [Types et champs](./types-et-champs.md). Ce
|
|
|
25
25
|
| `/admin/posts/<type>/taxonomies/<taxonomie>/new` | Création d'un terme. |
|
|
26
26
|
| `/admin/posts/<type>/taxonomies/<taxonomie>/edit/<id>` | Édition d'un terme. |
|
|
27
27
|
|
|
28
|
-
L'accès demande `posts.view` : sans elle, `/admin/posts` et ses sous-écrans répondent 404, comme une page inconnue. Créer, modifier, supprimer et réordonner demandent `posts.manage`, pour les posts comme pour les termes. Voir [Configuration](./configuration.md).
|
|
28
|
+
L'accès demande `posts.view` : sans elle, `/admin/posts` et ses sous-écrans répondent 404, comme une page inconnue. Créer, modifier, supprimer et réordonner demandent `posts.manage`, pour les posts comme pour les termes. Voir [Configuration](./02-configuration.md).
|
|
29
29
|
|
|
30
30
|
L'index des types n'a pas d'entrée dans la barre latérale : celle-ci pointe directement sur la liste de chaque type. Il reste atteignable à son URL, et affiche une carte par type avec son nombre de champs. Sans type déclaré, il affiche à la place un rappel de la variable à renseigner.
|
|
31
31
|
|
|
@@ -39,7 +39,7 @@ Le module pose une tuile « Contenus » sur `/admin`, à l'ordre 70, donc derri
|
|
|
39
39
|
|
|
40
40
|
Une ligne par type déclaré, avec son icône de barre latérale, son total et un lien vers sa liste. Un type sans contenu garde sa ligne, à zéro : la liste des types est celle de la barre latérale, et un type qui disparaîtrait de la tuile le jour où on vide sa corbeille se lirait comme une panne.
|
|
41
41
|
|
|
42
|
-
Le compte des privés ne s'affiche qu'au-dessus de zéro. Il compte les posts dont la visibilité vaut `private`, c'est-à-dire ceux que le rendu public refuse de servir. Il n'y a pas d'état de brouillon dans ce module : un post est public ou privé. Voir [Modèle de données](./modele-de-donnees.md).
|
|
42
|
+
Le compte des privés ne s'affiche qu'au-dessus de zéro. Il compte les posts dont la visibilité vaut `private`, c'est-à-dire ceux que le rendu public refuse de servir. Il n'y a pas d'état de brouillon dans ce module : un post est public ou privé. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
43
43
|
|
|
44
44
|
Les posts d'un type retiré de `FRAZA_MODULE_POSTS_TYPES` restent en base mais ne sont comptés nulle part : sans libellé ni section de navigation, ils n'ont ni ligne où se compter ni page où mener.
|
|
45
45
|
|
|
@@ -47,7 +47,7 @@ Les posts d'un type retiré de `FRAZA_MODULE_POSTS_TYPES` restent en base mais n
|
|
|
47
47
|
|
|
48
48
|
Les deux derniers posts touchés, tous types confondus, chacun lié à son écran d'édition. La date est celle de `updated_at`, donc de la dernière écriture, pas de la publication : un post ancien remonte en tête si on le corrige.
|
|
49
49
|
|
|
50
|
-
Un post est nommé comme la liste d'admin le nomme. Pour un type sans champ `title`, c'est donc un extrait de son premier champ `editor`, sinon de son premier champ `text`, et à défaut `#<id>`. Voir [Types et champs](./types-et-champs.md).
|
|
50
|
+
Un post est nommé comme la liste d'admin le nomme. Pour un type sans champ `title`, c'est donc un extrait de son premier champ `editor`, sinon de son premier champ `text`, et à défaut `#<id>`. Voir [Types et champs](./03-types-et-champs.md).
|
|
51
51
|
|
|
52
52
|
Le badge **Privé** ne marque que les lignes qui le sont : une colonne de « Public » répétés n'apprendrait rien et mangerait la largeur dont le titre a besoin.
|
|
53
53
|
|
|
@@ -98,7 +98,7 @@ Le glisser-déposer demande deux conditions réunies : le type porte le drapeau
|
|
|
98
98
|
|
|
99
99
|
Un post ne se déplace qu'**à l'intérieur de sa fratrie**. Le lâcher sur une ligne d'un autre parent est refusé avec un message, sans requête.
|
|
100
100
|
|
|
101
|
-
Le déplacement est appliqué immédiatement à l'affichage, puis persisté. Si le serveur refuse, la liste est rechargée pour se resynchroniser avec la base. Voir [Taxonomies et relations](./taxonomies-et-relations.md) pour la portée de l'ordre.
|
|
101
|
+
Le déplacement est appliqué immédiatement à l'affichage, puis persisté. Si le serveur refuse, la liste est rechargée pour se resynchroniser avec la base. Voir [Taxonomies et relations](./04-taxonomies-et-relations.md) pour la portée de l'ordre.
|
|
102
102
|
|
|
103
103
|
### Actions de ligne
|
|
104
104
|
|
|
@@ -118,7 +118,7 @@ La colonne latérale est créée dès qu'un template est enregistré pour le typ
|
|
|
118
118
|
|
|
119
119
|
Quand `FRAZA_SEO` est actif, la zone SEO du core apparaît sous la zone de contenu. Son aperçu d'URL utilise le chemin public du post, ou le chemin reconstruit depuis le slug en cours de saisie à la création.
|
|
120
120
|
|
|
121
|
-
Laissées vides, la méta description et l'image de partage retombent sur le contenu du post. La zone SEO montre alors la valeur héritée en filigrane, et la compte dans son score, pour refléter ce que la page publique émettra. La pastille de la liste applique le même calcul. Voir [Repli SEO automatique](./types-et-champs.md#repli-seo-automatique).
|
|
121
|
+
Laissées vides, la méta description et l'image de partage retombent sur le contenu du post. La zone SEO montre alors la valeur héritée en filigrane, et la compte dans son score, pour refléter ce que la page publique émettra. La pastille de la liste applique le même calcul. Voir [Repli SEO automatique](./03-types-et-champs.md#repli-seo-automatique).
|
|
122
122
|
|
|
123
123
|
### Titre et slug
|
|
124
124
|
|
|
@@ -126,13 +126,13 @@ Tant que le champ slug n'a pas été touché, il suit le titre à la frappe. Le
|
|
|
126
126
|
|
|
127
127
|
Sur un type sans champ `title`, il n'y a rien à suivre : le champ slug reste vide et le serveur y pose `post-<id>` à l'enregistrement. Vous pouvez toujours saisir la valeur de votre choix.
|
|
128
128
|
|
|
129
|
-
À l'édition, le slug est considéré comme touché **dès le chargement**. Renommer le titre d'un post existant ne change donc jamais son slug, ce qui reflète exactement la règle appliquée par le serveur. Voir [Modèle de données](./modele-de-donnees.md).
|
|
129
|
+
À l'édition, le slug est considéré comme touché **dès le chargement**. Renommer le titre d'un post existant ne change donc jamais son slug, ce qui reflète exactement la règle appliquée par le serveur. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
130
130
|
|
|
131
131
|
Le slug saisi est renormalisé à l'enregistrement, et suffixé s'il entre en collision avec celui d'un autre post du même type.
|
|
132
132
|
|
|
133
133
|
### Sélecteur de template
|
|
134
134
|
|
|
135
|
-
Le sélecteur liste les templates enregistrés pour **ce type**, jamais ceux d'un autre. Voir [Templates](./templates.md).
|
|
135
|
+
Le sélecteur liste les templates enregistrés pour **ce type**, jamais ceux d'un autre. Voir [Templates](./07-templates.md).
|
|
136
136
|
|
|
137
137
|
Si le post porte un template qui n'existe plus, le sélecteur se réaligne sur le premier disponible, et l'enregistrement suivant écrit cette valeur. Le rendu public, lui, ne réécrit rien : il retombe sur `default` tant que le champ n'a pas été enregistré.
|
|
138
138
|
|
|
@@ -178,7 +178,7 @@ Sans `@fraza/module-medias` installé et activé, le bouton de sélection est re
|
|
|
178
178
|
|
|
179
179
|
Chaque taxonomie déclarée a son propre écran, atteignable depuis la barre latérale. La liste est paginée à 20 termes, triable sur le titre, les dates et le statut.
|
|
180
180
|
|
|
181
|
-
Deux colonnes méritent l'attention : le **nombre de posts** qui portent le terme, et son statut actif ou inactif. Un terme utilisé par au moins un post ne peut pas être supprimé ; le désactiver est la façon de le retirer de la circulation sans perdre les classements. Voir [Taxonomies et relations](./taxonomies-et-relations.md).
|
|
181
|
+
Deux colonnes méritent l'attention : le **nombre de posts** qui portent le terme, et son statut actif ou inactif. Un terme utilisé par au moins un post ne peut pas être supprimé ; le désactiver est la façon de le retirer de la circulation sans perdre les classements. Voir [Taxonomies et relations](./04-taxonomies-et-relations.md).
|
|
182
182
|
|
|
183
183
|
Un terme porte un titre, une description facultative et son drapeau d'activité. Il n'a pas de slug. Deux termes d'une même taxonomie ne portent pas le même titre : créer ou renommer un terme avec le titre d'un autre est refusé avec le message « Un terme porte déjà ce titre dans cette taxonomie. ».
|
|
184
184
|
|
|
@@ -193,7 +193,7 @@ Le seul contrôle bloquant côté navigateur est le titre, qui ne peut pas être
|
|
|
193
193
|
## Notes
|
|
194
194
|
|
|
195
195
|
- Les deux plafonds de l'interface, 500 posts dans le sélecteur de parent et 1000 termes dans un sélecteur de taxonomie, ne sont pas réglables.
|
|
196
|
-
- La recherche n'est pas exposée dans la liste d'admin, bien que la route la supporte. Passer par [l'API](./api.md) pour l'utiliser.
|
|
196
|
+
- La recherche n'est pas exposée dans la liste d'admin, bien que la route la supporte. Passer par [l'API](./08-api.md) pour l'utiliser.
|
|
197
197
|
- Un post privé reste éditable dans l'admin, mais son URL publique répond une page introuvable. Le bouton de lien disparaît alors de la ligne et de l'en-tête. Il n'y a pas de prévisualisation des posts privés.
|
|
198
198
|
- Supprimer un post ne supprime pas ses enfants. Ils remontent à la racine du type, et leur URL publique change en conséquence.
|
|
199
199
|
- Modifier une variable de déclaration demande un redémarrage du serveur : l'admin lit la configuration analysée au boot, pas le fichier d'environnement.
|
|
@@ -4,7 +4,7 @@ description: Les quatre tables du module, les écritures en transaction, les mig
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/api
|
|
7
|
+
- 06-modules/posts/08-api
|
|
8
8
|
- 03-reference/01-cores/database
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -52,7 +52,7 @@ Tous les autres champs déclarés y sont écrits sous leur nom, avec `null` quan
|
|
|
52
52
|
- `template`, l'identifiant du template de rendu, `default` en l'absence de choix ;
|
|
53
53
|
- `seo`, l'objet de métadonnées, forcé à un objet vide si la valeur soumise n'en est pas un.
|
|
54
54
|
|
|
55
|
-
Seules les valeurs saisies sont stockées dans `seo`. La méta description et l'image de partage dérivées du contenu n'y sont jamais écrites : elles sont recalculées à chaque rendu depuis les champs du post. Voir [Repli SEO automatique](./types-et-champs.md#repli-seo-automatique).
|
|
55
|
+
Seules les valeurs saisies sont stockées dans `seo`. La méta description et l'image de partage dérivées du contenu n'y sont jamais écrites : elles sont recalculées à chaque rendu depuis les champs du post. Voir [Repli SEO automatique](./03-types-et-champs.md#repli-seo-automatique).
|
|
56
56
|
|
|
57
57
|
À la lecture, le module aplatit `data` au premier niveau de l'objet post tout en conservant l'objet brut sous `_data`. Un post lu porte donc `post.title` et `post._data.title`.
|
|
58
58
|
|
|
@@ -94,7 +94,7 @@ Table de liaison, plusieurs à plusieurs.
|
|
|
94
94
|
|
|
95
95
|
Contrainte : `UNIQUE(post_id, taxonomy, term_id)`.
|
|
96
96
|
|
|
97
|
-
Supprimer un post ou un terme retire les liaisons correspondantes par cascade. La suppression d'un terme encore utilisé est cependant refusée en amont, par le module. Voir [Taxonomies et relations](./taxonomies-et-relations.md).
|
|
97
|
+
Supprimer un post ou un terme retire les liaisons correspondantes par cascade. La suppression d'un terme encore utilisé est cependant refusée en amont, par le module. Voir [Taxonomies et relations](./04-taxonomies-et-relations.md).
|
|
98
98
|
|
|
99
99
|
## `fraza_posts_relation`
|
|
100
100
|
|
|
@@ -4,7 +4,7 @@ description: Écrire un template de post, les propriétés qu'il reçoit, la por
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/admin
|
|
7
|
+
- 06-modules/posts/05-admin
|
|
8
8
|
- 03-reference/01-cores/templates
|
|
9
9
|
- 02-guides/contenu-public-et-templates
|
|
10
10
|
---
|
|
@@ -59,7 +59,7 @@ Aucun `children` n'est injecté, le template décide seul de sa structure.
|
|
|
59
59
|
|
|
60
60
|
### Deux clés non déclarables sur `post`
|
|
61
61
|
|
|
62
|
-
`data` porte deux clés qui ne viennent d'aucune déclaration de champ, et qui sont donc aplaties comme les autres : `post.template`, l'identifiant du template retenu, et `post.seo`, l'objet de métadonnées. Voir [Modèle de données](./modele-de-donnees.md).
|
|
62
|
+
`data` porte deux clés qui ne viennent d'aucune déclaration de champ, et qui sont donc aplaties comme les autres : `post.template`, l'identifiant du template retenu, et `post.seo`, l'objet de métadonnées. Voir [Modèle de données](./06-modele-de-donnees.md).
|
|
63
63
|
|
|
64
64
|
Un type hiérarchique ajoute par ailleurs `post._path`, le chemin public reconstruit depuis la chaîne des parents. Sa valeur est celle de la propriété `url` : préférer `url`, qui est présente quel que soit le type. `_path` existe surtout pour l'admin, qui s'en sert pour le lien « voir » d'une ligne de liste.
|
|
65
65
|
|
|
@@ -4,8 +4,8 @@ description: Routes HTTP d'admin et publiques, et fonctions serveur importables
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/modele-de-donnees
|
|
8
|
-
- 06-modules/posts/admin
|
|
7
|
+
- 06-modules/posts/06-modele-de-donnees
|
|
8
|
+
- 06-modules/posts/05-admin
|
|
9
9
|
- 03-reference/01-cores/api
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -69,7 +69,7 @@ Le tri par défaut dépend du type : la colonne d'ordre en ascendant si le type
|
|
|
69
69
|
|
|
70
70
|
Renvoie le post ou `null`, y compris quand il existe mais n'est pas public, ou qu'un de ses ancêtres ne l'est pas.
|
|
71
71
|
|
|
72
|
-
Ses champs `editor` sont enrichis de leurs métadonnées médias, donc directement rendables. Ses taxonomies, relations et parent sont résolus. Les relations ne gardent que les posts visibles, sans leurs champs privés. Voir [Taxonomies et relations](./taxonomies-et-relations.md).
|
|
72
|
+
Ses champs `editor` sont enrichis de leurs métadonnées médias, donc directement rendables. Ses taxonomies, relations et parent sont résolus. Les relations ne gardent que les posts visibles, sans leurs champs privés. Voir [Taxonomies et relations](./04-taxonomies-et-relations.md).
|
|
73
73
|
|
|
74
74
|
Ses champs média le sont aussi : `image` et `thumbnail` portent un objet `{ id, filename, alt_text, caption, mime_type }`, `gallery` un tableau de ces objets dans l'ordre de la galerie. L'URL publique se construit à partir de `filename`, jamais stockée. Une référence dont le média a disparu apparaît comme `{ id, filename: null }`.
|
|
75
75
|
|
|
@@ -4,30 +4,42 @@ description: Types de contenu déclarés en variables d'environnement, avec taxo
|
|
|
4
4
|
related:
|
|
5
5
|
title: Étapes suivantes
|
|
6
6
|
links:
|
|
7
|
-
- 06-modules/posts/installation
|
|
8
|
-
- 06-modules/posts/types-et-champs
|
|
7
|
+
- 06-modules/posts/01-installation
|
|
8
|
+
- 06-modules/posts/03-types-et-champs
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
`@fraza/module-posts` ajoute des types de contenu à l'admin, sans écrire une ligne de code. Un type, ses champs, ses taxonomies et ses relations sont déclarés dans les variables d'environnement, et le module en dérive la table, l'interface d'édition, les routes et le rendu public.
|
|
12
12
|
|
|
13
|
+
```bash
|
|
14
|
+
npm i @fraza/module-posts
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Paquet | `@fraza/module-posts` |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Licence | MIT, Fraza Libre. |
|
|
20
|
+
| Registre | npmjs, sans compte ni configuration. |
|
|
21
|
+
| Activation | `FRAZA_MODULE_POSTS=true` |
|
|
22
|
+
|
|
23
|
+
Le module demande en plus au moins un type déclaré. Le premier type, la création des tables et le rendu public sont dans [Installation](./01-installation.md).
|
|
24
|
+
|
|
13
25
|
Le module est indépendant de `@fraza/module-pages`. Les deux peuvent cohabiter : posts réserve les URL de la forme `/<type>/<slug>`, pages sert de repli sur tout le reste.
|
|
14
26
|
|
|
15
27
|

|
|
16
28
|
|
|
17
|
-
Rien de cet écran n'est écrit en dur. Le libellé de la section, les colonnes affichées et la poignée de réordonnancement viennent de la déclaration du type dans les variables d'environnement. Un deuxième type déclaré donne une deuxième section, avec ses propres colonnes. Voir [Types et champs](./types-et-champs.md).
|
|
29
|
+
Rien de cet écran n'est écrit en dur. Le libellé de la section, les colonnes affichées et la poignée de réordonnancement viennent de la déclaration du type dans les variables d'environnement. Un deuxième type déclaré donne une deuxième section, avec ses propres colonnes. Voir [Types et champs](./03-types-et-champs.md).
|
|
18
30
|
|
|
19
31
|
## Pages de cette section
|
|
20
32
|
|
|
21
33
|
| Page | Contenu |
|
|
22
34
|
|---|---|
|
|
23
|
-
| [Installation](./installation.md) | Installer le module, créer les tables, brancher le rendu public. |
|
|
24
|
-
| [Configuration](./configuration.md) | Variable d'activation, permissions, entrées d'admin. |
|
|
25
|
-
| [Types et champs](./types-et-champs.md) | Déclarer un type de contenu et ses champs. |
|
|
26
|
-
| [Taxonomies et relations](./taxonomies-et-relations.md) | Classer, relier et hiérarchiser des posts. |
|
|
27
|
-
| [Administration](./admin.md) | Écrans d'admin, liste, formulaire, sélecteurs et termes. |
|
|
28
|
-
| [Modèle de données](./modele-de-donnees.md) | Les quatre tables, les migrations, les règles de slug. |
|
|
29
|
-
| [Templates](./templates.md) | Écrire un template de post et les propriétés qu'il reçoit. |
|
|
30
|
-
| [API](./api.md) | Routes HTTP et fonctions serveur importables. |
|
|
35
|
+
| [Installation](./01-installation.md) | Installer le module, créer les tables, brancher le rendu public. |
|
|
36
|
+
| [Configuration](./02-configuration.md) | Variable d'activation, permissions, entrées d'admin. |
|
|
37
|
+
| [Types et champs](./03-types-et-champs.md) | Déclarer un type de contenu et ses champs. |
|
|
38
|
+
| [Taxonomies et relations](./04-taxonomies-et-relations.md) | Classer, relier et hiérarchiser des posts. |
|
|
39
|
+
| [Administration](./05-admin.md) | Écrans d'admin, liste, formulaire, sélecteurs et termes. |
|
|
40
|
+
| [Modèle de données](./06-modele-de-donnees.md) | Les quatre tables, les migrations, les règles de slug. |
|
|
41
|
+
| [Templates](./07-templates.md) | Écrire un template de post et les propriétés qu'il reçoit. |
|
|
42
|
+
| [API](./08-api.md) | Routes HTTP et fonctions serveur importables. |
|
|
31
43
|
|
|
32
44
|
## Ce que le module apporte
|
|
33
45
|
|
|
@@ -47,7 +59,7 @@ Il n'y a pas un module par type de contenu. `FRAZA_MODULE_POSTS_TYPES` déclare
|
|
|
47
59
|
|
|
48
60
|
La conséquence pratique : ajouter un type de contenu ne demande ni installation, ni migration, ni redéploiement de schéma. Une variable d'environnement suffit, les tables étant déjà en place.
|
|
49
61
|
|
|
50
|
-
Voir [Types et champs](./types-et-champs.md) pour la syntaxe.
|
|
62
|
+
Voir [Types et champs](./03-types-et-champs.md) pour la syntaxe.
|
|
51
63
|
|
|
52
64
|
## Positionnement dans le rendu public
|
|
53
65
|
|
|
@@ -57,6 +69,6 @@ Une page CMS nommée `blogue` et un type de post nommé `blogue` peuvent donc co
|
|
|
57
69
|
|
|
58
70
|
## Notes
|
|
59
71
|
|
|
60
|
-
- Un type sans champ de type `slug` n'est jamais rendu publiquement. C'est l'interrupteur qui distingue un type public d'un type purement interne. Voir [Types et champs](./types-et-champs.md).
|
|
72
|
+
- Un type sans champ de type `slug` n'est jamais rendu publiquement. C'est l'interrupteur qui distingue un type public d'un type purement interne. Voir [Types et champs](./03-types-et-champs.md).
|
|
61
73
|
- Le champ `version` du manifeste suit la version du paquet : [`fraza-module sync-version`](../../03-reference/05-cli/fraza-module.md#sync-version), lancé par chaque build, la recopie dans `src/version.js`, et `prepublishOnly` refuse de publier si les deux divergent.
|
|
62
74
|
- Le module lit et écrit des médias par le [registre média](../../03-reference/03-registres/media-registry.md) du core. Sans `@fraza/module-medias`, les champs `image`, `thumbnail` et `gallery` restent déclarables mais le sélecteur ne s'ouvre pas, et le module émet un avertissement au boot.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|