[spip-dev] {ajax} et rechargement de blocs separes

Hello,

actuellement SPIP permet d'implémenter facilement des inclusions rafraichies en ajax grace a <INCLURE{}{ajax}>
De meme il est facile de faire un formulaire CVT ajax gràce à
<div class='ajax'>
#FORMULAIRE...
</div>

Mais il est un besoin assez récurent que l'on ne remplit pas encore simplement,
c'est la possibilité de rafraichir un autre morceau de la page quand un soumet un formulaire ajax ou que l'on clic sur un lien d'une noisette ajax.

J'ai pensé à une API pour faciliter cela, qui repose sur deux points :
* donner un identifiant aux blocs que l'on veut recharger a distance
* déclencher le rechargement des blocs designes par leur identifiant

1. Identifier les blocs ajax

Pour les inclusions, je propose
<INCLURE{}{ajax=identifiant}>

Cela ne rompt aucune compatibilite avec l'existant, et un squelette ecrit avec cette syntaxe fonctionnera a priori sans problème dans les versions précédentes.
L'identifiant n'est pas unique, et peut être le même pour plusieurs blocs, ce qui définit un groupe de blocs.

Pour les formulaires, comme actuellement cela repose sur une simple classe ajax présente sur le conteneur,
je propose que l'on puisse définir cet identifiant par un attribut data-ajaxid sur ce même conteneur :
<div class='ajax' data-ajaxid='identifiant'>
...
</div>

C'est une écriture un peu plus lourde, mais qui ne casse la encore aucune compatibilité.
Le data-ajaxid devra toujours être sur la balise qui porte la classe ajax.
L'identifiant peut être commun a plusieurs blocs, que ce soit indifférement des formulaires ou des inclusions

2. Déclencher le rafraichissement

Dans une inclusion ajax ou un formulaire ajax, on disposerait d'une balise
#RECHARGER_AJAX{id1}
qui déclencherait le rechargement en ajax du ou des blocs portant l'identifiant "id1",
lorsque le bloc contenant cette balise est lui même rechargé en ajax.

la balise peut recharger plusieurs identifiants :
#RECHARGER_AJAX{id1,id2,...}

Elle peut utiliser des identifiants calculés dynamiquement :
#RECHARGER_AJAX{#ENV{reload}}

