/branches/v1.5-cisaille/widget/modules/saisie/Saisie.php |
---|
92,8 → 92,18 |
} |
public function executerUploadImage() { |
$retour = array(); |
if ($_FILES['fichier']['error'] == 0) { |
$retour = array( |
'squelette' => $this->projet.'_image', |
'squelette_ext' => '.tpl.xml', |
'mime' => 'text/xml', |
'donnees' => array( |
'urlMiniature' => '', |
'imageNom' => '', |
'message' => '', |
'debogage' => '')); |
$message = ''; |
$debogage = ''; |
if ($_FILES['fichier']['error'] == UPLOAD_ERR_OK) { |
if (is_uploaded_file($_FILES['fichier']['tmp_name'])) { |
if ($_FILES['fichier']['type'] == 'image/jpeg') { |
$dossierStockage = $this->config['chemins']['imagesTempDossier']; |
134,25 → 144,31 |
imagedestroy($imageOriginale); |
// Retour des infos |
$retour['squelette'] = $this->projet.'_image'; |
$retour['squelette_ext'] = '.tpl.xml'; |
$retour['donnees']['urlMiniature'] = sprintf($this->config['chemins']['imagesTempUrlTpl'], $miniatureFichier); |
$retour['donnees']['imageNom'] = $nomFichierOriginal; |
$retour['mime'] = 'text/xml'; |
} else { |
$this->messages[] = "L'image n'a pu être déplacé sur le serveur."; |
$message = "L'image n'a pu être déplacé sur le serveur."; |
} |
} else { |
$this->messages[] = "L'image n'est pas au format JPEG."; |
$message = "L'image n'est pas au format JPEG."; |
} |
} else { |
$this->messages[] = "L'image n'a pu être uploadée :".print_r($_FILES, true); |
$message = "L'image n'a pu être téléversée."; |
$debogage = $message.print_r($_FILES, true); |
} |
} else { |
$this->messages[] = "Une erreur de transfert a eu lieu (téléversement interrompu). ". |
"Code erreur : {$_FILES['fichier']['error']}. ". |
if ($_FILES['fichier']['error'] == UPLOAD_ERR_FORM_SIZE) { |
$message = "L'image téléversée excède la taille maximum autorisée.". |
"Veuillez modifier votre image avant de la téléverser à nouveau."; |
} else { |
$message = "Une erreur de transfert a eu lieu (téléversement interrompu)."; |
} |
$debogage = "Code erreur : {$_FILES['fichier']['error']}. ". |
"Voir : http://php.net/manual/fr/features.file-upload.errors.php"; |
} |
// Retour des infos |
$retour['donnees']['message'] = $message; |
$retour['donnees']['debogage'] = $debogage; |
return $retour; |
} |
/branches/v1.5-cisaille/widget/modules/saisie/squelettes/sauvages/js/sauvages.js |
---|
12,6 → 12,7 |
} |
return false; |
} |
// TODO : voir si cette fonction est bien utile. Résoud le pb d'un warning sous chrome. |
(function(){ |
// remove layerX and layerY |
28,38 → 29,78 |
//+----------------------------------------------------------------------------------------------------------+ |
//UPLOAD PHOTO : Traitement de l'image |
$(document).ready(function() { |
$("#effacer-miniature").click(function () { |
supprimerMiniature(); |
}); |
$("#fichier").bind('change', function (e) { |
arreter(e); |
$("#form-upload").ajaxSubmit(options); |
return false; |
}); |
//prepare the form when the DOM is ready |
//create service object(proxy) using SMD (generated by the json result) |
var options = { |
success: afficherMiniature, // post-submit callback |
dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type) |
resetForm: true // reset the form after successful submit |
}; |
if (window.File && window.FileReader) { |
if (DEBUG) { |
console.log("L'API File est supporté."); |
} |
$('#fichier').bind('change', function(e) { |
afficherMiniatureHtml5(e); |
}); |
} else { |
$("#fichier").bind('change', function (e) { |
arreter(e); |
var options = { |
success: afficherMiniature, // post-submit callback |
dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type) |
resetForm: true // reset the form after successful submit |
}; |
$("#form-upload").ajaxSubmit(options); |
return false; |
}); |
} |
}); |
function afficherMiniatureHtml5(evt) { |
supprimerMiniature(); |
var selectedfiles = evt.target.files; // FileList object |
var f = selectedfiles[0];// Nous récupérons seulement le premier fichier. |
// Only process image files. |
if (f.type.match('image.*') == false) { |
var message = "Seule les images JPEG sont supportées."; |
$("#miniature-msg").append(message); |
} else { |
var reader = new FileReader(); |
// Lit le fichier image commune url de données |
reader.readAsDataURL(f); |
var imgNom = f.name; |
// Closure pour capturer les infos du fichier |
reader.onload = (function(theFile) { |
return function(e) { |
// Rendre la miniature |
var imageBase64 = e.target.result; |
$("#miniature").append('<img id="miniature-img" class="miniature b64" src="'+imageBase64+'" alt="'+imgNom+'"/>'); |
}; |
})(f); |
} |
$("#effacer-miniature").show(); |
} |
function afficherMiniature(reponse) { |
// 'responseXML' is the XML document returned by the server; we use |
// jQuery to extract the content of the message node from the XML doc |
var miniatureUrl = $("miniature-url", reponse).text(); |
var imgNom = $("image-nom", reponse).text(); |
$("#miniature").empty(); |
$("#miniature").append('<img id="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'); |
supprimerMiniature(); |
if (DEBUG) { |
var debogage = $("debogage", reponse).text(); |
console.log("Débogage upload : "+debogage); |
} |
var message = $("message", reponse).text(); |
if (message != '') { |
$("#miniature-msg").append(message); |
} else { |
var miniatureUrl = $("miniature-url", reponse).text(); |
var imgNom = $("image-nom", reponse).text(); |
$("#miniature").append('<img id="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'); |
} |
$("#effacer-miniature").show(); |
} |
function supprimerMiniature() { |
$("#miniature").empty(); |
$("#miniature-msg").empty(); |
$("#effacer-miniature").hide(); |
} |
347,12 → 388,12 |
'<tr id="obs'+obsNumero+'" class="obs">'+ |
'<td>'+obsNumero+'</td>'+ |
'<td>'+$("#date").val()+'</td>'+ |
'<td>'+$("#adresse").val()+'</td>'+ |
'<td>'+$("#rue").val()+'</td>'+ |
'<td>'+$("#taxon option:selected").text()+'</td>'+ |
'<td>'+$('input[name=milieu]:checked').val()+'</td>'+ |
'<td>'+$("#latitude").val()+' / '+$("#longitude").val()+'</td>'+ |
//Ajout du champ photo |
'<td class="obs-miniature">'+ajouterImgMiniature()+'</td>'+ |
'<td class="obs-miniature">'+ajouterImgMiniatureAuTransfert()+'</td>'+ |
'<td>'+$("#notes").val()+'</td>'+ |
'<td><button class="supprimer-obs" value="'+obsNumero+'" title="Supprimer l\'observation '+obsNumero+'">'+ |
'<img src="'+SUPPRIMER_ICONE_URL+'"/></button></td>'+ |
378,8 → 419,9 |
'notes' : $("#notes").val(), |
//Ajout des champs images |
'image_nom' : $("#miniature-img").attr('alt'), |
'image_b64' : ''// TODO : ajoute le support HTML5 |
'image_b64' : $("#miniature-img").hasClass('b64') ? $("#miniature-img").attr('src') : '' |
}); |
console.log("B64 : "+$("#miniature-img").hasClass('b64') ? $("#miniature-img").attr('src') : ''); |
} |
}); |
430,14 → 472,9 |
supprimerMiniature(); |
}, |
statusCode : { |
500 : function(jqXHR, textStatus, errorThrown) { |
500 : function(jqXHR, textStatus, errorThrown) { |
$("#chargement").hide(); |
erreurMsg += "Erreur 500 :\ntype : "+textStatus+' '+errorThrown+"\n"; |
reponse = jQuery.parseJSON(jqXHR.responseText); |
if (reponse != null) { |
$.each(reponse, function (cle, valeur) { |
erreurMsg += valeur + "\n"; |
}); |
} |
if (DEBUG) { |
$("#dialogue-obs-transaction").append('<pre class="msg-erreur">'+erreurMsg+'</pre>'); |
} |
445,11 → 482,15 |
}, |
error : function(jqXHR, textStatus, errorThrown) { |
erreurMsg += "Erreur Ajax :\ntype : "+textStatus+' '+errorThrown+"\n"; |
reponse = jQuery.parseJSON(jqXHR.responseText); |
if (reponse != null) { |
$.each(reponse, function (cle, valeur) { |
erreurMsg += valeur + "\n"; |
}); |
try { |
reponse = jQuery.parseJSON(jqXHR.responseText); |
if (reponse != null) { |
$.each(reponse, function (cle, valeur) { |
erreurMsg += valeur + "\n"; |
}); |
} |
} catch(e) { |
erreurMsg += "L'erreur n'était pas en JSON."; |
} |
if (DEBUG) { |
457,6 → 498,7 |
} |
}, |
complete : function(jqXHR, textStatus) { |
$("#chargement").hide(); |
var debugMsg = ''; |
if (jqXHR.getResponseHeader("X-DebugJrest-Data") != '') { |
debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader("X-DebugJrest-Data")); |
479,7 → 521,7 |
if (DEBUG) { |
$("#dialogue-obs-transaction").append('<pre class="msg-debug">Débogage : '+debugMsg+'</pre>'); |
} |
$("#chargement").hide(); |
$("#dialogue-obs-transaction").dialog(); |
$("#liste-obs").removeData(); |
$('.obs').remove(); |
491,47 → 533,13 |
}); |
}); |
function ajouterImgMiniature() { |
function ajouterImgMiniatureAuTransfert() { |
var miniature = ''; |
if ($("#miniature img").length == 1) { |
var css = $("#miniature-img").hasClass('b64') ? 'miniature b64' : 'miniature'; |
var src = $("#miniature-img").attr("src"); |
var alt = $("#miniature-img").attr("alt"); |
miniature = '<img class="miniature" alt="'+alt+'"src="'+src+'" />'; |
miniature = '<img class="'+css+'" alt="'+alt+'"src="'+src+'" />'; |
} |
return miniature; |
} |
function handleFileSelect(evt) { |
// Check for the various File API support. |
if (window.File && window.FileReader && window.FileList && window.Blob) { |
// Great success! All the File APIs are supported. |
var selectedfiles = evt.target.files; // FileList object |
// Loop through the FileList and render image files as thumbnails. |
for (var i = 0, f; f = selectedfiles[i]; i++) { |
// Only process image files. |
if (!f.type.match('image.*')) { |
continue; |
} |
var reader = new FileReader(); |
// Read in the image file as a data URL. |
reader.readAsDataURL(f); |
// Closure to capture the file information. |
reader.onload = (function(theFile) { |
return function(e) { |
// Render thumbnail. |
document.getElementById('image').src = e.target.result; |
//document.getElementById('list').insertBefore(img, null); |
}; |
})(f); |
} |
} |
else { |
alert('The File APIs are not fully supported in this browser.'); |
} |
} |
/branches/v1.5-cisaille/widget/modules/saisie/squelettes/sauvages/sauvages_image.tpl.xml |
---|
2,4 → 2,6 |
<root> |
<miniature-url><?=$urlMiniature?></miniature-url> |
<image-nom><?=$imageNom?></image-nom> |
<message><?=$message?></message> |
<debogage><?=$debogage?></debogage> |
</root> |
/branches/v1.5-cisaille/widget/modules/saisie/squelettes/sauvages/sauvages.tpl.html |
---|
176,7 → 176,6 |
<strong class="obligatoire">*</strong> |
Milieu |
</label> |
<br /> |
<ul id="liste-milieux"> |
<?php foreach ($milieux as $milieu => $description) : ?> |
<li> |
230,7 → 229,7 |
</li> |
<li> |
<label for="notes">Notes</label> |
<textarea id="notes" name="notes" rows="5" cols="4"></textarea> |
<textarea id="notes" name="notes" rows="3" cols="4"></textarea> |
</li> |
</ul> |
</fieldset> |
241,9 → 240,11 |
<form id="form-upload" action="<?=$url_base?>saisie?projet=sauvages&service=upload-image" |
method="post" enctype="multipart/form-data"> |
<fieldset id="partie-photo"> |
<legend>Ajouter une photo</legend> |
<legend>Ajouter une photo</legend> |
<p id="miniature-info" class="discretion">La photo doit être au format JPEG et ne doit pas excéder 5Mo.</p> |
<input type="file" id="fichier" name="fichier"/> |
<input type="hidden" name="MAX_FILE_SIZE" value="5242880"/> |
<p id="miniature-msg" style="float:right;"> </p> |
<div id="miniature"></div> |
<button id="effacer-miniature" type="button" style="display:none;">Effacer</button> |
</fieldset> |
/branches/v1.5-cisaille/widget/modules/saisie/squelettes/sauvages/css/sauvages.css |
---|
95,6 → 95,11 |
/*+--------------------------------------------------------------------------------------------------------+*/ |
/* Générique */ |
.discretion { |
color:grey; |
font-family:arial; |
font-size:11px; |
} |
.nettoyage{ |
clear:both; |
} |
262,10 → 267,11 |
width: 150px; |
} |
ul#liste-milieux{ |
padding-top:5px; |
float:left; |
} |
ul#liste-milieux li{ |
display:inline; |
width:100px; |
} |
#notes{ |
width:400px; |
284,6 → 290,13 |
#form-upload{ |
margin-top:10px; |
} |
#miniature-info{ |
margin:0; |
} |
.b64{ |
max-width:100px; |
max-height:100px; |
} |
/*-------------------------------------------------------*/ |
/* Partie-preview */ |
#partie-preview legend, #partie-preview{ |
/branches/v1.5-cisaille/jrest/services/CelWidgetSaisie.php |
---|
33,6 → 33,7 |
$this->utilisateur_id = $courriel; |
$ordre = $this->getMaxOrdre($courriel); |
if (!is_null($ordre)) { |
$requeteDonnees = $this->supprimerSlashesProfond($requeteDonnees); |
// Triage et manipulation des données |
$observations = array(); |
75,6 → 76,7 |
$imgAAjouter['id_obs'] = $idObs; |
$imgAAjouter['nom'] = $obs['image_nom']; |
$imgAAjouter['b64'] = $obs['image_b64']; |
$this->debug[] = 'Contient B64 : '.(empty($obs['image_b64']) ? 'non' : 'oui'); |
} |
$observations[$idObs] = array( |
95,11 → 97,13 |
if ($img != null) { |
$this->nettoyerImagesUploades(); |
$nomFichierImg = $this->traiterNomFichierImage($img['nom']); |
$cheminImage = $this->config['cel_db']['chemin_stockage_temp']."/$nomFichierImg"; |
// Si l'image est transmise en base 64 |
if (empty($img['b64']) === false) { |
$this->transformerBase64enFichier($nomFichierImg, $img['b64']); |
$this->transformerBase64enFichier($cheminImage, $img['b64']); |
} |
$cheminImage = $this->config['cel_db']['chemin_stockage_temp']."/$nomFichierImg"; |
$this->debug[] = 'Nom fichier img debut :'.$nomFichierImg; |
$idImg = $this->ajouterImageSurDdEtBdd($img['id_utilisateur'], $cheminImage, $nomFichierImg); |
if ($idImg !== false) { |
$this->lierObsEtImg($idImg, $img['id_utilisateur'], $img['id_obs']); |
145,6 → 149,12 |
$this->envoyerJson($retour); |
} |
private function supprimerSlashesProfond($valeur) { |
$valeur = is_array($valeur) ? array_map(array($this, 'supprimerSlashesProfond'), $valeur) : stripslashes($valeur); |
return $valeur; |
} |
private function getMaxOrdre($identifiant) { |
$ordre = null; |
$identifiant = $this->bdd->quote($identifiant); |
195,14 → 205,12 |
* Décode l'image en base64,enregistre celle-ci sous forme de fichier du type de l'image |
* dans un dossier temporaire. |
*/ |
private function transformerBase64enFichier($fichierNom, $imageInfosB64) { |
private function transformerBase64enFichier($cheminImage, $imageInfosB64) { |
// Enleve la partie data:image qui permet la previsalisation pour firefox de l'image en base64 |
$imageBase64 = explode(';', $imageInfosB64); |
$type = explode('/',$imageBase64[0]); |
$dataBase64 = explode(',',$imageBase64[1]); |
$dataImg = base64_decode($dataBase64[1]); |
$cheminImage = $this->config['cel_db']['chemin_stockage_temp'].'/'.$fichierNom.'.'.$type[1]; |
$imageRessource = fopen($cheminImage, 'wb'); |
fwrite($imageRessource, $dataImg); |
fclose($imageRessource); |
270,7 → 278,7 |
$infosImage['ci_nom_original'] = $nomFichierImage; |
$infosImage['ci_ce_utilisateur'] = $idUtilisateur; |
$infosImage['ci_md5'] = md5_file($cheminImage); |
$this->debug[] = 'Nom fichier img meta :'.$nomFichierImage; |
$requete = $this->construireRequeteInsertionImage($infosImage); |
$resultat = $this->executerRequeteSimple($requete); |
if ($resultat !== false) { |
315,7 → 323,7 |
"WHERE ci_ce_utilisateur = $id_utilisateur "; |
$resultat = $this->executerRequete($requete); |
$ordre = ($resultat) ? $resultat[0]['max_ordre']++ : 0; |
$ordre = ($resultat) ? ++$resultat[0]['max_ordre'] : 0; |
return $ordre; |
} |