PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → AWP : Code d'initialisation des pages exécuté trop souvent
AWP : Code d'initialisation des pages exécuté trop souvent
Débuté par Marc LAZZARINI, 28 mai 2015 09:33 - 9 réponses
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 28 mai 2015 - 09:33
Bonjour c'est encore moi...., avec deux questions au sujet des pages awp.

1/ Pourquoi le code d'initialisation des pages awp est exécuté 2 fois à l'ouverture de la page ?

2/ Pourquoi le code d'initialisation des pages awp est exécuté à chaque fois qu'on fait une action sur la page ? Quand je clique sur un bouton qui a du code serveur, alors même que l'Ajax automatique est activé, le code d'init de la page est exécuté. Mais la valeur des champs est conservée... Résultat, je ne peux pas utiliser de variables globales, car elles sont systématiquement réinitialisée...

Merci d'avance.

Cordialement,

Marc.
Posté le 28 mai 2015 - 13:42
Bonjour Marc

tout vient du fait que les pages awp n'ont pas de contexte... LE tout
est de bien comprendre ce que ca veut dire :

1- l'utilisateur demande l'affichage d'une page
2- le serveur la prépare
3- le serveur l'envoit au navigateur
4- le serveur n'a plus aucune information sur cette page
5- l'utilisateur fait une action sur la page qui appelle le serveur (ou
un champ le fait automatiquement). Du fait du point 4, le serveur DOIT
refaire l'init de la page pour savoir ce qu'il y a dessus et construire
un contexte dans lequel exécuter le code demandé... Sans celà, il ne
saurait pas quelles valeurs sont ou...

Ca se voit (ou se découvre) de plein de façons auxquelles on ne pense
pas forcément...
Par exemple (je n'ai pas testé si c'est toujours le cas en 20),
une table ajax sur une page awp... L'utilisateur clique sur l'entete
d'une colonne pour changer le tri, puis sélectionne une ligne (disons la
ligne 5)...

Clic sur un bouton et code serveur qui traite la ligne 5... Le serveur
refait l'init de page et remplit la table... mais ne la trie pas comme
l'utilisateur (vu que c'est une action navigateur seulement)
La ligne 5 traitée est celle dans le tri d'origine, pas dans le tri
choisi par l'utilisateur...

Il faut donc systématiquement gérer cette situation pour tout site awp.

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Disponible : WXShowroom.com, WXReplication (open source)
Bientôt : WXEDM (open source)
Plus d'information sur http://fabriceharari.com

On 5/28/2015 1:33 AM, Marc LAZZARINI wrote:
Bonjour c'est encore moi...., avec deux questions au sujet des pages awp.

1/ Pourquoi le code d'initialisation des pages awp est exécuté 2 fois à
l'ouverture de la page ?

2/ Pourquoi le code d'initialisation des pages awp est exécuté à chaque
fois qu'on fait une action sur la page ? Quand je clique sur un bouton
qui a du code serveur, alors même que l'Ajax automatique est activé, le
code d'init de la page est exécuté. Mais la valeur des champs est
conservée... Résultat, je ne peux pas utiliser de variables globales,
car elles sont systématiquement réinitialisée...

Merci d'avance.

Cordialement,

Marc.
Membre enregistré
841 messages
Popularité : +19 (27 votes)
Posté le 28 mai 2015 - 16:12
Bonjour,

Je ne sais pas comment on fait en WebDev mais en php il y a une solution pour échanger des variable entre serveur et navigateur.

On crée une variable de session pour ce paramètre, je suppose qu'en Webdev c'est une variable globale au projet.
La page XXX s'affiche avec la variable avec paramètre par défaut ( disons 12 ) on modifie ce paramètre coté navigateur (disons 14), on transmet ce paramètre à une procédure js ( donc du code navigateur pour WebDev ). Ce code appelle une page intermédiaire en post par exemple ( formulaire ) ensuite cette page intermédiaire affecte la variable globale avec la valeur reçue et appelle de nouveau la page XXX qui affichera 14 ( en php c'est header:location il y a surement un équivalent en WebDev ).

Ce n'est pas une limite de WebDev mais le web fonctionne comme ça les pages n'affichant que du html c'est à dire du texte.
Ca parait compliqué au premier abord mais tout le système Ajax est basé sur ce principe une page est appelé en arrière plan pour effectuer le travail puis on reaffiche la page ou on reaffiche une partie de la page. Si on comprend ce principe tout devient plus clair et on est moins frustré.

--
Miro
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 28 mai 2015 - 18:03
Bonjour Fabrice et Camus, et merci pour vos éclairages. J'en déduis alors qu'il est inutile d'utiliser des variables globales serveur au niveau des pages.

Comme le dis Camus, je pourrais utiliser une variable globale au projet, mais là ça deviendrait compliqué car il faudrait que j'inclue dans mon contexte awp toutes les variables globales de chaque page. Ce qui alourdirait considérablement le contexte.

Mais il me revient à l'esprit l'exemple MémoriserChamp_AWP qui sert à mémoriser la valeur des champs d'une page en stockant dans un tableau global au projet le nom du champ et sa valeur. Je crois que je vais appliquer ce principe aux variables globales des pages, ça me semble être une solution légère et souple.

Encore merci à tous les deux.

Cordialement,

