Skip to content
Extraits de code Groupes Projets
Valider 1e82b760 rédigé par esj's avatar esj
Parcourir les fichiers

Comme recommandé par [6959] les formulaires de description d'images et...

Comme recommandé par [6959] les formulaires de description d'images et documents joints passent en Ajax: à présent, lorsqu'on veut nommer, décrire, dater ouredimensionner un fichier préalablement téléchargé, cliquer sur le bouton "Enregistrer" ne provoque pas le rechargement de toute la page, mais seulement du bloc contenant ce mini formulaire. L'effet est particulièrement appréciable quand on télécharge une archive de N fichiers au format Zip que l'on demande de déballer: la page présente alors les N mini formulaires qu'on remplit puis soumet en rafale sans attendre la réponse de l'un pour passer à l'autre. 

Quelques remarques:

Ce comportement est disponible autant pour la présentation horizontale en fin de page (scripts articles, naviguer etc) que pour la présentation verticale pour le script d'édition (script articles_edit) et tant pour les images que pour les documents. En contrepartie, il s'en est suivi une uniformisation graphique qui est un peu en régression comparée à l'existant. On peut s'en consoler par le fait qu'il y avait déjà des attributs style en dur plutot que des CSS, ce qui rendait cet aspect quand meme insatisfaisant. Ca fait une raison de plus de le reprendre.

