Bonjour les amis, me revoila a la rechecrche de solution,
Comme je suis débutant en JS j'utilise jquery et je galere quand meme!
J'ai fais une page dans laquelle il y a des éléments type imge que l''on peut déplacer dans une zone dropable chaque éléments a des attributs spécifiques ( class, id, alt, style) et incrémente des compteurs différents puis lors d'un click button j'utilise html2canvas qui me fait une image de la div dropable puis jspdf qui met l'image dans un pdf, ensuite toutes données renseignées, les compteurs ainsi que l'image et le PDF sont enregistrer dans la bdd mysql et ça fonctionne pas mal, certain sur ce forum mon deja donner un coup de main dailleurs, je les remercis encore.
Je souhaite faire évoluer encore cette outil en donnant la possibilité de modifier les créations des données et images et pdf.
Comme le titre l'indique je recheche a enregistrer la position x, y lors d'un click buton des éléments drag and drop en jquery dans mysql.
Il peut y avoir plusieurs éléments déplacés a l'aide du drag and drop en jquery, genre 10 éléments ou 50 éléments cela dépend.
Je soushaite si possible que la position soit enregister sur des attribut type class html exemple class="ui-removable"
Je souhaite donc enregistrer leurs positions, leurs attributs class, id, alt, style, noms avec extension type .png, .gif, .svg ou .jpg le chemin type src="images/...".
Tout ça pour pouvoir retrouver tout les éléments précedement enregistrer a la meme position lors d'un click bouton.
Ce click boutton ouvrira une page avec une zone dropable dans laquelle les éléments (images) récuperer depuis mysql seront a leurs place avec leurs attributs class id alt src et style.
Voici quelques éléments déplacable avant le déplacement:
<div><img id="paper1" style="width:26px;height:64px" class="ui-widget-content elementRotate TrgtPaper" src="images/IPSC_Mini_Target.png" title="mini target ipsc" alt="minitarget"> </div>
<img id="metal1" class="ui-widget-content elementRotate TrgtPopper" src="images/IPSC_miniPopper.svg" title="Mini popper" alt="minipopper">
<img id="decor8" class="ui-widget-content elementRotate" src="images/Panneau_tsv1.svg" width="150" title="Panneausvg" alt="Panneausvg">
Voici un élément apres déplacement dans la zone dropable:
<img style="width: 26px; height: 64px; position: absolute; left: 609px; top: 254.719px;" class="elementRotate TrgtPaper ui-draggable ui-draggable-dragging ui-removable" src="images/IPSC_Mini_Target_iso1.png" title="mini target ipsc" alt="minitarget">
Voici la fonction qui recupere le tout vers un fichier php pour l'enregistrement(ce script est dans la meme page que les éléments)
<script>
//script pour capturer l'image du stage
function uploadFile() {
window.scrollTo(0, 0); //scroll page entiere du haut en bas
html2canvas(document.getElementById("main"),{scale: 2}).then(function(canvas){ //creation image avec scale: 2-> qualité X2
var doc = new jsPDF();
// doc.setFontSize(40); //taille titre
// doc.text(40, 25, "TSV STAGE MAKER") // titre
doc.addImage(canvas.toDataURL("image/jpeg", 0.9), 'JPEG', 5, 10, 200, 310); //'JPEG', 15(Gauche), 10 (Haut), 180 (Droite), 280 (Bas)
var blob = doc.output('blob');
var image = ("image=" + canvas.toDataURL("image/jpeg", 0.9));
var nomstage = document.querySelector('[name="nomstage"]');
var numstage = document.querySelector('[name="numstage"]');
var TrgtTypeId = document.querySelector('[name="TrgtTypeId"]');
var ScoringId = document.querySelector('[name="ScoringId"]');
var StartOn = document.querySelector('[name="StartOn"]');
// var StartPos = document.getElementById("StartPos");
var StartPos = document.querySelector('[name="StartPos"]');
var Descriptn = document.getElementById("Descriptn");
var CourseId = document.querySelector('[name="CourseId"]');
var matchsid = document.querySelector('[name="matchsid"]');
var MaxPoints = document.querySelector('[name="MaxPoints"]');
var MinRounds = document.querySelector('[name="MinRounds"]');
var TrgtPaper = document.querySelector('[name="TrgtPaper"]');
var TrgtPlates = document.querySelector('[name="TrgtPlates"]');
var TrgtPenlty = document.querySelector('[name="TrgtPenlty"]');
var TrgtPopper = document.querySelector('[name="TrgtPopper"]');
var bobber = document.getElementById("bobber");
var StringCnt = document.querySelector('[name="StringCnt"]');
var ReportOn = document.querySelector('[name="ReportOn"]');
var formData = new FormData();
formData.append('pdf', blob);
formData.append('jpeg', image);
formData.append('nomstage', nomstage.value);
formData.append('numstage', numstage.value);
formData.append('TrgtTypeId', TrgtTypeId.value);
formData.append('ScoringId', ScoringId.value);
formData.append('StartOn', StartOn.value);
formData.append('StartPos', StartPos.innerText);
formData.append('Descriptn', Descriptn.value);
formData.append('CourseId', CourseId.value);
formData.append('matchsid', matchsid.value);
formData.append('MaxPoints', MaxPoints.innerText);
formData.append('MinRounds', MinRounds.innerText);
formData.append('TrgtPaper', TrgtPaper.innerText);
formData.append('TrgtPlates', TrgtPlates.innerText);
formData.append('TrgtPenlty', TrgtPenlty.innerText);
formData.append('TrgtPopper', TrgtPopper.innerText);
formData.append('bobber', bobber.innerText);
formData.append('StringCnt', StringCnt.value);
formData.append('ReportOn', ReportOn.value);
console.log(formData);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
alertify.success('Stage successfully saved');
return;
}
}
xhr.open('post', '/save-capture.php');
xhr.send(formData);
});
}
</script>
Voici les fonctions pour le drag and drop et les compteurs (une partie) qui se trouve pas dans le meme fichier que les éléments et la partie ajax:
$(document).ready(function() { //fonction qui exectute le script
//console.log(document);
var nbcoup = 0; //Nombre de coup
document.getElementById("nbcp").innerText = nbcoup;
var pts = 0; //Nombre de points
document.getElementById("point").innerText = pts;
var pap = 0; //Nombre de cible papier
document.getElementById("papier").innerText = pap;
var met = 0; //Nombre de métal
document.getElementById("metal").innerText = met;
var minipap = 0; //Nombre de cible papier
document.getElementById("minipapier").innerText = minipap;
var minimet = 0; //Nombre de métal
document.getElementById("minimetal").innerText = minimet;
var plt = 0; //Nombre de métal poper
document.getElementById("plate").innerText = plt;
var bob = 0; //Nombre de métal minipoper
document.getElementById("bobber").innerText = bob;
var nosh = 0; //Nombre de noshoot
document.getElementById("targetNS").innerText = nosh;
var n = 0;
var p = 0;
$('.ui-widget-content').draggable({ //fonction qui rend les elements draggable
helper: 'clone',
cursor: 'move',
scope: "#paper , #metal , #decor",
grid: [2, 1],
$("#dropzone").droppable({ //fonction qui rend la zone droppable
//accept: "#objet1, #objet2 , #objet3 , #objet4",
scope: "#paper , #metal , #decor",
drop: function(event, ui) { //fonction qui gere les evenements de drop
if (ui.draggable.attr("alt") == "popper") {
n = 1;
p = 5;
met++;
} else if (ui.draggable.attr("alt") == "minipopper") {
n = 1;
p = 5;
minimet++;
} else if (ui.draggable.attr("alt") == "plate") {
n = 1;
p = 5;
plt++;
} else if (ui.draggable.attr("alt") == "target") {
n = 2;
p = 10;
pap++;
} else if (ui.draggable.attr("alt") == "minitarget") {
n = 2;
p = 10;
minipap++;
} else if (ui.draggable.attr("alt") == "bobber") {
n = 2;
p = 10;
bob++;
} else if (ui.draggable.attr("alt") == "targetNS") {
n = 0;
p = 0;
nosh++;
} else {
n = 0;
p = 0;
}
nbcoup = nbcoup + n;
pts = pts + p;
document.getElementById("nbcp").innerText = nbcoup; //ligne qui pemettent d'écrire dans le tableau en positif
document.getElementById("point").innerText = pts;
document.getElementById("metal").innerText = met;
document.getElementById("papier").innerText = pap;
document.getElementById("minimetal").innerText = minimet;
document.getElementById("minipapier").innerText = minipap;
document.getElementById("plate").innerText = plt;
document.getElementById("bobber").innerText = bob;
document.getElementById("targetNS").innerText = nosh;
var redrag = $(ui.helper).clone().removeClass('ui-widget-content') //variable qui enleve la class du l'élément cloné et qui redonne la fontion draggable aux clones
redrag.draggable({
containment: 'parent',
cursor: 'move',
grid: [2, 2],
snap: true,
snapTolerance: 5,
});
$(this).append(redrag);
$("img").click(function() { //fonction qui permet de rendre draggable des elements inseré dans la zone dropzone
var maxZindex = 0;
$("img").each(function() {
var z = parseInt($(this).css('z-index'));
if (isNaN(z)) z = 0;
if (z > maxZindex) maxZindex = z;
});
//assign a z-index greater than the current max to the clicked item
$(this).css('z-index', maxZindex + 1);
});
if ( $(this).find('img').addClass("ui-removable") ) { //fonction qui permet d'ajouter une class pour le supprimer
};
1 mais en méthode formdata comme juste au dessus plutot que la méthode ci-dessous avec push, data, json..
2 la partie JS qui gere la partie drag and drop et compteurs ce trouve dans une autre fichier JS, ce sui me pose probleme pour la partie ajax!
J'ai éfféctuer quelques tests en mettant tout sur la meme page et je souhaite adapter ce test qui fonctionne a ma page ave cles réells éléments
Partie html du test
<!-- div dropable avec éléments draggable -->
<div id="glassbox">
<img id="paper1" style="width:26px;height:64px" class="ui-widget-content elementRotate TrgtPaper" src="images/IPSC_Mini_Target.png" title="mini target ipsc" alt="minitarget">
<img id="metal1" class="ui-widget-content elementRotate TrgtPopper" src="images/IPSC_miniPopper.svg" title="Mini popper" alt="minipopper">
<img id="decor8" class="ui-widget-content elementRotate" src="images/declencheur.png" width="70" title="Déclencheur" title="Fleche" alt="declencheur">
</div>
<div id="respond"></div>
Partie PHP du test
<!-- div dropable avec éléments draggable -->
<div id="glassbox">
<?php
$get_coords = $bdd->query("SELECT * FROM coords");
while ($row = $get_coords->fetch()) {
$x = $row['x_pos'];
$y = $row['y_pos'];
$src = $row['srcImg'];
$class = $row['classImg'];
$id = $row['idImg'];
$alt = $row['altImg'];
$style = $row['styleImg'];
//then echo our div element with CSS properties to set the left(x) and top(y) values of the element
echo '<div id='.$id.' class='.$class.' style='.$style.'"><img src='.$src.' alt='.$alt.'><p></p></div>';
}?>
</div>
<div id="respond"></div>
partie JS du test
<script type="text/javascript">
$(document).ready(function() {
$(".ui-widget-content").draggable({
containment: '#glassbox',
scroll: false
})
.mousemove(function(){
var coord = $(this).position();
$("img:last").text( "left: " + coord.left + ", top: " + coord.top );
})
.mouseup(function(){
var coords=[];
var coord = $(this).position();
var srcElem = $(this).attr("src");
var classElem = $(this).removeClass("ui-draggable ui-draggable-dragging");
var classElemOK = $(this).attr("class");
var idElem = $(this).attr("id");
var altElem = $(this).attr("alt");
var styleElem = $(this).attr("style");
var item={
coordTop: coord.left,
coordLeft: coord.top,
srcElem,
classElemOK,
idElem,
altElem,
styleElem
};
console.log(item);
coords.push(item);
var order = { coords: coords };
$.post('updatecoords.php', 'data='+$.toJSON(order), function(response){
if(response=="success")
$("#respond").html('<div class="success">X and Y Coordinates Saved!</div>').hide().fadeIn(1000);
setTimeout(function(){ $('#respond').fadeOut(1000); }, 2000);
});
});
});
</script>