Blog

  • Version 1.0.2

    05/01/2023 | 0 commentaire

    Bonjour tous.

    Petite news pour signaler que je viens de publier en crash une nouvelle version, la v1.0.2.

    Celle-ci corrige un bug d'affichage des pages qui pouvaient apparaître sur le plugin Page, dans la partie administration.

    Au passage, j'en ai profité pour inclure une fonctionnalité demandée : La suppression automatique (en un clic) du fichier install.php lorsqu'il est encore présent à l'issue de l'installation.

    N'hésitez pas à poster vos retours et soucis sur le forum de 299Ko, toute discussion est la bienvenue :) Vous pouvez même poster un message sans vous enregistrer, mais vous perdez quelques fonctionnalités bien sûr.

    Merci !

  • Le Moteur de Templates

    01/11/2022 | 0 commentaire

    6361278b3e227.png

    Ca y est, je viens de commit un gros pavé sur le Git de 299Ko, bouclant un chapitre entamé avant la sortie de la V1 : Un moteur de templates PHP pour 299Ko.

    Moteur de templates ?

    Pour ceux qui ne connaissent pas, un moteur de templates est une librairie qui permet d'interpréter du code écrit dans du HTML et de le transformer en PHP. Au lieu du code PHP dans la partie affichage, nous n'allons plus avoir que du HTML et des 'pseudos codes'.

    Concrètement, nous allons pouvoir pleinement séparer la partie traitement, le code PHP pur, de la partie Vue, le code HTML.

    Selon la syntaxe choisie par le moteur de templates, on aura par exemple cette syntaxe :

    Par exemple, pour afficher une variable dans un div :

    // Dans un fichier .php
    ?>
    <div id="sidebar">
        <?php echo $varName; ?>
    </div>
    
    // Dans un fichier .tpl avec un moteur de templates
    <div id="sidebar">
        {{ varName }}
    </div>

    Cela va simplifier énormément la mise en page et surtout, permettre d'avoir une meilleure lisibilité de la Vue. En effet, les fichiers 'header.php' et 'footer.php' sont remplacés par un 'layout.tpl', dans lequel on injecte le contenu de la page (variable {{ CONTENT }}.

    Lequel ? Twig ? Smarty ?

    Si vous connaissez les moteurs de templates, vous n'êtes pas sans savoir que Twig, développé par les créateurs du framework Symfony, et Smarty, certainement le plus ancien et populaire des moteurs de rendu, sont assez 'gros'.

    S'ils permettent de faire beaucoup de choses, ils sont malheureusement très lourds, et ce n'est pas dans l'esprit de 299Ko, qui se veut l'anti usine à gaz. Aussi j'ai développé un moteur de templates (presque) spécialement pour ce CMS. Il se compose d'une seule classe et couvre tous les besoins nécessaires dans notre cas.

    Comme j'avais déjà utilisé Twig, j'ai décidé d'en reprendre sa syntaxe qui pour moi est assez claire.

    Que pourra t-on faire avec ?

    Pour le moment, et je pense que ça ne bougera pas, il suffit à remplacer toute la partie Vue du code des plugins. En voilà quelques lignes de code, que j'ai tiré de mes tests :

    Afficher une fonction avec 2 paramètres :

    {{ test[oui,non] }}

    Appeler une methode statique d'une classe :

    {{ show.mainTitle[<h3>#mainTitle#</h3>] }}

    Ici on affiche le titre principal en fournissant un argument

    Appeler un Hook :

    {% HOOK.ACTION.adminSandBoxAction[un, deuxxx] %}

    Les boucles :

    $arr = [
            0 => [
            'name' => 'Je s\'appelle Groot'
                    ]
            ,1 => [
                    'name' => 'Je s\'appelle Second élément'
            ]
    ];
    $tpl->set('monArray', $arr);
    
    {% FOR Arra IN monArray %}
            MOI : {{ Arra.name }} <br/>
            Ma clé est : {{ Arra.KEY }}<br/>
    {% ENDFOR %}

    La variable KEY est automatiquement affectée à chacun des items du tableau, avec pour valeur sa clé.

    Résultat :

    MOI : Je s'appelle Groot Ma clé est : 0 MOI : Je s'appelle Second élément Ma clé est : 1

    Tests de condition :

    {% IF mode %}
            Le mode est actif<br/>
            {% IF action == 2 %}
                    L'action est edit
            {% ELSEIF action === plop %}
                    L'action est plopi :)
            {% ELSE %}
                    L'action est autre
            {% ENDIF %}
    {% ENDIF %}

    Enfin bref, vous avez compris le principe ;)

    Ca ne fait pas tout

    A contrario de Twig, je n'ai pas souhaité insérer des fonctions qui permettent par exemple d'afficher des majuscules, d'échapper des caractères etc, car c'est selon moi de la partie traitement, et cela n'a rien à faire dans la vue. Les tests de condition, s'ils sont pleinement fonctionnels et peuvent être imbriqués, ne permettent pas de faire des condition de fou : La vue n'est pas le lieu.

    Pour finir

    J'espère pouvoir modifier les fichiers PHP pour les basculer en Templates rapidement. Pour le moment, les 2 systèmes peuvent cohabiter, et je pense que cela restera ainsi pour la version 2 définitive. J'en profite pour signaler que si jamais vous souhaitez filer un petit coup de main, toute aide est la bienvenue, je suis prêt à vous aider ;)

  • Suppression de jQuery

    28/10/2022 | 0 commentaire

    635b9bccd60b5.png

    C'était une idée voulue depuis le départ, la suppression de jQuery dans 299Ko. Faute de temps, et de priorité, cela n'a pas pu être fait dans la version 1. Mais j'ai pu avoir un énorme coup de main 😃

    jQuery

    Pour ceux qui ne connaissent pas, jQuery est une bibliothèque JavaScript permettant de simplifier l'écriture des scripts coté navigateur. De façon moins théorique, il facilite les effets visuels des pages Internet comme un affichage progressif des éléments masqués (Slide), ou une manipulation des éléments du DOM.

    Il faut avouer que lorsqu'on est plutôt comme moi orienté back-end, comprenez langage serveur (PHP ici), jQuery a grandement facilité ce coté des choses, puisqu'il possédait une courbe d'apprentissage bien plus rapide que le JavaScript pur (vanilla JS). De plus, à la création de 99ko (2010 je crois), certaines fonctionnalités de cette librairie était très difficiles à mettre en place pour les non initiés.

    Alors, pourquoi s'en passer ?

    Notez bien que j'ai dit "possédait". Et oui, si jQuery n'a pas énormément changé depuis 2010, les navigateurs l'ont fait, et surtout depuis 2015, avec la norme ECMAScript 2015. Concrètement, cela signifie que les navigateurs ont dû implémenter la majorité des fonctionnalités de jQuery en natif. Et ça ça change la donne. A tel point qu'à présent, sans trop peu d'efforts, on peut se permettre de s'en passer.

    Car il y a toujours un revers de médaille. Forcément, même si 299Ko appelait jQuery depuis un CDN, cela ajoutait malgré tout une latence supplémentaire, comme à chaque appel de fichier. De plus, celui-ci charge énormément de fonctions alors que notre CMS n'en utilise peut-être que 3 ou 4.

    Aussi, c'était déjà décidé, encore fallait-il le faire.

    Merci

    Pour cela, j'ai pu compter sans même lui demander sur un blogueur que je connaissais déjà depuis 4 ou 5 ans. Il s'agit de ShevAbam, qui a réécrit quasiment toute la partie JS de 299Ko, faisant bondir le projet de suppression de jQuery d'un énorme pas en avant.

    Par exemple :

    // jQuery
    $(document).ready(function () {
        $(".msg").each(function (index) {
            $(this).children(".msg-button-close").click(function () {
                $(this).parent().dequeue();
            });
            $(this).delay(5000 + index * 5000).slideUp();
        });
    
    // vanilla
    
        function fadeOut(el) {
            el.style.opacity = 1;
            (function fade() {
                    if ((el.style.opacity -= .03) < 0) {
                            el.style.display = "none";
                    } else {
                            requestAnimationFrame(fade);
                    }
            })();
        }
    
    document.addEventListener("DOMContentLoaded", function () {
            document.querySelectorAll('.msg').forEach(function (item, index) {
            item.querySelector('.msg-button-close').addEventListener('click', function () {
                fadeOut(item);
            });
            setTimeout(function () {
                fadeOut(item);
            }, 5000 + index * 5000);
        });

    Il n'y avait plus qu'à supprimer l'appel à la librairie dans le cœur du CMS, et c'est fini.

    Un énorme merci à ce touche à tout. Je vous incite d'ailleurs à jeter un œil à son blog, plein de bonnes lectures. Vous y trouverez des réalisations persos ou des liens intéressants, comme de la génération de données JSON que j'utilise souvent :)

    Normalize

    Pendant qu'on y était, la librairie CSS normalize a également été supprimée au profit d'un simple Reset CSS inclut directement dans le thème, afin de pouvoir supprimer ce reset dans le thème utilisateur et encore et surtout, gagner encore un peu de temps à l'affichage d'une page :)

  • PHP 7.4 sera nécessaire pour la v2 de 299Ko

    26/10/2022 | 0 commentaire

    635a38417e9bc.png

    A l'heure où j'écris ces lignes, je me penche déjà sur la prochaine version majeure de 299Ko. La v 1.0 vient de sortir, et déjà le gros chantier est en cours 😊

    Une V1 sortie rapidement

    En effet, la première version a été proposée quasiment 2 mois après la première modification du code. Certaines choses ont été faites, par exemple l'intégration de la LightBox (FancyApps), les formats acceptés de la galerie, ou un plugin pour rédiger en MarkDown. Mais tout cela ne m'a pas prit énormément de temps, tout comme je ne me suis pas attardé pour créer un vrai thème pour ce site, ou comme je n'ai pas modifié le thème défaut. La priorité n'était pas là.

    La première raison qui m'a fait continuer le projet 99ko, c'est bien sûr que j'avais besoin d'un CMS et que je souhaitais continuer à l'utiliser. Mais surtout, que l'installation de celle-ci était bloquée sur les serveurs Linux, à cause des permissions sur les dossiers et fichiers. Une fois ces petites erreurs corrigées, je suis rapidement passé à 2-3 fioritures et j'ai poussé le tout pour sortir une version 1 utilisable, très rapidement. Mais là n'était pas le but final.

    Des besoins plus poussés

    Une fois le blog en place, outre le contenu, il faut tâcher de l'améliorer. Et là est mon principal objectif. Pour ma part, j'estime qu'un système de blog a besoin d'une gestion des catégories afin de pouvoir s'y retrouver. Et quitte à créer un système de catégories, autant créer un système de catégories utilisable pour tous les plugins qui en ont besoin, et simplifier le développement d'éventuels futurs plugins. Mais tout ça c'est long, c'est d'ailleurs pour ça que je n'écris pas plus, je suis un peu la tête dans le guidon pendant le peu de moments libres que j'ai.

    PHP 7.4

    J'y arrive. Au fur et à mesure que je touche aux fichiers originels du projet, j'essaye de commenter, modifier, et optimiser un peu les sources du CMS. Et pour optimiser, quoi de mieux que de passer aux plus récentes versions ? En effet, PHP 7.4 a introduit de nombreuses fonctionnalités bien pratiques, notamment le typage des propriétés des classes. Cela m'aide énormément au débogage, car l'erreur affichée est vraiment explicite. Cette fonctionnalité évite aussi les 'bidouillages' que l'on peut faire avec. Je trouve pratique également l'opérateur d'assignement de fusion Null, qui réduit la quantité de code à écrire lorsqu'on teste des variables ou des entrées utilisateur. Mais surtout, je souhaite que les utilisateurs de 299Ko ne se retrouvent pas bloqués en devant garder une version de PHP quasi "obsolète". Aussi même si le développement se limite à PHP 7.4, la version 2 de 299Ko sera compatible PHP 8.1. En effet, il est souhaitable pour tout le monde que les serveurs passent sous les versions récentes des projets, et PHP n'est pas une exception. Pour vous en convaincre, sachez qu'avec une même machine avec un WordPress, PHP 7.4 exécute 2 fois plus de requêtes en une seconde que PHP 5.6.

    PHP 7.4 est sortie fin 2019, aussi j'estime que 3 ans après, il n'est pas délirant d'espérer avoir un serveur qui supporte cette version au minimum.

    A venir

    Je communiquerai au fur et à mesure des avancées sur les fonctionnalités à venir, mais sachez qu'il y en a déjà pas mal de prévues voir d'implémentées 😃

  • Sortie d'un container Docker

    18/09/2022 | 0 commentaire

    63277b0c7fd6e.jpg

    Pour aider ceux qui souhaiteraient tester rapidement 299Ko, j'ai mis en place à l'instant un container Docker afin de ne pas s'embêter à installer un Apache etc uniquement pour ça. Il est disponible sur le Docker Hub.

    Si vous avez Docker installé sur votre PC, il suffit de taper ces 2 lignes dans une console pour pouvoir tester 299Ko :

        docker pull maxkoder/299ko-cms
    
    
        docker run --name 299ko -p 8080:80 maxkoder/299ko-cms

    Puis lancez votre navigateur, et allez à l'adresse localhost:8080, et c'est tout !