Elle peut être utilisée de manière conditionnelle :
[(#ENV{reload}|oui) #RECHARGER_AJAX{id1}]

On peut ainsi couvrir une grande variété de scenarii.

3. Rafraichir un bloc, ça veut dire quoi ?
Pour une inclusion, cela veut dire recharger le bloc avec la derniere url avec laquelle il a été chargé. Ainsi si c'est un bloc paginé et qu'on a utilisé la pagination, le bloc sera rechargé en conservant le numéro de la page courante.

Pour un formulaire, c'est un peu plus problématique.
Est-ce que cela veut dire qu'on doit déclencher son submit ? avec le risque de faire une action indésirable si l'internaute a modifié des saisies sans rien soumettre.
Est-ce qu'on doit recharger le formulaire tel qu'a l'origine, avec le risque de perdre des saisies en cours ?

A la reflexion, je pense que dans un premier temps il serait plus sage de ne pas proposer cette possibilité de rafraichir un formulaire, car je crains que cela recouvre trop de scenario différents et compliqués à gérer.

4. Des avis, des questions, des remarques ?
Et là c'est à vous.

Cédric

avis : gogogo !

question : avec l'accoutumance au progrès et l'insatiable créativité des utilisateurs de spip, on ne tardera pas à réclamer la possibilité de mettre à jour des blocs par assemblages différents (bloc1 + bloc2 sur tel évt, bloc2 seul sur tel autre, bloc1 + bloc3 sur tel autre encore). Peut on prévoir cette évolution dés à présent, en permettant des identifiants multiples par ex, comme pour les classes css ?

remarque : le terme identifiant fait référence à un élément unique, par exemple dans les tables ou dans les css, alors que là, plusieurs blocs peuvent avoir le même identifiant... C'est donc un peu comme un 'type', comme un 'motclé', une 'rubrique' (qui contient plusieurs articles), et surtout, une 'classe' CSS (qui tague plusieurs balises)... Je fais ces comparaisons en espérant que ça suscitera l'inspiration d'un terme adhoc.

JLuc

question : avec l'accoutumance au progrès et l'insatiable créativité des utilisateurs de spip, on ne tardera pas à réclamer la possibilité de mettre à jour des blocs par assemblages différents (bloc1 + bloc2 sur tel évt, bloc2 seul sur tel autre, bloc1 + bloc3 sur tel autre encore). Peut on prévoir cette évolution dés à présent, en permettant des identifiants multiples par ex, comme pour les classes css ?

Justement, cela peut deja se gérer au niveau de la balise #RECHARGER_AJAX, en conditionnant son appel (dans un cas sur id1+id2, etc...)
Ce que tu demande, c'est d'avoir plusieurs identifiants sur un meme bloc, pour pouvoir faire des ensembles des blocs avec des intersections non nulles.
Cela complique un peu le concept (et beaucoup le code) sans apporter de possibilités fonctionnelles.

remarque : le terme identifiant fait référence à un élément unique, par exemple dans les tables ou dans les css, alors que là, plusieurs blocs peuvent avoir le même identifiant... C'est donc un peu comme un 'type', comme un 'motclé', une 'rubrique' (qui contient plusieurs articles), et surtout, une 'classe' CSS (qui tague plusieurs balises)... Je fais ces comparaisons en espérant que ça suscitera l'inspiration d'un terme adhoc.

Oui techniquement ce serait une classe avec quelques broutilles autour.
Identifiant se refere ici plus a un nom unique au sens qu'un bloc n'a qu'un seul nom ajax possible, mais qu'il peut le partager.

Cédric

question : avec l'accoutumance au progrès et l'insatiable créativité des
utilisateurs de spip, on ne tardera pas à réclamer la possibilité de
mettre à jour des blocs par assemblages différents (bloc1 + bloc2 sur
tel évt, bloc2 seul sur tel autre, bloc1 + bloc3 sur tel autre encore).
Peut on prévoir cette évolution dés à présent, en permettant des
identifiants multiples par ex, comme pour les classes css ?

Ça me semble possible :
[(#X|oui) #RECHARGER_AJAX{ depuis_x } ]
[(#Y|oui) #RECHARGER_AJAX{ depuis_x, depuis_y } ]

remarque : le terme identifiant fait référence à un élément unique, par
exemple dans les tables ou dans les css, alors que là, plusieurs blocs
peuvent avoir le même identifiant... C'est donc un peu comme un 'type',
comme un 'motclé', une 'rubrique' (qui contient plusieurs articles), et
surtout, une 'classe' CSS (qui tague plusieurs balises)... Je fais ces
comparaisons en espérant que ça suscitera l'inspiration d'un terme adhoc.

Certes, mais là, je crois pas que cerdic ait prévu la multi-nomination d'un bloc ajax...
Ce qui pourrait aussi être envisagé : {ajax=x|y} pour indiquer qu'un bloc porte 2 noms... comme des classes CSS pour faire des #RECHARGER_AJAX thématiques, et non par sélection de blocs.

MM.

Bonjour,

Serait-il possible et utile de pouvoir utiliser jquery encore plus facilement dans SPIP par ce nouveau biais là, exemple:

#RECHARGER_AJAX{id1|css{background-color:red},id2|hide,id3|click{id2|show},…}

qui appellerai en fait jquery $(‘id1’).css('background-color,‘red’) et $('id2).hide()
et dans l’idéal pour donc faire pas mal de chose…

et peut-être une autre balise pour les formulaires:
#RECHARGER_AJAX_FORMULAIRE{id_input|keydown{validation()}}

En tous cas, pourvoir faciliter l’ajout d’ajax avec une(des) balise est une bonne idée :wink:

Bonne journée.
Nicolas.

Bonjour,

Serait-il possible et utile de pouvoir utiliser jquery encore plus facilement dans SPIP par ce nouveau biais là, exemple:

Non ça n’est pas du tout le but, et l’interêt d’une balise #RECHARGER_AJAX est de separer la fonction de son implémentation technique.

#RECHARGER_AJAX{id1|css{background-color:red},id2|hide,id3|click{id2|show},…}

qui appellerai en fait jquery $(‹ id1 ›).css('background-color,‹ red ›) et $('id2).hide()

et dans l’idéal pour donc faire pas mal de chose…

Quel intérêt ? puisque tu peux déjà le faire en jQuery. L’écriture n’est pas plus rapide avec ta proposition,
mais cela mélange plein de notion qui n’ont rien a voir.

Donc, non.

Cédric

sauf que ça devient tout de suite ingérable en terme d'analyse syntaxique si tu veux utiliser des nommages dynamiques :
{ajax=#ENV{nombloc}}
...
Donc je pense qu'il faut rester sur un seul nom par bloc.

Cédric

Ok.
Sans cette possibilité, il n'y a pas vraiment de perte de fonctionnalité
puisque pour le besoin évoqué, il suffira de faire des plus petits groupes
de blocs de même id (ou plutôt 'classe' non ?)
et en appeler plusieurs successivement du coup.

JLuc

Quel intérêt ? puisque tu peux déjà le faire en jQuery.

Mais le rechargement d’une page ou d’un morceau aussi, donc le raisonnement s’applique aussi à cette nouvelle balise. J’ai du mal comprendre le fonctionnement de cette balise, elle n’utilise peut-être pas jquery…et des subtilités doivent m’échapper.

Il faut voir ma proposition plus comme un filtre qu’on appliquerai à un balise(mais là on appliquerai à plutôt à un id/class), la plupart des filtres sont des raccourcis de fonctions vers du php ou appliquent des css sur les balises auxquels on les lient, donc je verais bien un filtre qui facilite jquery/javascript sur une balise ou id/class.

C’est sur qu’on peut tous se coder jquery, comme on peut tous se coder en php et pas utiliser de framework/CMS, mais une des raisons pour lesquels j’aime bien utiliser SPIP est le fait d’utiliser « le langage des Squelette » de SPIP qui apporte de la facilité (filtres, balises, boucles) « qui cachent » le coté technique aux débutants et apportent de la simplicité, donc jquery et aussi compliqué que php ou des requetes SQL pour un néophyte, pourquoi SPIP ne pourrai pas apporter de la facilité à l’utilisation d’ajax avec son « langage de squelette » sur ce point là aussi…

L’écriture n’est pas plus rapide avec ta proposition,

Cette proposition (mais on pourrait en avoir des plus longues) fais gagné du temps et est plus simple à retenir:
id3|click{id2|show}
et peut-être:
#TITRE|click{id2|show}
Mais je suis pas sur que jquery même avec this récupère le bloc contenant titre pour y affecter l’évenement…

en jquery
$('$id3).click(function() { $(id2).show()}});
Un peu plus long mais plus confus aussi.

Je suis parti sur un truc différent de ta proposition, j’aimerais bien trouvé le temps d’expérimenter des trucs comme ça…
En tous cas je prendrais le temps de tester cette nouvelle balise de rechargement de portion de page quand elle sortira.

PS/ @cédric: Hier , j’ai suivi un fil ou tu intervenais , j’ai répondu à la suite de ça sur ce blog, à un commentaire qui parlait de « système de squelette propriétaire », l’auteur n’a pas répondu à ce sujet…
http://blog.adyax.com/2009/02/lenteur-de-mysql-drupal-views-user-relationship/

Bonne journée.
Nicolas.

Ben c'est bien le but de cette proposition, mais tu as l'air de mélanger "ajax" et "DHTML". Cette proposition ne vise QUE l'aide à l'ajax. Il se trouve que derrière ce sera du jQuery, mais peut importe, côté squelette on ne le saura même pas.

On donne juste un identifiant à un bloc, et on permet de le recharger depuis un autre endroit du HTML. Et c'est tout : ça fait une chose, ça le fait bien. :slight_smile:

Oui, je comprends, ça servira au rechargement uniquement d’une portion de la page et c’est déjà très bien, c’est juste que j’aimerais bien utilisé d’autres effets (dhtml entres autres) facilement dans SPIP, mais c’est bien un autre problème.

Et c’est tout : ça fait une chose, ça le fait bien. :slight_smile:

Oui, ça je vous fais confiance, car moi quand je code, ça fait beaucoup de chose mais ça le fait pas très très bien :wink:

Bonne fin de journée.
Nicolas.