Marc.
Membre enregistré
135 messages
Popularité : +8 (8 votes)
Posté le 29 mai 2015 - 09:45
Bonjour,

Pour mémoriser le contexte en AWP je fais ainsi :

Je déclare une structure OU une classe qui gère le contexte. Par exemple la classe cl_contexte
cl_contexte_projet est une classe
ClientCourant est un cl_client dynamique // Le client logué par exemple (Null = pas de client)
Panier est un cl_panier() // Le panier courant (une autre classe avec le contenu du panier)
MessageAAfficher est une chaîne // Un message à afficher au prochaine chargement de page
etc..
etc..
FIN


Et dans le code d'init du projet je fais
ConfigureContexteAWP(ctxDisque,ctxIDCookieURL)

Gbp_Contexte_Projet est un cl_contexte_Projet()
DéclareContexteAWP(Gbp_Contexte)


Et c'est tout...

Je veux délogguer l'user
Gbp_Contexte_Projet:ClientCourant=null


Je veux vider le panier
Gbp_Contexte_Projet:Panier:Vider() // L'objet panier est conservé par le contexte, la méthode Vider supprimer le tableau d'articles (exemple !)


Je veux supprimer le contexte du projet
AnnuleContexteAWP(Gbp_Contexte_Projet)


Une nouvelle info à mémoriser dans le contexte ? Il suffit d'ajouter un membre à la structure ou à la classe.

Ce principe est également utilisable avec une page.. Tu fais une structure ou une classe qui contient les éléments du contexte d'une page et tu la déclare au niveau de la page comme je le fais ci dessus pour le projet.

// Init d'une page
Gbw_Contexte_Page_xxxx est un cl_contexte_page_xxxx()
DéclareContexteAWP(Gbw_Contexte_Page_xxxx)


--
Dominique DAUSSY
http://www.serviceinfo76.com
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 29 mai 2015 - 20:12
Bonjour Dominique,

Merci pour ta réponse, ça rejoint, mais en plus élaboré, l'exemple MémoriserChamps dont je parlais précédemment.

Par contre, au sujet du contexte de page dont tu parles en fin de ton message, est-ce qu'en faisant cela on ne réinitialise pas le contexte à chaque chargement de page ? Vu que l'init est appelé à chaque action Ajax réalisée dans la page, ça pourrait être pénalisant.

Cordialement,

Marc.
Membre enregistré
135 messages
Popularité : +8 (8 votes)
Posté le 30 mai 2015 - 06:54
Bonjour,

Dans tous les cas, le contexte est rechargé à chaque appel d'une page AWP.. que la déclaration se trouve dans l'init du projet ou dans le code d'init d'une page. Le rechargement du contexte avec DeclareContexteAwp peut être placé ou tu veux, cela dépend de ce que tu cherches à faire.

Exemple avec un autre site qui a 2 parties, une partie client et une partie admin.
J'ai, dans ce cas, créé deux classes de contexte, une pour le client et une autre pour l'admin MAIS je ne recharge pas le contexte dans l'init du projet. Je déclare bien ces 2 classes dans le code d'init du projet en global mais le chargement du contexte avec DeclareContexteAWP ce fait ici dans le modèle de page respectif de chaque partie.
- Le modèle de page de base de la partie client déclare le contexte client.
- Le modèle de page de base de la partie admin déclare le contexte admin.

Petite précision également, je cherche à optimiser également la taille du contexte, dans tout ce que j'ai pu réaliser je n'ai jamais constaté de lenteur à cause du rechargement du contexte.. Je n'ai jamais fait le test mais déclare simplement un tableau de chaines ou d'objets dans ton contexte que tu charges un max et tu verras si le chargement du contexte provoque un ralentissement..

--
Dominique DAUSSY
http://www.serviceinfo76.com
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 01 juin 2015 - 08:35
Bonjour,

Il est peut-être possible de stocker des variables autrement, pour s'affranchir des limites en volume des cookies, sans compter que l'internaute peut aussi bloquer les cookies et que les variables seraient alors transmises dans l'URL de la page AWP :

http://www.alsacreations.com/article/lire/1402-web-storage-localstorage-sessionstorage.html

A étudier comment utiliser cela dans Webdev pour écrire des variables serveur ou navigateur, les modifier, les lire et les supprimer...

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 01 juin 2015 - 09:09
Bonjour François.
Effectivement cette solution semble à la fois très intéressante et très facile à mettre en oeuvre. Ça evite pas mal d'aller-retours vers le serveur.

Cordialement,

Marc.
Posté le 01 juin 2015 - 14:25
Bonjour,

perso, j'ai un enreg de session dans ma base, l'id de session dans les
paramètres de chaque page, et tous mes paramètres (valeur de variable ou
autre) stockées dans un mémo texte de l'enreg session, façon fichier ini...

Aucun cookie ou que ce soit, aucun blocage possible

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Disponible : WXShowroom.com, WXReplication (open source)
Bientôt : WXEDM (open source)
Plus d'information sur http://fabriceharari.com




On 6/1/2015 1:09 AM, Marc LAZZARINI wrote:
Bonjour François. Effectivement cette solution semble à la fois très
intéressante et très facile à mettre en oeuvre. Ça evite pas mal
d'aller-retours vers le serveur.

Cordialement,

Marc.