Lecture 3 minutes
Les champs Url sont généralement voués à faire référence à des sites Web mais il peut arriver aussi que l’on ait à les utiliser dans un but différent : référence à un document partagé sur un réseau, \\partage\répertoire\fichier.pdf accès à un FTP, etc …
Un problème lié au préfixe de l’Url par un protocole
En fonction de notre contexte, un champ de type Url ne présente donc pas forcement une ressource accessible au travers de l’HTTP. De manière standard, Sugar propose de concaténer votre « site Web » avec le protocole HTTP si aucun protocole n’a été renseigné. Afin d’illustrer, il se peut que des utilisateurs soient confrontés à ce genre de situations :
– On renseigne des informations sur un site lambda
Donnée :
monsite.com
résultat :
http://monsite.com
– On renseigne l’adresse d’un site accessible par HTTPS
Donnée :
https://monsite.com
résultat :
https://monsite.com
– On renseigne un emplacement réseau accessible par d’autres utilisateurs
Donnée :
\\monpartage\répertoire
résultat :
http://\\monpartage\répertoire
Aïe ! Il suffit de regarder comment fonctionne le contrôleur du champ pour comprendre ce qui ne va pas dans le cas de figure numéro 3 : clients/base/fields/url/url.js
1 2 3 4 5 6 7 8 |
... format:function(value){ if (value && !value.match(/^([a-zA-Z]+):\/\//)) { value = "http://" + value; } return value; }, ... |
Ma référence au partage réseau « \\… » ne remplit pas les critères de la regexp contrairement au lien sécurisé qui contient « https://…« . Ma valeur est donc concaténée pour faire référence à de l’HTTP.
Détourner sans casser !
La solution qui a permis de résoudre notre problème c’est de mettre en place un moyen de passer outre la fonction « format » standard lorsqu’on le souhaite.
Première étape, on prépare un paramètre
skip_format dans les vardefs de nos champs de type Url qui pourra être interprété par la suite dans notre code :
1 |
$dictionary['Account']['fields']['mon_champ_type_url']['skip_format'] = true; |
Nous pouvons maintenant ré-écrire le comportement du format
en nous appuyant sur cette valeur afin de « débrayer » cette concaténation seulement quand on en a besoin (quand cela est indiqué par le vardef du champ) :
custom/clients/base/fields/url/url.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
({ extendsFrom: 'UrlField', format: function(value) { // On récupère notre flag depuis la définition du champ courant var skipFormat = _.isUndefined(this.def.skip_format) ? false : this.def.skip_format; // On fait appel à la logique parente en fonction du flag if(!skipFormat) { return this._super('format', arguments); } return value; } }) |
C’est aussi simple que cela, de même que cette logique est applicable dans plusieurs situations. Il s’agit là principalement de savoir comment faire un « override » d’un contrôleur JS et d’avoir déjà manipulé des vardefs.