Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 3957 → Rev 3958

/trunk/widget/modules/photo/squelettes/popup.tpl.html
318,7 → 318,10
'tailleMax' : 580,
'popupUrl' : "<?php echo $popup_url; ?>",
'urlBaseTelechargement' : "<?php echo $url_base_telechargement; ?>",
'urlServiceRegenererMiniature' : "<?php echo $url_ws_regenerer_img; ?>"
'urlServiceRegenererMiniature' : "<?php echo $url_ws_regenerer_img; ?>",
'userId' : "<?php echo $userId; ?>",
'token' : "<?php echo $token; ?>",
'protocoles' : <?php echo json_encode($protocoles); ?>
};
$( document ).ready( function() {
popup = new WidgetPhotoPopup( widgetProp );
/trunk/widget/modules/photo/squelettes/photo.tpl.html
229,6 → 229,8
<div class="grid-sizer"></div>
<?php foreach ($items as $i => $item) : ?>
<?php
$auteurTruncatedEmail = preg_replace('/[^@]+$/i', '...', $item['utilisateur']['mail_utilisateur']);
$auteur = trim($item['utilisateur']['nom_utilisateur']) ? $item['utilisateur']['nom_utilisateur'] : $auteurTruncatedEmail;
$dimention_img = 'CRS';
$class_extra = '';
?>
254,7 → 256,7
<a class="cel-img-contact"
href="?mode=contact&nn=<?php echo urlencode($item['obs']['nom_sel_nn']); ?>&nom_sci=<?php echo urlencode($item['obs']['nom_sel']); ?>&date=<?php echo urlencode($item['date']); ?>&id_image=<?php echo $item['id_photo_formate']; ?>&auteur=<?php echo $item['utilisateur']['nom_utilisateur']; ?>"
title="Cliquez pour contacter l'auteur de la photo">
<?php echo $item['utilisateur']['nom_utilisateur']; ?>
<?php echo $auteur; ?>
</a>
<?php else : ?>
<?php echo $item['titre']; ?>
307,7 → 309,7
//<![CDATA[
var widgetProp = {
'id' : "<?php echo $id; ?>",
'galerieId' : "<?php echo $galerie_id; ?>"
'galerieId' : "<?php echo $galerie_id; ?>",
};
 
$( document ).ready( function() {
/trunk/widget/modules/photo/squelettes/js/WidgetPhotoPopup.js
10,8 → 10,13
this.popupUrl = proprietes.popupUrl;
this.urlBaseTelechargement = proprietes.urlBaseTelechargement;
this.urlServiceRegenererMiniature = proprietes.urlServiceRegenererMiniature;
this.userId = proprietes.userId;
this.token = proprietes.token;
this.protocoles = proprietes.protocoles;
}
 
this.protocole = null;
this.voteId = null;
this.votes = null;
this.mettreAJourInfosImage();
}
 
36,7 → 41,6
this.initEvtsFonctionsPhoto();
this.initEvtsRetourGalerieResponsive();
this.initEvtsTagsPF();
this.initEvtsProtocole();
};
 
WidgetPhotoPopup.prototype.mettreAJourPopup = function() {
45,9 → 49,8
this.traiterMetas();
this.regenererMiniature();
this.fournirLienIdentiplante();
this.traiterVote();
this.pivoterImage();
// this.pivoterGauche();
this.initEvtsProtocole();
};
 
WidgetPhotoPopup.prototype.mettreAJourInfosImage = function() {
68,7 → 71,8
this.urlIP = this.obs['url_ip'];
this.tagsImage = this.tagsToArray( this.item['tags_photo'] );
this.tagsObs = this.tagsToArray( this.obs['tags_obs'] );
this.auteur = this.item['utilisateur']['nom_utilisateur'];
let auteurMail = this.item['utilisateur']['mail_utilisateur'].split("@")[0];
this.auteur = this.item["utilisateur"]["nom_utilisateur"] ? this.item["utilisateur"]["nom_utilisateur"] : auteurMail;
this.date = this.item['date'];
};
 
680,79 → 684,186
 
WidgetPhotoPopup.prototype.initEvtsProtocole = function() {
const lthis = this;
$('#bloc-notes-protocole').addClass('hidden');
lthis.votes = null
//On transforme la promesse en array
const PROTOCOLES_ARRAY = Object.values(lthis.protocoles);
 
const $select = $('#protocole');
$select.empty(); // Clear existing options
 
// Add the default hidden option
$select.append('<option value="" selected hidden>Choix du protocole</option>');
 
PROTOCOLES_ARRAY.forEach(protocoleData => {
$select.append(`<option id="protocole_${protocoleData['protocole.id']}" value="protocole_${protocoleData['protocole.id']}">${protocoleData['protocole.intitule']}</option>`);
})
 
$( '#protocole').on( 'change', function( event ){
event.preventDefault();
lthis.votes = null
 
var id = $(this).children(":selected").attr("id");
var protocole = id.split("_")[1];
 
$('#bloc-notes-protocole').removeClass('hidden');
 
const message = {
'capitalisation_image': "\"Capitalisation d'image\" est un programme de sciences participatives initié" +
" dans le cadre du projet Pl@nttNet. En attribuant une note aux photos vous nous aidez à connaître" +
" leur qualité.",
'aide_identification': "Message du protocole aide identification",
'defi_photo': "Message du protocole défi photo",
'gentiane_azure': "Message du protocole gentiane_azure",
'arbres_tetards': "Message du protocole arbres_tetards",
// Find the object corresponding to the selected id (protocole.id)
var selectedProtocoleData = PROTOCOLES_ARRAY.find(protocoleData => protocoleData['protocole.id'] === protocole);
 
lthis.protocole = selectedProtocoleData['protocole.id'];
const message = selectedProtocoleData['protocole.descriptif'];
 
$('#message-protocole').html('<p>' + message + '</p>');
 
// On envoie le protocole sélectionné à la partie "vote"
// On récupère tous les votes de l'image depuis pictoflora
lthis.votes = lthis.getVotes(lthis.protocole)
 
// Si l'utilisateur est connect, on vérifie s'il a déjà voté pour cette image et on affiche les étoiles
// correspondantes
if(lthis.userId){
lthis.checkUserVote(lthis.userId, lthis.protocole, lthis.votes);
} else {
lthis.voteId = null;
lthis.removeVoteStars()
}
$('#message-protocole').html('<p>' + message[id] + '</p>');
 
// Remove any previous click event listeners on rating stars
for (let i=1; i<=5; i++){
$("#rating-star-"+i).off("click");
}
 
// Si l'utilisateur vote, on affiche les étoiles correspondantes et on l'envoie vers pictoflora
lthis.traiterVote();
});
};
}
 
WidgetPhotoPopup.prototype.traiterVote = function () {
const lthis = this;
let starSelected = 0
let mode = '';
 
$("#note").attr("value", -1);
 
// Traitement du bouton suppression du vote
$("#note-remove").click(function (){
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
 
$("#note").attr("value", -1);
lthis.removeVoteStars();
mode = 'DELETE';
// On n'envoie le vote que si l'utilisateur est connecté
if (lthis.userId) {
lthis.sendVote(lthis.userId, lthis.protocole, starSelected, mode, lthis.voteId);
}
})
 
$("#rating-star-1").hover(function () {
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
// Si l'utilisateur a déjà voté pour cette image on affiche son vote et on passe en mode modification
let userAVoter = lthis.checkUserVote(lthis.userId, lthis.protocole, lthis.votes);
userAVoter ? mode = 'POST' : mode = 'PUT';
 
$("#rating-star-1").removeClass('far').addClass('fa').css("color", "#c3d45d");
// Affichage du nombre d'étoiles sélectionnées et envoi du vote
for (let i=1; i<=5; i++){
$("#rating-star-"+i).click(function () {
starSelected = i
lthis.displayVote(starSelected);
$("#note").attr("value", starSelected);
// On n'envoie le vote que si l'utilisateur est connecté
if (lthis.userId){
lthis.sendVote(lthis.userId, lthis.protocole, starSelected, mode);
}
});
}
};
 
$("#note").attr("value", 1);
});
// Envoi du vote vers la fonction sendVote() du fichier php
WidgetPhotoPopup.prototype.sendVote = function (userId, protocole, note, mode, voteId){
const lthis = this;
 
$("#rating-star-2").hover(function () {
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
location.reload();
}
};
 
$("#rating-star-1, #rating-star-2").removeClass('far').addClass('fa').css("color", "#c3d45d");
var url = "../widget:cel:photo/";
 
$("#note").attr("value", 2);
});
// Convertir les données en une chaîne JSON pour les envoyer dans le corps de la requête
var data = {
idImage: this.idImage,
mode: mode,
user: userId,
protocole: protocole,
vote: note,
voteId: voteId
}
var jsonData = JSON.stringify(data);
 
$("#rating-star-3").hover(function () {
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
xhttp.open("POST", url+"?action=send_pf_vote", true);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.send(jsonData);
}
 
$("#rating-star-1, #rating-star-2, #rating-star-3").removeClass('far').addClass('fa').css("color", "#c3d45d");
WidgetPhotoPopup.prototype.getVotes = function (protocoleId){
let votes = Object.values(this.item["votes"]);
let noteMoyenne = 0;
let nombreVotes= 0;
let noteTotal = 0;
let itemVotes = [];
 
$("#note").attr("value", 3);
});
votes.forEach(vote => {
if (vote["protocole.id"] == protocoleId){
nombreVotes++
noteTotal += parseInt(vote["vote"]);
noteMoyenne = (noteTotal / nombreVotes).toFixed(1)
itemVotes.push(vote);
}
})
 
$("#rating-star-4").hover(function () {
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
let elementNoteMoyenne = $("#note-moyenne .contenu");
elementNoteMoyenne.text(noteMoyenne);
 
$("#rating-star-1, #rating-star-2, #rating-star-3, #rating-star-4").removeClass('far').addClass('fa').css("color", "#c3d45d");
let elementNoteCount = $("#note-count .contenu");
elementNoteCount.text(nombreVotes);
 
$("#note").attr("value", 4);
});
return itemVotes;
}
 
$("#rating-star-5").hover(function () {
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
WidgetPhotoPopup.prototype.displayVote = function (note){
lthis.removeVoteStars();
 
$("#rating-star-1, #rating-star-2, #rating-star-3, #rating-star-4, #rating-star-5").removeClass('far').addClass('fa').css("color", "#c3d45d");
for (let i=1; i<=5; i++){
for (let j=1; j<=note; j++){
$("#rating-star-"+j).removeClass('far').addClass('fa').css("color", "#c3d45d");
}
}
}
 
$("#note").attr("value", 5);
});
WidgetPhotoPopup.prototype.removeVoteStars = function (){
$(".notation-star").removeClass('fa').addClass('far').css("color", "grey");
$("#note").attr("value", -1);
}
 
// TODO Envoyer le vote
};
WidgetPhotoPopup.prototype.checkUserVote = function (userId, protocoleId, votes){
let userVote = null;
 
votes.forEach(vote => {
if (vote["protocole.id"] == protocoleId && vote["auteur.id"] == userId){
userVote = vote;
}
})
 
if (userVote){
this.displayVote(userVote['vote']);
// this.traiterVote()
this.voteId = userVote['vote.id'];
 
return true
} else {
this.voteId = null;
this.removeVoteStars()
}
}
 
WidgetPhotoPopup.prototype.pivoterImage = function() {
lthis = this;
$( '#pivoter-droite' ).off( 'click' ).on( 'click', function( event ) {
/trunk/widget/modules/photo/Photo.php
51,7 → 51,10
 
// Suffixe de template pour la langue (vide par défaut, correspond à "fr" au français)
private $suffixeLangue = '';
 
private $user = null;
private $service_del_url = null;
/**
* Méthode appelée par défaut pour charger ce widget.
*/
60,7 → 63,7
// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
unset($this->parametres['callback']);
extract($this->parametres);
 
if (!isset($mode)) {
$mode = self::SERVICE_DEFAUT;
}
75,7 → 78,9
$cache = new Cache($cache_stockage, $ddv, $cache_activation);
$id_cache = 'photo-'.hash('adler32', print_r($this->parametres, true));
$contenu = $cache->charger($id_cache);
 
$this->user = $this->getUserFromCookie();
if (!$contenu) {
$methode = $this->traiterNomMethodeExecuter($mode);
 
117,6 → 122,13
$this->envoyer($contenu);
 
}
// POur l'envoi du vote vers PF
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_GET['action']) && $_GET['action'] === 'send_pf_vote') {
$this->sendVote();
}
}
}
 
