rss

Des cyclistes encore plus gênants ?

Des cyclistes encore plus gênants ? Oui en oubliant ce titre un peu provocateur, c'est ce que l'on peut lire dans le dossier JDN de la Villes high-tech (source de l'info sur ecofriend.org.)


Une bonne idée que d'ajouter autour du cycliste un halo lumineux avec un capteur de distance. Le système est alimenté par une dynamo.




Cerise sur le gâteau : si l'automobiliste se rapproche de trop, alors le système klaxonne !



Sous réserve que les cyclistes respectent le code de la route... cette innovation semble prometeuse.

ExtJS - Ext.data.Store - traitement d'exception pour un service JSON

Aujourd'hui, voici un mini tutoriel permettant de comprendre comment gérer un retour en erreur pour un appel de service JSON depuis un client JavaScript utilisant ExtJS API doc..

Personnellement, je trouve qu'ExtJS est assez bien documenté pour les cas nominaux, mais manque cruellement d'exemples dans le cas des traitements d'exception. C'est dommage car on le sait bien, les cas nominaux ne sont pas toujours au rendez-vous ;)

Dans ce mini tutoriel, un service "getUsers" permet de retourner une liste d'utilisateurs (il peut être implémenté en PHP par exemple, mais ce n'est pas l'objet de ce tutorial).