Autre aspect graphique. Les fichiers joints sont présentés avec leur nom, leur type et leur vignette (std ou non) plus (quand on a les droit d'accès) le nom du fichier précédé du triangle dont le clic donne accès au bloc du formulaire. Ce bloc affiche le titre, le descriptif, et la date puis les balises permettant de les modifier; la soumission du formulaire provoque ce réaffichage initial, permettant de s'assurer que l'opération a bien eu lieu. En revanche, le titre AU-DESSUS de la vignette reste l'ancien (jusqu'au prochain rechargement complet de la page bien sur; un phénomène similaire existe pour le changement de statut des articles en simili-Ajax). C'est aussi à améliorer.

Pour le téléchargement lui-meme, le réaffichage complet reste la norme, le mode Ajax ne permettant pas le transfert asynchrone de fichiers (les alternatives connues à ce jour ne semblent pas très portables). De plus, changer le nombre de pièces jointes affecte presque toujours la mise en page, qu'il faut reconsidérer. Cet argument explique aussi pourquoi la suppression provoque aussi un réaffichage complet. Le seul cas échappant à cette problématique est l'association d'une vignette; il faut faire avec (ou plutot sans).

La transmission en Ajax aurait du se faire en Post, mais Firefox s'est révélé peu fiable dans ce mode. La méthode retenue est donc GET, et on verra  passer furtivement les arguments dans la barre de navigation. Pas beau, mais pas grave. 

Ce mode a été testé avec succès sur MacOSX avec Firefox et Safari. Avec Opera 9, les changements ont lieu mais le formulaire ne se réaffiche pas. Lorsqu'Ajax n'est pas connu du JavaScript du navigateur, le mode habituel est utilisé.
parent c7c0a6a8
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -14,9 +14,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -14,9 +14,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/filtres'); include_spip('inc/filtres');
// Utiliser $_REQUEST car en Ajax on utilise GET et sinon POST.
function action_documenter_dist() { function action_documenter_dist() {
global $action, $arg, $hash, $id_auteur, $redirect; global $action, $arg, $hash, $id_auteur, $redirect;
include_spip('inc/actions'); include_spip('inc/actions');
if (!verifier_action_auteur("$action-$arg", $hash, $id_auteur)) { if (!verifier_action_auteur("$action-$arg", $hash, $id_auteur)) {
include_spip('inc/minipres'); include_spip('inc/minipres');
...@@ -29,30 +32,30 @@ function action_documenter_dist() { ...@@ -29,30 +32,30 @@ function action_documenter_dist() {
$id_document = $r[1]; $id_document = $r[1];
$titre_document = (corriger_caracteres($_POST['titre_document'])); $titre_document = (corriger_caracteres($_REQUEST['titre_document']));
$descriptif_document = (corriger_caracteres($_POST['descriptif_document'])); $descriptif_document = (corriger_caracteres($_REQUEST['descriptif_document']));
// taille du document (cas des embed) // taille du document (cas des embed)
if ($largeur_document = intval($_POST['largeur_document']) if ($largeur_document = intval($_REQUEST['largeur_document'])
AND $hauteur_document = intval($_POST['hauteur_document'])) AND $hauteur_document = intval($_REQUEST['hauteur_document']))
$wh = ", largeur='$largeur_document', $wh = ", largeur='$largeur_document',
hauteur='$hauteur_document'"; hauteur='$hauteur_document'";
else $wh = ""; else $wh = "";
// Date du document (uniquement dans les rubriques) // Date du document (uniquement dans les rubriques)
if (!$_POST['jour_doc']) if (!$_REQUEST['jour_doc'])
$date = ''; $d = '';
else { else {
if ($_POST['annee_doc'] == "0000") if ($_REQUEST['annee_doc'] == "0000")
$_POST['mois_doc'] = "00"; $_REQUEST['mois_doc'] = "00";
if ($_POST['mois_doc'] == "00") if ($_REQUEST['mois_doc'] == "00")
$_POST['jour_doc'] = "00"; $_REQUEST['jour_doc'] = "00";
$d = $_POST['annee_doc'].'-' .$_POST['mois_doc'].'-'.$_POST['jour_doc']; $date = $_REQUEST['annee_doc'].'-' .$_REQUEST['mois_doc'].'-'.$_REQUEST['jour_doc'];
if (preg_match('/^[0-9-]+$/', $d)) $date=" date='$d',"; if (preg_match('/^[0-9-]+$/', $date)) $d=" date='$date',";
} }
spip_query("UPDATE spip_documents SET$date titre=" . spip_abstract_quote($titre_document) . ", descriptif=" . spip_abstract_quote($descriptif_document) . " $wh WHERE id_document=".$id_document); spip_query("UPDATE spip_documents SET$d titre=" . spip_abstract_quote($titre_document) . ", descriptif=" . spip_abstract_quote($descriptif_document) . " $wh WHERE id_document=".$id_document);
if ($date) { if ($date) {
...@@ -66,3 +69,4 @@ function action_documenter_dist() { ...@@ -66,3 +69,4 @@ function action_documenter_dist() {
marquer_indexer('document', $id_document); marquer_indexer('document', $id_document);
} }
} }
?>
...@@ -259,4 +259,12 @@ function ajax_page_aff_info($id, $exclus, $col, $id_ajax_fonc, $type, $rac) ...@@ -259,4 +259,12 @@ function ajax_page_aff_info($id, $exclus, $col, $id_ajax_fonc, $type, $rac)
echo "</div>"; echo "</div>";
} }
function ajax_page_document($id, $bof, $id_document, $script, $type, $ancre)
{
include_spip('inc/documents');
include_spip('inc/presentation');
echo formulaire_document($id_document, array(), $script, $type, $id, $ancre);
}
?> ?>
...@@ -139,13 +139,12 @@ function aff_selection (type, rac, id) { ...@@ -139,13 +139,12 @@ function aff_selection (type, rac, id) {
// //
// Cette fonction charge du contenu - dynamiquement - dans un // Cette fonction charge du contenu - dynamiquement - dans un
// Ajax
var url_chargee = new Array(); var url_chargee = new Array();
var xmlhttp = new Array(); var xmlhttp = new Array();
var image_search = new Array(); var image_search = new Array();
// Ajax
function createXmlHttp() { function createXmlHttp() {
if(window.XMLHttpRequest) if(window.XMLHttpRequest)
return new XMLHttpRequest(); return new XMLHttpRequest();
...@@ -153,6 +152,49 @@ function createXmlHttp() { ...@@ -153,6 +152,49 @@ function createXmlHttp() {
return new ActiveXObject("Microsoft.XMLHTTP"); return new ActiveXObject("Microsoft.XMLHTTP");
} }
function ajah(method, url, flux, rappel)
{
var xhr = createXmlHttp();
if (!xhr) return false;
xhr.onreadystatechange = function () {ajahReady(xhr, rappel);}
xhr.open(method, url, true);
xhr.send(flux);
}
function ajahReady(xhr, f) {
if (xhr.readyState == 4) {
if (xhr.status > 200) // Opera dit toujours 0 !
{f('Erreur HTTP : ' + xhr.status);}
else { f(xhr.responseText); }
}
}
function AjaxSqueeze(form, div)
{
var i;
var u = '';
var noeud = document.getElementById(div); // pere du formulaire
if (!noeud) return true; // forcer l'envoi en mode non Ajax
for (i=0;i < form.elements.length;i++) {
n = form.elements[i].name;
if (n) u += n+"="+escape(form.elements[i].value) + '&' ;
}
u = form.getAttribute('action') +'?' + u;
// ce serait plus propre d'envoyer en Post mais FireFox coince
ajah('GET',
u,
null,
function(r) { noeud.innerHTML = r;});
return false; // empecher l'envoi en mode non Ajax
}
function charger_id_url(myUrl, myField, jjscript) function charger_id_url(myUrl, myField, jjscript)
{ {
var Field = findObj_forcer(myField); // selects the given element var Field = findObj_forcer(myField); // selects the given element
......
...@@ -56,8 +56,9 @@ function generer_action_auteur($action, $arg, $redirect="", $mode=false, $att='' ...@@ -56,8 +56,9 @@ function generer_action_auteur($action, $arg, $redirect="", $mode=false, $att=''
return generer_url_action($action, "arg=$arg&id_auteur=$id_auteur&hash=$hash" . (!$redirect ? '' : ("&redirect=" . rawurlencode($redirect))), $mode); return generer_url_action($action, "arg=$arg&id_auteur=$id_auteur&hash=$hash" . (!$redirect ? '' : ("&redirect=" . rawurlencode($redirect))), $mode);
if ($redirect) if ($redirect)
$redirect = "\n\t\t<input name='redirect' type='hidden' value='$redirect' />"; $redirect = "\n\t\t<input name='redirect' type='hidden' value='$redirect' />";
// Attention, JS n'aime pas le melange de param GET/POST
return "\n<form action='" . return "\n<form action='" .
generer_url_action($action,'') . generer_url_public('') .
"'$att>\n\t<div> "'$att>\n\t<div>
<input name='id_auteur' type='hidden' value='$id_auteur' /> <input name='id_auteur' type='hidden' value='$id_auteur' />
<input name='hash' type='hidden' value='$hash' /> <input name='hash' type='hidden' value='$hash' />
......
Ce diff est replié.
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter