Contribuer au développement du Core

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.

Branches Github

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.

Développement

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.

Arborescence du Core

Le code est réparti dans différents répertoires à la racine de Jeedom (par défaut : /var/www/html) :

Front-end

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 :

Desktop

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 :

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 :

Le fichier desktop/common/js/utils.js est donc toujours présent, et chargé une fois. Il permet de :

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.

Core v4.2

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.

Core v4.3

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.jsdéclare deux nouveaux namespaces :

jeeFrontEnd[}

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’utiliser jeeFrontEnd.corepage avec une syntaxe courte, elle correspond à un self propre à la page.

jeephp2js[}

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.

Mobile

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 :

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 :

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.

Fichiers CSS

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 :

Back-end

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.

Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site web. Si vous continuez à utiliser ce site, nous supposerons que vous en êtes satisfait.