Voici un exemple de retour fait par ce service lorsqu'aucune erreur ne survient :
{
"results":4,
"rows":
[{"id":"1",
"login":"brice",
"date_inscription":"2009-02-10 14:20:00",
"fullname":"Brice"},
{"id":"10",
"login":"toto",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto"},
{"id":"11",
"login":"toto2",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto2"},
{"id":"13",
"login":"toto4",
"date_inscription":"2009-10-28 09:10:00",
"fullname":"toto4"}],
"success":true
}
A noter : dans cet exemple, 4 utilisateurs sont retournés sous le noeud "rows", et la propriété "success" vaut "true".

Voici le retour du même service lorsqu'une erreur survient (ie. Base de donnée injoignable) :
{
"results":1,
"success":false,
"errors":[
{"id":"500",
"msg":"Erreur de connexion à la base de donnée."
}]
}
A noter : dans cet exemple, 1 exception a été levée et traduite sous la forme d'un message d'erreur (id="500", msg="Erreur de connexion à la base de donnée."), et la propriété "success" vaut "false".

Voici maintenant comment gérer ces 2 types de retour côté client à l'aide d'ExtJS :
var dateFormat = 'Y-m-d G:i:s';
// ancienne valeur par defaut : 'm/d/Y'
// dateFormat correspond a une date
// de la forme : "2009-10-28 10:10:00"

var myStore = new Ext.data.Store({
url: 'http://localhost/getUsers.php5', // URL du service JSON
title: 'TOTO',
reader: new Ext.data.JsonReader({ // Reader JSON
idProperty: 'id',
root: 'rows',
totalProperty: 'results',
successProperty:'success',
fields: [
{name: 'id'},
{name: 'login'},
{name: 'date_inscription',
type: 'date',
dateFormat: dateFormat},
{name: 'fullname'}
]
})
});
A noter : dans cet exemple, on déclare l'Ext.data.Storedoc "myStore" qui va faire appel au service ('getUsers.php5'), et va lire le résultat grâce à un analyseur JSON (JSONReaderdoc). La lecture sera considérée comme un succès si la propriété "success" vaut "true". La manière d'interpréter les différents champs est également décrite.

On va également implémenter un analyseur JSON (JSONReader) capable d'interpréter un retour en erreur :
var errorReader = new Ext.data.JsonReader({
idProperty: 'id',
root: 'errors',
totalProperty: 'results',
fields: [
{name: 'id'},
{name: 'msg'}
]
});
A noter : dans cet exemple, la structure JSON lue doit posséder le nombre d'erreur sous "results" et les différentes erreurs sous la racine "errors". Ici une erreur comporte 2 champs : un "id" et un "msg".


Il convient ensuite de déclarer une méthode de traitement d'erreur de la manière suivante :
myStore.on('exception', usrException);
A noter : dans cet exemple, on indique pour myStore que sur réception de l'évènement "exception", un appel à la méthode "usrException(...)" doit être fait. Dans la version 3 d'ExtJSdoc, l'évènement "loadexception" est indiqué comme obsolète (deprecated) et ne doit donc plus être utilisé.

Voici maintenant comment interpréter le retour en erreur lors de l'appel au service :
function usrException(dataProxy, type, action, options, response) {
// alert('usrException type=' + type
// + ' action=' + action
// + ' response.status=' + response.status);
if (type == 'response' && action == 'read' && response.status == 200) {
var rs = errorReader.read(response);
if(rs.records) {
for(var i = 0, len = rs.records.length; i < len; i++) {
var r = rs.records[i];
alert("Erreur de chargement ERR"
+ r.data.id + ":" + r.data.msg);
}
}
} else if (type == 'response' && action == 'read') {
alert("Connexion impossible au serveur ("
+ response.status +")");
}
}
A noter : dans cet exemple, on traite un cas d'erreur sur lecture du résultat. On utilise l'analyseur d'erreur précédemment évoqué pour interpréter le retour d'erreur de service en JSON et afficher une alerte sur chaque erreur lue.

Enfin, il ne manque plus que l'appel à "myStore" permettant de lancer le service :
myStore.load();


Si l'appel au service "getUsers" se passe correctement, alors le store pourra afficher le resultat au sein d'un Ext.grid.GridPanel par exemple, sinon la méthode "usrException" sera invoquée.

Ce mini tutoriel peut sûrement être complété, ou bien si vous avez une autre solution, je suis preneur !

En attendant, à vous de jouer!

HTML, IE : window.onload et menu fixe

Bonjour,
alors aujourd'hui, je vais faire un petit peu de publicité pour 2 sites qui permettent de répondre encore une fois à la problématique de compatibilité entre navigateurs.


window.onload
Ce premier point concerne l'appel à une méthode JavaScript lorsqu'une page HTML a été complètement chargée par le navigateur. Je pensais (trop naïvement) que "window.onload" était assez standard pour passer sur tous les navigateurs... ! Et bien il semble que non !

Alors pour résoudre ce problème, rendez-vous sur ce post de septembre 2005 qui m'a été fort utile..

Vous y trouverez le code à copier dans le HEAD :

<script type="text/javascript">
/* for Mozilla */
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
document.write("<script defer src=js/ie_onload.js><"+"/script>");
/*@end @*/

/* for other browsers */
window.onload = init;

function init() {
alert('ok');
}
</script>


Dans cet exemple, il vous faut également mettre la ligne suivante dans le fichier "js/ie_onload.js" :

init();



menu fixe

Aujourd'hui, j'ai également découvert une page relatant le problème souvent évoqué que de faire pour une page Web, une portion de page fixe (ie. un menu) quelquesoit le contenu et la position de l'ascenseur.

Rendez-vous sur cette page composante du site de batra3.

Ses exemples fonctionnent également sous IE. A priori la parade trouvée ne devait pas être simple ! merci à lui!

Mots clés du blog

10.1 4G acceptancetest adb androï Android androïd Android7 api appender appengine application applications archive array assistantematernelle astuce auth0 authentication authority automation Axis bash bearer blog boot bootloader bower build bundle c calendrier camille combal cdi certificate cf client cloudfoundry collaboratif command commandes connexion console css cyanogen decrypt démasquées démasquer développement dll dump easter eggs écologie écrit employeur EMUI EMUI5.0 encrypt enfant évènement export-package ExtJS fab fastboot fiche find firefox gadget galaxytab gelf gem git gmail gnupg gooelappengine google gparted gpg gpg2 gps graylog grenoble Grid gui harddrive heroku hover howto HTML http https IE ihm immobilier imprimante innovation insolite instance integration Java JavaScript jenkins jeu jobs json json-schema-validator key keystore labs linux livre log log4j logger logs lombok masquées masquer maven maven-gae-plugin Mémoire microsoft mobile mockito mondialisation monitor MUSE musique en ligne myopera nodejs npm NT NTEventLogger onglet openstack osgi paas package parameters parent php politique prosyst prototype proxies proxy quartz radio rappel recherche regex repository resize RIA ridge rock ROM route ruby rubygems s8500 samsung scheduler scm secret secure sel selenium Serializer server shared shell sign signature slf4j smartphone so société song spy ssh ssl struct swagger swig tâches téléphone téléréalité test thunderbird timeout token Tomcat tooltip tooltips truststore TWRP ubuntu unit test validator verify virgin virtualbox wave waze web WebApp wiki wikimedia wikipédia wikipen wiko windows windows10 yahoo youtube yum