{"id":8092,"date":"2023-04-13T12:16:11","date_gmt":"2023-04-13T12:16:11","guid":{"rendered":"https:\/\/combodo.com\/collecting-data-with-itop-in-action\/"},"modified":"2026-03-13T13:17:55","modified_gmt":"2026-03-13T13:17:55","slug":"synchronisation-api-rest-itop","status":"publish","type":"post","link":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/","title":{"rendered":"La collecte de donn\u00e9es avec iTop en action"},"content":{"rendered":"\r\n<p>Dans ce tutoriel, nous allons aborder la synchronisation de donn\u00e9es avec iTop et nous allons voir comment l\u2019adapter \u00e0 un besoin sp\u00e9cifique gr\u00e2ce aux collecteurs de donn\u00e9es.<\/p>\r\n<p>Nous utiliserons les API en libre acc\u00e8s mises \u00e0 disposition sur le site<a href=\"https:\/\/api.gouv.fr\/\">\u00a0https:\/\/api.gouv.fr\/<\/a>\u00a0afin de synchroniser les \u00e9tablissements de l\u2019\u00e9ducation nationale sur notre serveur iTop.<br \/>Vous pourrez par la suite ajouter d\u2019autres donn\u00e9es disponibles dans d\u2019autres API du site.<\/p>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n\r\n\r\n<p>Ce site r\u00e9f\u00e9rence les API du service public, mises \u00e0 la disposition des collectivit\u00e9s, des minist\u00e8res et des entreprises pour construire des services informatiques au service de tous.<\/p>\r\n<cite>api.gouv.fr<\/cite><\/blockquote>\r\n\r\n\r\n\r\n<p>\u23f1\ufe0fDur\u00e9e approximative du tutoriel:\u00a0<strong>4 heures<\/strong><\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Les \u00e9tapes cl\u00e9s de ce tutoriel<\/h4>\r\n\r\n\r\n\r\n<p>1\/ La structuration des donn\u00e9es<br \/>2\/ La cr\u00e9ation d\u2019une extension pour iTop<br \/>3\/ La cr\u00e9ation d\u2019un collecteur pour iTop<br \/>4\/ L\u2019industrialisation de la solution<br \/>5\/ Exercice<br \/>6\/ Quizz<\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Pr\u00e9requis<\/h4>\r\n\r\n\r\n\r\n<p>Un serveur iTop communautaire de version 2.7 ou sup\u00e9rieure install\u00e9 en local ou sur une machine distante de votre r\u00e9seau avec les droits utilisateurs pour apporter des modifications \u00e0 l\u2019installation.<br \/>Un environnement d\u2019ex\u00e9cution PHP compatible avec la version d\u2019iTop et quelques connaissances en PHP.<br \/>Un \u00e9diteur de texte Notepad++ ou autre.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Principe de synchronisation avec iTop<\/h2>\r\n\r\n\r\n\r\n\r\n\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8093 aligncenter\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/replica-269x300.png\" alt=\"\" width=\"269\" height=\"300\" \/><\/p>\r\n<p>Le r\u00f4le du collecteur est de convertir les donn\u00e9es externes au format CSV, de mettre \u00e0 jour les r\u00e9plicas avec ces donn\u00e9es et enfin de synchroniser ces derniers avec les donn\u00e9es d\u2019iTop.<br \/>Une couche d\u2019abstraction s\u2019occupe de la phase d\u2019importation et de synchronisation pour nous.<\/p>\r\n<p><br \/>Pour notre collecteur sp\u00e9cifique REST, nous devons simplement extraire les donn\u00e9es de l\u2019API et les convertir en CSV.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Les \u00e9tapes du tutoriel<\/h2>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">1\/ La structuration des donn\u00e9es<\/h3>\r\n\r\n\r\n\r\n<p>Nous souhaitons synchroniser la liste des \u00e9tablissements de l\u2019\u00e9ducation nationale Fran\u00e7aise avec notre iTop. Les donn\u00e9es seront en lecture seule c\u00f4t\u00e9 iTop.<br \/>Nous utiliserons l\u2019API annuaire \u00e9ducation: https:\/\/api.gouv.fr\/les-api\/api-annuaire-education<\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">L\u2019analyse<\/h4>\r\n\r\n\r\n\r\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 analyser l\u2019API et \u00e0 identifier les donn\u00e9es que nous souhaitons remonter sur iTop.<br \/>En allant sur la page de pr\u00e9sentation de l\u2019API, nous pouvons d\u00e9couvrir les principales donn\u00e9es disponibles.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8096 aligncenter\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/scope_api-1019x1024-1-300x300.png\" alt=\"\" width=\"300\" height=\"300\" \/><\/p>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">La s\u00e9lection des donn\u00e9es \u00e0 synchroniser<\/h4>\r\n\r\n\r\n\r\n<p>Nous choisissons les informations des \u00e9tablissements suivantes:<\/p>\r\n<p>\u00b7 L\u2019identifiant unique (UAI)<br \/>\u00b7 Le nom<br \/>\u00b7 L\u2019adresse postale<br \/>\u00b7 Le type d\u2019\u00e9tablissement<br \/>\u00b7 L\u2019information public \/ priv\u00e9<br \/>\u00b7 Le code acad\u00e9mie<br \/>\u00b7 Le nombre d\u2019\u00e9l\u00e8ves<br \/>\u00b7 La pr\u00e9sence d\u2019un service de restauration<br \/>\u00b7 La date d\u2019ouverture<\/p>\r\n<p>Plusieurs types de donn\u00e9es (texte, nombre, date, \u00e9num\u00e9ration et bool\u00e9en) seront ainsi synchronis\u00e9s.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Data source<\/h4>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">La source de donn\u00e9es<\/h4>\r\n<p>La requ\u00eate de l\u2019API que nous utiliserons est la suivante:<\/p>\r\n\r\n\r\n\r\n<p><code>GET \/catalog\/datasets\/fr-en-annuaire-education\/records<\/code><\/p>\r\n\r\n\r\n\r\n<p>Nous utiliserons les param\u00e8tres\u00a0<code>select<\/code>,\u00a0<code>limit\u00a0<\/code>et\u00a0<code>offset\u00a0<\/code>afin de ne s\u00e9lectionner que les donn\u00e9es qui nous int\u00e9resse et nous pourrons ainsi, parcourir l\u2019ensemble des enregistrements en plusieurs it\u00e9rations. Il est en effet impossible de s\u00e9lectionner l\u2019ensemble des \u00e9tablissements, la limite du nombre de r\u00e9sultats fix\u00e9e par l\u2019API \u00e9tant de 100 \u00e9tablissements par requ\u00eate.<\/p>\r\n\r\n\r\n\r\n<p>Vous pouvez effectuer quelques tests pour prendre en main l\u2019API ici: https:\/\/api.gouv.fr\/documentation\/api-annuaire-education.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8098 aligncenter\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/desc_api-980x958-1-300x293.png\" alt=\"\" width=\"300\" height=\"293\" \/><\/p>\r\n\r\n\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">2\/ La cr\u00e9ation d\u2019une extension pour iTop<\/h3>\r\n\r\n\r\n\r\n<p>Nous allons cr\u00e9er une extension pour nous permettre de customiser le mod\u00e8le de donn\u00e9es d\u2019iTop et ainsi nous permettre de collecter des donn\u00e9es de type \u00e9tablissement d\u2019\u00e9ducation. Nous \u00e9tendrons la classe localisation et ajouterons les informations sp\u00e9cifiques aux \u00e9tablissements de l\u2019\u00e9ducation nationale. Nous apporterons \u00e9galement quelques modifications au menu lat\u00e9ral d\u2019iTop afin d\u2019accueillir les menus associ\u00e9s aux API du site api.gouv.fr.<\/p>\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">G\u00e9n\u00e9ration du squelette<\/h4>\r\n\r\n\r\n\r\n<p>Commencez par g\u00e9n\u00e9rer un squelette d\u2019extension en saisissant les informations suivantes dans le\u00a0formulaire de cr\u00e9ation.<br \/>Cliquez sur le bouton\u00a0<code>Generate\u00a0<\/code>et t\u00e9l\u00e9chargez ensuite l\u2019archive cr\u00e9\u00e9e.<br \/>D\u00e9compressez l\u2019archive t\u00e9l\u00e9charg\u00e9e dans le dossier extensions sur le serveur iTop.<\/p>\r\n<p>Company name: MyCompany<br \/>Extension name: gouv-api-extension<br \/>Extension label: api.gouv.fr data synchronisation<br \/>Version: 1.0.0<br \/>Dependencies: itop-structure\/3.0.0<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image aligncenter size-full wp-image-1292 size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" class=\"wp-image-2312\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/new_extension-1024x500-1.png\" alt=\"\" srcset=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/new_extension-1024x500-1.png 1024w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/new_extension-1024x500-1-980x479.png 980w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/new_extension-1024x500-1-480x234.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/>\r\n<figcaption class=\"wp-element-caption\">Formulaire pour la g\u00e9n\u00e9ration du squelette<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p class=\"anchorinfo\"><em>Pour aller plus loin dans la cr\u00e9ation d\u2019extensions, visitez la\u00a0documentation officielle.<\/em><\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Cr\u00e9ation de la classe du mod\u00e8le de donn\u00e9es<\/h4>\r\n\r\n\r\n\r\n<p>Nous allons cr\u00e9er notre classe pour stocker les informations des \u00e9tablissement scolaires. Nous faisons le choix de d\u00e9river la classe\u00a0<code>Location\u00a0<\/code>et h\u00e9ritons ainsi des donn\u00e9es de localisation.<\/p>\r\n<h5 class=\"wp-block-heading\">Informations g\u00e9n\u00e9rales<\/h5>\r\n<p>Initialisation de la classe\u00a0<code>Establishment<\/code>\u00a0qui d\u00e9rive de la classe\u00a0<code>Location<\/code>.<\/p>\r\n<p>Ajoutez les informations g\u00e9n\u00e9rales de la classe dans le fichier de mod\u00e8le de donn\u00e9es comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>datamodel.gouv-edu-extension.xml<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;itop_design xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" version=\"1.6\"&gt;\r\n  \u2026\r\n    &lt;classes&gt;\r\n      &lt;class id=\"Establishment\" _delta=\"define\"&gt;\r\n        &lt;parent&gt;Location&lt;\/parent&gt;\r\n        &lt;properties&gt;\r\n          &lt;category&gt;bizmodel,searchable&lt;\/category&gt;\r\n          &lt;abstract&gt;false&lt;\/abstract&gt;\r\n          &lt;key_type&gt;autoincrement&lt;\/key_type&gt;\r\n          &lt;db_table&gt;establishment&lt;\/db_table&gt;\r\n          &lt;db_key_field&gt;id&lt;\/db_key_field&gt;\r\n          &lt;db_final_class_field\/&gt;\r\n          &lt;naming&gt;\r\n            &lt;format&gt;%1$s&lt;\/format&gt;\r\n            &lt;attributes&gt;\r\n              &lt;attribute id=\"name\"\/&gt;\r\n            &lt;\/attributes&gt;\r\n          &lt;\/naming&gt;\r\n          &lt;display_template\/&gt;\r\n          &lt;icon&gt;assets\/img\/school.png&lt;\/icon&gt;\r\n        &lt;\/properties&gt;\r\n      &lt;\/class&gt;\r\n    &lt;\/classes&gt;\r\n  \u2026\r\n&lt;\/itop_design&gt;<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>\ud83d\udca1La balise\u00a0<code>&lt;icon&gt;<\/code>\u00a0permets d\u2019associer une image \u00e0 la classe.<\/p>\r\n\r\n\r\n\r\n<h5 class=\"wp-block-heading\">Ajout des attributs de la classe du mod\u00e8le de donn\u00e9es<\/h5>\r\n\r\n\r\n\r\n<p>D\u00e9claration des attributs de la classe Establishment. Pour chacun de ces attributs nous sp\u00e9cifions son type de donn\u00e9e\u00a0<code>xsi:type=\"AttributeXXX\"<\/code>.<br \/>Nous rendons obligatoires les attributs\u00a0<code>identifier<\/code>,\u00a0<code>type\u00a0<\/code>et\u00a0<code>private_public<\/code>.<\/p>\r\n<p>Ajoutez les attributs de la classe dans le fichier de mod\u00e8le de donn\u00e9es comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>datamodel.gouv-edu-extension.xml<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>&lt;classes&gt;\r\n  &lt;class id=\"Establishment\" _delta=\"define\"&gt;\r\n  \u2026\r\n    &lt;fields&gt;\r\n      &lt;!-- identifier--&gt;\r\n      &lt;field id=\"identifier\" xsi:type=\"AttributeString\"&gt;\r\n        &lt;sql&gt;identifier&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;false&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- type --&gt;\r\n      &lt;field id=\"type\" xsi:type=\"AttributeString\"&gt;\r\n        &lt;sql&gt;type&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;false&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- private_public --&gt;\r\n      &lt;field id=\"private_public\" xsi:type=\"AttributeEnum\"&gt;\r\n        &lt;values&gt;\r\n          &lt;value&gt;unknown&lt;\/value&gt;\r\n          &lt;value&gt;private&lt;\/value&gt;\r\n          &lt;value&gt;public&lt;\/value&gt;\r\n        &lt;\/values&gt;\r\n        &lt;sql&gt;private_public&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;false&lt;\/is_null_allowed&gt;\r\n        &lt;display_style&gt;radio_horizontal&lt;\/display_style&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- academy_code --&gt;\r\n      &lt;field id=\"academy_code\" xsi:type=\"AttributeString\"&gt;\r\n        &lt;sql&gt;code_academie&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;true&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- catering_service --&gt;\r\n      &lt;field id=\"catering_service\" xsi:type=\"AttributeBoolean\"&gt;\r\n        &lt;sql&gt;catering_service&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;true&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- students_count --&gt;\r\n      &lt;field id=\"students_count\" xsi:type=\"AttributeInteger\"&gt;\r\n        &lt;sql&gt;students_count&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;false&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n      &lt;!-- opening_date --&gt;\r\n      &lt;field id=\"opening_date\" xsi:type=\"AttributeDate\"&gt;\r\n        &lt;sql&gt;opening_date&lt;\/sql&gt;\r\n        &lt;default_value\/&gt;\r\n        &lt;is_null_allowed&gt;false&lt;\/is_null_allowed&gt;\r\n      &lt;\/field&gt;\r\n    &lt;\/fields&gt;\r\n  &lt;\/class&gt;\r\n&lt;\/classes&gt;<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Ajoutez les traductions de nos attributs de classe dans le fichier d\u2019internationalisation.<br \/>Par d\u00e9faut, seul le fichier de traduction anglais est cr\u00e9\u00e9, ajoutez d\u2019autres langues au besoin.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>en.dict.gouv-api-extension.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>Dict::Add('EN US', 'English', 'English', array(\r\n  'Class:Establishment\/Attribute:identifier' =&gt; 'Establishment code',\r\n  'Class:Establishment\/Attribute:identifier+' =&gt; 'Code UAI',\r\n  'Class:Establishment\/Attribute:type' =&gt; 'Establishment type',\r\n  'Class:Establishment\/Attribute:private_public' =&gt; 'Private \/ Public',\r\n  'Class:Establishment\/Attribute:private_public\/Value:private' =&gt; 'Private',\r\n  'Class:Establishment\/Attribute:private_public\/Value:public' =&gt; 'Public',\r\n  'Class:Establishment\/Attribute:private_public\/Value:unknown' =&gt; 'Unknown',\r\n  'Class:Establishment\/Attribute:academy_code_academie' =&gt; 'Academy code',\r\n  'Class:Establishment\/Attribute:catering_service' =&gt; 'Catering service',\r\n  'Class:Establishment\/Attribute:students_count' =&gt; 'Students count',\r\n  'Class:Establishment\/Attribute:opening_date' =&gt; 'Opening date',\r\n));<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>\ud83d\udca1Le symbole + permets de joindre une bulle de survol au formulaire pour un attribut donn\u00e9: \u2018<code>Class:Establishment\/Attribute:identifier+<\/code>\u2018<\/p>\r\n\r\n\r\n\r\n<h5 class=\"wp-block-heading\">Ajout des donn\u00e9es de pr\u00e9sentation<\/h5>\r\n\r\n\r\n\r\n<p>D\u00e9claration des diff\u00e9rents modes d\u2019affichage de notre classe.<br \/>La section\u00a0<code>d\u00e9tails\u00a0<\/code>determine l\u2019affichage de notre classe lors de la visualisation ou de l\u2019\u00e9dition d\u2019objet.<br \/>La section\u00a0<code>list\u00a0<\/code>determine les attributs de notre classe utilis\u00e9s comme colonnes dans les listes.<br \/>La section\u00a0<code>search\u00a0<\/code>quant \u00e0 elle d\u00e9finit les attributs utilis\u00e9s comme crit\u00e8res lors des recherches.<\/p>\r\n<p>Ajoutez les modes d\u2019affichage comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>datamodel.gouv-edu-extension.xml<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>      &lt;presentation&gt;\r\n        &lt;details&gt;\r\n          &lt;items&gt;\r\n            &lt;item id=\"type\"&gt;\r\n              &lt;rank&gt;30&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"identifier\"&gt;\r\n              &lt;rank&gt;10&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"private_public\"&gt;\r\n              &lt;rank&gt;40&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"academy_code\"&gt;\r\n              &lt;rank&gt;50&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"catering_service\"&gt;\r\n              &lt;rank&gt;60&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"students_count\"&gt;\r\n              &lt;rank&gt;70&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"opening_date\"&gt;\r\n              &lt;rank&gt;80&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"org_id\"&gt;\r\n              &lt;rank&gt;90&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"address\"&gt;\r\n              &lt;rank&gt;100&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"postal_code\"&gt;\r\n              &lt;rank&gt;110&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"city\"&gt;\r\n              &lt;rank&gt;120&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"country\"&gt;\r\n              &lt;rank&gt;130&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n          &lt;\/items&gt;\r\n        &lt;\/details&gt;\r\n        &lt;search&gt;\r\n          &lt;items&gt;\r\n            &lt;item id=\"type\"&gt;\r\n              &lt;rank&gt;10&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"private_public\"&gt;\r\n              &lt;rank&gt;20&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"academy_code\"&gt;\r\n              &lt;rank&gt;30&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n          &lt;\/items&gt;\r\n        &lt;\/search&gt;\r\n        &lt;list&gt;\r\n          &lt;items&gt;\r\n            &lt;item id=\"identifier\"&gt;\r\n              &lt;rank&gt;10&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"private_public\"&gt;\r\n              &lt;rank&gt;30&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"city\"&gt;\r\n              &lt;rank&gt;40&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"opening_date\"&gt;\r\n              &lt;rank&gt;50&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"catering_service\"&gt;\r\n              &lt;rank&gt;60&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n            &lt;item id=\"students_count\"&gt;\r\n              &lt;rank&gt;70&lt;\/rank&gt;\r\n            &lt;\/item&gt;\r\n          &lt;\/items&gt;\r\n        &lt;\/list&gt;\r\n      &lt;\/presentation&gt;<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<h5 class=\"wp-block-heading\">Ajout des donn\u00e9es de r\u00e9conciliation<\/h5>\r\n\r\n\r\n\r\n<p>D\u00e9claration des attributs de r\u00e9conciliation de notre classe.<br \/>Nous nous servons de l\u2019identifiant de l\u2019\u00e9tablissement scolaire pour la r\u00e9conciliation car il est unique.<\/p>\r\n<p>\ud83c\udf93La r\u00e9conciliation d\u00e9finit un ou plusieurs attributs garants de l\u2019identification d\u2019un objet.<\/p>\r\n<p>Ajoutez les informations de r\u00e9conciliation de la classe dans le fichier de mod\u00e8le de donn\u00e9es comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>datamodel.gouv-edu-extension.xml<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>&lt;classes&gt;\r\n  &lt;class id=\"Establishment\" _delta=\"define\"&gt;\r\n    \u2026\r\n    &lt;properties&gt;\r\n      \u2026\r\n      &lt;reconciliation&gt;\r\n        &lt;attributes&gt;\r\n          &lt;attribute id=\"identifier\"\/&gt;\r\n        &lt;\/attributes&gt;\r\n      &lt;\/reconciliation&gt;\r\n    &lt;\/properties&gt;\r\n  &lt;\/class&gt;\r\n&lt;\/classes&gt;<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Personnalisation du menu iTop<\/h4>\r\n\r\n\r\n\r\n<p>Nous allons organiser nos donn\u00e9es issues du site api.gouv.fr dans un menu int\u00e9gr\u00e9 au menu lat\u00e9ral d\u2019iTop.<br \/>Vous pourrez par la suite ajouter autant d\u2019entr\u00e9es dans ce menu que d\u2019API que vous impl\u00e9menterez.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image aligncenter size-full wp-image-1290 size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"619\" height=\"768\" class=\"wp-image-2297\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/menu-api.gouv_.fr_-1.png\" alt=\"\" srcset=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/menu-api.gouv_.fr_-1.png 619w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/menu-api.gouv_.fr_-1-480x596.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 619px, 100vw\" \/>\r\n<figcaption class=\"wp-element-caption\">\r\n<figure class=\"wp-block-image aligncenter size-full wp-image-1290 size-large\">\r\n<figcaption class=\"wp-element-caption\">Aper\u00e7u du menu api.gouv.fr<\/figcaption>\r\n<\/figure>\r\n<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>Ajoutez les informations de menu de la classe dans le fichier de mod\u00e8le de donn\u00e9es comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>datamodel.gouv-edu-extension.xml<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;itop_design xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" version=\"1.6\"&gt;\r\n  \u2026\r\n  &lt;menus&gt;\r\n    &lt;menu id=\"GouvAPIMenu\" xsi:type=\"MenuGroup\" _delta=\"define\"&gt;\r\n      &lt;rank&gt;10&lt;\/rank&gt;\r\n      &lt;style&gt;\r\n        &lt;decoration_classes&gt;fas fa-dice-d20&lt;\/decoration_classes&gt;\r\n      &lt;\/style&gt;\r\n    &lt;\/menu&gt;\r\n    &lt;menu id=\"EstablishmentSearchMenu\" xsi:type=\"SearchMenuNode\" _delta=\"define\"&gt;\r\n      &lt;rank&gt;10&lt;\/rank&gt;\r\n      &lt;parent&gt;GouvAPIMenu&lt;\/parent&gt;\r\n      &lt;class&gt;Establishment&lt;\/class&gt;\r\n    &lt;\/menu&gt;\r\n  &lt;\/menus&gt;\r\n  \u2026\r\n&lt;\/itop_design&gt;<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>\ud83d\udca1La balise\u00a0<code>&lt;decoration_classes&gt;<\/code>\u00a0permets de d\u00e9finir une ic\u00f4ne pour le groupe de menu.<\/p>\r\n\r\n\r\n\r\n<p>Les codes pour les ic\u00f4nes sont disponibles sur le site de Font Awesome:\u00a0<a href=\"https:\/\/fontawesome.com\/\">https:\/\/fontawesome.com\/<\/a>.<\/p>\r\n<p>Ajoutez les traductions de nos menus dans le fichier d\u2019internationalisation comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>en.dict.gouv-api-extension.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>Dict::Add('EN US', 'English', 'English', array(\r\n  'Menu:GouvAPIMenu' =&gt; 'api.gouv.fr',\r\n  'Menu:EstablishmentSearchMenu' =&gt; 'National Education Establishments',\r\n));<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Installation de notre extension<\/h4>\r\n\r\n\r\n\r\n<p>Copiez l\u2019extension dans le dossier extensions de votre serveur iTop.<br \/>Ajoutez les autorisations d\u2019\u00e9criture au fichier de configuration d\u2019iTop se trouvant dans le dossier\u00a0<code>conf\/production\/config-itop.php<\/code>\u00a0puis acc\u00e9dez \u00e0 l\u2019adresse web de votre iTop suivante:\u00a0<code>http:\/\/{adresse-serveur-itop}\/setup<\/code>\u00a0dans un navigateur internet afin de lancer l\u2019installation.<\/p>\r\n<p>Confirmez les \u00e9tapes de l\u2019installation et assurez-vous que notre nouvelle extension soit coch\u00e9e \u00e0 la fin de l\u2019assistant d\u2019installation.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image alignnone size-full wp-image-1280 size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"429\" class=\"wp-image-2299\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/add_extension-1024x429-1.png\" alt=\"\" srcset=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/add_extension-1024x429-1.png 1024w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/add_extension-1024x429-1-980x411.png 980w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/03\/add_extension-1024x429-1-480x201.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Et voil\u00e0 ! Nous pouvons \u00e0 pr\u00e9sent accueillir des \u00e9tablissements de l\u2019\u00e9ducation nationale dans notre iTop.<br \/>Essayez de cr\u00e9er un \u00e9tablissement pour v\u00e9rifier que tout est op\u00e9rationnel.<\/p>\r\n<p>Naviguez dans le menu api.gouv.fr &gt; Etablissements \u00e9ducation nationale et cliquez sur create a establishment.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8100\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/establishment_card-300x113.png\" alt=\"\" width=\"300\" height=\"113\" srcset=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/establishment_card-300x113.png 300w, https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/establishment_card.png 312w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8102\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/establishment_form-980x452-1-300x138.png\" alt=\"\" width=\"300\" height=\"138\" \/><\/p>\r\n<p>Dans le chapitre suivant, nous verrons comment synchroniser les donn\u00e9es gr\u00e2ce \u00e0 un collecteur.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">3\/ La cr\u00e9ation d\u2019un collecteur pour iTop<\/h3>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Installation iTop data collector<\/h4>\r\n\r\n\r\n\r\n<p>T\u00e9l\u00e9charger\u00a0l\u2019extension data collector base.<br \/>Et d\u00e9compressez le contenu dans le dossier de votre choix. (Ne pas d\u00e9compresser dans le dossier\u00a0<code>www\u00a0<\/code>de votre serveur afin de ne pas en exposer le contenu)<br \/>Il est tout \u00e0 fait possible de d\u00e9compresser sur une autre machine du r\u00e9seau du moment qu\u2019elle poss\u00e8de un environnement d\u2019ex\u00e9cution PHP 7.x.<\/p>\r\n<p><em>Tout savoir sur Data collector base dans notre\u00a0documentation officielle.<\/em><\/p>\r\n\r\n\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Configuration de la source de donn\u00e9es<\/h4>\r\n\r\n\r\n\r\n<p>La configuration de la source de donn\u00e9es est d\u00e9crite au format JSON.<br \/>Le plus simple est de param\u00e9trer la source de donn\u00e9es dans l\u2019interface utilisateur de la console d\u2019iTop et de la transformer au format JSON via un script fourni par l\u2019extension iTop data collector.<\/p>\r\n<p>Cr\u00e9ez une nouvelle source de donn\u00e9es dans le menu configuration &gt; sources de d\u00e9 donn\u00e9es de synchronisation.<br \/>Saisissez les informations suivantes et laissez les autres champs \u00e0 leur valeur par d\u00e9faut.<\/p>\r\n\r\n\r\n\r\n<p>Name: Synchro national education establishments<br \/>Description: <a href=\"https:\/\/api.gouv.fr\/documentation\/api-annuaire-education\">https:\/\/api.gouv.fr\/documentation\/api-annuaire-education<\/a><br \/>Target class: Establishment<br \/>Contact to notify: Your_email<br \/>Datatable: data_national_education_establishment<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8104\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/synchro_settings-980x350-1-300x107.png\" alt=\"\" width=\"300\" height=\"107\" \/><\/p>\r\n\r\n\r\n\r\n\r\n\r\n<p>Choisissez l\u2019attribut identifier pour la r\u00e9conciliation.<br \/>Choisissez la cl\u00e9 de r\u00e9conciliation Full name pour l\u2019attribut Owner organization ce qui nous permettra d\u2019indiquer l\u2019organisation par son nom et \u00eatre ainsi plus lisible.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8106\" src=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/synchro_settings2-980x418-1-300x128.png\" alt=\"\" width=\"300\" height=\"128\" \/><\/p>\r\n\r\n\r\n\r\n\r\n\r\n<p>G\u00e9n\u00e9rez ensuite la d\u00e9finition JSON de cette source de donn\u00e9es dans le r\u00e9pertoire collectors.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>php toolkit\/dump_tasks.php --task_name=\"Synchro \u00e9tablissements \u00e9ducation nationale\" &gt; collectors\/DataEducationCollector.class.inc.json<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p><em>Pour aller plus loin sur ce sujet, consultez notre\u00a0<a href=\"https:\/\/wiki.combodo.com\/doku.php?id=latest:advancedtopics:data_synchronization&amp;s%5B%5D=synchronization\">documentation officielle<\/a>.<\/em><\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Param\u00e9trage du collecteur<\/h4>\r\n\r\n\r\n\r\n<p>Nous devons pr\u00e9parer un fichier de param\u00e9trage pour l\u2019utilisation du collecteur.<\/p>\r\n<p>Dupliquez le fichier de configuration\u00a0<code>params.distrib.xml<\/code>\u00a0en le nommant\u00a0<code>params.local.xml<\/code>.<br \/>Mettez \u00e0 jour le fichier de param\u00e9trage avec vos param\u00e8tres comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-luminous-vivid-orange-color has-text-color\">conf\/params.local.xml<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n\r\n&lt;parameters&gt;\r\n  &lt;itop_url&gt;itop_server_url&lt;\/itop_url&gt;\r\n  &lt;itop_login&gt;your_login&lt;\/itop_login&gt;\r\n  &lt;itop_password&gt;your_password&lt;\/itop_password&gt;\r\n  &lt;itop_login_mode&gt;&lt;\/itop_login_mode&gt;\r\n\r\n  &lt;synchro_user&gt;admin&lt;\/synchro_user&gt;\r\n  &lt;contact_to_notify&gt;your_email&lt;\/contact_to_notify&gt;\r\n  \u2026<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Cr\u00e9ation de la classe collector<\/h4>\r\n\r\n\r\n\r\n<p>Cr\u00e9ation de la classe\u00a0<code>DataEducationCollector\u00a0<\/code>d\u00e9riv\u00e9e de la classe\u00a0<code>Collector<\/code>.<br \/>On v\u00e9rifie la pr\u00e9sence de\u00a0<code>curl\u00a0<\/code>et on initialise en supprimant les anciennes donn\u00e9es collect\u00e9es.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>DataEducationCollector.class.inc.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>class DataEducationCollector extends Collector\r\n{\r\n  \/** @var array education establishment data *\/\r\n  protected $aData = [];\r\n\r\n  \/** @var integer current process element *\/\r\n  protected $iCurrent;\r\n\r\n  \/** @var integer fetched elements count *\/\r\n  protected $idx;\r\n\r\n  \/**\r\n  * Constructor.\r\n  *\r\n  * @throws Exception\r\n  *\/\r\n  public function __construct()\r\n  {\r\n    parent::__construct();\r\n\r\n    \/\/ test curl presence\r\n    if(!function_exists('curl_version')){\r\n      throw new Exception('Curl is mandatory, check your PHP installation');\r\n    }\r\n\r\n    \/\/ initialization\r\n    $this-&gt;init();\r\n  }\r\n\r\n  \/**\r\n  * Initialization.\r\n  *\r\n  * @return void\r\n  *\/\r\n  private function init() : void\r\n  {\r\n    \/\/ remove data files\r\n    $this-&gt;RemoveDataFiles();\r\n  }\r\n}\r\n<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>On d\u00e9clare notre fonction principale pour l\u2019appel \u00e0 l\u2019API.<br \/>Cette m\u00e9thode retourne un bool\u00e9en pour signifier qu\u2019il reste des donn\u00e9es \u00e0 r\u00e9colter.<br \/>On it\u00e8re par paquets de 100 \u00e9l\u00e9ments (max d\u00e9finit par l\u2019API) et on se limite \u00e0 300 r\u00e9sultats pour l\u2019instant.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>DataEducationCollector.class.inc.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>class DataEducationCollector extends Collector\r\n{\r\n  \u2026\r\n  \/**\r\n  * Call rest api to acquire data.\r\n  *\r\n  * @return bool true if more data available\r\n  *\/\r\n  private function callRestApi() : bool\r\n  {\r\n    \/\/ open curl\r\n    $oCurl = curl_init();\r\n\r\n    \/\/ check limit\r\n    $limit = 100;\r\n    $max = 300;\r\n    if($this-&gt;iCurrent + $limit &gt; $max){\r\n      $limit = $max - $this-&gt;iCurrent;\r\n    }\r\n\r\n    \/\/ construct API url\r\n    $url = \"https:\/\/data.education.gouv.fr\/api\/v2\/catalog\/datasets\/fr-en-annuaire-education\/records?limit=$limit&amp;offset=$this-&gt;iCurrent\";\r\n\r\n    \/\/ curl options\r\n    curl_setopt($oCurl, CURLOPT_URL, $url);\r\n    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);\r\n    curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);\r\n\r\n    \/\/ execute\r\n    $aResult = json_decode(curl_exec($oCurl), true);\r\n    echo \"curl_exec: $url\\n\";\r\n    curl_close($oCurl);\r\n\r\n    \/\/ retrieve records\r\n    $this-&gt;aData = $aResult['records'];\r\n    $this-&gt;iCurrent += count($aResult['records']);\r\n\r\n    \/\/ processing flags\r\n    $hasMoreData = $this-&gt;iCurrent &lt; $aResult['total_count'];\r\n    $hasReachMax = $this-&gt;iCurrent &gt;= $max;\r\n\r\n    return $hasMoreData &amp;&amp; !$hasReachMax;\r\n  }\r\n}<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Le m\u00e9canisme de fond de la collecte.<br \/>On appelle la fonction pr\u00e9pare pour collecter un lot puis on d\u00e9pile les enregistrements de ce lots en les ajoutant dans des fichiers csv respectant une taille maximum de donn\u00e9es.<br \/>On recommence tant qu\u2019il y a des donn\u00e9es \u00e0 collecter.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>DataEducationCollector.class.inc.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>class DataEducationCollector extends Collector\r\n{\r\n  \u2026\r\n  \/**\r\n  * Prepare data.\r\n  *\r\n  * @return bool true if more data available\r\n  *\/\r\n  public function Prepare() : bool\r\n  {\r\n    \/\/ call rest API for new block of data\r\n    $this-&gt;idx = 0;\r\n    return $this-&gt;callRestApi(); \/\/ return true if more data available\r\n  }\r\n\r\n  \/**\r\n  * Fetch next block of data.\r\n  *\r\n  * @return bool|array current element data or false if no more data to fetch\r\n  *\/\r\n  public function Fetch()\r\n  {\r\n    \/\/ has something to fetch ?\r\n    if ($this-&gt;idx &lt; count($this-&gt;aData))\r\n    {\r\n      \/\/ next value to fetch\r\n      $aElement = $this-&gt;aData[$this-&gt;idx++]['record'];\r\n\r\n      \/\/ table conversion establishment private public enumeration\r\n      $tableConvPrivatePublicEnum = [\r\n        'Priv\u00e9' =&gt; 'private',\r\n        'Public' =&gt; 'public',\r\n        '' =&gt; 'unknown',\r\n      ];\r\n\r\n      return array(\r\n        'primary_key' =&gt; $aElement['id'],\r\n        'identifiant' =&gt; $aElement[\"fields\"]['identifiant_de_l_etablissement'],\r\n        'name' =&gt; $aElement[\"fields\"]['nom_etablissement'],\r\n        'org_id' =&gt; $this-&gt;aSynchroFieldsToDefaultValues['org_id'],\r\n        'address' =&gt; $aElement['fields']['adresse_1'],\r\n        'city' =&gt; $aElement['fields']['nom_commune'],\r\n        'postal_code' =&gt; $aElement['fields']['code_postal'],\r\n        'country' =&gt; 'France',\r\n        'status' =&gt; 'active',\r\n        'type' =&gt; $aElement['fields']['type_etablissement'],\r\n        'private_public' =&gt; $tableConvPrivatePublicEnum[$aElement['fields']['statut_public_prive']],\r\n        'code_academie' =&gt; $aElement['fields']['code_academie'],\r\n        'restauration' =&gt; $aElement['fields']['restauration'] == '' ? '0' : $aElement['fields']['restauration'],\r\n        'nombre_eleves' =&gt; $aElement['fields']['nombre_d_eleves'] == null ? 0 : $aElement['fields']['nombre_d_eleves'],\r\n        'date_ouverture' =&gt; $aElement['fields']['date_ouverture']\r\n      );\r\n    }\r\n\r\n    return false; \/\/ no more data to fetch\r\n  }\r\n\r\n  \/**\r\n  * Collect data.\r\n  *\r\n  * @return bool true if data has been collected\r\n  *\/\r\n  public function Collect($iMaxChunkSize = 0)\r\n  {\r\n    $idx = 0;\r\n\r\n    do{\r\n      \/\/ block preparation\r\n      $continue = $this-&gt;Prepare();\r\n\r\n      \/\/ fetch elements...\r\n      while ($aRow = $this-&gt;Fetch()) {\r\n        if (($idx == 0) || (($iMaxChunkSize &gt; 0) &amp;&amp; (($idx % $iMaxChunkSize) == 0))) {\r\n          $this-&gt;NextCSVFile();\r\n          $this-&gt;AddHeader($this-&gt;aColumns);\r\n        }\r\n        $this-&gt;AddRow($aRow);\r\n        $idx++;\r\n      }\r\n    }\r\n    while($continue); \/\/ next block\r\n\r\n    \/\/ cleanup\r\n    $this-&gt;Cleanup();\r\n\r\n    return $idx &gt; 0;\r\n  }\r\n}\r\n<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Inscription du collecteur<\/h4>\r\n\r\n\r\n\r\n<p>Nous allons \u00e0 pr\u00e9sent d\u00e9clarer notre nouveau collecteur \u00e0 l\u2019orchestrateur.<\/p>\r\n<p>Cr\u00e9ez un fichier<code>\u00a0main.php\u00a0<\/code>\u00e0 la racine du dossier collectors et initialisez le comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\">collectors\/main.php<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>Orchestrator::AddCollector(1, 'DataEducationCollector');<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Lancement de la synchronisation<\/p>\r\n\r\n\r\n\r\n<p>Vous pouvez \u00e0 pr\u00e9sent d\u00e9clencher la synchronisation avec la commande suivante.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>php .\\exec.php<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Naviguez dans le menu api.gouv.fr &gt; Etablissements \u00e9ducation nationale.<br \/>Vous devriez retrouver vos 300 \u00e9tablissements synchronis\u00e9s.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">4\/ Industrialisation de la solution<\/h3>\r\n\r\n\r\n\r\n<p>Nous souhaitons \u00e0 pr\u00e9sent finaliser notre solution en externalisant des param\u00e8tres de notre collecteur dans le fichier de param\u00e9trage.<\/p>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Ajout de param\u00e8tres<\/h4>\r\n\r\n\r\n\r\n<p>Ajoutez les membres de classe comme suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>DataEducationCollector.class.inc.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>class DataEducationCollector extends Collector\r\n{\r\n  const PRIMARY_KEY = 'primary_key';\r\n\r\n  \/** @var string rest API url *\/\r\n  protected $sRestUrl;\r\n\r\n  \/** @var integer rest results amount limit *\/\r\n  protected $iRestLimit;\r\n\r\n  \/** @var integer max elements to synchronize *\/\r\n  protected $iMaxElements;\r\n\r\n  \/** @var array data columns *\/\r\n  protected $aSynchroCols;\r\n\r\n  \/** @var array data translation *\/\r\n  protected $aSynchroTranslation;\r\n\r\n  \/** @var array default values *\/\r\n  protected $aSynchroDefaultValues;\r\n\r\n  \/** @var array class fields *\/\r\n  protected $aSynchroClassFields;\r\n  \u2026\r\n\r\n  \/**\r\n  * Initialization.\r\n  *\r\n  * @return void\r\n  *\/\r\n  private function init() : void\r\n  {\r\n    $this-&gt;iCurrent = 0;\r\n    $this-&gt;iMaxElements = -1;\r\n\r\n    \/\/ extract configuration values\r\n    $this-&gt;extractConfigurationValues();\r\n\r\n    \/\/ remove data files\r\n    $this-&gt;RemoveDataFiles();\r\n  }\r\n\r\n  \/**\r\n  * Extract configuration values.\r\n  *\r\n  * @return void\r\n  * @throws Exception\r\n  *\/\r\n  private function extractConfigurationValues() : void\r\n  {\r\n    \/\/ read configuration values\r\n    $aConfigurationValues = Utils::GetConfigurationValue(strtolower(get_class($this)));\r\n\r\n    \/\/ rest url\r\n    if (array_key_exists('rest_url', $aConfigurationValues)) {\r\n      $this-&gt;sRestUrl = $aConfigurationValues['rest_url'];\r\n    }\r\n\r\n    \/\/ rest limit\r\n    if (array_key_exists('rest_limit', $aConfigurationValues)) {\r\n      $this-&gt;iRestLimit = $aConfigurationValues['rest_limit'];\r\n    }\r\n\r\n    \/\/ max elements\r\n    if (array_key_exists('max_elements', $aConfigurationValues)) {\r\n      $this-&gt;iMaxElements = $aConfigurationValues['max_elements'];\r\n    }\r\n\r\n    \/\/ fields association\r\n    if (array_key_exists('class_fields', $aConfigurationValues)) {\r\n      $this-&gt;aSynchroClassFields = array(Self::PRIMARY_KEY =&gt; null);\r\n      $this-&gt;aSynchroClassFields = array_merge($this-&gt;aSynchroClassFields, $aConfigurationValues['class_fields']);\r\n      $this-&gt;aSynchroCols = array_keys($this-&gt;aSynchroClassFields);\r\n    }\r\n\r\n    \/\/ translation\r\n    if (array_key_exists('translations', $aConfigurationValues)) {\r\n      $this-&gt;aSynchroTranslation = $aConfigurationValues['translations'];\r\n      foreach ($this-&gt;aSynchroTranslation as $key =&gt; $aTranslation) {\r\n        $this-&gt;aSynchroTranslation[$key] = array_flip($this-&gt;aSynchroTranslation[$key]);\r\n      }\r\n    }\r\n\r\n    \/\/ default values\r\n    if (array_key_exists('defaults', $aConfigurationValues)) {\r\n      $this-&gt;aSynchroDefaultValues = $aConfigurationValues['defaults'];\r\n    }\r\n  }\r\n\r\n  \/**\r\n  * Call rest api to acquire data.\r\n  *\r\n  * @return void\r\n  * @throws Exception\r\n  *\/\r\n  private function callRestApi() : bool\r\n  {\r\n    \u2026\r\n    \/\/ check limit\r\n    $limit = $this-&gt;iRestLimit;\r\n    if($this-&gt;iCurrent + $this-&gt;iRestLimit &gt; $this-&gt;iMaxElements){\r\n      $limit = $this-&gt;iMaxElements - $this-&gt;iCurrent;\r\n    }\r\n\r\n    \/\/ construct API url\r\n    $url = \"$this-&gt;sRestUrl?limit=$limit&amp;offset=$this-&gt;iCurrent\";\r\n    \u2026\r\n  }\r\n\r\n  \/**\r\n  * Fetch next data.\r\n  *\r\n  * @return bool|array current element data or false if no more data to tech\r\n  *\/\r\n  public function Fetch()\r\n  {\r\n    \/\/ has something to fetch ?\r\n    if ($this-&gt;idx &lt; count($this-&gt;aData))\r\n    {\r\n      \/\/ next value to fetch\r\n      $aElement = $this-&gt;aData[$this-&gt;idx++]['record'];\r\n\r\n      \/\/ fetched data\r\n      $fetchedData = array();\r\n\r\n      \/\/ fill values\r\n      foreach ($this-&gt;aSynchroClassFields as $classField =&gt; $value) {\r\n        if($classField == Self::PRIMARY_KEY){\r\n          $fetchedData[$classField] = $aElement['id'];\r\n        }\r\n        else if(array_key_exists($value, $aElement[\"fields\"]) &amp;&amp; $aElement[\"fields\"][$value] != ''){\r\n          $fetchedData[$classField] = $this-&gt;getFieldValue($classField, $aElement[\"fields\"][$value]);\r\n        }\r\n        else{\r\n          $fetchedData[$classField] = $this-&gt;getFieldDefaultValue($classField);\r\n        }\r\n      }\r\n\r\n      return $fetchedData;\r\n    }\r\n\r\n    return false; \/\/ no more data to fetch\r\n  }<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">Versionner le collecteur<\/h4>\r\n\r\n\r\n\r\n<p>Cr\u00e9ez un fichier de d\u00e9claration de module \u00e0 la racine du dossier collectors et initialisez le come suit:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-color\" style=\"color: #7385b2;\"><strong>collectors\/module.gouv-api-collectors-extension.php<\/strong><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-codemirror-blocks-code-block code-block\">\r\n<pre>__FILE__, \/\/ Path to the current file, all other file names are relative to the directory containing this file\r\n'gouv-api-collectors-extension\/1.0.0',\r\narray(\r\n  \/\/ Identification\r\n  \/\/\r\n  'label' =&gt; 'api.gouv.fr API data synchronisation collectors',\r\n  'category' =&gt; 'business',\r\n\r\n  \/\/ Setup\r\n  \/\/\r\n  'dependencies' =&gt; array(\r\n    'gouv-api-extension\/1.0.0'\r\n  ),\r\n  'mandatory' =&gt; false\r\n  )\r\n);<\/pre>\r\n<\/div>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">5\/ Exercice en autonomie !<\/h3>\r\n\r\n\r\n\r\n<p>Lister les \u00e9tablissements AFPA de la France enti\u00e8re<br \/><a href=\"https:\/\/api.gouv.fr\/les-api\/api-annuaire-education\">https:\/\/api.gouv.fr\/documentation\/api_etablissements_publics<\/a><\/p>\r\n<p>Ajouter une nouvelle entr\u00e9e dans le menu lat\u00e9ral.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">6\/ Quizz<\/h3>\r\n\r\n\r\n\r\n<p>\u2013 Comment cr\u00e9er un squelette d\u2019extension rapidement ?<br \/>\ud83d\udd32 En la cr\u00e9ant avec un \u00e9diteur de texte<br \/>\ud83d\udd32 Gr\u00e2ce au pages du wiki<br \/>\ud83d\udd32 Avec une autre extension<\/p>\r\n<p>\u2013 Qu\u2019est-ce que la r\u00e9conciliation ?<br \/>\ud83d\udd32 La cl\u00e9 primaire d\u2019une classe<br \/>\ud83d\udd32 L\u2019affichage du nom intelligible d\u2019un objet<br \/>\ud83d\udd32 Un ou ensemble d\u2019attributs d\u2019identification<\/p>\r\n<p>\u2013 Ou sont d\u00e9finies les traductions des textes ?<br \/>\ud83d\udd32 Dans la balise class du mod\u00e8le de donn\u00e9e<br \/>\ud83d\udd32 Dans la balise dictionaries du mod\u00e8le de donn\u00e9e<br \/>\ud83d\udd32 Dans la fonction Dict::Add en PHP<\/p>\r\n<p>\u2013 Comment installer son extension ?<br \/>\ud83d\udd32 Avec iTop hub<br \/>\ud83d\udd32 En ex\u00e9cutant un script d\u2019installation<br \/>\ud83d\udd32 En pla\u00e7ant l\u2019extension dans le dossier extensions du serveur iTop.<\/p>\r\n<p>\u2013 Comment donner une version \u00e0 son collecteur<br \/>\ud83d\udd32 En nommant le dossier avec la version<br \/>\ud83d\udd32 En cr\u00e9ant un fichier module<br \/>\ud83d\udd32 En le sauvegardant sous Git<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>This example shows how to synchronise data with iTop. The aim is to synchronise National Education institutions with iTop.<br \/>\nBy following this tutorial, you will understand how to structure data, create an extension and a collector to implement this collection.<\/p>\n","protected":false},"author":25,"featured_media":6344,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","content-type":"","footnotes":""},"categories":[130],"tags":[133,143],"class_list":["post-8092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-itop-fr","tag-cmdb-fr","tag-integration-fr"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Comment synchroniser des donn\u00e9es dans iTop avec une API REST<\/title>\n<meta name=\"description\" content=\"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment synchroniser des donn\u00e9es dans iTop avec une API REST\" \/>\n<meta property=\"og:description\" content=\"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/\" \/>\n<meta property=\"og:site_name\" content=\"iTop\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-13T12:16:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-13T13:17:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"330\" \/>\n\t<meta property=\"og:image:height\" content=\"220\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Benjamin Dalsass\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benjamin Dalsass\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/\"},\"author\":{\"name\":\"Benjamin Dalsass\",\"@id\":\"https:\\\/\\\/combodo.com\\\/#\\\/schema\\\/person\\\/8ea08664874cf0db44a8a20398ebee8f\"},\"headline\":\"La collecte de donn\u00e9es avec iTop en action\",\"datePublished\":\"2023-04-13T12:16:11+00:00\",\"dateModified\":\"2026-03-13T13:17:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/\"},\"wordCount\":2107,\"publisher\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/collecte-donnees-1.png\",\"keywords\":[\"CMDB\",\"Int\u00e9gration\"],\"articleSection\":[\"iTop\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/\",\"url\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/\",\"name\":\"Comment synchroniser des donn\u00e9es dans iTop avec une API REST\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/collecte-donnees-1.png\",\"datePublished\":\"2023-04-13T12:16:11+00:00\",\"dateModified\":\"2026-03-13T13:17:55+00:00\",\"description\":\"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#primaryimage\",\"url\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/collecte-donnees-1.png\",\"contentUrl\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/collecte-donnees-1.png\",\"width\":330,\"height\":220},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/combodo.com\\\/fr\\\/itop-fr\\\/synchronisation-api-rest-itop\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/combodo.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"La collecte de donn\u00e9es avec iTop en action\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/combodo.com\\\/#website\",\"url\":\"https:\\\/\\\/combodo.com\\\/\",\"name\":\"iTop, easy service management\",\"description\":\"Easy service management\",\"publisher\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/combodo.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/combodo.com\\\/#organization\",\"name\":\"iTop\",\"url\":\"https:\\\/\\\/combodo.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/combodo.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/yoast-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/combodo.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/yoast-logo.jpg\",\"width\":696,\"height\":696,\"caption\":\"iTop\"},\"image\":{\"@id\":\"https:\\\/\\\/combodo.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/iTopByCombodo\",\"https:\\\/\\\/www.youtube.com\\\/@itopbycombodo1800\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/combodo.com\\\/#\\\/schema\\\/person\\\/8ea08664874cf0db44a8a20398ebee8f\",\"name\":\"Benjamin Dalsass\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g\",\"caption\":\"Benjamin Dalsass\"},\"url\":\"https:\\\/\\\/combodo.com\\\/fr\\\/author\\\/benjamin-dalsass\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Comment synchroniser des donn\u00e9es dans iTop avec une API REST","description":"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment synchroniser des donn\u00e9es dans iTop avec une API REST","og_description":"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.","og_url":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/","og_site_name":"iTop","article_published_time":"2023-04-13T12:16:11+00:00","article_modified_time":"2026-03-13T13:17:55+00:00","og_image":[{"width":330,"height":220,"url":"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png","type":"image\/png"}],"author":"Benjamin Dalsass","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Benjamin Dalsass","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#article","isPartOf":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/"},"author":{"name":"Benjamin Dalsass","@id":"https:\/\/combodo.com\/#\/schema\/person\/8ea08664874cf0db44a8a20398ebee8f"},"headline":"La collecte de donn\u00e9es avec iTop en action","datePublished":"2023-04-13T12:16:11+00:00","dateModified":"2026-03-13T13:17:55+00:00","mainEntityOfPage":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/"},"wordCount":2107,"publisher":{"@id":"https:\/\/combodo.com\/#organization"},"image":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#primaryimage"},"thumbnailUrl":"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png","keywords":["CMDB","Int\u00e9gration"],"articleSection":["iTop"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/","url":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/","name":"Comment synchroniser des donn\u00e9es dans iTop avec une API REST","isPartOf":{"@id":"https:\/\/combodo.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#primaryimage"},"image":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#primaryimage"},"thumbnailUrl":"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png","datePublished":"2023-04-13T12:16:11+00:00","dateModified":"2026-03-13T13:17:55+00:00","description":"Apprenez \u00e0 synchroniser des donn\u00e9es externes dans iTop avec une API REST et un data collector. Tutoriel complet avec l\u2019API api.gouv.fr.","breadcrumb":{"@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#primaryimage","url":"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png","contentUrl":"https:\/\/combodo.com\/wp-content\/uploads\/2023\/04\/collecte-donnees-1.png","width":330,"height":220},{"@type":"BreadcrumbList","@id":"https:\/\/combodo.com\/fr\/itop-fr\/synchronisation-api-rest-itop\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/combodo.com\/fr\/"},{"@type":"ListItem","position":2,"name":"La collecte de donn\u00e9es avec iTop en action"}]},{"@type":"WebSite","@id":"https:\/\/combodo.com\/#website","url":"https:\/\/combodo.com\/","name":"iTop, easy service management","description":"Easy service management","publisher":{"@id":"https:\/\/combodo.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/combodo.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/combodo.com\/#organization","name":"iTop","url":"https:\/\/combodo.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/combodo.com\/#\/schema\/logo\/image\/","url":"https:\/\/combodo.com\/wp-content\/uploads\/2025\/06\/yoast-logo.jpg","contentUrl":"https:\/\/combodo.com\/wp-content\/uploads\/2025\/06\/yoast-logo.jpg","width":696,"height":696,"caption":"iTop"},"image":{"@id":"https:\/\/combodo.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/iTopByCombodo","https:\/\/www.youtube.com\/@itopbycombodo1800"]},{"@type":"Person","@id":"https:\/\/combodo.com\/#\/schema\/person\/8ea08664874cf0db44a8a20398ebee8f","name":"Benjamin Dalsass","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d94c47775636f0fc54348f4eeccf09f2675e68c324dcb60c1ac13fc0dcab3e98?s=96&d=mm&r=g","caption":"Benjamin Dalsass"},"url":"https:\/\/combodo.com\/fr\/author\/benjamin-dalsass\/"}]}},"_links":{"self":[{"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/posts\/8092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/comments?post=8092"}],"version-history":[{"count":0,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/posts\/8092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/media\/6344"}],"wp:attachment":[{"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/media?parent=8092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/categories?post=8092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/combodo.com\/fr\/wp-json\/wp\/v2\/tags?post=8092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}