diff --git a/administration/guide_developpeur/filtres_couches.md b/administration/guide_developpeur/filtres_couches.md index 2f03d88a0e8c2b17f8f62c26061043319d5d8673..dc2ca55e8ff0a8de8ac11e8f7c9bd519afce14ab 100644 --- a/administration/guide_developpeur/filtres_couches.md +++ b/administration/guide_developpeur/filtres_couches.md @@ -51,4 +51,176 @@ Après avoir mis à jour le calque, une nouvelle section "Formulaire de filtre" # Autres exemples d'utilisation des filtres dans vMap -Section en cours de rédaction.. +## 1 - Filtre textuelle non obligatoire et fonctionnement similaire au LIKE sql + +Dans le studio il faudra définir un champs de type texte ou une liste déroulante avec une source de données adaptée. + +Il faudra définir votre filtre pour qu'il utilise une valeur par défaut qui permettra de court-circuiter le vrai filtre. (Dans le cas présent **'empty'**) + +Si vous voulez un fonctionnement plus proche d'un LIKE SQL qu'une concordance parfaite utilisez **~** à la place de **=**. (voir exemple ci-dessous) + +``` + FILTER (([type] = '%type%' or '%type%' = 'empty') and ([liketext] ~ '%liketext%' or '%liketext%' = 'empty') + VALIDATION + 'type' '^empty|value_type_1|value_type_2|value_type_3$' + 'liketext' '^empty|.{1,}$' + 'default_type' 'empty' + 'default_liketext' 'empty' + END +``` + +## 2 - Filtre sur une colonne de type date/timestamp + +Pour filtrer sur un attribut unique de type date/timestamp référez vous à la documentation de MapServer http://mapserver.org/ogc/wms_time.html. + +## 3 - Filtre sur plusieurs colonnes de type date/timestamp + +Vue que la spécification d'un champs de type date/timestamp se fait dans la partie **METADATA**, il est impossible pour MapServer de traiter deux champs de ce type en théorie. + +En réalité par un moyen détourné il est possible de géré autant de champs date/timestamp que vous voulez. + +Pour l'exemple je vais prendre trois champs en base creation_date (date de création d'un objet, type postgres timestamp with time zone), date_debut_travaux (une date de début de travaux pour un objet métier par exemple, type timestamp with time zone), duree_travaux_jour (la durée des travaux en jours, type integer) + +### a - Adapter votre vue + +On suppose que vous avez une vue postgres/postgis qui retourne déjà ces attributs. Pour permettre à MapServer de les traiter comme des entiers il va falloir que la vue retourne des entiers. +Exemple de code permettant de faire cela : + +```sql + date_part('epoch'::text, table.creation_date)::integer AS mstmstp_creation_date, + date_part('epoch'::text, table.date_debut_travaux)::integer AS mstmstp_date_debut_travaux, + date_part('epoch'::text, table.date_debut_travaux + table.duree_travaux_jour * '1 day'::interval)::integer AS mstmstp_date_fin_travaux +``` + +### b - Adapter votre formulaire avec le studio + +Ajouter les champs dates que vous voulez. Dans le cas présent on va laisser la possibilité de prendre une date au dessus, en dessous, ou d'encadrer la/les date(s). +Pour chaque champs date il faut un champ caché. Le champs date va renvoyer une valeur formaté du type 'DD/MM/YYYY' ou 'YYYY-MM-DD', mais nous voulons un timestamp. Nous allons voir dans la prochaine partie comment utilisé un champ date pour remplir un champs caché avec un timestamp. + + + + +### c - Permettre au formulaire de calculé les timestamps + +Il va falloir ajouter du code javascript spécifique à ce formulaire. Pour ce faire il va falloir changer de mode d'utilisation du studio, pour pouvoir éditer du javascript. + + + +Vous allez arriver devant un champ vide. + +Voici le code permettant de remplir les champs cachés avec les timestamps saisie dans les champs dates pour l'exemple : + +```javascript +/* global angular, goog, moment, vitisApp, bootbox */ + +// goog fonctionne en mode décompilé mais pas en mode compilé + +console.info("filtre_mapserver_couche_NOM loaded --> your functions are ready"); +/*********************************************************************************** + filtre_mapserver_couche_NOM Javascript + ***********************************************************************************/ + +var oFormRequired = { + "sUrl": "", + "scope_": {}, + "toDestructor": [] +}; +/** + * constructor_form + * Fonction appelée à l'initialisation du formulaire + * @param {type} scope + * @param {type} s_url + * @returns {undefined} + */ +var constructor_form = function (scope, s_url) { + ////////////////////////////////////////////////////////// + //Ne pas toucher + //console.log("Constructor"); + + oFormRequired.sUrl = s_url; + oFormRequired.scope_ = scope; + ////////////////////////////////////////////////////////// + console.log(oFormRequired.scope_); + + var formaterStringFrom = "DD/MM/YYYY"; + var formaterStringTo = "X"; // timestamp UNIX + oFormRequired.toDestructor.push(oFormRequired.scope_.$watch("oFormValues." + oFormRequired.scope_.sFormDefinitionName + ".creation_date_min_viz", function (value) { + if (typeof(value) !== "undefined" && value !== "") { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["creation_date_min"] = moment(value, formaterStringFrom).format(formaterStringTo); + } else { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["creation_date_min"] = null; + } + }) + ); + oFormRequired.toDestructor.push(oFormRequired.scope_.$watch("oFormValues." + oFormRequired.scope_.sFormDefinitionName + ".creation_date_max_viz", function (value) { + if (typeof(value) !== "undefined" && value !== "") { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["creation_date_max"] = moment(value, formaterStringFrom).format(formaterStringTo); + } else { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["creation_date_max"] = null; + } + }) + ); + oFormRequired.toDestructor.push(oFormRequired.scope_.$watch("oFormValues." + oFormRequired.scope_.sFormDefinitionName + ".tavaux_date_min_viz", function (value) { + if (typeof(value) !== "undefined" && value !== "") { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["travaux_date_min"] = moment(value, formaterStringFrom).format(formaterStringTo); + } else { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["travaux_date_min"] = null; + } + }) + ); + oFormRequired.toDestructor.push(oFormRequired.scope_.$watch("oFormValues." + oFormRequired.scope_.sFormDefinitionName + ".tavaux_date_max_viz", function (value) { + if (typeof(value) !== "undefined" && value !== "") { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["travaux_date_max"] = moment(value, formaterStringFrom).format(formaterStringTo); + } else { + oFormRequired.scope_["oFormValues"][oFormRequired.scope_["sFormDefinitionName"]]["travaux_date_max"] = null; + } + }) + ); + +}; +/** + * destructor_form + * Fonction appelée quand on quitte le formulaire (ne pas modifier) + * @returns {undefined} + */ +var destructor_form = function () { + console.log("Destructor"); + + for (var i = 0; i < oFormRequired.toDestructor.length; i++) { + oFormRequired.toDestructor[i] = undefined; + delete oFormRequired.toDestructor[i]; + } + + //supprimer la balise script du js pour pouvoir le recharger si on revient sur le formulaire plus tard + angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove(); + + oFormRequired = undefined; + delete oFormRequired; + + constructor_form = undefined; + delete constructor_form; + destructor_form = undefined; + delete destructor_form; +}; +/**********************************************************************************/ +``` + +Ce code créer un instance pour surveiller les chagement des champs dates (**$watch**) et utilise une librairie intégré à Vitis (**moment.js**) pour parser la date, la transformer en timestamp Unix et stocké le résultat dans le champ caché. + +### d - Intégration du filtre dans la couche MapServer + +``` + FILTER (([mstmstp_date_debut_travaux] < '%travaux_date_max%' or [mstmstp_date_fin_travaux] < '%travaux_date_max%' or '%travaux_date_max%' = '0') and ([mstmstp_date_debut_travaux] < '%travaux_date_min%' or [mstmstp_date_fin_travaux] < '%travaux_date_min%' or '%travaux_date_min%' = '0') and ([mstmstp_creation_date] < '%travaux_date_max%' or '%travaux_date_max%' = '0') and ([mstmstp_creation_date] > '%creation_date_min%' or '%creation_date_min%' = '0')) + + VALIDATION + 'creation_date_max' '^[0-9]{1,}$' + 'creation_date_min' '^[0-9]{1,}$' + 'travaux_date_max' '^[0-9]{1,}$' + 'travaux_date_min' '^[0-9]{1,}$' + 'default_creation_date_max' '0' + 'default_creation_date_min' '0' + 'default_travaux_date_max' '0' + 'default_travaux_date_min' '0' + END + +``` \ No newline at end of file diff --git a/images/filtres_couches_exemples_1.jpg b/images/filtres_couches_exemples_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3addbc4f9f7aee45cefb9f6050d06245e71b3413 Binary files /dev/null and b/images/filtres_couches_exemples_1.jpg differ diff --git a/images/filtres_couches_exemples_2.jpg b/images/filtres_couches_exemples_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60cb7e9b0f22eab9da0134fc3ae40f7262a58de8 Binary files /dev/null and b/images/filtres_couches_exemples_2.jpg differ