CINXE.COM
Resources for Developers ― Ressources pour programmeurs
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <!-- labs-003.php --> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Resources for Developers ― Ressources pour programmeurs</title> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> <meta name="description" content="Ressources diverses pour programmeurs: NOTRE code, NOS productions ... pas des copies"> <link rel="icon" href="/favicon.png" type="image/png"> <link id="5588f99a-dd3f-4319-94d6-38b812acad08" href="/css/base.css?guid-902612c8-3105-e235-428b-4751be9d08cf" rel="stylesheet" title="" media="all" type="text/css"> <link id="6d7219b7-0615-4a52-9ff3-a91ced373a38" href="https://fonts.googleapis.com/css?family=Lato:100&subset=latin-ext" rel="stylesheet" title="" media="all" type="text/css"> <link id="fd3b1a4f-2f05-4a2e-8b8f-016f9bc921a1" href="https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap" rel="stylesheet" title="" media="all" type="text/css"> <link id="d4cc4565-c3ec-4f40-9a7b-a0384b377d2d" href="https://fonts.googleapis.com/css2?family=Open+Sans+Condensed:ital,wght@0,300;0,700;1,300&display=swap" rel="stylesheet" title="" media="all" type="text/css"> <link id="4864eebb-8a9e-4820-b76c-7ff324516bf1" href="https://fonts.googleapis.com/css?family=Comfortaa:300" rel="stylesheet" title="" media="all" type="text/css"> <link id="dee8de89-fce3-4232-bad0-2e55299d753a" href="https://fonts.googleapis.com/css?family=Open+Sans|Ubuntu" rel="stylesheet" title="" media="all" type="text/css"> <script id="d971c135-77af-48fd-8012-a31fd121a630" src="/js/LSVStrings.js?guid-30f013b5-52fb-47b7-1f00-e93290600db3"></script> <style rel="stylesheet" title="" media="all" type="text/css"> </style> <!-- # --> <link rel="canonical" href="https://www.trql.fm/developers/?lang=en" /> <link rel="preload" as="image" href="https://www.trql.fm/media/images/AI/dev-001.jpg" /> <meta property="og:site_name" content="TRQL Radio"></meta> <meta property="og:title" content="Resources for Developers ― Ressources pour programmeurs"></meta> <meta property="og:type" content="website"></meta> <meta property="og:image" content="https://www.trql.fm/media/images/AI/dev-001.jpg"></meta> <meta property="og:url" content="https://www.trql.fm/developers/?lang=en"></meta> <meta property="og:description" content="Ressources diverses pour programmeurs: NOTRE code, NOS productions ... pas des copies"></meta> <meta property="og:profile:first_name" content="Pat"></meta> <meta property="og:profile:last_name" content="Boens"></meta> <meta name="twitter:card" content="summary_large_image"></meta> <meta name="twitter:site" content="@TRQLRadio"></meta> <meta name="twitter:creator" content="@pat_boens"></meta> <meta name="twitter:title" content="Resources for Developers ― Ressources pour programmeurs"></meta> <meta name="twitter:description" content="Ressources diverses pour programmeurs: NOTRE code, NOS productions ... pas des copies"></meta> <meta name="twitter:image" content="https://www.trql.fm/media/images/AI/dev-001.jpg"></meta> <script> /* This routine shows or hides the system menu mobileMenuID: ID of the menu (the thing that contains the choices) handleID: the ID of the "|||" that appears as a waffle (it's the handle to manipulate the menu) */ function showHideMenu( mobileMenuID,handleID,szID,szMobility ) /*----------------------------------------------------------*/ { let o = document.getElementById( mobileMenuID ); let o2 = document.getElementById( handleID ); if ( o ) { //debugger; // old code ... if ( o && o.style.right.length == 0 || o.style.right == "-300px" ) // old code ... { // old code ... //if ( undefined === szMobility || szMobility != 'desktop' ) // old code ... //{ // old code ... // console.log( 'should go to top' ); // old code ... // location.href = "#" + szID; // old code ... //} // old code ... o.style.right = "0px"; // old code ... var o2 = document.getElementById( handleID ); // old code ... o2.style.transform = "rotate(0deg)"; // old code ... o2.style.background = "#000"; // old code ... } // old code ... else // old code ... { // old code ... o.style.right = "-300px"; // old code ... var o2 = document.getElementById( handleID ); // old code ... o2.style.transform = "rotate(90deg)"; // old code ... o2.style.background = "#d00a11"; // old code ... } o.classList.toggle( "active" ); o2.classList.toggle( "active" ); } } // https://developer.mozilla.org/fr/docs/Web/API/notification function notify() /*-------------*/ { // Vérifions si le navigateur prend en charge les notifications if ( ! ('Notification' in window ) ) { console.log( 'Ce navigateur ne prend pas en charge la notification de bureau' ); } else { var x,i,bFound = false,aParams = []; // Le message à afficher doit provenir d'un appel Ajax ou assimilé // L'icône à utiliser doit aussi provenir du résultat rendu par l'appel Ajax var notificationOptions = { body: 'Bonjour ... <strong>Nous sommes à nouveau LIVE</strong>.' , icon: 'https://www.trql.fm/favicon.png' , } // Cherchons tous les paramètres envoyés dans l'URL (Query String) // Je mets un paramètre dans l'URL pour des questions de test // J'utilise le paramètre "?notification" pour me dire si oui ou // non, je dois m'occuper de notifications (encore une fois ... // pour des questions de test) if ( x = window.location.href.match( new RegExp("([^?=&]+)(=([^&]*))?", 'g' ) ) ) { for ( i=1; i < x.length;++i ) { aParams.push( x[i] ); // if ( x[i] === 'notification' ) { bFound = true; break; } } } //console.log( aParams ); // Si je dois gérer les notifications if ( bFound ) { console.log( "Je peux prendre les notifications" ); //console.log( window.location.href ); // Si autorisation de notification déjà été accordée if ( Notification.permission === 'granted' || Notification.permission === 'default' ) { // Titre de la notification (ici MyABVV/MyFGTB), devrait provenir // du résultat rendu par le call Ajax const notification = new Notification( 'TRQL Radio',notificationOptions ); } else { // Sinon, demander la permission à l'utilisateur // mis en commentaire pour test ! //else if ( Notification.permission !== 'denied' ) { Notification.requestPermission().then( ( permission ) => { // Si l'utilisateur accepte, créons une notification if ( permission === 'granted' ) { const notification = new Notification( 'TRQL Radio',notificationOptions ); } } ); } } } /* On a trouvé un paramètre 'notification' dans l'URL */ } // Si refus de notifications, on se met un cookie et on ne dérange plus // l'utilisateur } function showHomeAccelerator() /*--------------------------*/ { let iLimit = 150; let oTopDiv = document.getElementById( "homeAccelerator" ); //console.log( "showHomeAccelerator" ); if ( oTopDiv && window.pageYOffset > iLimit ) { //console.log( "visible" ); oTopDiv.style.opacity = 0.8; oTopDiv.style.visibility = "visible"; } else if ( oTopDiv && window.pageYOffset <= iLimit ) { //console.log( "hidden" ); oTopDiv.style.opacity = 0; oTopDiv.style.visibility = "hidden"; } } window.addEventListener( "scroll",showHomeAccelerator,true ); </script> </head> <body id="pageBody" data-mobility="desktop" class="desktop spring morning dow-thursday d-20250410 m-april y-2025 theme-bw developers-php"> <div id="popup"> <!-- <img src="/images/players/close.svg" class="button close" title="Close popup" onclick="document.getElementById('popup').style.display = 'none';" /> --> <!-- <span class="button close popup" title="Close popup" onclick="this.parentNode.style.display = 'none';"></span> --> <span class="button close popup" title="Close popup" onclick="this.parentNode.classList.toggle('active');">×</span> <div id="popupContent"></div> <!-- #popupContent --> </div> <!-- #popup --> <div id="wrapper"> <!-- content file: /home/vaesoli/domains/trql.fm/private_html/content/developers.php --> <main lang="fr"> <section class="content"> <h1 class="pageTitle"><span lang="en">Resources for Developers</span> ― <span lang="fr">Ressources pour programmeurs</span></h1> <!-- ***************************************************************************************************************************** --> <style> ul.articles li { padding-left: 2.5em; position: relative; } ul.articles li::before { position: absolute; left: -5px; top: 0; } ul.articles li.new::before { content: url(/media/icons/star.svg); } ul.articles li.construction::before { content: url(/media/icons/construction2.svg); } </style> <article class="content"> <aside role="complementary"> <div class="pageLupdate"> <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100%" version="1.1" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 55 55" xmlns:xlink="http://www.w3.org/1999/xlink"> <circle cx="12.5" cy="12.5" r="10.5" stroke="rgba(128,128,128,1)" stroke-width="0.61764705882353" stroke-linecap="butt" fill="white"></circle> <g class="minutes-marks"> <line id="minute-16" class="minute-mark" x1="21.376107916162" y1="13.432916534664" x2="22.635348139562" y2="13.56526801536" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-17" class="minute-mark" x1="21.229967336549" y1="14.355611840549" x2="22.468474813361" y2="14.618864731422" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-18" class="minute-mark" x1="20.988179407934" y1="15.257976674796" x2="22.192384791067" y2="15.649246722086" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-19" class="minute-mark" x1="20.65339320946" y1="16.130124539452" x2="21.81010297274" y2="16.64512490664" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-21" class="minute-mark" x1="19.720476674796" y1="17.74598337671" x2="20.74483495738" y2="18.490223232922" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-22" class="minute-mark" x1="19.132567567386" y1="18.471990661753" x2="20.073520059645" y2="19.319228091275" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-23" class="minute-mark" x1="18.471990661753" y1="19.132567567386" x2="19.319228091275" y2="20.073520059645" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-24" class="minute-mark" x1="17.74598337671" y1="19.720476674796" x2="18.490223232922" y2="20.74483495738" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-26" class="minute-mark" x1="16.130124539452" y1="20.65339320946" x2="16.64512490664" y2="21.81010297274" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-27" class="minute-mark" x1="15.257976674796" y1="20.988179407934" x2="15.649246722086" y2="22.192384791067" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-28" class="minute-mark" x1="14.355611840549" y1="21.229967336549" x2="14.618864731422" y2="22.468474813361" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-29" class="minute-mark" x1="13.432916534664" y1="21.376107916162" x2="13.56526801536" y2="22.635348139562" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-31" class="minute-mark" x1="11.567083465336" y1="21.376107916162" x2="11.43473198464" y2="22.635348139562" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-32" class="minute-mark" x1="10.644388159451" y1="21.229967336549" x2="10.381135268578" y2="22.468474813361" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-33" class="minute-mark" x1="9.7420233252036" y1="20.988179407934" x2="9.3507532779141" y2="22.192384791067" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-34" class="minute-mark" x1="8.8698754605485" y1="20.65339320946" x2="8.3548750933599" y2="21.81010297274" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-36" class="minute-mark" x1="7.2540166232897" y1="19.720476674796" x2="6.5097767670782" y2="20.74483495738" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-37" class="minute-mark" x1="6.5280093382472" y1="19.132567567386" x2="5.6807719087252" y2="20.073520059645" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-38" class="minute-mark" x1="5.8674324326143" y1="18.471990661753" x2="4.9264799403554" y2="19.319228091275" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-39" class="minute-mark" x1="5.2795233252036" y1="17.74598337671" x2="4.25516504262" y2="18.490223232922" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-41" class="minute-mark" x1="4.3466067905398" y1="16.130124539452" x2="3.18989702726" y2="16.64512490664" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-42" class="minute-mark" x1="4.0118205920658" y1="15.257976674796" x2="2.8076152089332" y2="15.649246722086" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-43" class="minute-mark" x1="3.7700326634508" y1="14.355611840549" x2="2.5315251866393" y2="14.618864731422" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-44" class="minute-mark" x1="3.6238920838382" y1="13.432916534664" x2="2.364651860438" y2="13.56526801536" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-46" class="minute-mark" x1="3.6238920838382" y1="11.567083465336" x2="2.364651860438" y2="11.43473198464" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-47" class="minute-mark" x1="3.7700326634508" y1="10.644388159451" x2="2.5315251866393" y2="10.381135268578" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-48" class="minute-mark" x1="4.0118205920658" y1="9.7420233252036" x2="2.8076152089332" y2="9.3507532779141" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-49" class="minute-mark" x1="4.3466067905398" y1="8.8698754605485" x2="3.18989702726" y2="8.3548750933599" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-51" class="minute-mark" x1="5.2795233252036" y1="7.2540166232897" x2="4.25516504262" y2="6.5097767670782" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-52" class="minute-mark" x1="5.8674324326143" y1="6.5280093382472" x2="4.9264799403554" y2="5.6807719087252" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-53" class="minute-mark" x1="6.5280093382472" y1="5.8674324326143" x2="5.6807719087252" y2="4.9264799403554" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-54" class="minute-mark" x1="7.2540166232897" y1="5.2795233252036" x2="6.5097767670782" y2="4.25516504262" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-56" class="minute-mark" x1="8.8698754605485" y1="4.3466067905398" x2="8.3548750933599" y2="3.18989702726" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-57" class="minute-mark" x1="9.7420233252036" y1="4.0118205920658" x2="9.3507532779141" y2="2.8076152089332" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-58" class="minute-mark" x1="10.644388159451" y1="3.7700326634508" x2="10.381135268578" y2="2.5315251866393" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-59" class="minute-mark" x1="11.567083465336" y1="3.6238920838382" x2="11.43473198464" y2="2.364651860438" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-01" class="minute-mark" x1="13.432916534664" y1="3.6238920838382" x2="13.56526801536" y2="2.364651860438" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-02" class="minute-mark" x1="14.355611840549" y1="3.7700326634508" x2="14.618864731422" y2="2.5315251866393" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-03" class="minute-mark" x1="15.257976674796" y1="4.0118205920658" x2="15.649246722086" y2="2.8076152089332" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-04" class="minute-mark" x1="16.130124539452" y1="4.3466067905398" x2="16.64512490664" y2="3.18989702726" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-06" class="minute-mark" x1="17.74598337671" y1="5.2795233252036" x2="18.490223232922" y2="4.25516504262" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-07" class="minute-mark" x1="18.471990661753" y1="5.8674324326143" x2="19.319228091275" y2="4.9264799403554" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-08" class="minute-mark" x1="19.132567567386" y1="6.5280093382472" x2="20.073520059645" y2="5.6807719087252" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-09" class="minute-mark" x1="19.720476674796" y1="7.2540166232897" x2="20.74483495738" y2="6.5097767670782" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-11" class="minute-mark" x1="20.65339320946" y1="8.8698754605485" x2="21.81010297274" y2="8.3548750933599" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-12" class="minute-mark" x1="20.988179407934" y1="9.7420233252036" x2="22.192384791067" y2="9.3507532779141" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-13" class="minute-mark" x1="21.229967336549" y1="10.644388159451" x2="22.468474813361" y2="10.381135268578" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-14" class="minute-mark" x1="21.376107916162" y1="11.567083465336" x2="22.635348139562" y2="11.43473198464" stroke="rgba(200,200,200,1)" stroke-width="0.105" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-15" class="minute-mark" x1="20.375" y1="12.5" x2="22.691176470588" y2="12.5" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-20" class="minute-mark" x1="19.319950054802" y1="16.4375" x2="21.32581771798" y2="17.595588235294" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-25" class="minute-mark" x1="16.4375" y1="19.319950054802" x2="17.595588235294" y2="21.32581771798" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-30" class="minute-mark" x1="12.5" y1="20.375" x2="12.5" y2="22.691176470588" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-35" class="minute-mark" x1="8.5625" y1="19.319950054802" x2="7.4044117647059" y2="21.32581771798" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-40" class="minute-mark" x1="5.6800499451975" y1="16.4375" x2="3.6741822820204" y2="17.595588235294" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-45" class="minute-mark" x1="4.625" y1="12.5" x2="2.3088235294118" y2="12.5" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-50" class="minute-mark" x1="5.6800499451975" y1="8.5625" x2="3.6741822820204" y2="7.4044117647059" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-55" class="minute-mark" x1="8.5625" y1="5.6800499451975" x2="7.4044117647059" y2="3.6741822820204" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-00" class="minute-mark" x1="12.5" y1="4.625" x2="12.5" y2="2.3088235294118" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-05" class="minute-mark" x1="16.4375" y1="5.6800499451975" x2="17.595588235294" y2="3.6741822820204" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> <line id="minute-10" class="minute-mark" x1="19.319950054802" y1="8.5625" x2="21.32581771798" y2="7.4044117647059" stroke="black" stroke-width="0.525" stroke-linecap="butt" class="minute-mark" fill="none" /> </g> <!-- group.minutes-marks --> <g class="hands"> <circle cx="12.5" cy="12.5" r="2.1" stroke="none" stroke-width="1" stroke-linecap="butt" fill="slategray"></circle> <line id="hour-hand" class="hand" x1="12.5" y1="12.5" x2="8.8626933041054" y2="10.4" stroke="silver" stroke-width="0.84" stroke-linecap="round" class="hand" fill="none" /> <line id="minute-hand" class="hand" x1="12.5" y1="12.5" x2="8.2844771799392" y2="17.181812400508" stroke="silver" stroke-width="0.315" stroke-linecap="round" class="hand" fill="none" /> </g> <!-- group.hands --> </svg> <p><span class="lupdate" title="Last update of the content">06/08/2024 - 10:37:51</span></p> </div> <script> /* Ce code est detiné à être inclus dans une page éditable */ // Cette fonction sert à sauver un contenu sur le serveur function saveContent( o ) /*---------------------*/ { let id = o.getAttribute( 'id' ); let src = o.getAttribute( 'data-source' ); let url = '/save-content/'; let params = null; let xhr = null; if ( o ) { params = "id=" + encodeURIComponent( id ) + '&src=' + encodeURIComponent( src ) + '&data=' + encodeURIComponent( o.innerHTML ); params = "id=" + encodeURIComponent( id ) + '&data=' + encodeURIComponent( o.innerHTML ); xhr = new XMLHttpRequest(); xhr.open( "POST",url,true ); xhr.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" ); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200 ) { console.log( xhr.responseText ); } } xhr.send( params ); } //console.log( id,src ); } </script> <figure class="primaryImageOfPage"> <img id="primaryImageOfPage" src="https://www.trql.fm/media/images/AI/dev-001.jpg" class="constrained shadow" /> <div class="our-logo"> <img src="/media/images/trql-radio-embossed.png" class="constrained" /> </div> </figure> <p class="readingTime">4'56"</p> </aside> <!-- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles --> <div id="payload" role="article" style="top:-11em;" e-ditable="onblur='saveContent(this);'"> <section id="foreword" class="thanks shadowLight"> <div lang="en"> <p>Hello Fellow <b class="emphasis">Developer</b>, Friend,</p> <p>TRQL Radio… it's <strong>computer code</strong>. Above all, <strong><b class="emphasis blue">computer code!</b></strong></p> <p>Therefore, we are going to make it as easy as possible for you to interact with TRQL Radio and the data that has been gathered over the past <b class="emphasis">8 years</b>.</p> <p>All we need from you is a little bit of patience so that we can create something <b class="emphasis">fantastic, simple and effective</b>. Not like the anti-covid vaccines! <b class="emphasis blue">Something safe and effective</b>, you know?</p> <p>What keeps us busy now is our <b class="emphasis">Vae Soli! Player</b> (where you can listen to a multitude of radios and tracks) and our <b class="emphasis blue">API</b> (which you will be able to use to interact with us).</p> <p>Stay tuned and plan a visit here in a few days!</p> </div> <hr /> <p>Bonjour chers développeurs, chers amis,</p> <div lang="fr"> <p>TRQL Radio... c'est du <strong>code informatique</strong>. Avant tout, du <strong>code informatique</strong> !</p> <p>C'est pourquoi nous allons faire en sorte que vous puissiez interagir le plus facilement possible avec TRQL Radio et les données qui ont été recueillies au cours des 8 dernières années.</p> <p>Tout ce dont nous avons besoin, c'est d'un peu de patience pour créer quelque chose de fantastique, de simple et d'efficace. Pas comme les vaccins anti-covidés ! Quelque chose de sûr et d'efficace, vous voyez ?</p> <p>Ce qui nous occupe pour l'instant, c'est notre lecteur Vae Soli ! (où vous pouvez écouter une multitude de radios et de morceaux) et notre API (que vous pourrez utiliser pour interagir avec nous).</p> <p>Restez à l'écoute et prévoyez une visite ici dans quelques jours !</p> </div> </section> <!-- #foreword --> <section id="github" class="thanks shadowLight"> <h2>Immediate Release</h2> <p>This code is NOT our latest code (open source) but at least it can help you start with something useful as it covers everything we will still document in our <a href="/projects/#generic-concepts">generic concepts</a> (still a lot of things to do here!):</p> <ul> <li>GitHub Repository: <a target="_blank" href="https://github.com/patboens/TRQL-Labs">https://github.com/patboens/TRQL-Labs</a></li> </ul> <p>GitHub has some limitations in terms of number of entries. We are working on that constraint by re-organizing our code (there are more than 1000 classes/files)</p> </section> <!-- #github --> <section id="ancestor" class="thanks shadowLight"> <h2>The Ancestor of Vae Soli! is … Vae Soli!</h2> <p>All this work started in 1996, when we developed the core architectural concepts needed for the automation of a new extension of the Upjohn facility in Puurs. The mission was clear: we needed to have a facility that would be fully automated, which required to interface software with many different physical devices such as packaging machines, weighing scales, automatic forklifts, …</p> <p>At that time, we wanted to have the possibility of exchanging information between machines located on the production lines all throughout the new facility. That's the reason why we worked hard together with Oracle to create a messaging mechanism whose central message repository was an Oracle DB.</p> <p>Then, based on what Siemens suggested, we have switched to IBM's MQSeries and we abandoned the work with Oracle to concentrate on MQ that already had many of the features we were actually searching for.</p> <p>Later on, in 2001, I had the honor of creating an EAI: I baptized this EAI "Vae Soli!", which literally means <em>Woe to the ones standing alone</em>. All the sources of this EAI were written in ANCI C and was mostly based on what I remembered our code for Upjohn was. I still plan to put this in the Open Source community some day.</p> <p>Then, in 2005, I founded Lato Sensu Management. This company was focused on delivering consulting services to large and medium companies, many of them which were turning to web consulting.</p> <p>That is the moment, I created the other arm of Vae Soli!: the web framework, a rebuild of some previous work I started with ColdFusion, which I then turned to Ephemere, a framework built in a language that was pretty close to Visual FoxPro, and finally the PHP version of Vae Soli! as we know it today (09/02/2022 14:14:46, when I first wrote these lines, but still the case on 07/02/2024 08:58:03).</p> <p>The promise of Vae Soli! was to be STRICTLY compatible from version to version. It happens to be a reality since 2005, a <strong>total of <b>20 years</b> of stability and strict compatibility</strong>.</p> <p>The latest modifications I ran on Vae Soli! are dated of today! Sources are still compatible, which is an incredible achievement (<b>20 years</b>)! In the meantime, all code was transformed to form yet another framework: the one I build web sites with today, made of more than 1000 PHP classes, mostly built with standardized et of properties inherited from schema.org and wikidata.</p> </section> <!-- #ancestor --> <section id="articles" class="thanks shadowLight"> <h2>Articles</h2> <ul class="articles"> <li class="regular"><a href="articles-service-catalog">Service Catalog</a> : c'est quoi un catalogue de services ?</li> <li class="new"><a href="articles-service-catalog-extended">Service Catalog (Extended)</a> : la suite (avec un véritable catalogue et avec des paramètres) ?</li> <li class="new"><a href="articles-http">HTTP</a> : l'utilisation du protocole HTTP dans les services REST</li> <li class="new"><a href="articles-yaml">YAML</a> : YAML comme base de documentation des services</li> <li class="new"><a href="articles-openapi">OpenAPI 3.0 — Partie 1</a> : écrire services et microservices en OpenAPI 3.0</li> <li class="new"><a href="articles-openapi2">OpenAPI 3.0 — Partie 2</a> : utiliser Swagger</li> <li class="new"><a href="articles-openapi3">OpenAPI 3.0 — Partie 3</a> : finalisation de notre API à 3 services</li> <li class="new"><a href="articles-openapi4">OpenAPI 3.0 — Partie 4</a> : ajout d'un service nécessitant un passage de paramètre</li> <li class="construction"><a href="articles-openapi5">OpenAPI 3.0 — Partie 5</a> : plus de détails</li> <li class="new"><a href="articles-uml-part1">UML</a> : Diagramme de classe — Les relations — Partie 1</li> <li class="construction"><a href="articles-uml-part2">UML</a> : Diagramme de classe — Les autres symboles — Partie 2</li> <!-- <li class="construction"><a href="articles-uml-part3">UML</a> : Diagramme de classe — Exemple complet — Partie 3</li> --> <li class="new"><a href="/project-management">Project Management, Program Management, Portfolio Management</li> <li class="new"><a href="/developers/open-repositories/">Schema.org, Wikidata & Co: Leveraging Open Repositories </li> <li class="construction"><a href="/procurement-managementLeveraging Open Repositories">Procurement Management</a></li> </ul> </section> <!-- #articles --> <section id="resources" lang="en"> <h2>Resources</h2> <p>Here you will find some useful resources:</p> <ul class="resources"> <li id="html-color-codes"><a href="/developers/html-color-codes/">HTML Color Codes</a></li> <li id="html-special-characters"><a href="/developers/html-special-characters/">HTML Special Characters</a></li> <li id="language-iso-codes"><a href="/developers/language-iso-codes/">Language ISO Codes</a></li> <li id="country-iso-codes"><a href="/developers/country-iso-codes/">Country ISO Codes</a></li> <li id="free-svg"><a href="/developers/svg/">Icônes en SVG libres … (cc) attribution)</a></li> </ul> </section> <!-- #resources --> </div> <!-- #payload.article --> <section class="additionalInfos" role="contentinfo"> </section> </article> <!-- article.content --> </section> <!-- section.content --> </main> <div class="social-networks"> <a target="_blank" href="https://t.me/share/url?url=https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F&text=%0AApparu%20sur%20https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F%0ARessources%20diverses%20pour%20programmeurs%3A%20NOTRE%20code%2C%20NOS%20productions%20...%20pas%20des%20copies" class="telegram forward icon" style="border:none !important;"><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iTGl2ZWxsb18xIiBkYXRhLW5hbWU9IkxpdmVsbG8gMSIgdmlld0JveD0iMCAwIDI0MCAyNDAiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyLWdyYWRpZW50IiB4MT0iMTIwIiB5MT0iMjQwIiB4Mj0iMTIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWQ5M2QyIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzhiMGUzIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPlRlbGVncmFtX2xvZ288L3RpdGxlPjxjaXJjbGUgY3g9IjEyMCIgY3k9IjEyMCIgcj0iMTIwIiBmaWxsPSJ1cmwoI2xpbmVhci1ncmFkaWVudCkiLz48cGF0aCBkPSJNODEuMjI5LDEyOC43NzJsMTQuMjM3LDM5LjQwNnMxLjc4LDMuNjg3LDMuNjg2LDMuNjg3LDMwLjI1NS0yOS40OTIsMzAuMjU1LTI5LjQ5MmwzMS41MjUtNjAuODlMODEuNzM3LDExOC42WiIgZmlsbD0iI2M4ZGFlYSIvPjxwYXRoIGQ9Ik0xMDAuMTA2LDEzOC44NzhsLTIuNzMzLDI5LjA0NnMtMS4xNDQsOC45LDcuNzU0LDAsMTcuNDE1LTE1Ljc2MywxNy40MTUtMTUuNzYzIiBmaWxsPSIjYTljNmQ4Ii8+PHBhdGggZD0iTTgxLjQ4NiwxMzAuMTc4LDUyLjIsMTIwLjYzNnMtMy41LTEuNDItMi4zNzMtNC42NGMuMjMyLS42NjQuNy0xLjIyOSwyLjEtMi4yLDYuNDg5LTQuNTIzLDEyMC4xMDYtNDUuMzYsMTIwLjEwNi00NS4zNnMzLjIwOC0xLjA4MSw1LjEtLjM2MmEyLjc2NiwyLjc2NiwwLDAsMSwxLjg4NSwyLjA1NSw5LjM1Nyw5LjM1NywwLDAsMSwuMjU0LDIuNTg1Yy0uMDA5Ljc1Mi0uMSwxLjQ0OS0uMTY5LDIuNTQyLS42OTIsMTEuMTY1LTIxLjQsOTQuNDkzLTIxLjQsOTQuNDkzcy0xLjIzOSw0Ljg3Ni01LjY3OCw1LjA0M0E4LjEzLDguMTMsMCwwLDEsMTQ2LjEsMTcyLjVjLTguNzExLTcuNDkzLTM4LjgxOS0yNy43MjctNDUuNDcyLTMyLjE3N2ExLjI3LDEuMjcsMCwwLDEtLjU0Ni0uOWMtLjA5My0uNDY5LjQxNy0xLjA1LjQxNy0xLjA1czUyLjQyNi00Ni42LDUzLjgyMS01MS40OTJjLjEwOC0uMzc5LS4zLS41NjYtLjg0OC0uNC0zLjQ4MiwxLjI4MS02My44NDQsMzkuNC03MC41MDYsNDMuNjA3QTMuMjEsMy4yMSwwLDAsMSw4MS40ODYsMTMwLjE3OFoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=" class="telegram forward icon" alt="Telegram icon" /></a><a target="_blank" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F&text=%0AApparu%20sur%20https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F%0ARessources%20diverses%20pour%20programmeurs%3A%20NOTRE%20code%2C%20NOS%20productions%20...%20pas%20des%20copies" class="twitter forward icon" style="border:none !important;"><img src="data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGFyaWEtaGlkZGVuPSJ0cnVlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPGc+CiAgICAgICAgPHBhdGggZD0iTTE4LjI0NCAyLjI1aDMuMzA4bC03LjIyNyA4LjI2IDguNTAyIDExLjI0SDE2LjE3bC01LjIxNC02LjgxN0w0Ljk5IDIxLjc1SDEuNjhsNy43My04LjgzNUwxLjI1NCAyLjI1SDguMDhsNC43MTMgNi4yMzF6bS0xLjE2MSAxNy41MmgxLjgzM0w3LjA4NCA0LjEyNkg1LjExN3oiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+" class="twitter forward icon" alt="Twitter icon" /></a><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F&text=%0AApparu%20sur%20https%3A%2F%2Fwww.trql.fm%2Fdevelopers%2F%0ARessources%20diverses%20pour%20programmeurs%3A%20NOTRE%20code%2C%20NOS%20productions%20...%20pas%20des%20copies" class="facebook forward icon" style="border:none !important;"><img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDkzMy4zMzMzMSA5MzMuMzMzMzEiCiAgIGhlaWdodD0iOTMzLjMzMzMxIgogICB3aWR0aD0iOTMzLjMzMzMxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE4Ij48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNiI+PGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGgxOCIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48cGF0aAogICAgICAgICBpZD0icGF0aDE2IgogICAgICAgICBkPSJNIDAsNzAwIEggNzAwIFYgMCBIIDAgWiIgLz48L2NsaXBQYXRoPjwvZGVmcz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDkzMy4zMzMzMykiIGlkPSJnMTAiPgogICAgICAgIDxnIGlkPSJnMTIiPgogICAgICAgICAgICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiIGlkPSJnMTQiPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAwLDM1MCkiIGlkPSJnMjAiPgogICAgICAgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBpZD0icGF0aDIyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzA4NjZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIGQ9Im0gMCwwIGMgMCwxMzguMDcxIC0xMTEuOTI5LDI1MCAtMjUwLDI1MCAtMTM4LjA3MSwwIC0yNTAsLTExMS45MjkgLTI1MCwtMjUwIDAsLTExNy4yNDUgODAuNzE1LC0yMTUuNjIyIDE4OS42MDYsLTI0Mi42MzggdiAxNjYuMjQyIGggLTUxLjU1MiBWIDAgaCA1MS41NTIgdiAzMi45MTkgYyAwLDg1LjA5MiAzOC41MDgsMTI0LjUzMiAxMjIuMDQ4LDEyNC41MzIgMTUuODM4LDAgNDMuMTY3LC0zLjEwNSA1NC4zNDcsLTYuMjExIFYgODEuOTg2IGMgLTUuOTAxLDAuNjIxIC0xNi4xNDksMC45MzIgLTI4Ljg4MiwwLjkzMiAtNDAuOTkzLDAgLTU2LjgzMiwtMTUuNTI4IC01Ni44MzIsLTU1LjkgViAwIGggODEuNjU5IGwgLTE0LjAyOCwtNzYuMzk2IGggLTY3LjYzMSBWIC0yNDguMTY5IEMgLTk1LjkyNywtMjMzLjIxOCAwLC0xMjcuODE4IDAsMCIgLz48L2c+PGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NDcuOTE3NSwyNzMuNjAzNikiCiAgICAgICAgICAgaWQ9ImcyNCI+PHBhdGgKICAgICAgICAgICAgIGlkPSJwYXRoMjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgZD0iTSAwLDAgMTQuMDI5LDc2LjM5NiBIIC02Ny42MyB2IDI3LjAxOSBjIDAsNDAuMzcyIDE1LjgzOCw1NS44OTkgNTYuODMxLDU1Ljg5OSAxMi43MzMsMCAyMi45ODEsLTAuMzEgMjguODgyLC0wLjkzMSB2IDY5LjI1MyBjIC0xMS4xOCwzLjEwNiAtMzguNTA5LDYuMjEyIC01NC4zNDcsNi4yMTIgLTgzLjUzOSwwIC0xMjIuMDQ4LC0zOS40NDEgLTEyMi4wNDgsLTEyNC41MzMgViA3Ni4zOTYgaCAtNTEuNTUyIFYgMCBoIDUxLjU1MiB2IC0xNjYuMjQyIGMgMTkuMzQzLC00Ljc5OCAzOS41NjgsLTcuMzYyIDYwLjM5NCwtNy4zNjIgMTAuMjU0LDAgMjAuMzU4LDAuNjMyIDMwLjI4OCwxLjgzMSBMIC02Ny42MywwIFoiIC8+PC9nPjwvZz48L2c+CiAgICA8L2c+Cjwvc3ZnPg==" class="facebook forward icon" alt="Facebook icon" /></a></div> <!-- div.social-networks --> </div> <!-- #wrapper --> <div id="menu-8706f9fc-6646-34b4-5cdc-95b5f2ce5ce9" class="shadow menuContent"> <div data-storage="trql-sysmenu.php"> <ol class="navmenu" style="margin-top:1em;"> <li><a href="/vaesoli!/?r=trql.fm" >TRQL Radio LIVE</a></li> <hr /> <!-- ********************************************* --> <li><a href="/catalog/" >Catalogue</a></li> <hr /> <!-- ********************************************* --> <li><a href="/news/" >Niouzes</a></li> <li><a href="/timeline/" >Timeline</a></li> <!-- <li><a href="/artists/" >Artistes</a></li> --> <!-- <li><a href="/tracks/" >Morceaux</a></li> --> <hr /> <!-- ********************************************* --> <li><a href="/economics/" >Économie</a></li> <!-- <li><a href="/horoscope/" >Horoscope</a></li> --> <li><a href="/recipes/" >Recettes</a></li> <li><a href="/meteo/" >Météo</a></li> <hr /> <!-- ********************************************* --> <!-- <li><a href="/our-world/" >Notre monde</a></li> --> <li><a href="/developers/" >Dévelopeurs</a> <hr /> <!-- ********************************************* --> <li><a href="/" >Accueil</a></li> <li><a href="/sitemap/" >Sitemap</a></li> </ol> </div> <!-- End of data-storage --> </div> <nav class="sysmenu"> <!-- Petite gaufre du menu, ici appelée 'menu-8706f9fc-6646-34b4-5cdc-95b5f2ce5ce9-Handle' --> <div id="menu-8706f9fc-6646-34b4-5cdc-95b5f2ce5ce9-Handle" class="menuHandle"> <div><span onclick="showHideMenu('menu-8706f9fc-6646-34b4-5cdc-95b5f2ce5ce9','menu-8706f9fc-6646-34b4-5cdc-95b5f2ce5ce9-Handle','wrapper','desktop');">|||</span></div> </div> </nav> </body> </html> <!-- Gestion QUITUS 1) Il faut déterminer les modules Quitus disponibles a) Il y a des modules standards ... et ceux-là, dès qu'ils sont disponibles en standard ils deviennent disponibles dans le compte client) b) Il y a des modules payants ... et ceux-là le client doit avoir une licence c) Des modules standards peuvent devenir payants d) Des modules payants peuvent devenir standards 2) Sur base des modules disponibles, il faut constituer un menu avec tous les modules a) On utilise la propriété "category" pour trier les modules. b) On dispoise aussi de subcategory pour avoir une catégorisation plus fine -->