Énoncé du problème

Le cas est simple et le problème tout bête. Prenez un TTabPanel, ce contrôle de Prado permettant de gérer différentes vue via des onglets. Vous avez dans le premier onglet une liste de choses et dans le deuxième un formulaire permettant d'ajouter quelque chose dans la liste du premier. C'est une façon ergonomique classique de présenter certaines données sans avoir recours à des popups ou à un changement de vue... c'est surtout plus rapide pour l'utilisateur et généralement assez intuitif. Seulement, si après validation du formulaire vous désirez revenir dynamiquement au premier onglet, et bien c'est pas toujours évident... car le composant ne fait pas parti de ceux ayant une gestion du callback.

Petit rappel, le callback est en fait d'une certaine manière le côté AJAX de Prado. Les contrôles s'appellant TActiveQuelqueChose sont des composants pouvant être modifiés via un appel serveur par Javascript, donc sans recharger la page[1].

Une 1ère fausse solution : utiliser un TActivePanel

J'en vois plusieurs venir de loin... "Mais t'as cas encapsuler ton TTabPanel dans un TActivePanel!" et bah non ! Enfin, oui, c'est possible, ça marche... mais que c'est lourd... et puis ça veut dire que les vues sont toute recalculées... et alors on utilise du cache, et on se complique la vie, et ça devient une usine à gaz, et ce texte ne sert à rien, et surtout, la solution que je vais vous proposer est plus simple, plus rapide, et très pratique!!! :)

Une 2nde fausse solution : ajouter un écouteur

Alors là techniquement c'est pas mal, on s'approche de ce que je vais vous proposer. L'idée vient d'un certain linuxanton sur le forum de Prado. Donc il a compris que par Javascript on peut simplement simuler le clic, mais il s'embête en créant un nouvel évènement à observer, et en plus il modifie directement le fichier dans les sources de Prado... et ça pour la maintenance c'est très "crade"... Bon il y a moyen de redéfinir le prototype Javascript pour faire ça proprement, mais comme la solution finale va être encore plus simple, autant ne pas s'embêter...

La solution toute simple : simuler le click

En fait Prado permet de générer par le code l'évènement 'click' sur un élément côté client, et donc toute la suite est traité exactement comme si vous aviez cliqué réellement sur cet élément.

Prado.Element.click('id_de_mon_control');

Seulement, la difficulté est que les onglets de TTabPanel sont générés lors de la construction de la page, on ne possède donc pas d'ID à évoquer. Il faut donc au choix aller dans le code ou observer le comportement du code html généré pour trouver le moyen de se procurer l'ID. On se rend alors compte que l'onglet d'un TTabView à le même ID que son TTabView plus le suffixe '_0'. Ceci est d'ailleurs une pratique courante de Prado.

On obtient donc le code suivant si on fait un appel côté client :

Prado.Element.click(<%=$this->MyTabView->getClientID().'_0'%>);

Et le code suivant pour un appel côté serveur (dans un Callback!) :

$this->getCallbackClient()->click($this->MyTabView->getClientID().'_0');

Épilogue

J'ai fait un peu long en proposant des "fausses" solutions, mais je trouve intéressant d'exposer le raisonnement plutôt que balancer la solution et comme le dit un proverbe : "Donne un poisson à un homme et il mangera un jour, apprend-lui à pêcher et il mangera toute sa vie." :-)

Notes

[1] pour les ours qui ont hibernés ces dernières années :-) => AJAX sur la Wikipedia