Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1122 → Rev 1123

/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/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/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&amp;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;">&nbsp;</p>
<div id="miniature"></div>
<button id="effacer-miniature" type="button" style="display:none;">Effacer</button>
</fieldset>
/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;
}