Raccourcis : Contenu - rubriques - sous rubriques
EN FR

Nouveautés apportées par la version 1.7

Jelix 1.7 apporte beaucoup de nouveautés. Consultez les instructions de migrations qui sont bien moins impressionnantes que la liste des nouveautés : les scripts de mises à jour s'occupent de pas mal de choses.

Jelix 1.7 nécessite PHP 5.6 minimum et est compatible avec PHP 7.3.

Intégration avec Composer

  • La bibliothèque Jelix est maintenant installable avec Composer.
  • Des modules et plugins ont été externalisés et disponibles séparément via Composer. Certains restent toutefois inclus dans le paquet standard de Jelix.
  • Les paramètres de configuration modulesPath et pluginsPath ne sont plus pris en charge, et remplacés par une nouvelle API à appeler dans le fichier application.init.php : jApp::declareModulesDir(), jApp::declarePluginsDir(), jApp::declareModuleDir(). Il est aussi possible de déclarer les chemins de repertoire de modules et plugins, via le fichier composer.json de l'application et des paquets contenant des modules.

Nouveau répertoire app/

Une application contient un nouveau repertoire app/ dans lequel ont été déplacé certains fichiers de var/ ainsi que responses/. Cela permet de séparer les fichiers qui ne dépendent pas de l'environnement d'execution, (dans app/) de ceux qui en dépendent (dans var/).

C'est le cas pour :

  • La configuration générale, avec un nouveau répertoire app/system contenant mainconfig.ini.php, urls.xml, les fichiers de configuration des plugins, de SOAP etc. Les fichiers qui dépendent du serveur restent dans var/config (localconfig.ini.php, liveconfig.ini.php, profiles.ini.php...)
  • Les fichiers config.ini.php des points d'entrées. Ils peuvent être à la fois dans app/system/ et var/config/.
  • Les répertoires overloads, themes et locales. Ils sont maintenant dans app/, mais Les répertoires var/overloads, var/themes et var/locales sont dorénavant destinés uniquement aux ressources qui sont créés dynamiquement par l'application, ou installés par des modules ajoutés au niveau de l'instance
  • le répertoire responses/ est déplacé dans app/
  • la liste des points d'entrées n'est plus dans project.xml mais dans un nouveau fichier app/system/framework.ini.php et éventuellement dans var/config/localframework.ini.php.

Refonte du moteur d'URL

