Wiki » Plugins » Contenu
Dans cette partie, nous allons voir comment générer le HTML qui sera affiché sur la page. Commençons par créer le fichier qui sera appelé par le CMS.
Que le plugin soit de type page
, header
ou sidebar
, vous devez créer un fichier PHP nommé core.php
: c'est celui qui sera exécuté quand le CMS aura besoin de votre HTML.
Dans ce fichier, et dans tous les fichiers PHP que vous ferez dans votre plugin, vous devez mettre ce code tout au dessus:
En effet, le CMS défini une constante IN_ENV
, si la constante n'est pas définie ça veut dire que le script est appelé directement par son adresse, sans passer par le CMS: dans ce cas la le script sera arrêté.
Plusieurs variables sont à votre disposition:
$page (Object Page): Objet initialisé avec la page courante
$user (Object User): Objet initialisé avec l'utilisateur courant
$plugin (Array): Tableau associatif contenant toutes les infos du plugin (type, lang, version)
$config (String): Alias de $plugin['config']
, contient la configuration utilisateur (config
) au format JSON
$path (String): Alias de $plugin['path']
, contient le dossier du plugin (exemple: plugin/Slider/
)
$template (String): Alias de $plugin['template']
, contient le dossier contenant les fichiers template, soit du plugin, soit du thème si supporté (nous y reviendrons)
$data (String): Configuration utilisateur (data
) au format JSON
Vous ne devez pas afficher le code HTML généré avec echo
ou print
, vous devez obligatoirement le retourner depuis le fichier core.php
. Par exemple:
<?php defined('IN_ENV') or die; if ($user->auth()) { $html = '<div>{@WELCOME} ' . $user->get('username') . '</div>'; } else { $html = '<div>{@WELCOME}</div>'; } return $html;
Si jamais vous voulez retourner une page blanche, ne retournez pas une chaîne de caractère vide ""
, ou le CMS pensera qu'un problème est survenu. Faites alors return false;
pour ne rien afficher et éviter une erreur.
Vous aurez surement besoin de fichiers autre que PHP (HTML, CSS, images, …), qui peuvent changer suivant le thème. Vous devez alors créer un dossier template
, et mettre tous ces fichiers dedans. Si un thème supporte votre plugin, alors la variable $template
sera le dossier de ce thème, sinon la variable sera votre dossier.
Pour qu'un thème puisse supporter votre plugin, vous devez modifier votre configuration (config.cfg.php
) pour ajouter la version minimum de votre plugin avec laquelle le thème peut être utilisé: plugin.require.template
, comme ceci.
Par exemple, votre plugin est créé sous la version 1.0.0, mettez alors plugin.require.template
à 1.0.0.
Ensuite, vous mettez à jour votre plugin, en version 1.1.0, mais les fichiers template ne sont pas modifié: laissez plugin.require.template
à 1.0.0.
Plus tard, vous passez en version 2.0.0, et vous modifiez un ou plusieurs fichier template: mettez alors plugin.require.template
à 2.0.0.
Que vous utilisez data
ou config
, le fonctionnement est le même, il faut juste utiliser les bonnes variables ($data
et $config
).
Pour décoder la configuration JSON en tableau, il suffit d'utiliser la fonction $config = json_decode($config, true);
.
Mais attention, $config
ne contient pas toujours les données attendues: il peut être un tableau vide si la configuration était vide, ou peut être NULL
ou FALSE
si une erreur survient.
Pensez donc à gérer le cas ou la configuration est vide ou si elle est incorrecte, par exemple:
$data = json_decode($data, true); if (is_array($data) and !empty($data)) { // $data est un tableau, et n'est pas vide // On génère le code html et on le retourne return $html; } else { // Retourne le code HTML correspondant à un message d'erreur. // La traduction ERROR_PLUGIN_NO_CONFIG existe déjà dans le CMS, // pas besoin de l'ajouter à votre fichier de langue return render_flash(false, 'ERROR_PLUGIN_NO_CONFIG'); }
<div class="slider"> <!-- %SLIDER_BLOCK% --> <div style="width: 100%; background: url(%PICTURE%); background-size: cover;"> <h1>%TITLE%</h1> </div> <!-- %SLIDER_BLOCK% --> <!-- %SLIDER_POSITION% --> <a href="#">« {@PREVIOUS}</a> - <a href="#">{@NEXT} »</a> </div>
<?php defined('IN_ENV') or die; $data = json_decode($data, true); // Si aucun slide n'est configuré, on n'affiche rien if (!is_array($data) or empty($data)) return false; // Récupère le fichier slider.htm du thème ou du plugin $html = file_get_contents($template . 'slider.htm'); // Enlève les commentaires des tags ("<!-- %SLIDER_BLOCK% -->" devient "%SLIDER_BLOCK%") $html = strip_comments($html); // Récupère le code entre les balises "%SLIDER_BLOCK%" $slideTemplate = str_between($html, '%SLIDER_BLOCK%'); foreach ($data['slide'] as $slide) { // On créé un nouveau slide $currentSlide = $slideTemplate; // On remplace les tags $currentSlide = str_replace('%TITLE%', e($slide['title']), $currentSlide); $currentSlide = str_replace('%PICTURE%', e($slide['picture']), $currentSlide); // On ajoute le slide dans le code HTML $html = str_replace('%SLIDER_POSITION%', $currentSlide . '%SLIDER_POSITION%', $html); } // On supprime les tags et les blocs $html = str_replace('%SLIDER_POSITION%', '', $html); $html = str_remove_where($html, '%SLIDER_BLOCK%'); return $html;
Il faut différencier 2 choses:
site.fr/nouveautes/
site.fr/plugin/Slider/template/style.css
Les liens vers d'autres pages doivent prendre en compte le dossier d'installation du CMS, les slash de de fin, et si l'url rewriting est activé ou non. En effet, sur 2 CMS différents ces liens représentent la même page:
http://www.site.fr/overcms/?/nouveautes/ http://www.site.fr/nouveautes/
Pour commencer, le début (http://www.site.fr
) ne doit pas être précisé, car on commencera les liens par /
ce qui indique la racine du site. Ensuite, la partie suivante (/overcms/?/
pour le lien 1 et /
pour le lien 2) est toujours indiqué dans une constante: ABS_ROOT
. Cette constante prend en compte le dossier et si l'url rewriting est activé ou non. Reste à préciser le slash de fin, et votre lien est terminé:
echo '<a href="' . ABS_ROOT . 'nouveautes/">Lien</a>';
Vous n'êtes pas obligé d'utiliser PHP pour faire un lien, en HTML le tag {ROOT}
sera remplacé par ABS_ROOT:
<a href="{ROOT}nouveautes/">Lien</a>
Les liens vers des scripts, images, CSS qui pointent vers des fichiers ont un peu près le même fonctionnement, a une constante près: utilisez HTTP_ROOT pour désigner le dossier d'installation du CMS.
Par exemple, pour ces fichiers:
http://www.site.fr/overcms/plugin/Slider/template/script.js http://www.site.fr/plugin/Pictures/template/img/42.jpg
On utilisera:
echo '<script src="' . HTTP_ROOT . 'plugin/Slider/template/script.js"></script>'; echo '<img src="' . HTTP_ROOT. 'plugin/Pictures/template/img/42.jpg" alt="">';
En HTML le tag {WEBROOT}
sera remplacé par HTTP_ROOT:
<script src="{WEBROOT}plugin/Slider/template/script.js"></script>'; <img src="{WEBROOT}plugin/Pictures/template/img/42.jpg" alt="">';
Page suivante: Outils