À tout hasard, si ça vous intéresse, voilà la solution que j'ai retenue. Finalement elle est toute simple, mais elle me convient bien puisqu'elle n'impacte que la couche présentation : aucune modification dans le code PHP n'est nécessaire pour la mettre en oeuvre (donc sur un site proposant deux skins différentes, l'une peut proposer des fonctionnalités Ajax et l'autre pas du tout, la structure du code n'a pas à en souffrir).
- Ce sont les templates (j'utilise Smarty) qui contiennent des "filtres", utilisés uniquement dans le cas d'Ajax, qui permettent de désactiver l'affichage de certaines parties. Si aucun filtre n'est actif, l'affichage a lieu. Ça se résume à des instructions de type "
{if (!isset ($filtre) || $filtre = 'id_bloc')}" dans les templates, autour des quelques blocs que j'aurai à afficher séparément.
- Ces filtres sont en fait des variables récupérées en GET (l'intérêt apparaitra plus bas). Finalement dans le template, l'instruction risque de ressembler plus à ça : "
{if (!isset ($_GET['filtre']) || $_GET['filtre'] == 'id_bloc'} <!-- code html du bloc --> {/if}".
En temps normal, aucun filtre n'est activé, l'affichage se fait donc entièrement. Si je veux ajouter de l'Ajax à un traitement, par exemple ne mettre à jour que l'intérieur d'un cadre lors de login d'un utilisateur, la seule modification à apporter se fait encore du coté présentation (dans le fichier template). Là où j'avais un lien "<a href="{$mon_lien}">lien</a>", il suffit de demander à l'objet XMLHttpRequest l'url "{$mon_lien}&filtre=login". La variable "filtre" sera transmise à la page et donc à mon template, ce qui bloquera l'affichage de toutes les parties qui ne m'intéressent pas, pour ne renvoyer que l'intérieur du cadre que je voulais mettre à jour.
(en réalité il y a un petit test à ajouter pour savoir si il faut ajouter "?filtre=login" ou "&filtre=login", puisque la syntaxe diffère suivant que le lien avait déjà des paramètres ou non, mais ce genre de détail mineur se règle très facilement avec les plugins de Smarty par exemple).
Au final, j'ai bien la possibilité d'ajouter de l'Ajax partout où je veux, mais sans avoir ni à modifier la structure du site, ni même à toucher la moindre ligne de code dans les couches autres que la présentation. Néanmoins le résultat reste bien plus propre que ce qui était proposé en début de topic, puisque seule la partie à mettre à jour est envoyée au client, et non pas l'intégralité de la page.
Voilà, pour le moment cette solution me convient très bien puisqu'elle répond à toutes les contraintes que j'avais exprimées plus haut. Mais si vous avez autre chose en tête ou des critiques à formuler, le topic est là pour ça