// maintenir la retrocompatibilité avec l'ancien mode ajax
138,6 → 150,8
private function executerPopup() {
session_start();
 
$protocoles = $this->getProtocoles();
$galerie_id = $_GET['galerie_id'];
$widget['donnees']['url_image'] = $_GET['url_image'];
$widget['donnees']['infos_images'] = $_SESSION[$galerie_id]['infos_images'];
150,9 → 164,15
$widget['donnees']['popup_url'] = isset( $_GET['popup_url'] ) ? $_GET['popup_url'] : null;
$widget['donnees']['url_base_telechargement'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelImageFormat/');
$widget['donnees']['formats_description'] = self::IMAGE_FORMATS;
$widget['donnees']['protocoles'] = $protocoles;
if ($this->user){
$widget['donnees']['userId'] = $this->user['id'];
$widget['donnees']['token'] = $this->user['token'];
}
 
$widget['squelette'] = 'popup' . $this->suffixeLangue;
 
return $widget;
}
 
268,16 → 288,22
if ($key == $max_photo) {
break;
}
$auteurTruncatedEmail = $this->tronquerCourriel($image['utilisateur']['mail_utilisateur']);
$auteur = trim($image['utilisateur']['nom_utilisateur']) ? $image['utilisateur']['nom_utilisateur'] : $auteurTruncatedEmail;
$item = $image;
// Formatage date
$item['date_photo'] = $image['date_photo'] ?? $image['obs']['date_obs'];
$item['date_redige'] = strftime('%A %d %B %Y', $item['date_photo']);
$item['date_redige'] = strftime('%A %d %B %Y', strtotime($item['date_photo']));
$item['date'] = date_format(date_create($item['date_photo']),"d/m/Y");
$item['lien'] = sprintf($this->eflore_url_tpl, $image['obs']['nom_referentiel'], $image['obs']['nom_sel_nn']);
$image['url_photo'] = preg_replace('/,/', "", $image['url_photo']);
$item['url_tpl'] = preg_replace('/(O|XS|[SML]|X(?:[23]|)L|CR(?:|X2)S|C(?:|X)S)$/', '%s.jpg',$image['url_photo']);
// Formatage titre
$item['titre'] = $image['obs']['nom_sel'].' [nn'.$image['obs']['nom_sel_nn'].'] par '.$image['utilisateur']['nom_utilisateur'].' le '.date_format(date_create($image['obs']['date_obs']),"d/m/Y").' - '.$image['obs']['localisation'];
 
$item['titre'] = $image['obs']['nom_sel'].' [nn'.$image['obs']['nom_sel_nn'].'] par '.$auteur.' le '
.date_format(date_create($image['obs']['date_obs']),"d/m/Y").' - '.$image['obs']['localisation'];
 
$item['id_photo_formate'] = sprintf('%09d', $image['id_photo']);
$item['urlProfil'] = sprintf($this->config['photo']['tbProfilUrlTpl'], $image['utilisateur']['id_utilisateur'] );
// Ajout aux items et si première photo à extra
291,6 → 317,9
$image_size = getimagesize($url_galerie_popup);
$item['width'] = $image_size[0];
$item['height'] = $image_size[1];
// Récupération des votes pictoflora
$item['votes'] = $this->getVotes($item);
 
$_SESSION[$galerie_id]['infos_images'][$url_galerie_popup] = $item;
}
357,5 → 386,93
return boolval($var);
}
}
private function getProtocoles(){
$protocoles = [];
$this->service_del_url = $this->config['chemins']['baseURLServicesDelTpl'];
$url = sprintf($this->service_del_url, 'protocoles');
$json = $this->getDao()->consulter($url);
if (empty($json)) {
$this->messages[] = "L'URI suivante est invalide : $url";
} else {
$protocoles= json_decode($json, true);
}
return $protocoles['resultats'];
}
private function getVotes($image){
$votes = [];
$id = $image['id_photo'];
$this->service_del_url = $this->config['chemins']['baseURLServicesDelTpl'];
$url = sprintf($this->service_del_url, 'images/'.$id.'/votes');
$json = $this->getDao()->consulter($url);
if (empty($json)) {
$this->messages[] = "L'URI suivante est invalide : $url";
} else {
foreach (json_decode($json, true)['resultats'] as $vote){
$votes[] = $vote;
}
}
return $votes;
}
 
public function sendVote(){
$data = json_decode(file_get_contents('php://input'), true);
$id = $data['idImage'];
$mode = $data['mode'];
$contenu = [
'utilisateur' => $data['user'],
'protocole' => $data['protocole'],
'valeur' => $data['vote']
];
switch ($mode){
case 'PUT':
case 'POST':
$this->service_del_url = $this->config['chemins']['baseURLServicesDelTpl'];
$url = sprintf($this->service_del_url, 'images/'.$id.'/votes/');
$this->send($url, $mode, $contenu);
break;
case 'DELETE':
$this->service_del_url = $this->config['chemins']['baseURLServicesDelTpl'];
$url = sprintf($this->service_del_url, 'images/'.$id.'/votes/'.$data['voteId']);
$this->send($url, $mode, $contenu);
break;
}
}
public function send($url, $mode, Array $donnees = array()){
$contenu = false;
$authorizationToken = $this->user['token'];
 
$json = json_encode($donnees);
$contexte = stream_context_create([
'http' => [
'method' => $mode,
'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
"Authorization: $authorizationToken\r\n",
'content' => http_build_query($donnees, null, '&')]
]);
$flux = fopen($url, 'r', false, $contexte);
if (!$flux) {
$e = "L'ouverture de l'url '{$url}' par la méthode HTTP {$mode} a échoué! avec les données {$json} et le token {$authorizationToken}";
trigger_error($e, E_USER_WARNING);
} else {
// Contenu actuel de $url
$contenu = stream_get_contents($flux);
fclose($flux);
}
return $contenu;
}
}
?>