Vous souhaitez contribuer au développement du Core de Jeedom ?
Voici les notions de bases à connaître :
Avant de proposer un PR, mettez à jour votre alpha pour vérifier que le bug n’a pas déjà été corrigé. Et synchronisez votre dépôt github.
Vérifiez que ce que vous corrigez ne cause pas d’autres bugs. La plupart des fonctions du Core sont appellées par différentes pages du Front-End ou par d’autres fonctions du Core et par les plugins. Faites une recherche sur le Core pour voir/comprendre où les fonctions sont utilisées et, dans le doute, exposez le soucis et votre correction sur Community.
Pour participer au développement de Jeedom, vous devez avoir un compte Github.
Le code du Core est Open-Source est disponible ici.
Les mises à jour se font sur ces branches en fonction de la configuration de Jeedom Réglages → Système → Configuration / Mises à jour/Market.
Les PRs (Pull requests) doivent toujours être faits sur la branche alpha.
De même, afin de participer aux discussions sur Community, inscrivez-vous en tant que développeur : Jeedom dev.
Pour aider au développement du Core, vous devez maîtriser un ou plusieurs des langages suivants:
Des connaissances de l’environnent Linux sont également souhaitables.
Le code est réparti dans différents répertoires à la racine de Jeedom (par défaut : /var/www/html) :
L’interface de Jeedom fonctionne comme un site web, à partir de php interfacé avec SQL et de js / CSS.
Au départ, le browser charge le fichier /index.php
:
install/setup.php
si nécessaire./core/php/core.inc.php
./desktop/php/index.php
ou Mobile mobile/html/home.html
en fonction des paramètres de l’url.L’interface de Jeedom fonctionne sur le principe du One-Page. Une fois chargée, les différentes pages sont affichées en changeant le contenu d’un container.
Le fichier principal en Desktop est /desktop/php/index.php
.
Chaque page possède au minimum deux paramètres dans l’url. Exemple :
https://my.dns1.jeedom.com/index.php?v=d&p=dashboard
:
dashboard
.Dans ce cas, le fichier /desktop/php/index.php
va charger le fichier /desktop/php/dashboard.php
dans la div div_pageContainer
. Celui-ci va également charger le fichier /desktop/js/dashboard.js
comprenant les fonctions js propres à l’affichage de cette page (ici, le Dashboard).
Le fichier /desktop/php/index.php
se charge aussi de :
desktop/common/js/utils.js
Le fichier desktop/common/js/utils.js
est donc toujours présent, et chargé une fois. Il permet de :
div_pageContainer
.Ainsi, les fichiers index.php et utils.js fournissent la structure et les fonctions de base de l’interface.
Ensuite, le contenu de la page appelée est chargé depuis desktop/php/page.php et desktop/js/page.js.
Ces fichiers de contenu, purement orientés interface, peuvent accéder aux fonctions du Core (les classes /core/class
) directement en php, ou en js grâce aux classes js (/core/js
) en passant par des appels ajax (/core/ajax
).
Les fonctions internes du Core sont ainsi bien séparées, pour le fonctionnement interne (Back-end), mais sont accessibles par l’interface. De même, chaque page possède sont propre code php et js. Ceci permet de mieux faire évoluer et maintenir le code, mais aussi d’optimiser les performances en chargeant uniquement les classes et fonctions nécessaires.
Depuis le Core v4.2, toutes les fonctions js du fichier desktop/common/js/utils.js
sont isolées dans un namespace jeedomUtils{}
.
Par exemple, la fonction précédemment dans le root window loadPage()
devient jeedomUtils.loadPage()
.
Pour des raisons de rétro-compatibilité pour les plugins, les anciennes fonctions sont toujours déclarées et seront dépréciées dans une version ultérieure. Voir la liste ici.
Dans la continuité de la version 4.2, les pages du front-end en desktop on été isolées afin d’éviter de référencer des variables et fonctions dans le root window. Ceci sécurise de possible collision de déclaration et facilite la lecture et la compréhension du code ainsi que son debuggage.
Le fichier core/js/jeedom.class.js
déclare deux nouveaux namespaces :
Certaines variables globales sont maintenant dans ce namespace :
jeeFrontEnd = {
__description: 'Global object where each Core page register its own functions and variable in its sub-object name.',
jeedom_firstUse: '',
language: '',
userProfils: {},
planEditOption: {state: false, snap: false, grid: false, gridSize: false, highlight: true},
//loadPage history:
PREVIOUS_PAGE: null,
PREVIOUS_LOCATION: null,
NO_POPSTAT: false,
modifyWithoutSave: false,
//@index.php
serverDatetime: null,
clientServerDiffDatetime: null,
serverDatetime: null,
serverTZoffsetMin: null,
}
Exemple type pour desktop/js/corepage.js :
"use strict"
if (!jeeFrontEnd.corepage) {
jeeFrontEnd.corepage = {
myVar: 'oneVar',
init: function() {
window.jeeP = this //root shortcut
},
postInit: function() {
//Do stuff once page loaded
},
myFunction: function(_var) {
var myFuncContextVar = this.myVar + ' -> ' + _var
console.log(myFuncContextVar)
}
}
}
jeeFrontEnd.corepage.init()
$(function() {
jeeFrontEnd.corepage.postInit()
})
$('#myButton').on('click', function() {
jeeP.myFunction('test')
})
Le namespace de la page ne sera donc pas recréé au retour sur cette même page. De plus, la variable
jeeP
permet d’utiliserjeeFrontEnd.corepage
avec une syntaxe courte, elle correspond à unself
propre à la page.
Utilisé pour passer les variables d’un script php vers le front-end js. Par exemple :
sendVarToJS([
'jeephp2js.myjsvar1' => init('type', ''),
'jeephp2js.myjsvar2' => config::byKey('enableCustomCss')
]);
Puis
$(function() {
if (jeephp2js.myjsvar1 == '1') { ... }
})
Le namespace jeephp2js{} est vidé au changement de page pour éviter toute variable résiduelle non attendue.
L’interface Desktop est responsive et s’adapte à la taille du navigateur. Toutefois, certaines choses, comme l’édition d’un scénario, seraient compliquées sur un petit écran. De plus, sur un smartphone à l’extérieur, en 3G ou même 4G, il est important d’optimiser la rapidité de l’affichage. C’est pourquoi Jeedom possède une interface Mobile, plus légère et adaptée aux petits écrans.
La page de référence est /mobile/html/index.html
, qui se charge de :
mobile/js/application.js
Le fichier mobile/js/application.js
contient les fonctions communes à toutes les pages.
Comme pour l’interface Desktop, la page appelée est constituée de deux fichiers :
/mobile/html/home.html
: le code html./mobile/js/home.js
: les fonctions js propres à cette page.Une différence notable en Mobile est l’absence de pages php. La génération du code repose donc sur les classes js, qui peuvent toujours appeler les fonctions du Core avec des appels ajax.
Les CSS du Core reposent principalement sur ces fichiers :
Les thèmes contiennent des CSS propres à chaque thème, notamment les colors.css.
Ordre de chargement des CSS en Desktop :
en cours
L’interface est une chose, mais bien sûr votre Jeedom est toujours actif, afin de faire tourner les scénarios, les crons, les logs, les historiques etc.
Le Back-end s’appuie sur les mêmes classes php que le Front-end, présentes dans /core/class/
. Chaque partie de Jeedom possède sa classe php, notamment :
etc.