Salut !
Ton problème est lié à Dojo et à la serialization JSON effectuée !
Les composants DateTextBox et TimeTextBox travaillent en interne avec une propriété value de type javascript Date.
Or quand tu appelles
dojo.toJson(arguments[0], true))
arguments[0] vaut en fait this.getValues(), soit un objet de la forme
1 2 3 4
| {
nom_du_champ: valeur_associée,
...
} |
C'est donc cela que tu serializes via JSON.
Or malheureusement la serialization via JSON serialize les propriétés de l'objet mais ici les objets JS Date (pour rappel les valeurs de propriétés des champs date et time) en sont dépourvus... donc tu obtiens une serialization avec des valeurs vides.
Dojo a prévu cet écueil en cela que si un élément à sérializer dispose d'une fonction "json" (ou "__json__") alors c'est celle-ci qu'il appellera prioritairement.
Une solution simple à ton problème (mais pas parfaite, plutôt sale j'en conviens) est d'ajouter directement au prototype de l'objet Date cette fonction. Cela donnera donc:
//à ajouter par ex après les dojo.require(...)
Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this);};
Le résultat de la serialization est alors le suivant (heure sélectionnée -> 17H30):
1 2 3 4 5 6 7 8 9
| {
"name":"nom",
"loc":"Paris",
"sdate":"2009-01-06T00:00:00+01:00",
"edate":"2009-01-26T00:00:00+01:00",
"time":"1970-01-01T17:30:00+01:00",
"desc":
"erze"
} |
Les controles dates sont inscrits au format ISO, et les heures aussi... mais alors basées sur le 01/01/1970... car elle n'ont pas de "vraie" date associée . Mais tu as ainsi les heures.
Note que si tu as uniquement des dates, tu peux écrire plutôt ceci:
Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
ce qui donnera alors des dates au format YYYY-MM-JJ.
Finalement si tu as surtout des dates et exceptionnellement des heures je te conseille de faire un mix des 2 sous cette forme:
1) ajouter pour gérer le bon format des dates:
Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
2) dans la div du formDialog inscris:
1 2 3
| execute="alert('submitted w/args:\n' +
dojo.toJson(dojo.mixin(arguments[0],{ time: dijit.byId('time').attr('displayedValue')}), true)
);" |
dojo.mixin permet de ... mixer 2 objets, ce qu'on fait ici en remplaçant la propriété "time" renvoyée initialement avec la donnée de type Date par le contenu (displayedValue) de la zone
de texte.
Amuse toi bien avec Dojo car globalement c'est un très bon produit qui a beaucoup progressé et dont la philisophie très intéressante est différente de Prototype ou jQuery, même si on retrouve globalement dans le core les mêmes fonctionnalités.
Manu
Partager