Le nouveau moteur d'URL est en quelque sorte une fusion des anciens plugins 'basic_significant' et 'significant', avec des améliorations pour faciliter la configuration des urls. Il n'y a plus de système de plugins ('simple', 'basic_significant', 'significant' n'existent plus).

  • Les paramètres d'url "module" et "action" ne sont plus pris en compte (mais peuvent toujours être récupérés à partir de vos contrôleurs, même si cet usage est obsolète)
  • les paramètres startModule et startAction dans la configuration du point d'entrée n'existent plus
  • Les paramètres de configuration suivant de la section urlengine n'existent plus : engine, defaultEntrypoint, simple_urlengine_https
  • Les sections de configurations suivantes n'existent plus : simple_urlengine_entrypoints, basic_significant_urlengine_entrypoints
  • Une API permet aux scripts d'installation de déclarer facilement les urls (et donc de modifier urls.xml) : jInstallerGlobalSetup::getUrlModifier(), jInstallerGlobalSetup::declareNewEntryPoint()
  • Dans le fichier urls.xml
    • Il est possible d'indiquer un pathinfo sur un <url module="..">
    • Il est obligatoire d'indiquer une action pour l'url "/", ce qui remplace la disparition de startModule et startAction
    • Un pathinfo absent ou vide dans un <url> équivaut à "/"
    • Une meilleure vérification des mauvaises utilisations du XML. Par exemple une erreur est levée si il n'y a pas d'attribut "module".
    • Il est possible de déclarer une url pour un contrôleur, sans avoir à le faire pour chacune de ses méthodes

L'outil de migration s'occupe d'effectuer la plupart de ces changements.

Amélioration de l'installateur

Jusqu'à Jelix 1.6, le système d'installation appelait les scripts d'installation de chaque module pour chaque point d'entrée. Ce n'est plus le cas. Ils ne sont appelés maintenant qu'une seule fois.

De ce fait, la declaration des modules (section [modules]), n'est plus possible dans les configurations des points d'entrées, uniquement dans mainconfig.ini.php ou localconfig.ini.php, et les API pour les scripts d'installation ont été retravaillé.

Le nouveau système d'installation introduit une nouvelle étape dans l'installation d'un module : la configuration. Un module peut fournir une classe qui sera chargée de configurer le module pendant le développement. La classe chargée de l'installation n'a ainsi plus qu'à finaliser l'intégration du module dans une instance de l'application.

Un module peut fournir également une classe pour sa désinstallation. Il n'y a donc plus de méthode pour cela dans la classe d'installation. Cette classe est copiée à l'exterieur du module lors de la "déconfiguration", ce qui permet de supprimer les sources du module tout en permettant lors du déploiement de réaliser des tâches de désinstallation au niveau des instances.

Enfin pour la mise à jour d'un module, vous pouvez maintenant fournir un fichier upgrade.php, sur le même modèle que install.php, qui sera exécuté à chaque mise à jour, en plus des scripts de mise à jour dédié à une version précise du module. Cela permet de faire des tâches systématiques de mise à jour, et d'éviter de les réécrire pour chaque version.

Tout ceci implique un remaniement des API et de nouvelles classes à hériter pour les scripts de configuration, installation, désinstallation et de mise à jour. Cependant les anciennes classes reposant sur jInstallerModule et jInstallerEntryPoint sont encore utilisables bien que dépréciées.

Coté commandes pour le développeur, il y en a des nouvelles, comme module:configure et module:unconfigure, et d'autres ont été supprimées, comme installmodule et migrate.

Autre nouveauté : l'installateur fait maintenant une sauvegarde du fichier installer.ini.php. Si l'installation échoue, cela permet de restaurer plus facilement l'installation d'origine.

Il est également possible d'indiquer dans le fichier module.xml d'un module, des modules alternatifs, ou des modules incompatibles dans la déclaration des dépendances.

Nouveau Système d'assets : webassets

Une nouvelle manière de déclarer les assets (js et css) dans le HTML fait son apparition. Dans la configuration, vous pouvez indiquer des listes de scripts js et css, regroupés en groupe.

Ainsi, plutôt que de déclarer "en dur" dans le code de vos contrôleurs, les scripts js et les feuilles css à utiliser, vous y indiquez un nom de groupe d'assets.

Cela permet de modifier facilement les assets à charger, et d'éviter à modifier les modules. Très utile pour modifier les assets d'un module tiers (en particulier les assets des composants Jelix !), ou pour mettre à jour des bibliothèques JS. Ou encore pour spécifier des listes de fichiers JS/CSS en fonction de l'environnement (debug vs production).

À noter que les bibliothèques jQuery, jQueryUI, Markitup ont été mis à jour à leur dernière version (respectivement 3.3.1, 1.12.1, 1.1.15). jQueryUI est maintenant fournit sous forme d'un unique fichier contenant tout. WymEditor a été remplacé par CKEditor5.

Scripts en ligne de commande

Dans Jelix 1.6, il était possible de créer des scripts en ligne de commande en créant un contrôleur héritant de jControllerCmdLine, en ayant un point d'entrée spécifique utilisant jCmdLineCoordinator etc.. Ce mécanisme est maintenant déprécié, bien qu'encore utilisable.

Un nouveau mécanisme fait son apparition : le module peut fournir des commandes implémentées avec Symfony Console, et sont appelables depuis un nouveau fichier console.php fourni dans l'application, qui va découvrir (presque) automatiquement toutes ces commandes.

Jelix Scripts

Les commandes d'aide au développeur, qui étaient appelables via le script cmd.php de l'application, ont été totalement réécrite en utilisant Symfony Console. Les noms et paramètres des commandes ont donc changé, et le script cmd.php renommé en dev.php.

Les commandes concernant la manipulation des droits jAcl2 ont été migré dans le module jacl2db, et sont donc accessible via le nouveau script console.php.

La création d'une application se fait au moyen d'un nouveau script bin/create-jelix-app (il remplace l'ancien script createapp.php), avec des nouveaux paramètres et options. Grâce au nouveau système de configuration, ce script pose des questions à l'utilisateur pour faciliter la pré-configuration de l'application.

jDb et jDao

  • Amélioration de la prise en charge des requêtes préparées
    • bindValue() et bindParam() a maintenant la même signature que PDO
    • sqlite3 : support des requêtes préparées
    • pgsql : support des paramètres nommés pour les requêtes préparées
    • mysqli : correction sur la prise en charge des requêtes préparées et support des paramètres nommés
  • jDb/mysqli : correction sur le démarrage d'une transaction, pour ne plus utiliser l'ancien mot-clé SQL pour cette fonctionnalité
  • jDao : a maintenant son propre système de plugin "daobuilder". Les classes des plugins de jDb qui lui étaient dédiés sont maintenant des plugins.
  • jDb schema: toutes les améliorations déjà apportées par Jelix 1.6.16, à savoir la prise en charge totale de la lecture et modification de schema de base de données pour Mysql, Postgresql, Sqlite3, OCI, SqlServer
  • Les classes de types jDbTools ont été migré en dehors des drivers de base de données.
  • jProfiles :
    • le contenu du fichier profiles.ini.php est optimisé et stocké en cache
    • est maintenant extensible par des plugins. Ceux-ci peuvent traiter les profiles qu'ils prennent en charge avant la mise en cache du fichier profiles.ini.php. (plugin : profiles/<type>/<type>.profiles.php classe: <type>ProfilesCompiler).
    • un plugin pour jdb est fourni, permettant à jDb de traiter plus rapidement l'ouverture d'une connexion.

jForms

  • jForms ne stocke plus les données des instances dans la session mais dans un cache avec jCache, permettant de charger les sessions beaucoup plus rapidement. Par défaut le cache se fait dans des fichiers, mais vous pouvez utiliser Redis ou autre.
  • Pour le contrôle choice, un item de choix peut maintenant avoir une valeur vide.
  • Un contrôle choice peut maintenant être utilisé dans un group.
  • Le javascript généré pour un formulaire n'est plus intégré en ligne dans le HTML généré, mais chargé en tant que script externe. Utile pour les rêgles CSP.
  • Tous les composants de jForms, comme les widgets wikieditor et htmleditor, utilisent le nouveau système d'assets de Jelix.
  • En js, vous pouvez forcer le rechargement d'une listbox dynamique avec la méthode updateDynamicList() de l'objet JS jforms.
  • le datepicker contient maintenant de quoi sélectionner l'heure quand il s'agit de la saisie d'un datetime.
  • nouveau contrôle <color> pour sélectionner une couleur.
  • nouveau contrôle <upload2> améliorant la manipulation des fichiers déjà téléchargés.

Changements d'API dans le coeur du framework

  • La propriété _lang de jResponseHtml ne contient maintenant que le code langue (XX), et non la locale complète (XX_YY), que l'on retrouve dans une nouvelle propriété _locale.
  • jRequest parse maintenant automatiquement les contenus JSON indiqués dans les requêtes HTTP (c'était une fonctionnalité introduite dans Jelix 1.6.12 mais désactivé par défaut).
  • Nouvelle méthode jCoordinator::execOriginalAction() pour savoir si l'action courante est une redirection interne ou pas.
  • jCmdLineRequest : il faut maintenant donner le module et l'action au constructeur quand le script est dédié à une action précise.
  • contrôleur CRUD : la liste des enregistrements peut être triée par colonne
  • jApp :
    • nouvelle méthode jApp::urlBasePath() qui permet de récupérer le basePath, donc un équivalent de jApp::config()->urlengine['basePath'].
    • nouvelle méthode jApp::version()
    • jApp utilise maintenant en interne une nouvelle classe jAppInstance pour faciliter le changement de contexte.
    • nouvelle méthode jAppInstance::includePlugin() pour charger un plugin sans l'instancier
  • nouvel objet jFramework permettant d'accéder à des informations sur le framework (version...)
  • Dans les applications nouvellement créés, le répertoire temp est maintenant par défaut dans le répertoire de l'application.
  • Les assets des modules récupérés par le contrôleur www du module jelix sont maintenant mis en cache dans le navigateur

Autres nouveautés

  • par défaut, dans toute nouvelle application, le contenu de jelix-www est copié dans le répertoire www/jelix/ de l'application, ce qui facilite la debut du développement de l'application. On peut aussi garder l'ancienne pratique, un alias vers jelix-www dans la configuration du serveur web, ou mettre un lien de fichier symbolique. Tout ceci est modifiable en relançant le configurateur du module jelix, avec la nouvelle commande module:configure.
  • jAuth: persistant_crypt_key a été renommé en persistant_encryption_key et utilise une fonction de création de clé plus forte.
  • jAuth, plugin ldap : les informations de connexions (hote, login, password etc.) doivent être maintenant dans le fichier profiles.ini.php
  • jauthdb_admin : la liste des utilisateurs peut être filtrée et triée
  • jacl2db_admin : la liste des utilisateurs peut être filtrée
  • jAcl2 : la notion de 'sujet' a été remplacé par la notion de 'role', plus logique. Concrètement, des APIs ont été renommées mais restent disponibles sous leur ancien noms.
  • jLocale peut maintenant chercher une clé manquante dans une locale similaire à la locale courante
  • Zones : organisation du cache en sous-répertoires pour éviter un trop grand nombre de fichier dans un même répertoire.
  • correction jIniFileModifier : il n'y a plus de ligne vide ajoutée à la fin du fichier à chaque sauvegarde
  • jFile repose maintenant sur le paquet Composer "jelix/file-utilities" qui propose des méthodes supplémentaires.
  • jFile::getMimeTypeFromFilename() : support d'une liste de type mime définie par le développeur, dans une section [mimeTypes] de la configuration.
  • Correction dans jDatetime sur le format RCF822 et les timezones

Les modules et plugins externalisés

À l'instar du module jtcpdf dans les versions précédentes, des modules et plugins ne sont plus fournis avec Jelix, mais disponibles séparément, en tant que paquets Composer et archives téléchargeables classiquement.

Voici la liste de ces modules et plugins :

À noter que d'autres composants, modules et plugins sont aussi maintenant chacun dans leurs propres dépôts même si ils sont fournis avec Jelix en standard. Il s'agit de :

Les modules, plugins et fonctionnalités supprimés ou dépréciés

  • Il n'y a plus les fichiers de locales en_EN. Configurez plutôt votre application pour utiliser en_US ou en_GB.
  • le plugin memcache22 pour jCache a été supprimé
  • La méthode jInstallerBase::declarePluginsPath() a été supprimé.
  • les classes jIniFile, jIniFileModifier, jIniMultiFilesModifier ont changés de nom en respectivement Jelix\IniFile\Util, Jelix\IniFile\IniModifier, Jelix\IniFile\MultiIniModifier. Mais il est encore possible d'utiliser les anciens noms (jusqu'à la prochaine version).
  • La méthode jApp::configPath() est dépréciée au profit de jApp::varConfigPath()
  • La classe jJson a été supprimée. Utilisez les fonctions json de PHP directement.
  • La classe jCrypt a été supprimée, l'API mcrypt était dépréciée par PHP et n'était plus maintenue depuis longtemps. Utilisez d'autres bibliothèques de chiffrements (le paquet defuse/php-encryption par exemple).
  • La classe jVersionComparator a été remplacée par la classe Jelix\Version\VersionComparator d'un nouveau paquet "jelix/version"
  • project.xml : <directories> n'est plus pris en charge
  • le plugin zendframework a été supprimé
  • jDao : l'attribut "driver" sur la balise de condition "binary_op" est déprécié et remplacé par un attribut "dbtype"
  • jDao : le support de l'attribut groupby sur l'élement method a été supprimé
  • jDao : la méthode obsolète jDaoConditions::addItemGroup() a été supprimée.
  • le plugin LDS pour jAuth a été supprimé.
  • le driver mssql pour jDb a été déprécié. Il faut utiliser le driver sqlsrv
  • Le module junittests et Simpletests ont été supprimé. Ils sont disponibles séparement pour ceux qui n'auraient pas encore migré leur tests vers PHPUnit.
  • idem pour les plugins mysql et sqlite : en effet, les API PHP qu'ils utilisent sont dépréciées dans PHP. Ils sont disponibles séparément. Il est toutefois préférable d'utiliser respectivement les plugins mysqli et sqlite3, toujours disponibles dans la distribution standard.
  • La classe jHttp est dépréciée et installable séparément, ainsi que les quelques fichiers de la bibliothèque clearbricks qui l'accompagnait.
  • les fichiers json.js, json2.js et xul/jsonrpc.js ont été supprimé, les navigateurs récents supportant JSON.

Pour les contributeurs

  • La configuration Vagrant pour les contributeurs est maintenant située dans testapp
  • Il n'y a plus besoin de faire un "build" des sources de Jelix pour contribuer à Jelix et lancer les tests.
  • FakeServerConf, Minify, PHPMailer sont maintenant installés via Composer
  • Dans testapp, une application "adminapp" est disponible pour tester les modules d'admin.

Contributeurs à Jelix 1.7

  • Brunto (sur le contrôleur CRUD)
  • Julien Issler (sur jForms)
  • Laurent Jouanneau (la plupart des évolutions)