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.

Site - Forum - GitHub

Sommaire

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 brut
    • self::DISPLAY_JSON : Affichage sous forme de tableau JSON
    • self::DISPLAY_LAYOUT_BLANK : Affichage du thème mais sans structure
    • self::DISPLAY_LAYOUT_MAIN : Affichage du thème avec la structure principale
    • self::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 rouge
    • null : Activation de l'enregistrement des données et notification orange
    • true : 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 date
    • tinycolorpicker : Palette de couleurs
    • tinymce : É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 pages
  • index() 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 :

http://votresite.com/?id-de-la-page/config

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

Vue "add"

Vue "config"

Vue "index"

Librairies