RealET a écrit :
* cedric.morin@yterium.com tapuscrivait, le 13/03/2008 10:46:
les liens ajaxes sont cibles par '.pagination a' et 'a.ajax'
il faut donc que tu marques les liens ajaxables, car spip ne peut pas deviner ceux qui ne provoquent des changements dans la noisettes uniquement et ceux qui provoquent d'autres changements sur la page.
Et dans le cas d'un formulaire ?
Par exemple : Agenda - EcoloTech Philosophie - Écologie - Technologie
Si je clique sur OK, la page est ré affichée, mais cette fois-ci, avec l'année entière.
Pour les formulaires, il faut utiliser les balises dynamiques nouvelle API qui gerent elles aussi l'ajax.
Voici un début de doc :
1/ créér le squelette de son formulaire dans formulaires/, par exemple dans ton cas
annee.html
qui contient ton formulaire, avec la balise #ACTION_FORMULAIRE
un formulaire minimal serait :
[(#ENV**{editable}|?{' '})
<form action='#SELF' method='post'>
#ACTION_FORMULAIRE{#SELF}
<label>annee</label>
<input type='text' name='annee' value='#ENV{annee}' />
<input type='submit' name='ok' value='ok' />
</form>
]
<INCLURE{fond=agenda}{annee=#ENV{annee}}{ajax}>
avec ça tu peux deja afficher ton formulaire en faisant
#FORMULAIRE_ANNEE
2/ implementer le chargement des valeurs par defaut
dans formulaires/annee/charger.php :
function formulaires_annee_charger_dist(){
$valeurs = array('annee'=>date('Y'));
return $valeurs; // retourner simplement les valeurs
//return array(true,$valeurs); // forcer l'etat editable du formulaire et retourner les valeurs
//return array(false,$valeurs); // forcer l'etat non editable du formulaire et retourner les valeurs
}
spip saura alors que ton formulaire a un champ annee, et remplacera sa valeur par _request('annee') si elle est dispo
ton formulaire aura ses valeurs par defaut
3/ implementer une verification de format
dans formulaires/annee/valider.php :
function formulaires_annee_valider_dist(){
$erreurs = array();
if (!_request('annee')) $erreurs['annee'] = 'Ce champ est obligatoire';
if (_request('annee')<1900 OR _request('annee')>2100) $erreurs['annee'] = 'Soyez raisonables...';
if (count($erreurs)) $erreurs['message_erreur'] = 'Veuillez recommencer !';
return $erreurs; // si c'est vide, modifier sera appele, sinon le formulaire sera resoumis
}
et ajouter dans le formulaire :
en haut le message d'erreur general :
[<p class='formulaire_erreur'>(#ENV*{message_erreur})</p>]
sous le input, le message d'erreur lie a ce champ :
[<span class='erreur'>(#ENV**{erreurs}|table_valeur{annee})</span>]
4/ implémenter une action en bdd :
dans formulaires/annee/modifier.php :
function formulaires_annee_modifier_dist(){
// rien a faire en bdd pour ce formulaire
$message = 'merci';
//return $message; // retourner simplement un message, le formulaire ne sera pas resoumis
return array(true,$valeurs); // forcer l'etat editable du formulaire et retourner le message
}
et ajouter dans le formulaire :
[<p class="formulaire_message">(#ENV*{message_ok})</p>]
Il est possible de passer des arguments à la balise
ex :
#FORMULAIRE_ANNEE{#DATE}
il seront alors retrouvés en entrée des fonction charger/valider/modifier
Avec une telle implémentation, les formulaires dynamiques sont automatiquement ajaxes.
Il est possible de desactiver l'ajax en ajoutant la class noajax sur la balise form :
<form action='#SELF' method='post' class='noajax'>
par exemple parce que l'on veut rediriger l'internaute apres soumission : il suffit de faire un redirect dans modifier() qui est appelé avant tout affichage.
Cerise sur le gateau, tu peux ajouter ton formulaire dynamique ajax dans le texte de ton article :
<formulaire|annee> qui est equivalent à #FORMULAIRE_ANNEE dans un squelette
et passer aussi un argument :
<formulaire|annee|date=13/03/2008>
qui sera recupere dans les fonctions charger/valider/modifier
Si tu veux ecrire un article avec ça et le code testé et documenté, n'hésite pas 
Cédric