Imaginez que vous disposez, sur l’une de vos applications, une page de type " tableau de bord ". Les différentes statistiques ne sont pas calculées à l’ouverture de la page mais prés calculées par un agent programmé toutes les heures. Ceci afin d’éviter de trop lourd calcul à chaque visualisation.
Jusque là tout va bien sauf que le gestionnaire de votre application à la bonne idée de vous demander un « bouton » sur cette page lui permettant de mettre à jours lui même ces statistiques.
Pour réaliser le souhait de votre utilisateur vous avez deux solutions.
<input type="button" onclick="window.location.href=‘nomAgent?OpenAgent’”>
Le premier problème c’est que le navigateur va rester figé durant l’exécution de l’agent car rien ne lui est renvoyé par le serveur avant la fin de tous ses traitements. De plus une fois le traitement réalisé on va se retrouver devant une belle page blanche avec un gros « Agent exécuté ».
.De plus on contrôle la fin d’exécution de l’agent et on peut ainsi choisir de recharger la page par exemple.
Côté HTML on crée tout d’abord un bouton ainsi qu’un block div pour l’indicateur ajax :
<input type="button" id="btUpdateStatistics" onclick="updateStatistics()" value="Mettre à jour statistiques"> <span id="Indicateur" style="display:none"><img src="Indicator.gif"></span>
Voici le code côté Javascript à placer avant le bouton :
Votre bouton sera donc désactivé pendant le traitement de l’agent et l’indicateur Ajax apparaîtra.// Création de l'handler ou l’on va gérer // l’apparition de l’indicateur d’activité // ainsi que l’activation/désactivation du bouton. var myGlobalHandlers = { onCreate: function(){ $('btUpdateStatistics').disabled = true; Element.show('Indicateur'); }, onComplete: function() { if(Ajax.activeRequestCount == 0){ $('btUpdateStatistics').disabled = false; Element.hide('Indicateur'); } } }; Ajax.Responders.register(myGlobalHandlers); var opt = { // Use POST method: 'get', // Handle successful response. Here we reload the current location onSuccess: function(t) { window.location.reload(); }, // Handle 404 on404: function(t) { alert('Error 404: location "' + t.statusText + '" was not found.'); }, // Handle other errors onFailure: function(t) { alert('Error ' + t.status + ' -- ' + t.statusText); } } function updateStatistics(){ if(Ajax.activeRequestCount == 0){ new Ajax.Request('nomAgent?OpenAgent', opt); } }

Voici donc comment simplement faire appel à vos agents via le web sans créer d’agent spécifique.
UPDATE :
Comme vous l'aurez deviné, ne pas oublier d'insérer la bibliothèque Prototype.js à votre page.
1. YoGi
07/11/2006 02:18:49
Rho. Tu sais, tu peux rediriger l'utilisateur à l'issu du traitement de ton agent, pourquoi pas vers la page de consultation du tableau de bord (print "[/mabase.nsf/...]" à la fin).
De même que ta page courante va rester affichée tant que la réponse du serveur ne sera pas arrivée. Ce qui te permet par exemple d'y faire appraître un indicateur qui n'existait pas avant :)
2. julien
07/11/2006 07:26:11
Oui effectivement mais pour cela il faut modifier ton agent schédulé pour insérer ton print. Ton admin va pas être super ravis d'avoir des logs à la noix lors de l'exécution par programation de cet agent. De plus il faut aussi savoir d'ou sera appelé ton agent pour que le print recharge la page courante (si tu veux l'appeler de plusieurs page bonjour le cauchemard...). Là tu vas me dire que tu peux insérer du JS dans le print pour faire un history.back mais faut pas pousser... la bidouille a ses limites.
Tu peux aussi créer un agent qui appelle ton agent mais niveau conception c'est pas terrible.
Et puis tu dis que la page vas rester affichée mais figée avec le sablier et en attente du retour de l'agent. C'est pas trés... comment dire... Web 2.0 tout ça 
3. Renaud
07/11/2006 07:59:50
Tu as raison Julien, c'est pas très web 2.0 tout ça mais c'est surtout que YoGI adore contredire, il est très taquin comme garçon ;)
4. YoGi
07/11/2006 08:13:57
Mais euh, un print vers un agent appelé via une URL, ça print vers l'user, pas dans les logs, non ?!
Et si ta destination peut changer, suffit de la passer dans l'URL :) toto?Openagent&redirect=/mabase.nsf/...
Quant à la page qui se fige plus ou moins, effectivement il n'y a probablement pas grand chose à faire (et je rajoute à ma liste des définitions du web 2.0 : web 2.0 c'est une page qui ne se fige pas :D)
5. julien
07/11/2006 08:43:48
"Mais euh, un print vers un agent appelé via une URL, ça print vers l'user, pas dans les logs, non ?!" --> oui lorsqu'il est actionné par la tâche HTTP mais pas lorsqu'il est exécuté par la tâche AGMR (agent manager). Là les prints vont direct dans les logs.
"web 2.0 c'est une page qui ne se fige pas :D) --> On peut y mettre ce que l'on veut dans le Web2.0. C'est un peu comme un framework open source
. Je participe donc à ma manière à son enrichissement 
@Renaud : Oui je sais et je commence à avoir l'habitude
. Ça doit être fatiguant à la longue non ? Je comprends mieux pourquoi vous l'avez lourdé à Paris
.
En plus je suis sûr qu'il aurait fait pareil que moi s'il avait eu la même demande 
6. Benoit
07/11/2006 10:16:05
Effectivement AJAX va permettre aux utilisateurs de déclencher des agents web de façon non-bloquante (ce que d'ailleurs le client Notes ne peut pas
)
J'ai eu une demande de ce type il y a quelques temps, et je ne touchait pas encore vraiment à AJAX. La solution que j'ai mis en place : le bouton pointe sur une bête page affichant "Veuillez patienter..." qui contient un Meta Redirect vers "/mabase.nsf/agent?openagent". Comme ca l'utilisateur a un message d'attente tandis que l'agent travaille.
7. Smicky
07/11/2006 12:15:23
Comme moi aussi j'aime bien contredire, je contre-dit Benoit : si le client Notes sait lancer des agents non bloquant : dans les propriétés de l'agent, tu coches "run as background thread" et voila...(R6 ou plus)
8. Benoit
08/11/2006 09:30:47
Ah exact, merci Smicky, je me disais aussi, ca serait pas normal de pouvoir faire plus de choses en web qu'avec un client lourd
9. tsfig
04/12/2006 11:42:49
j'ai un message d'erreur :
"Ajax not defined" !!!!
10. julien
04/12/2006 15:07:48
@tsfig :
Ne pas oublier d'insérer la bibliothèque Prototype.js à votre page.
11. Pascal
18/01/2007 17:19:40
Bonjour à tous,
Pourriez vous m'aider sur un point concernant POST et les agents.
Comment peut on envoyer des variables par POST à un agent en utilisant AJAX.
Et une fois dans l'agent, comment faire pour les récupérer?
Merci de votre aide...
12. Mika
04/12/2008 07:11:51
Marche pas MDR.




- 









