essais - lechti64/ZwiiCMS-speciale-8.2.5 GitHub Wiki
Zwii 8
Zwii est un CMS sans base de données (Flat-File) qui permet à ses utilisateurs de créer et gérer facilement un site web sans aucune connaissance en programmation.
Sommaire
- Configuration recommandée
- Installation
- Traduction (i18n)
- Procédure de mise à jour
- Arborescence générale
- Structure du fichier de données
- Liste des valeurs en sortie
- Liste des méthodes du cœur
- Liste des méthodes de template
- Liste des helpers
- Création d'un module
Configuration recommandée
- PHP 5.5 ou plus
- Support du .htaccess
Installation
Décompressez l'archive de Zwii sur votre serveur et c'est tout ! Vous pouvez aussi décompresser cette archive sur votre pc et envoyer le dossier qu'elle contenait directement sur votre serveur.
Traduction (i18n)
Vous pouvez télécharger ou proposer de nouvelles langues pour Zwii depuis ce lien.
You can download or suggest new languages for Zwii from this link.
Procédure de mise à jour de Zwii
- Sauvegardez le dossier "site" de votre serveur
- Supprimez les dossiers et fichiers restants sur votre serveur
- Décompressez la nouvelle version sur votre serveur
- Écrasez le dossier "site" de la nouvelle version par le votre
Note : La réécriture des URLS est automatiquement désactivée après une mise à jour. À vous de la réactiver depuis l'interface de configuration du site.
Arborescence générale
Légende : [D] Dossier ; [F] Fichier
[D] core Contient le coeur de Zwii
[D] layout Contient les différentes structure de thème
[D] module Contient les modules du coeur
[D] tmp Contient les fichiers temporaire
[D] vendor Contient les librairies
[F] core.js.php Coeur JavaScript de Zwii
[F] core.php Coeur PHP de Zwii
[D] i18n Contient les fichiers de traduction
[D] module Contient les modules de page
[D] site Contient données du site
[D] backup Contient les 30 dernière sauvegardes automatiques du fichier data.json
[D] data Contient les fichiers de données
[F] data.json Fichier de données
[F] theme.json Thème stocké dans le fichier data.json compilé en CSS
[D] file Contient les fichiers envoyés sur le serveur depuis le gestionnaire de fichiers
[D] source Contient les fichiers
[D] thumb Contient les miniatures des fichiers de type image
[F] index.php Fichier d'initialisation de Zwii
Structure du fichier de données
{
"config": { // Contient la configuration du site
"analyticsId": "", // Id Google Analytics
"autoBackup": true, // Sauvegarde automatique des données
"cookieConsent": true, // Message de consentement pour les cookies
"favicon": "", // Favicon
"homePageId": "", // ID de la page d'acceuil
"language": "", // Langue de l'interface
"metaDescription": "", // Méta-description
"social": { // Contient les IDs des réseaux sociaux
"facebookId": "", // ID Facebook
"googleplusId": "", // ID Google+
"instagramId": "", // ID Instagram
"pinterestId": "", // ID Pinterest
"twitterId": "", // ID Twitter
"youtubeId": "" // ID Youtube
},
"timezone": "", // Fuseau horaire de l'horodatage
"title": "" // Titre du site
},
"core": { // Contient des informations utiles au cœur
"dataVersion": 0, // Version des données (permet de mettre à jour le fichier de données à chaque nouvelle version de Zwii)
"lastBackup": 0, // Horodatage de la dernière sauvegarde
"lastClearTmp": 0 // Horodatage du dernier nettoyage du dossier temporaire
},
"page": { // Contient les pages du site
"example": { // ID de la page, contient les données de la page
"content": "", // Contenu
"hideTitle": true, // Cache ou non le titre
"metaDescription": "", // Méta-description
"metaTitle": "", // Méta-titre
"moduleId": "", // ID du module de la page
"parentPageId": "", // ID de la page parente
"position": 1, // Position de la page dans le menu
"group": 0, // Groupe minimum pour accéder à la page
"targetBlank": true, // Ouvre ou non la page dans un nouvel onglet
"title": "" // Titre
}
},
"module": { // Contient les données des modules de page
"example": {} // ID de la page, contient les données du module de la page "example"
},
"user": { // Contient les utilisateurs
"a": { // ID de l'utilisateur, contient les données de l'utilisateur
"firstname": "", // Prénom
"forgot": 0, // Horodatage de la dernière demande de récupération de mot de passe
"group": 1, // Groupe
"lastname": "", // Nom
"mail": "", // Mail
"password": "" // Mot de passe hashé
}
},
"theme": { // Contient le thème
"body": { // Thème du fond
"backgroundColor": "", // Couleur
"image": "", // Image
"imageAttachment": "", // Fixation de l'image
"imageRepeat": "", // Répétition de l'image
"imagePosition": "", // Position de l'image
"imageSize": "" // Taille de l'image
},
"button": { // Thème des boutons
"backgroundColor": "" // Couleur
},
"footer": { // Thème du bas de page
"backgroundColor": "", // Couleur
"copyrightAlign": "", // Alignement du copyright
"height": "", // Hauteur
"loginLink": true, // Affichage lien de connexion
"margin": true, // Espacement
"position": "", // Position
"socialsAlign": "", // Alignement des réseaux sociaux
"text": "", // Texte
"textAlign": "" // Alignement du texte
},
"header": { // Thème de la bannière
"backgroundColor": "", // Couleur du fond
"font": "", // Police du texte
"fontWeight": "", // Style du texte
"height": "", // Hauteur
"image": "", // Image de fond
"imagePosition": "", // Position de l'image
"imageRepeat": "", // Répétition de l'image
"margin": true, // Espacement
"position": "", // Position
"textAlign": "", // Alignement du texte
"textColor": "", // Couleur du texte
"textHide": true, // Cache ou non le texte
"textTransform": "" // Caractère du texte
},
"link": { // Thème des liens
"textColor": "" // Couleur
},
"menu": { // Thème du menu
"backgroundColor": "", // Couleur
"fontWeight": "", // Style du texte
"height": "", // Hauteur
"loginLink": true, // Affiche ou non le lien de connexion
"margin": true, // Espacement
"position": "", // Position
"textAlign": "", // Alignement du texte
"textTransform": "" // Caractère du texte
},
"site": { // Thème du site
"width": "" // Largeur
},
"text": { // Thème du texte
"font": "" // Police
},
"title": { // Thème des titres
"font": "", // Police
"fontWeight": "", // Style
"textColor": "", // Couleur
"textTransform": "" // Caractère
}
}
}
Liste des valeurs en sortie
access
Autorise ou non l'accès à un contrôleur.
- Type :
boolean
- Par défaut :
false
content
Retourne une chaîne à afficher (aucune vue ne peut être affichée lorsque cette valeur est utilisée)
- Type :
string
- Par défaut : chaîne vide
display
Type d'affichage à utiliser.
- Type :
constant
- Par défaut :
self::DISPLAY_LAYOUT_MAIN
- Constantes disponibles :
self::DISPLAY_RAW
: Affichage brutself::DISPLAY_JSON
: Affichage sous forme de tableau JSONself::DISPLAY_LAYOUT_BLANK
: Affichage du thème mais sans structureself::DISPLAY_LAYOUT_MAIN
: Affichage du thème avec la structure principaleself::DISPLAY_LAYOUT_LIGHT
: Affichage du thème avec la structure simplifiée
metaDescription
Méta-description à utiliser
- Type :
string
- Par défaut : chaîne vide
metaTitle
Méta-titre à utiliser
- Type :
string
- Par défaut : chaîne vide
notification
Notification à afficher
- Type :
string
- Par défaut : chaîne vide
redirect
Redirection vers un URL
- Type :
string
- Par défaut : chaîne vide
showBarEditButton
Affiche ou non le bouton d'édition de page dans la barre de membre
- Type :
boolean
- Par défaut :
false
showPageContent
Affiche ou non le contenu de la page qui instancie le module (seulement pour les modules de page)
- Type :
boolean
- Par défaut :
false
state
État des données en sortie. Permet d'activer l'enregistrement des données et de changer la couleur des notifications.
- Type :
boolean
/null
- Par défaut :
false
- Liste des valeurs :
false
: Désactivation de l'enregistrement des données et notification rougenull
: Activation de l'enregistrement des données et notification orangetrue
: Activation de l'enregistrement des données et notification verte
title
Titre à afficher
- Type :
string
/null
- Par défaut :
null
- Spécificité : Préférez l'utilisation de
null
pour cacher le titre, une chaîne vide n'affichera rien mais chargera quand même du HTML dans votre page.
vendor
Liste des librairies à charger
- Type :
array
- Par défaut : tableau vide
- Librairies disponibles :
flatpickr
: Sélecteur de datetinycolorpicker
: Palette de couleurstinymce
: Éditeur de texte
Exemple :
$this->addOutput([
'vendor' => [
'flatpickr',
'tinymce'
]
]);
view
Vue à afficher
- Type :
string
- Par défaut : chaîne vide
Exemple :
$this->addOutput([
'view' => 'index'
]);
Liste des méthodes du cœur
Liste des méthodes de template
Liste des helpers
Création d'un module
Afin de comprendre les étapes de création d'un module nous allons en développer un ensemble. Notre module permettra aux utilisateurs autorisés de publier des messages depuis une interface dédiée. Mais avant de nous lancer quelques points importants :
- Les modules ne sont pas directement appelés depuis une URL, ils doivent être instanciés dans une page afin d'être appelés.
- Un module peut être instancié dans une infinité de page sans que les données ne se croisent. Par exemple, 2 pages avec chacune un module de blog instancié ne partageront pas les données entre elles.
Structure des données
La structure des données enregistrées depuis la page de création des messages sera la suivante :
{
"id-du-message-1" : "Message 1",
"id-du-message-2" : "Message 2",
"id-du-message-3" : "Message 3"
}
Pour rappel, les données des modules sont stockées comme ceci dans le fichier de données :
module > id-de-la-page > [données du module]
Pour plus d'informations je vous invite à regarder la section "Structure du fichier de données" (TODO LIEN).
Arborescence
Pour commencer vous allez créer les dossiers et fichiers nécessaires au bon fonctionnement du module dans le dossier "module" à la racine de Zwii :
Légende : [D] Dossier ; [F] Fichier
[D] message Contient le module
[D] view Contient les vues du module
[D] add Contient les fichiers de la vue du contrôleur "add"
[F] add.php Vue du contrôleur "add"
[D] config Contient les fichiers de la vue du contrôleur "config"
[F] config.php Vue du contrôleur "config"
[D] index Contient les fichiers de la vue du contrôleur "index"
[F] index.php Vue du contrôleur "index"
[F] message.php Contrôleurs du module
Le dossier des vues peut contenir 3 types de fichiers :
[nom de la vue].css
: feuille de style CSS de la vue.[nom de la vue].js.php
: JavaScript de la vue, peut également contenir PHP.[nom de la vue].php
: la vue.
Dans le développement du module nous n'utiliserons que le fichier [nom de la vue].php
. Par la suite vous pourrez très bien les ajouter afin d'intégrer des scripts et du style à vos vues.
Contrôleurs
Les contrôleurs permettent de traiter les données avant de les enregistrer ou de les afficher dans une vue.
Ouvrez le fichier "module/message/message.php" et copiez-y le code suivant :
<?php
class message extends common {
public static $controllers = [
'add' => self::GROUP_MODERATOR,
'config' => self::GROUP_MODERATOR,
'index' => self::GROUP_MODERATOR
];
public static $messages = [];
public function add() {}
public function config() {}
public function index() {}
}
Je pense que quelques explications s'imposent !
La propriété $controllers
est obligatoire dans un module, elle permet de déclarer les contrôleurs du module. Il s'agit d'un tableau avec pour clé le nom du contrôleur et pour valeur le groupe minimum requis pour y accéder.
Il existe 4 constantes de groupe (du plus faible au plus fort) :
self::GROUP_VISITOR
: un visiteur.self::GROUP_MEMBER
: un utilisateur connecté.self::GROUP_MODERATOR
: un utilisateur connecté et modérateur.self::GROUP_ADMIN
: un utilisateur connecté et administrateur.
Les propriétés permettent aussi de communiquer des données entre les contrôleurs et les vues, vous pouvez en créer une infinité et les nommer comme bon vous semble. La propriété $messages
illustre bien ce propos, elle va permettre de communiquer aux vues la liste des messages générée dans les contrôleurs.
Les méthodes situées en dessous des propriétés correspondent aux contrôleurs des pages du module. Voici le détails des trois méthodes :
add()
correspond au contrôleur de la page d'ajout de message.config()
est obligatoire dans un module, elle correspond au contrôleur de la page de configuration accessible depuis la roue dentée de la page d'édition des pagesindex()
est obligatoire dans un module, elle correspond au contrôleur de l'accueil du module.
Contrôleur "add"
Contrôleur "config"
Copiez / Collez le code ci-dessous à la place de la méthode config()
vide :
public function config() {
// Liste des messages
$messages = $this->getData(['module', $this->getUrl(0)]);
// Génération des lignes du tableau
foreach($messages as $messageId => $message) {
self::$messages[] = [
$message['content']
];
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Liste des messages',
'view' => 'config'
]);
}
Ce code permet générer un tableau contenant la liste des messages et d'ajouter la vue au contrôleur. Pas de panique, je vais vous détailler chaque étape afin de mieux comprendre le fonctionnement du contrôleur.
// Liste des messages
$messages = $this->getData(['module', $this->getUrl(0)]);
Cette ligne retourne les données du module. Pour comprendre son fonctionnement vous devez déjà connaître la structure des URLs de Zwii.
Je vais prendre comme exemple l'URL pour accéder à la page de configuration du module :
Vous avez du remarquer que l'URL est scindée en plusieurs parties, chaque partie est séparée par un slash "/". C'est là que la méthode $this->getUrl()
entre en jeu, elle permet entre autre de retourner le contenu d'une partie de l'URL.
$this->getUrl(0)
: id-de-la-page.$this->getUrl(1)
: config.
Quant à la méthode $this->getData()
, elle retourne les données demandées en naviguant dans la structure du fichier de données.
Par conséquent, $this->getData(['module', $this->getUrl(0)])
retourne les données du module à l'aide de l'ID de la page, la méthode suit le schéma suivant pour retourner les données :
module > id-de-la-page > [retourner les données]
Pour plus d'informations sur les deux méthodes citées, je vous invite à lire la section "Liste des méthodes du coeur" (TODO LIEN).
// Génération des lignes du tableau
foreach($messages as $messageId => $message) {
self::$messages[] = [
$message['content']
];
}
Ici rien de compliqué, la fonction foreach()
passe en revue les messages afin de remplir la propriété $messages
.
// Valeurs en sortie
$this->addOutput([
'title' => 'Liste des messages',
'view' => 'config'
]);
$this->addOutput()
retourne au cœur des valeurs en sortie du contrôleur. Pour obtenir la liste des valeurs possible je vous invite à lire la section "Liste des valeurs en sortie" (TODO LIEN).
Dans notre cas la méthode retourne le titre de la page et rattache la vue config à notre contrôleur.
Contrôleur "index"
Vues
Les vues permettent d'afficher des formulaires, tableaux et autres éléments afin de saisir ou lire les données de votre site.
Nous allons créer une vue pour le contrôleur de la partie précédente. Pour ce faire i