Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1811 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  Formulaire avec signature sur tablette

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Formulaire avec signature sur tablette

n°2315913
charliedap​s
Posté le 26-05-2018 à 20:57:41  profilanswer
 

Bonjour à toutes et à tous,
 
Un ami voudrait pour son futur site internet un sorte de formulaire avec une zone "manuscrite" pour que ces clients puissent signer soit avec la souris soit avec le doigt (tablette ou similaire) (Ce sont en fait des bons de commande lors de ses démarches chez ses clients).  Ma maîtrise du codage ayant ses limites, je fais appel à votre savoir et aide :)
 
J'ai comme base https://www.zetakey.com/codesample-signature.php
 
J'ai modifié pour tester la page html
 

Code :
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.         <meta name="viewport" content="initial-scale=1, maximum-scale=1">
  6.         <script src="signature.js"></script>
  7.     </head>
  8.     <style>
  9.         body, canvas, div, form, input {
  10.             margin: 0;
  11.             padding: 0;
  12.         }
  13.         #wrapper {
  14.             width: 100%;
  15.             padding: 1px;
  16.         }
  17.         canvas {
  18.             position: relative;
  19.             margin: 1px;
  20.             margin-left: 0px;
  21.             border: 1px solid #3a87ad;
  22.         }
  23.         h1, p {
  24.             padding-left: 2px;
  25.             width: 100%;
  26.             margin: 0 auto;
  27.         }
  28.         #controlPanel {
  29.             margin: 2px;
  30.         }
  31.         #saveSignature {
  32.             display: none;
  33.         }
  34.     </style>
  35.     <body>
  36.         <div id="wrapper">
  37.             <p>Zetakey Signature Webapp</p>
  38.            
  39.             <form>
  40.                 <label for="Email">To:</label>
  41.                 <input type="email" id="sendemail" size="35" placeholder="Send to email" autocomplete="on"/><br>
  42.                 <label for="Name">Nom:</label>
  43.                 <input type="text" id="name" size="35" autocomplete="on"/>
  44.             </form>
  45.            
  46.             <div id="canvas">
  47.                 Canvas is not supported.
  48.             </div>
  49.            
  50.            
  51.             <script>
  52.                 zkSignature.capture();
  53.             </script>
  54.             <button type="button" onclick="zkSignature.clear()">
  55.                 Clear Signature
  56.             </button>
  57.             <br />
  58.             <img id="saveSignature" alt="Saved image png"/>
  59.             <form>
  60.                 <label for="Email"></label>
  61.                 <input type="hidden" type="email" id="replyemail"  size="35" value="Validation disclaimer" disabled />
  62.                 <br />
  63.                 <button type="button" onclick="zkSignature.send()">
  64.                     Send Email
  65.                 </button>
  66.             </form>
  67.         </div>
  68.     </body>
  69. </html>


 
Jusque là ça va +/-
 
Mais quand le mail est envoyé il n'apparaît pas le name du pseudo formulaire alors que le to apparaît bien.
 
Voici les modifications du .js (j'imagine que c'est un problème de traitement des données venant sur fichier html.
 

Code :
  1. **************************************************/
  2. var zkSignature = (function () {
  3.     var empty = true;
  4.     return {
  5.         //public functions
  6.         capture: function (){
  7.                 var parent = document.getElementById("canvas" );
  8.                 parent.childNodes[0].nodeValue = "";
  9.                 var canvasArea = document.createElement("canvas" );
  10.                 canvasArea.setAttribute("id", "newSignature" );
  11.                 parent.appendChild(canvasArea);
  12.                 var canvas = document.getElementById("newSignature" );
  13.                 var context = canvas.getContext("2d" );
  14.                 if (!context) {
  15.                     throw new Error("Failed to get canvas' 2d context" );
  16.                 }
  17.                 screenwidth = screen.width;
  18.                 if (screenwidth < 480) {
  19.                     canvas.width = screenwidth - 8;
  20.                     canvas.height = (screenwidth * 0.63);
  21.                 } else {
  22.                     canvas.width = 464;
  23.                     canvas.height = 304;
  24.                 }
  25.                 context.fillStyle = "#fff";
  26.                 context.strokeStyle = "#444";
  27.                 context.lineWidth = 1.2;
  28.                 context.lineCap = "round";
  29.                 context.fillRect(0, 0, canvas.width, canvas.height);
  30.                 context.fillStyle = "#3a87ad";
  31.                 context.strokeStyle = "#3a87ad";
  32.                 context.lineWidth = 1;
  33.                 context.moveTo((canvas.width * 0.042), (canvas.height * 0.7));
  34.                 context.lineTo((canvas.width * 0.958), (canvas.height * 0.7));
  35.                 context.stroke();
  36.                 context.fillStyle = "#fff";
  37.                 context.strokeStyle = "#444";
  38.                 var disableSave = true;
  39.                 var pixels = [];
  40.                 var cpixels = [];
  41.                 var xyLast = {};
  42.                 var xyAddLast = {};
  43.                 var calculate = false;
  44.                 //functions
  45.                 {
  46.                     function remove_event_listeners() {
  47.                         canvas.removeEventListener('mousemove', on_mousemove, false);
  48.                         canvas.removeEventListener('mouseup', on_mouseup, false);
  49.                         canvas.removeEventListener('touchmove', on_mousemove, false);
  50.                         canvas.removeEventListener('touchend', on_mouseup, false);
  51.                         document.body.removeEventListener('mouseup', on_mouseup, false);
  52.                         document.body.removeEventListener('touchend', on_mouseup, false);
  53.                     }
  54.                     function get_board_coords(e) {
  55.                         var x, y;
  56.                         if (e.changedTouches && e.changedTouches[0]) {
  57.                             var offsety = canvas.offsetTop || 0;
  58.                             var offsetx = canvas.offsetLeft || 0;
  59.                             x = e.changedTouches[0].pageX - offsetx;
  60.                             y = e.changedTouches[0].pageY - offsety;
  61.                         } else if (e.layerX || 0 == e.layerX) {
  62.                             x = e.layerX;
  63.                             y = e.layerY;
  64.                         } else if (e.offsetX || 0 == e.offsetX) {
  65.                             x = e.offsetX;
  66.                             y = e.offsetY;
  67.                         }
  68.                         return {
  69.                             x : x,
  70.                             y : y
  71.                         };
  72.                     };
  73.                     function on_mousedown(e) {
  74.                         e.preventDefault();
  75.                         e.stopPropagation();
  76.                         canvas.addEventListener('mousemove', on_mousemove, false);
  77.                         canvas.addEventListener('mouseup', on_mouseup, false);
  78.                         canvas.addEventListener('touchmove', on_mousemove, false);
  79.                         canvas.addEventListener('touchend', on_mouseup, false);
  80.                         document.body.addEventListener('mouseup', on_mouseup, false);
  81.                         document.body.addEventListener('touchend', on_mouseup, false);
  82.                         empty = false;
  83.                         var xy = get_board_coords(e);
  84.                         context.beginPath();
  85.                         pixels.push('moveStart');
  86.                         context.moveTo(xy.x, xy.y);
  87.                         pixels.push(xy.x, xy.y);
  88.                         xyLast = xy;
  89.                     };
  90.                     function on_mousemove(e, finish) {
  91.                         e.preventDefault();
  92.                         e.stopPropagation();
  93.                         var xy = get_board_coords(e);
  94.                         var xyAdd = {
  95.                             x : (xyLast.x + xy.x) / 2,
  96.                             y : (xyLast.y + xy.y) / 2
  97.                         };
  98.                         if (calculate) {
  99.                             var xLast = (xyAddLast.x + xyLast.x + xyAdd.x) / 3;
  100.                             var yLast = (xyAddLast.y + xyLast.y + xyAdd.y) / 3;
  101.                             pixels.push(xLast, yLast);
  102.                         } else {
  103.                             calculate = true;
  104.                         }
  105.                         context.quadraticCurveTo(xyLast.x, xyLast.y, xyAdd.x, xyAdd.y);
  106.                         pixels.push(xyAdd.x, xyAdd.y);
  107.                         context.stroke();
  108.                         context.beginPath();
  109.                         context.moveTo(xyAdd.x, xyAdd.y);
  110.                         xyAddLast = xyAdd;
  111.                         xyLast = xy;
  112.                     };
  113.                     function on_mouseup(e) {
  114.                         remove_event_listeners();
  115.                         disableSave = false;
  116.                         context.stroke();
  117.                         pixels.push('e');
  118.                         calculate = false;
  119.                     };
  120.                 }
  121.                 canvas.addEventListener('mousedown', on_mousedown, false);
  122.                 canvas.addEventListener('touchstart', on_mousedown, false);
  123.         }
  124.         ,
  125.         save : function(){
  126.                 var canvas = document.getElementById("newSignature" );
  127.                 // save canvas image as data url (png format by default)
  128.                 var dataURL = canvas.toDataURL("image/png" );
  129.                 document.getElementById("saveSignature" ).src = dataURL;
  130.         }
  131.         ,
  132.         clear : function(){
  133.                 var parent = document.getElementById("canvas" );
  134.                 var child = document.getElementById("newSignature" );
  135.                 parent.removeChild(child);
  136.                 empty = true;
  137.                 this.capture();
  138.         }
  139.         ,
  140.         send : function(){
  141.                 if (empty == false){
  142.                 var canvas = document.getElementById("newSignature" );
  143.                 var dataURL = canvas.toDataURL("image/png" );
  144.                 document.getElementById("saveSignature" ).src = dataURL;
  145.                 var sendemail = document.getElementById('sendemail').value;
  146.                 var name = document.getElementById('name').value;
  147.                 var replyemail = document.getElementById('replyemail').value;
  148.                 var dataform = document.createElement("form" );
  149.                 document.body.appendChild(dataform);
  150.                 dataform.setAttribute("action","upload_file.php" );
  151.                 dataform.setAttribute("enctype","multipart/form-data" );
  152.                 dataform.setAttribute("method","POST" );
  153.                 dataform.setAttribute("target","_self" );
  154.                 dataform.innerHTML =
  155.                     '<input type="text" name="image" value="' + dataURL + '"/>'
  156.                     +
  157.                     '<input type="email" name="email" value="' + sendemail + '"/>'
  158.                     +
  159.                     '<input type="text" name="name" value="' + name + '"/>'
  160.                     +
  161.                     '<input type="email" name="replyemail" value="' + replyemail + '"/>'
  162.                     +
  163.                     '<input type="submit" value="Click me" />';
  164.                 dataform.submit();
  165.                 }
  166.         }
  167.     }
  168. })()
  169. var zkSignature;


 
J'ai également modifié le fichier .php (qui doit aussi traiter les données) mais sans plus de succès.
 

Code :
  1. $name = $_POST["name"];


 

Code :
  1. $body = "Signé le - Signed on " . date('d.m.Y H:i:s') .  "\n Signed and Send by Jet " .  "\n Test deuxième ligne $name ";


Quand je fais cette ligne, le name apparaît pas dans le mail
 

Code :
  1. $body = "Signé le - Signed on " . date('d.m.Y H:i:s') .  "\n Signed and Send by Jet " .  "\n Test deuxième ligne $to ";


Quand c'est to, le to apparaît bien dans le mail.
 
Merci d'avance pour votre aide.
 
 
 
 

mood
Publicité
Posté le 26-05-2018 à 20:57:41  profilanswer
 

n°2315916
MaybeEijOr​Not
but someone at least
Posté le 26-05-2018 à 21:26:26  profilanswer
 

Bonjour,
 
Vérifie déjà ce que retourne ta variable name dans le js et ce que $_POST["name"] retourne dans le php.
Cela permettra de voir de quel côté il vaut mieux chercher.  ;)


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2315918
charliedap​s
Posté le 26-05-2018 à 21:55:08  profilanswer
 

Bonsoir,
 
Merci pour ta réponse.
 
C'est moi qui ai crée $_POST["name"]
 
Dans le fichier html, j'ai ajouté
 

Code :
  1. <label for="Name">Nom:</label>
  2.                 <input type="text" id="name" size="35" autocomplete="on"/>


 
et ceci dans le js
 

Code :
  1. var name = document.getElementById('name').value;


 
Merci pour ton aide.


Message édité par charliedaps le 26-05-2018 à 21:55:39
n°2315920
MaybeEijOr​Not
but someone at least
Posté le 26-05-2018 à 22:56:49  profilanswer
 

Non mais ça j'ai compris.

 

Je ne vois pas à première vue d'où vient le problème, et quand on ne voit ni le problème ni de message d'erreur, la démarche à suivre c'est de debugger son code en regardant ce que valent les variables à chaque étape du code.

 

N'ayant qu'une partie du code je ne peux pas le faire à ta place.

 

Il existe des outils pour débugger afin de suivre pas à pas ce qui se passe à chaque ligne de code. Sinon tu peux utiliser des techniques barbares mais tout aussi efficaces, par exemple, dans le JS, après :

Code :
  1. var name = document.getElementById('name').value;


Tu peux ajouter :

Code :
  1. console.log(name);
  2. return;


Afin de récupérer dans la console ce que vaut la variable name et interrompre le reste du code.

 

Tout comme tu dois pouvoir faire en PHP :

Code :
  1. exit(var_dump($_POST));


Message édité par MaybeEijOrNot le 26-05-2018 à 22:57:31

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2315926
charliedap​s
Posté le 27-05-2018 à 09:32:10  profilanswer
 

Bonjour,
 
Je te remercie pour ces explications mais je ne suis arrivé à rien excepté planter toute la page :( et même en remettant l'ancien code, ça fonctionne pas.  Bref un délai que je vais bien trouvé.
 
Voici le code php.  Il n'y a que 3 fichiers.
 

Code :
  1. <?php
  2. function geturlonly() {
  3.     $urlpath = explode('/', $_SERVER['PHP_SELF']);
  4.     array_pop($urlpath);
  5.     $scriptname = implode("/", $urlpath);
  6.     $http_protocol = 'http';
  7.     if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ($_SERVER['SERVER_PORT'] == 443)){
  8.       $http_protocol = 'https';
  9.     }
  10.     return $http_protocol . "://" . $_SERVER["HTTP_HOST"] . $scriptname . "/";
  11. }
  12. function multi_attach_mail($to, $sendermail, $subject, $message, $files) {
  13.     // email fields: to, from, subject, and so on
  14.     $from = $sendermail;
  15.     $headers = "From: $from";
  16.     // boundary
  17.     $semi_rand = md5(time());
  18.     $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  19.     // headers for attachment
  20.     $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
  21.     // multipart boundary
  22.     $message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";
  23.     if (is_file($files)) {
  24.         $message .= "--{$mime_boundary}\n";
  25.         $fp = @fopen($files, "rb" );
  26.         $data = @fread($fp, filesize($files));
  27.         @fclose($fp);
  28.         $data = chunk_split(base64_encode($data));
  29.         $message .= "Content-Type: application/octet-stream; name=\"" . basename($files) . "\"\n" . "Content-Description: " . basename($files[$i]) . "\n" . "Content-Disposition: attachment;\n" . " filename=\"" . basename($files) . "\"; size=" . filesize($files) . ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
  30.         $i = TRUE;
  31.     } else {
  32.         // preparing attachments
  33.         for ($i = 0; $i < count($files); $i++) {
  34.             if (is_file($files[$i])) {
  35.                 $message .= "--{$mime_boundary}\n";
  36.                 $fp = @fopen($files[$i], "rb" );
  37.                 $data = @fread($fp, filesize($files[$i]));
  38.                 @fclose($fp);
  39.                 $data = chunk_split(base64_encode($data));
  40.                 $message .= "Content-Type: application/octet-stream; name=\"" . basename($files[$i]) . "\"\n" . "Content-Description: " . basename($files[$i]) . "\n" . "Content-Disposition: attachment;\n" . " filename=\"" . basename($files[$i]) . "\"; size=" . filesize($files[$i]) . ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
  41.             }
  42.         }
  43.     }
  44.     $message .= "--{$mime_boundary}--";
  45.     $returnpath = "-f" . $sendermail;
  46.     $ok = @mail($to, $subject, $message, $headers, $returnpath);
  47.     if ($ok) {
  48.         return $i;
  49.     } else {
  50.         return FALSE;
  51.     }
  52. }
  53. function base64_to_jpeg($base64_string, $output_file) {
  54.     $ifp = @fopen($output_file, "wb" );
  55.     $data = explode(',', $base64_string);
  56.     @fwrite($ifp, base64_decode($data[1]));
  57.     @fclose($ifp);
  58.     return $output_file;
  59. }
  60. function add_ZK_mark($inputfile, $outputfile) {
  61. //    var_dump(gd_info());
  62.     $im = @imagecreatefrompng($inputfile);
  63.     $bg = @imagecolorallocate($im, 255, 255, 255);
  64.     $textcolor = @imagecolorallocate($im, 0, 0, 255);
  65.     list($x, $y, $type) = getimagesize($inputfile);
  66.     $txtpos_x = $x - 170;
  67.     $txtpos_y = $y - 20;
  68.     @imagestring($im, 5, $txtpos_x, $txtpos_y, 'Powered by Jet', $textcolor);
  69.     $txtpos_x = $x - 145;
  70.     $txtpos_y = 20;
  71.     @imagestring($im, 3, $txtpos_x, $txtpos_y, date("d-m-Y H:i:s" ), $textcolor);
  72.     @imagepng($im, $outputfile);
  73.     // Output the image
  74.     //imagejpeg($im);
  75.     @imagedestroy($im);
  76. }
  77. date_default_timezone_set("Europe/Madrid" );
  78. $output_file = "captured/signature" . date("d-m-Y-H-i-s-" ).time(). ".png";
  79. base64_to_jpeg($_POST["image"], $output_file);
  80. add_ZK_mark($output_file, $output_file);
  81. $to = $_POST["email"];
  82. $name = $_POST["name"];
  83. $replyemail = $_POST["replyemail"];
  84. $replyemail = "contact@zetakey.com";
  85. if( (!isset($_POST["email"])) || ($to == "toemail@example.com" ) || ($replyemail == "youremail@example.com" )|| ($to == "" )){
  86.     echo("<p>Incorrect email address...</p>" );
  87.     echo "<a href=\"index.html\">Sign and Send again!</a>";
  88.     exit;
  89. }
  90. $subject = "Contrat Jet";
  91. $curdir = dirname($_SERVER['REQUEST_URI']) . "/";
  92. $dir = $_SERVER['SERVER_NAME'] . $curdir;
  93. $urlonly = geturlonly();
  94. $body = "Signé le - Signed on " . date('d.m.Y H:i:s') .  "\n Signed and Send by Jet " .  "\n Test deuxième ligne $to ";
  95. //$from = "contact@zetakey.com";
  96. $headers = "From: $replyemail" . "\r\nReply-To: $replyemail";
  97. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  98.     //if (mail($to, $subject, $body, $headers)) {
  99.     echo("<p>Message successfully sent to " . $to . " !</p>" );
  100. } else {
  101.     echo("<p>Message delivery failed...</p>" );
  102. }
  103. echo "<a href=\"index.html\">Sign and Send again!</a>";
  104. exit ;
  105. ?>


 
Je me suis basé sur la conception d'un formulaire mais je dois admettre que le fichier upload, j'ai comprends pas grand chose.
 
Merci d'avance pour ton aide.
 
Bonne journée.


Message édité par charliedaps le 27-05-2018 à 09:33:11
n°2315932
MaybeEijOr​Not
but someone at least
Posté le 27-05-2018 à 11:58:40  profilanswer
 

Bonjour,

 

Pour l'instant, sans envoyer de mail, juste en testant les parties qui sont censées poser problème, chez moi, ceci fonctionne :

 

page.html

Code :
  1. <!DOCTYPE html>
  2. <html>
  3.    <head>
  4.       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.       <meta name="viewport" content="initial-scale=1, maximum-scale=1">
  6.       <script type="text/javascript" src="signature.js"></script>
  7.       <style type="text/css">
  8.          body, canvas, div, form, input {
  9.             margin: 0;
  10.             padding: 0;
  11.          }
  12.          #wrapper {
  13.             width: 100%;
  14.             padding: 1px;
  15.          }
  16.          canvas {
  17.             position: relative;
  18.             margin: 1px;
  19.             margin-left: 0px;
  20.             border: 1px solid #3a87ad;
  21.          }
  22.          h1, p {
  23.             padding-left: 2px;
  24.             width: 100%;
  25.             margin: 0 auto;
  26.          }
  27.             #controlPanel {
  28.             margin: 2px;
  29.          }
  30.          #saveSignature {
  31.             display: none;
  32.          }
  33.       </style>
  34.    </head>
  35.    <body>
  36.       <div id="wrapper">
  37.          <p>Zetakey Signature Webapp</p>
  38.          <form>
  39.             <label for="Email">To:</label>
  40.             <input type="email" id="sendemail" size="35" placeholder="Send to email" autocomplete="on">
  41.             <br>
  42.             <label for="Name">Nom:</label>
  43.             <input type="text" id="name" size="35" autocomplete="on">
  44.          </form>
  45.          <div id="canvas">Canvas is not supported.</div>
  46.          <script type="text/javascript">zkSignature.capture();</script>
  47.          <button type="button" onclick="zkSignature.clear()">Clear Signature</button>
  48.          <br>
  49.          <img id="saveSignature" alt="Saved image png">
  50.          <form>
  51.             <label for="Email"></label>
  52.             <input type="hidden" id="replyemail"  size="35" value="Validation disclaimer" disabled>
  53.             <br>
  54.             <button type="button" onclick="zkSignature.send()">Send Email</button>
  55.          </form>
  56.       </div>
  57.    </body>
  58. </html>
 

signature.js :

Code :
  1. var zkSignature = (function () {
  2.    var empty = true;
  3.    return {
  4.       //public functions
  5.       capture: function (){
  6.          var parent = document.getElementById("canvas" );
  7.          parent.childNodes[0].nodeValue = "";
  8.          var canvasArea = document.createElement("canvas" );
  9.          canvasArea.setAttribute("id", "newSignature" );
  10.          parent.appendChild(canvasArea);
  11.          var canvas = document.getElementById("newSignature" );
  12.          var context = canvas.getContext("2d" );
  13.          if (!context) {
  14.             throw new Error("Failed to get canvas' 2d context" );
  15.          }
  16.          screenwidth = screen.width;
  17.          if (screenwidth < 480) {
  18.             canvas.width = screenwidth - 8;
  19.             canvas.height = (screenwidth * 0.63);
  20.          } else {
  21.             canvas.width = 464;
  22.             canvas.height = 304;
  23.          }
  24.          context.fillStyle = "#fff";
  25.          context.strokeStyle = "#444";
  26.          context.lineWidth = 1.2;
  27.          context.lineCap = "round";
  28.          context.fillRect(0, 0, canvas.width, canvas.height);
  29.          context.fillStyle = "#3a87ad";
  30.          context.strokeStyle = "#3a87ad";
  31.          context.lineWidth = 1;
  32.          context.moveTo((canvas.width * 0.042), (canvas.height * 0.7));
  33.          context.lineTo((canvas.width * 0.958), (canvas.height * 0.7));
  34.          context.stroke();
  35.          context.fillStyle = "#fff";
  36.          context.strokeStyle = "#444";
  37.          var disableSave = true;
  38.          var pixels = [];
  39.          var cpixels = [];
  40.          var xyLast = {};
  41.          var xyAddLast = {};
  42.          var calculate = false;
  43.          //functions
  44.          {
  45.             function remove_event_listeners() {
  46.                canvas.removeEventListener('mousemove', on_mousemove, false);
  47.                canvas.removeEventListener('mouseup', on_mouseup, false);
  48.                canvas.removeEventListener('touchmove', on_mousemove, false);
  49.                canvas.removeEventListener('touchend', on_mouseup, false);
  50.                document.body.removeEventListener('mouseup', on_mouseup, false);
  51.                document.body.removeEventListener('touchend', on_mouseup, false);
  52.             }
  53.             function get_board_coords(e) {
  54.                var x, y;
  55.                if (e.changedTouches && e.changedTouches[0]) {
  56.                   var offsety = canvas.offsetTop || 0;
  57.                   var offsetx = canvas.offsetLeft || 0;
  58.                   x = e.changedTouches[0].pageX - offsetx;
  59.                   y = e.changedTouches[0].pageY - offsety;
  60.                } else if (e.layerX || 0 == e.layerX) {
  61.                   x = e.layerX;
  62.                   y = e.layerY;
  63.                } else if (e.offsetX || 0 == e.offsetX) {
  64.                   x = e.offsetX;
  65.                   y = e.offsetY;
  66.                }
  67.                return {
  68.                   x : x,
  69.                   y : y
  70.                };
  71.             };
  72.             function on_mousedown(e) {
  73.                e.preventDefault();
  74.                e.stopPropagation();
  75.                canvas.addEventListener('mousemove', on_mousemove, false);
  76.                canvas.addEventListener('mouseup', on_mouseup, false);
  77.                canvas.addEventListener('touchmove', on_mousemove, false);
  78.                canvas.addEventListener('touchend', on_mouseup, false);
  79.                document.body.addEventListener('mouseup', on_mouseup, false);
  80.                document.body.addEventListener('touchend', on_mouseup, false);
  81.                empty = false;
  82.                var xy = get_board_coords(e);
  83.                context.beginPath();
  84.                pixels.push('moveStart');
  85.                context.moveTo(xy.x, xy.y);
  86.                pixels.push(xy.x, xy.y);
  87.                xyLast = xy;
  88.             };
  89.             function on_mousemove(e, finish) {
  90.                e.preventDefault();
  91.                e.stopPropagation();
  92.                var xy = get_board_coords(e);
  93.                var xyAdd = {
  94.                   x : (xyLast.x + xy.x) / 2,
  95.                   y : (xyLast.y + xy.y) / 2
  96.                };
  97.                if (calculate) {
  98.                   var xLast = (xyAddLast.x + xyLast.x + xyAdd.x) / 3;
  99.                   var yLast = (xyAddLast.y + xyLast.y + xyAdd.y) / 3;
  100.                   pixels.push(xLast, yLast);
  101.                } else {
  102.                   calculate = true;
  103.                }
  104.                context.quadraticCurveTo(xyLast.x, xyLast.y, xyAdd.x, xyAdd.y);
  105.                pixels.push(xyAdd.x, xyAdd.y);
  106.                context.stroke();
  107.                context.beginPath();
  108.                context.moveTo(xyAdd.x, xyAdd.y);
  109.                xyAddLast = xyAdd;
  110.                xyLast = xy;
  111.             };
  112.             function on_mouseup(e) {
  113.                remove_event_listeners();
  114.                disableSave = false;
  115.                context.stroke();
  116.                pixels.push('e');
  117.                calculate = false;
  118.             };
  119.          }
  120.          canvas.addEventListener('mousedown', on_mousedown, false);
  121.          canvas.addEventListener('touchstart', on_mousedown, false);
  122.       },
  123.       save : function(){
  124.          var canvas = document.getElementById("newSignature" );
  125.          // save canvas image as data url (png format by default)
  126.          var dataURL = canvas.toDataURL("image/png" );
  127.          document.getElementById("saveSignature" ).src = dataURL;
  128.       },
  129.       clear : function(){
  130.          var parent = document.getElementById("canvas" );
  131.          var child = document.getElementById("newSignature" );
  132.          parent.removeChild(child);
  133.          empty = true;
  134.          this.capture();
  135.       },
  136.       send : function(){
  137.          if (empty == false){
  138.          var canvas = document.getElementById("newSignature" );
  139.          var dataURL = canvas.toDataURL("image/png" );
  140.          document.getElementById("saveSignature" ).src = dataURL;
  141.          var sendemail = document.getElementById('sendemail').value;
  142.          var name = document.getElementById('name').value;
  143.          var replyemail = document.getElementById('replyemail').value;
  144.          var dataform = document.createElement("form" );
  145.          document.body.appendChild(dataform);
  146.          dataform.setAttribute("action","test.php" ); //attention, page de traitement du formulaire
  147.          dataform.setAttribute("enctype","multipart/form-data" );
  148.          dataform.setAttribute("method","POST" );
  149.          dataform.setAttribute("target","_self" );
  150.          dataform.innerHTML =
  151.             '<input type="text" name="image" value="' + dataURL + '"/>'
  152.             +
  153.             '<input type="email" name="email" value="' + sendemail + '"/>'
  154.             +
  155.             '<input type="text" name="name" value="' + name + '"/>'
  156.             +
  157.             '<input type="email" name="replyemail" value="' + replyemail + '"/>'
  158.             +
  159.             '<input type="submit" value="Click me" />';
  160.          dataform.submit();
  161.          }
  162.       }
  163.    }
  164. })()
  165. var zkSignature;
 

test.php

Code :
  1. <?php
  2. #test.php#
  3. $to = $_POST["email"];
  4. $name = $_POST["name"];
  5. $replyemail = $_POST["replyemail"];
  6. $body = "Signé le - Signed on ".date('d.m.Y H:i:s')."\n Signed and Send by Jet\n Test deuxième ligne $to\n Test troisième ligne $name";
  7. echo $body;
  8. ?>
 

As-tu des problèmes avec ça ?


Message édité par MaybeEijOrNot le 27-05-2018 à 12:00:35

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2315933
charliedap​s
Posté le 27-05-2018 à 12:12:43  profilanswer
 

Re bonjour,
 
Merci pour cette réponse rapide.
 
Ca fonctionne.  
 
J'ai bien la page test.php qui affiche tout ce qu'il faut..... excepté la signature ;) et bien entendu l'envoi du mail.
 
Sans vouloir abuser (vu que j'aimerais bien comprendre et apprendre)  qu'as tu changé (excepté la création de la page test.php et de la ligne 146 du .js ?
 
Merci encore pour ton aide précieuse.
 
 
 
 
 

n°2315934
MaybeEijOr​Not
but someone at least
Posté le 27-05-2018 à 12:20:54  profilanswer
 

Pour l'instant rien de spécial...
J'ai juste remis "au propre" le code. Maintenant si tu testes avec ton ancien PHP et que ça fonctionne alors c'est qu'à mon avis le problème provenait du document HTML qui contenait de petites erreurs.
Notamment, la balise style qui n'était pas dans la balise head, le type non précisé dans la balise style et les balises script et la ligne suivante :

Code :
  1. <input type="hidden" id="replyemail"  size="35" value="Validation disclaimer" disabled>


contenait deux attributs type.


Message édité par MaybeEijOrNot le 27-05-2018 à 12:22:04

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2315935
charliedap​s
Posté le 27-05-2018 à 12:26:14  profilanswer
 

C'est moi qui ai ajouté le hidden car il n'a aucune utilité d'être visible.
 
Ok je vais tester avec l'ancien PHP.
 
Je reviens vers toi.
 
Merci.

n°2315936
charliedap​s
Posté le 27-05-2018 à 12:32:24  profilanswer
 

Test effectué.  Ca fonctionne parfaitement avec la signature et l'envoi du mail.
 
Donc effectivement, le problème était dans le html.
 
Un très très grand merci pour ton aide ultra précieuse.
 
Je vais pouvoir mettre tout en place maintenant.
 
Génial.  Merci
 
Bon dimanche

mood
Publicité
Posté le 27-05-2018 à 12:32:24  profilanswer
 

n°2315937
MaybeEijOr​Not
but someone at least
Posté le 27-05-2018 à 12:34:38  profilanswer
 

Pour l'histoire d'attributs, tu avais mis :

Code :
  1. <input type="hidden" type="email" id="replyemail"  size="35" value="Validation disclaimer" disabled />


Tu ne peux pas mettre type="hidden" et type="email", c'est soit l'un soit l'autre. Tu ne peux pas avoir deux valeurs au même moment pour la même chose, c'est une règle de base de la programmation.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2315939
charliedap​s
Posté le 27-05-2018 à 12:38:20  profilanswer
 

MaybeEijOrNot a écrit :

Pour l'histoire d'attributs, tu avais mis :

Code :
  1. <input type="hidden" type="email" id="replyemail"  size="35" value="Validation disclaimer" disabled />


Tu ne peux pas mettre type="hidden" et type="email", c'est soit l'un soit l'autre. Tu ne peux pas avoir deux valeurs au même moment pour la même chose, c'est une règle de base de la programmation.


 
Effectivement, ça paraît logique.   En fait, je cherchais à ne pas faire apparaître cet imput (je l'avais supprimé et forcement ça ne fonctionnait plus) et donc content de ma trouvaille et surtout du bon fonctionnement, je ne suis pas allé plus loin.
J'imaginais pas que c'était ce détail qui bloquait tout.
 
Maintenant ça fonctionne grâce à ton aide.
 
Merci encore.

n°2315940
MaybeEijOr​Not
but someone at least
Posté le 27-05-2018 à 12:53:50  profilanswer
 

Je ne sais pas si c'est ce détail là, mais c'est une possibilité.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2316743
charliedap​s
Posté le 09-06-2018 à 14:48:53  profilanswer
 

Bonjour,
 
Suite de mon projet qui avance pas mal.  Mise en forme css et consort.  Pour ça je m'en sors mais j'ai un petit souci.
 
Je voudrais que le formulaire soit envoyé au client et aussi à moi.
Je n'arrive pas à trouver comment indiquer au fichier php qu'il faut envoyer à l'adresse du formulaire et à une adresse mail prédéfinie (à savoir la mienne)
 

Code :
  1. <?php
  2. function geturlonly() {
  3.     $urlpath = explode('/', $_SERVER['PHP_SELF']);
  4.     array_pop($urlpath);
  5.     $scriptname = implode("/", $urlpath);
  6.     $http_protocol = 'http';
  7.     if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ($_SERVER['SERVER_PORT'] == 443)){
  8.       $http_protocol = 'https';
  9.     }
  10.     return $http_protocol . "://" . $_SERVER["HTTP_HOST"] . $scriptname . "/";
  11. }
  12. function multi_attach_mail($to, $sendermail, $subject, $message, $files) {
  13.     // email fields: to, from, subject, and so on
  14.     $from = $sendermail;
  15.     $headers = "From: $from";
  16.     // boundary
  17.     $semi_rand = md5(time());
  18.     $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  19.     // headers for attachment
  20.     $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
  21.     // multipart boundary
  22.     $message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";
  23.     if (is_file($files)) {
  24.         $message .= "--{$mime_boundary}\n";
  25.         $fp = @fopen($files, "rb" );
  26.         $data = @fread($fp, filesize($files));
  27.         @fclose($fp);
  28.         $data = chunk_split(base64_encode($data));
  29.         $message .= "Content-Type: application/octet-stream; name=\"" . basename($files) . "\"\n" . "Content-Description: " . basename($files[$i]) . "\n" . "Content-Disposition: attachment;\n" . " filename=\"" . basename($files) . "\"; size=" . filesize($files) . ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
  30.         $i = TRUE;
  31.     } else {
  32.         // preparing attachments
  33.         for ($i = 0; $i < count($files); $i++) {
  34.             if (is_file($files[$i])) {
  35.                 $message .= "--{$mime_boundary}\n";
  36.                 $fp = @fopen($files[$i], "rb" );
  37.                 $data = @fread($fp, filesize($files[$i]));
  38.                 @fclose($fp);
  39.                 $data = chunk_split(base64_encode($data));
  40.                 $message .= "Content-Type: application/octet-stream; name=\"" . basename($files[$i]) . "\"\n" . "Content-Description: " . basename($files[$i]) . "\n" . "Content-Disposition: attachment;\n" . " filename=\"" . basename($files[$i]) . "\"; size=" . filesize($files[$i]) . ";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
  41.             }
  42.         }
  43.     }
  44.     $message .= "--{$mime_boundary}--";
  45.     $returnpath = "-f" . $sendermail;
  46.     $ok = @mail($to, $subject, $message, $headers, $returnpath);
  47.     if ($ok) {
  48.         return $i;
  49.     } else {
  50.         return FALSE;
  51.     }
  52. }
  53. function base64_to_jpeg($base64_string, $output_file) {
  54.     $ifp = @fopen($output_file, "wb" );
  55.     $data = explode(',', $base64_string);
  56.     @fwrite($ifp, base64_decode($data[1]));
  57.     @fclose($ifp);
  58.     return $output_file;
  59. }
  60. function add_ZK_mark($inputfile, $outputfile) {
  61. //    var_dump(gd_info());
  62.     $im = @imagecreatefrompng($inputfile);
  63.     $bg = @imagecolorallocate($im, 255, 255, 255);
  64.     $textcolor = @imagecolorallocate($im, 0, 0, 255);
  65.     list($x, $y, $type) = getimagesize($inputfile);
  66.     $txtpos_x = $x - 170;
  67.     $txtpos_y = $y - 20;
  68.     @imagestring($im, 5, $txtpos_x, $txtpos_y, 'Powered by Jet', $textcolor);
  69.     $txtpos_x = $x - 145;
  70.     $txtpos_y = 20;
  71.     @imagestring($im, 3, $txtpos_x, $txtpos_y, date("d-m-Y H:i:s" ), $textcolor);
  72.     @imagepng($im, $outputfile);
  73.     // Output the image
  74.     //imagejpeg($im);
  75.     @imagedestroy($im);
  76. }
  77. date_default_timezone_set("Europe/Madrid" );
  78. $output_file = "captured/signature" . date("d-m-Y-H-i-s-" ).time(). ".png";
  79. base64_to_jpeg($_POST["image"], $output_file);
  80. add_ZK_mark($output_file, $output_file);
  81. $to = $_POST["email"];
  82. $name = $_POST["name"];
  83. $prenom = $_POST["prenom"];
  84. $replyemail = $_POST["replyemail"];
  85. $replyemail = "MON ADRESSE MAIL";
  86. if( (!isset($_POST["email"])) || ($to == "toemail@example.com" ) || ($replyemail == "youremail@example.com" )|| ($to == "" )){
  87.     echo("<p>Incorrect email address...</p>" );
  88.     echo "<a href=\"page.html\">Sign and Send again!</a>";
  89.     exit;
  90. }
  91. $subject = "Contrat ";
  92. $curdir = dirname($_SERVER['REQUEST_URI']) . "/";
  93. $dir = $_SERVER['SERVER_NAME'] . $curdir;
  94. $urlonly = geturlonly();
  95. $body = "TEXTE";
  96. //$from = "MON ADRESSE MAIL";
  97. $headers = "From: $replyemail" . "\r\nReply-To: $replyemail";
  98. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  99.     //if (mail($to, $subject, $body, $headers)) {
  100.     echo("<p>Message successfully sent to " . $to . " !</p>" );
  101. } else {
  102.     echo("<p>Message delivery failed...</p>" );
  103. }
  104. echo "<a href=\"page.html\">Sign and Send again!</a>";
  105. exit ;
  106. ?>


 
Merci d'avance pour votre aide.


Message édité par charliedaps le 09-06-2018 à 14:52:41
n°2316747
MaybeEijOr​Not
but someone at least
Posté le 09-06-2018 à 15:27:00  profilanswer
 

Ici :

Code :
  1. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  2.    //if (mail($to, $subject, $body, $headers)) {
  3.    echo("<p>Message successfully sent to " . $to . " !</p>" );
  4. } else {
  5.    echo("<p>Message delivery failed...</p>" );
  6. }


Le mail est envoyé dans la condition du "if". Ici cela veut littéralement dire :

Citation :

Si la fonction "multi_attach_mail", avec les paramètres qui lui sont passés, retourne une valeur non fausse ou non nulle alors ...


 
Tu peux-donc transformer en :

Code :
  1. $toyourmail = 'yourmail@mail.com';
  2. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  3.    //if (mail($to, $subject, $body, $headers)) {
  4.    multi_attach_mail($toyourmail, $replyemail, $subject, $body, $output_file);
  5.    echo("<p>Message successfully sent to " . $to . " !</p>" );
  6. } else {
  7.    echo("<p>Message delivery failed...</p>" );
  8. }


 
Je ne te gère pas l'erreur en cas de problème d'envoi à ton adresse mail car je ne sais pas comment tu comptes gérer le cas où le mail part bien à l'adresse client mais pas à la tienne.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2316748
charliedap​s
Posté le 09-06-2018 à 17:39:37  profilanswer
 

MaybeEijOrNot a écrit :

Ici :

Code :
  1. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  2.    //if (mail($to, $subject, $body, $headers)) {
  3.    echo("<p>Message successfully sent to " . $to . " !</p>" );
  4. } else {
  5.    echo("<p>Message delivery failed...</p>" );
  6. }


Le mail est envoyé dans la condition du "if". Ici cela veut littéralement dire :

Citation :

Si la fonction "multi_attach_mail", avec les paramètres qui lui sont passés, retourne une valeur non fausse ou non nulle alors ...


 
Tu peux-donc transformer en :

Code :
  1. $toyourmail = 'yourmail@mail.com';
  2. if (multi_attach_mail($to, $replyemail, $subject, $body, $output_file)) {
  3.    //if (mail($to, $subject, $body, $headers)) {
  4.    multi_attach_mail($toyourmail, $replyemail, $subject, $body, $output_file);
  5.    echo("<p>Message successfully sent to " . $to . " !</p>" );
  6. } else {
  7.    echo("<p>Message delivery failed...</p>" );
  8. }


 
Je ne te gère pas l'erreur en cas de problème d'envoi à ton adresse mail car je ne sais pas comment tu comptes gérer le cas où le mail part bien à l'adresse client mais pas à la tienne.


 
 
Génial.  Merci beaucoup.  Ca fonctionne nickel.
Comme quoi, le savoir, ça aide.  J'ai bien passé 1H à tester dans tous les sens ;) ;)
 
Quand même une petite question.
Lors de l'envoi vers gmail, le texte s'affiche parfaitement.  Ce qui n'est pas le cas quand j'envoie à une autre adresse mail qui est un nom de domaine dont je dispose.  Les accents ne s'affichent pas.
 
Allez dernière question.  Y a t il une solution plus facile dans le body qui sert pour le texte et l'envoi du mail pour faire quelque chose de joli et de bien présenté ?
J'ai testé, c'est clair et net mais pas vraiment pro.
 

Code :
  1. $body = "Test blabla $name $prenom e-mail $to \n blabla\n blabla.\n blabla \n \n Signé le ".date('d.m.Y H.i.s')." \n Signé et envoyé par société";


 
Peut on se baser sur le code html avec le css ?
 
Merci


Message édité par charliedaps le 09-06-2018 à 17:45:33
n°2316750
charliedap​s
Posté le 09-06-2018 à 18:17:24  profilanswer
 

@ MaybeEijOrNot
 
J'ai reçu un mail m'indiquant que tu avais posté une réponse mais je ne la vois pas sur le forum.

n°2316751
MaybeEijOr​Not
but someone at least
Posté le 09-06-2018 à 18:25:10  profilanswer
 

Tu peux envoyer un mail avec du HTML, du texte et des pièce-jointes mais ça va te demander du boulot. Il faut laisser le content-type en multipart/mixed puis dans le premier boundary tu crées un content-type multipart/alternative dans lequel tu crées deux sub-boundaries, l'un pour le texte et l'autre pour le HTML. Il vaut mieux laisser une version texte au cas où le client ne gère pas le HTML.
 
Pour cela il faudra modifier ta fonction "multi_attach_mail($to, $sendermail, $subject, $message, $files)" pour qu'elle prenne un paramètre de plus (le contenu HTML) et pour qu'elle écrive correctement le header du mail par rapport à ce que je t'ai décrit au-dessus.
 
Tu peux retrouver à quoi ressemble un header de mail ici : https://www.arobase.org/newsletters [...] native.htm
C'est ce qu'écrit ta fameuse fonction mais pour un content-type multipart/mixed.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2316752
charliedap​s
Posté le 09-06-2018 à 18:27:13  profilanswer
 

Merci pour ta réponse.
Je vais me pencher la dessus demain.
 
J'ai un autre souci que je n'arrive pas à résoudre donc chaque chose en son temps.
 
Merci à toi
 
Bonne soirée.

n°2316753
charliedap​s
Posté le 09-06-2018 à 18:33:03  profilanswer
 

Au secours quand même.....
 
J'ai donc peaufiné une partie du formulaire html.
 

Code :
  1. <fieldset id="section-1">
  2.    <legend>Vous</legend>
  3.   <label for="Genre">Mr / Mme :</label>
  4.             <input type="text" id="genre" size="35" placeholder="Mr / Mme" autocomplete="on"> 
  5.   <label for="Name">Nom :</label>
  6.             <input type="text" id="name" size="35" placeholder="Votre Nom" autocomplete="on">
  7.   <label for="Prenom">Prénom :</label>
  8.             <input type="text" id="prenom" size="35" placeholder="Votre Prénom" autocomplete="on">
  9.  </fieldset>  
  10.  <fieldset id="section-1">
  11.    <legend>Vos coordonnées</legend>
  12.   <label for="Adresse">Adresse :</label>
  13.             <input type="text" id="adresse" size="90" placeholder="Adresse Complète avec CP, Ville et Pays" autocomplete="on">
  14.   <label for="Email">E-mail :</label>
  15.             <input type="email" id="sendemail" size="35" placeholder="Votre e-mail" autocomplete="on">
  16.             <label for="Portable">Portable :</label>
  17.             <input type="text" id="portable" size="35" placeholder="Votre portable" autocomplete="on">
  18.  </fieldset>


 
Idem pour le signature.js
 
J'ai ajouté  
 

Code :
  1. var genre = document.getElementById('genre').value;


 
et  
 

Code :
  1. '<input type="text" name="genre" value="' + genre + '"/>'
  2.             +


 
Dans le fichier php d'envoi
 

Code :
  1. $genre = $_POST["genre"];


 
et en test dans le body de ce même fichier
 

Code :
  1. $body = "Genre $genre";


 
Et donc mon genre du formulaire ne s'affiche pas dans le mail qui est envoyé alors que name et prenom s'affichent.
 
Je ne comprends pas d'où vient le problème car j'ai déjà fait cette modification pour prenom et ça a fonctionné.
 
Merci d'avance

Message cité 1 fois
Message édité par charliedaps le 09-06-2018 à 18:37:10
n°2316754
MaybeEijOr​Not
but someone at least
Posté le 09-06-2018 à 19:16:49  profilanswer
 

En HTML, une id est unique et ne peut donc correspondre qu'à un élément, cf. fieldset.

 

L'attribut "for" d'un élément doit prendre pour valeur l'id d'un champ, bien que normalement non sensible à la casse, mieux vaut rester cohérent et ne pas utiliser de majuscule quand l'id n'en contient pas.

 

En PHP, l'écriture d'une variable entre guillemets doubles est possible mais n'est pas conseillée, mieux vaut utiliser l'opérateur de concaténation :

Code :
  1. $var = 'blablabla'.$variable.'blablabla';
 

En français, on utilise "M." pour monsieur et "Mme" pour madame, c'est en anglais qu'on utilise "Mr".  ;)

 

Sinon je ne vois pas d'où vient le problème. Mais comme vu au début du sujet, suffit que tu ais fait une faute ailleurs pour que ça bloque.

Message cité 1 fois
Message édité par MaybeEijOrNot le 09-06-2018 à 19:17:33

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2316755
charliedap​s
Posté le 09-06-2018 à 20:28:51  profilanswer
 

Merci pour ta réponse rapide et précise.
 
Je vais tester tout cela et je reviens donner la réponse.
 
C'est vrai pour le M.  ça sera corrigé ;)
 
Bonne soirée.

n°2316758
charliedap​s
Posté le 10-06-2018 à 10:07:40  profilanswer
 

MaybeEijOrNot a écrit :

En HTML, une id est unique et ne peut donc correspondre qu'à un élément, cf. fieldset.
 
L'attribut "for" d'un élément doit prendre pour valeur l'id d'un champ, bien que normalement non sensible à la casse, mieux vaut rester cohérent et ne pas utiliser de majuscule quand l'id n'en contient pas.
 
En PHP, l'écriture d'une variable entre guillemets doubles est possible mais n'est pas conseillée, mieux vaut utiliser l'opérateur de concaténation :

Code :
  1. $var = 'blablabla'.$variable.'blablabla';


 
En français, on utilise "M." pour monsieur et "Mme" pour madame, c'est en anglais qu'on utilise "Mr".  ;)  
 
Sinon je ne vois pas d'où vient le problème. Mais comme vu au début du sujet, suffit que tu ais fait une faute ailleurs pour que ça bloque.


 
 
Bonjour MaybeEijOrNot,
 
Encore un grand merci pour tes réponses.
 
Donc j'ai modifié le fieldset.  Effectivement j'avais une erreur vu qu'il y avait plusieurs id les mêmes.  De ce côté c'est OK.  Je n'ai plus d'erreur dans le html.
 
J'ai également modifié les "for" pour qu'il soient parfaitement les mêmes que les "id".
 
Idem pour le M. ;)
 
Par contre, concernant le php, je ne comprends pas à quelle ligne tu fais référence ?
 
Ce qui est vexant, c'est que j'ai ajouté $name et $prenom il y a quelques temps et ça fonctionne mais $genre ne fonctionne pas.
 
Merci
 
 
 
 

n°2316760
charliedap​s
Posté le 10-06-2018 à 11:13:15  profilanswer
 

Re bonjour,
 
Finalement, j'ai repris depuis le début.  J'ai modifié les choses que tu m'as conseillé et ça fonctionne dans son intégralité.
Je ne vois pas où était l'erreur (un peu bête point de vue compréhension) mais niveau efficacité, c'est tout bon ;)
 
Merci pour ton aide précieuse.

n°2316762
MaybeEijOr​Not
but someone at least
Posté le 10-06-2018 à 11:55:21  profilanswer
 

Pour le PHP :

charliedaps a écrit :

Code :
  1. $body = "Genre $genre";



Tu inscris ta variable à l'intérieur de ta chaîne de caractères, cela fonctionne en PHP car tu utilises des guillemets doubles. Néanmoins le comportement peut être un peu imprévisible, mieux vaut éviter d'inclure la variable dans la chaîne de caractères.
 
Sinon moi non plus je ne sais pas d'où vient l'erreur, mais niveau compréhension, ce qu'il faut retenir c'est qu'il faut être rigoureux. Les langages informatiques sont interprétés par des machines et donc la moindre faute peut tout faire déconner.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2316791
charliedap​s
Posté le 10-06-2018 à 21:45:36  profilanswer
 

Merci beaucoup pour ton aide.
 
Tout fonctionne actuellement et j'ai quasi fini.
 
Merci

n°2405443
tetel74
Posté le 02-01-2022 à 20:41:35  profilanswer
 

J'ai testé votre exemple qui fonctionne correctement
 
Je désirerai inclure une 2eme zone de dessin et pour ce faire j'ai dupliqué signature.js mais cela ne fonctionne pas
Avez vous une idée pour créer cette 2eme zone ?
 
A+

n°2405444
tetel74
Posté le 02-01-2022 à 20:42:46  profilanswer
 

Sur un même formulaire
 
Mon code:
 

Code :
  1. <head>
  2.   <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  3.   <title>Rucher Montminois</title>
  4.   <link rel="stylesheet" href="styles_hiver.css" type="text/css" media="screen" />
  5.   <link rel="stylesheet" type="text/css" href="print.css" media="print" />
  6.   <script src="../js/signature.js"></script>
  7.   <script src="../js/signature1.js"></script>
  8.   <link rel="icon" type="image/png" href="favicon.png" /> 
  9. </head>
  10. ......
  11. ......
  12. <tr>
  13.                           <td rowspan="5" width="30%" height=50 align="center"><b>Signature des conducteurs</b></td>
  14.                           <td width="35%" align="center"><b>Matin</b></td>
  15.                           <td width="35%" align="center"><b>Après-midi</b></td>
  16.                       </tr>
  17.                       <tr>
  18.                           <td width="35%" align="center"><div id="canvas"><script type="text/javascript">Signature.capture();</script></div></td> 
  19.                           <td width="35%" align="center"><div id="canvas1"><script type="text/javascript">Signature1.capture();</script></div></td>
  20.                       </tr>   
  21.                       <tr>
  22.                           <td width="35%" align="center"><button type="button" onclick="Signature.clear()">Clear Signature matin</button></td> 
  23.                           <td width="35%" align="center"><button type="button" onclick="Signature1.clear()">Clear Signature AM</button></td>
  24.                       </tr>                         
  25.                   </Table>           
  26.                   <br />                                                                                                                                                                                                                                   
  27.                   <p><b>Validation: </b><input type="submit" value="Valider" ></p>
  28.               </form>


La partie signature.js
 
Code :

Code :
  1. var Signature = (function () {
  2.    var empty = true;
  3.    return {
  4.       //public functions
  5.       capture: function (){
  6.          var parent = document.getElementById("canvas" );
  7.          parent.childNodes[0].nodeValue = "";
  8.          var canvasArea = document.createElement("canvas" );
  9.          canvasArea.setAttribute("id", "newSignature" );
  10.          parent.appendChild(canvasArea);
  11.          var canvas = document.getElementById("newSignature" );
  12.          var context = canvas.getContext("2d" );
  13.          if (!context) {
  14.             throw new Error("Failed to get canvas' 2d context" );
  15.          }
  16.          canvas.width =250;       
  17.          canvas.height = 70;         
  18.          context.fillStyle = "#fff";
  19.          context.strokeStyle = "#444";
  20.          context.lineWidth = 1.2;
  21.          context.lineCap = "round";
  22.          context.fillRect(0, 0, canvas.width, canvas.height);
  23.          context.fillStyle = "#3a87ad";
  24.          context.strokeStyle = "#3a87ad";
  25.          context.lineWidth = 1; 
  26.          context.stroke();
  27.          context.fillStyle = "#fff";
  28.          context.strokeStyle = "#444";
  29.          var disableSave = true;
  30.          var pixels = [];
  31.          var cpixels = [];
  32.          var xyLast = {};
  33.          var xyAddLast = {};
  34.          var calculate = false;
  35.          //functions
  36.          {
  37.             function remove_event_listeners() {
  38.                canvas.removeEventListener('mousemove', on_mousemove, false);
  39.                canvas.removeEventListener('mouseup', on_mouseup, false);
  40.                canvas.removeEventListener('touchmove', on_mousemove, false);
  41.                canvas.removeEventListener('touchend', on_mouseup, false);
  42.                document.body.removeEventListener('mouseup', on_mouseup, false);
  43.                document.body.removeEventListener('touchend', on_mouseup, false);
  44.             }
  45.             function get_board_coords(e) {
  46.                var x, y;
  47.                if (e.changedTouches && e.changedTouches[0]) {
  48.                   var offsety = canvas.offsetTop || 0;
  49.                   var offsetx = canvas.offsetLeft || 0;
  50.                   x = e.changedTouches[0].pageX - offsetx;
  51.                   y = e.changedTouches[0].pageY - offsety;
  52.                } else if (e.layerX || 0 == e.layerX) {
  53.                   x = e.layerX;
  54.                   y = e.layerY;
  55.                } else if (e.offsetX || 0 == e.offsetX) {
  56.                   x = e.offsetX;
  57.                   y = e.offsetY;
  58.                }
  59.                return {
  60.                   x : x,
  61.                   y : y
  62.                };
  63.             };
  64.             function on_mousedown(e) {
  65.                e.preventDefault();
  66.                e.stopPropagation();
  67.                canvas.addEventListener('mousemove', on_mousemove, false);
  68.                canvas.addEventListener('mouseup', on_mouseup, false);
  69.                canvas.addEventListener('touchmove', on_mousemove, false);
  70.                canvas.addEventListener('touchend', on_mouseup, false);
  71.                document.body.addEventListener('mouseup', on_mouseup, false);
  72.                document.body.addEventListener('touchend', on_mouseup, false);
  73.                empty = false;
  74.                var xy = get_board_coords(e);
  75.                context.beginPath();
  76.                pixels.push('moveStart');
  77.                context.moveTo(xy.x, xy.y);
  78.                pixels.push(xy.x, xy.y);
  79.                xyLast = xy;
  80.             };
  81.             function on_mousemove(e, finish) {
  82.                e.preventDefault();
  83.                e.stopPropagation();
  84.                var xy = get_board_coords(e);
  85.                var xyAdd = {
  86.                   x : (xyLast.x + xy.x) / 2,
  87.                   y : (xyLast.y + xy.y) / 2
  88.                };
  89.                if (calculate) {
  90.                   var xLast = (xyAddLast.x + xyLast.x + xyAdd.x) / 3;
  91.                   var yLast = (xyAddLast.y + xyLast.y + xyAdd.y) / 3;
  92.                   pixels.push(xLast, yLast);
  93.                } else {
  94.                   calculate = true;
  95.                }
  96.                context.quadraticCurveTo(xyLast.x, xyLast.y, xyAdd.x, xyAdd.y);
  97.                pixels.push(xyAdd.x, xyAdd.y);
  98.                context.stroke();
  99.                context.beginPath();
  100.                context.moveTo(xyAdd.x, xyAdd.y);
  101.                xyAddLast = xyAdd;
  102.                xyLast = xy;
  103.             };
  104.             function on_mouseup(e) {
  105.                remove_event_listeners();
  106.                disableSave = false;
  107.                context.stroke();
  108.                pixels.push('e');
  109.                calculate = false;
  110.             };
  111.          }
  112.          canvas.addEventListener('mousedown', on_mousedown, false);
  113.          canvas.addEventListener('touchstart', on_mousedown, false);
  114.       },
  115.       save : function(){
  116.          var canvas = document.getElementById("newSignature" );
  117.          // save canvas image as data url (png format by default)
  118.          var dataURL = canvas.toDataURL("image/png" );
  119.          document.getElementById("saveSignature" ).src = dataURL;
  120.       },
  121.       clear : function(){
  122.          var parent = document.getElementById("canvas" );
  123.          var child = document.getElementById("newSignature" );
  124.          parent.removeChild(child);
  125.          empty = true;
  126.          this.capture();
  127.       },
  128.    }
  129. })()
  130. var Signature;


 
La partie signature1.js
 
Code :
 

Code :
  1. var Signature1 = (function () {
  2.    var empty = true;
  3.    return {
  4.       //public functions
  5.       capture: function (){
  6.          var parent = document.getElementById("canvas1" );
  7.          parent.childNodes[0].nodeValue = "";
  8.          var canvasArea1 = document.createElement("canvas1" );
  9.          canvasArea1.setAttribute("id", "newSignature1" );
  10.          parent.appendChild(canvasArea1);
  11.          var canvas1 = document.getElementById("newSignature1" );
  12.          var context1 = canvas1.getContext("2d" );
  13.          if (!context1) {
  14.             throw new Error("Failed to get canvas1' 2d context" );
  15.          }
  16.          canvas1.width =250;       
  17.          canvas1.height = 70;         
  18.          context.fillStyle = "#fff";
  19.          context.strokeStyle = "#444";
  20.          context.lineWidth = 1.2;
  21.          context.lineCap = "round";
  22.          context.fillRect(0, 0, canvas1.width, canvas1.height);
  23.          context.fillStyle = "#3a87ad";
  24.          context.strokeStyle = "#3a87ad";
  25.          context.lineWidth = 1; 
  26.          context.stroke();
  27.          context.fillStyle = "#fff";
  28.          context.strokeStyle = "#444";
  29.          var disableSave = true;
  30.          var pixels = [];
  31.          var cpixels = [];
  32.          var xyLast = {};
  33.          var xyAddLast = {};
  34.          var calculate = false;
  35.          //functions
  36.          {
  37.             function remove_event_listeners() {
  38.                canvas1.removeEventListener('mousemove', on_mousemove, false);
  39.                canvas1.removeEventListener('mouseup', on_mouseup, false);
  40.                canvas1.removeEventListener('touchmove', on_mousemove, false);
  41.                canvas1.removeEventListener('touchend', on_mouseup, false);
  42.                document.body.removeEventListener('mouseup', on_mouseup, false);
  43.                document.body.removeEventListener('touchend', on_mouseup, false);
  44.             }
  45.             function get_board_coords(e) {
  46.                var x, y;
  47.                if (e.changedTouches && e.changedTouches[0]) {
  48.                   var offsety = canvas1.offsetTop || 0;
  49.                   var offsetx = canvas1.offsetLeft || 0;
  50.                   x = e.changedTouches[0].pageX - offsetx;
  51.                   y = e.changedTouches[0].pageY - offsety;
  52.                } else if (e.layerX || 0 == e.layerX) {
  53.                   x = e.layerX;
  54.                   y = e.layerY;
  55.                } else if (e.offsetX || 0 == e.offsetX) {
  56.                   x = e.offsetX;
  57.                   y = e.offsetY;
  58.                }
  59.                return {
  60.                   x : x,
  61.                   y : y
  62.                };
  63.             };
  64.             function on_mousedown(e) {
  65.                e.preventDefault();
  66.                e.stopPropagation();
  67.                canvas1.addEventListener('mousemove', on_mousemove, false);
  68.                canvas1.addEventListener('mouseup', on_mouseup, false);
  69.                canvas1.addEventListener('touchmove', on_mousemove, false);
  70.                canvas1.addEventListener('touchend', on_mouseup, false);
  71.                document.body.addEventListener('mouseup', on_mouseup, false);
  72.                document.body.addEventListener('touchend', on_mouseup, false);
  73.                empty = false;
  74.                var xy = get_board_coords(e);
  75.                context.beginPath();
  76.                pixels.push('moveStart');
  77.                context.moveTo(xy.x, xy.y);
  78.                pixels.push(xy.x, xy.y);
  79.                xyLast = xy;
  80.             };
  81.             function on_mousemove(e, finish) {
  82.                e.preventDefault();
  83.                e.stopPropagation();
  84.                var xy = get_board_coords(e);
  85.                var xyAdd = {
  86.                   x : (xyLast.x + xy.x) / 2,
  87.                   y : (xyLast.y + xy.y) / 2
  88.                };
  89.                if (calculate) {
  90.                   var xLast = (xyAddLast.x + xyLast.x + xyAdd.x) / 3;
  91.                   var yLast = (xyAddLast.y + xyLast.y + xyAdd.y) / 3;
  92.                   pixels.push(xLast, yLast);
  93.                } else {
  94.                   calculate = true;
  95.                }
  96.                context.quadraticCurveTo(xyLast.x, xyLast.y, xyAdd.x, xyAdd.y);
  97.                pixels.push(xyAdd.x, xyAdd.y);
  98.                context.stroke();
  99.                context.beginPath();
  100.                context.moveTo(xyAdd.x, xyAdd.y);
  101.                xyAddLast = xyAdd;
  102.                xyLast = xy;
  103.             };
  104.             function on_mouseup(e) {
  105.                remove_event_listeners();
  106.                disableSave = false;
  107.                context.stroke();
  108.                pixels.push('e');
  109.                calculate = false;
  110.             };
  111.          }
  112.          canvas1.addEventListener('mousedown', on_mousedown, false);
  113.          canvas1.addEventListener('touchstart', on_mousedown, false);
  114.       },
  115.       save : function(){
  116.          var canvas1 = document.getElementById("newSignature1" );
  117.          // save canvas image as data url (png format by default)
  118.          var dataURL = canvas1.toDataURL("image/png" );
  119.          document.getElementById("saveSignature1" ).src = dataURL;
  120.       },
  121.       clear : function(){
  122.          var parent = document.getElementById("canvas1" );
  123.          var child = document.getElementById("newSignature1" );
  124.          parent.removeChild(child);
  125.          empty = true;
  126.          this.capture();
  127.       },
  128.    }
  129. })()
  130. var Signature1;



Message édité par tetel74 le 02-01-2022 à 20:47:39
n°2405446
MaybeEijOr​Not
but someone at least
Posté le 02-01-2022 à 21:12:14  profilanswer
 

Bonjour,

 

Sans tester, donc peut-être que ça ne suffit pas pour régler le problème (et je n'ai pas lu tout le code), la ligne suivante ne va pas dans signature1.js :

Code :
  1. var canvasArea1 = document.createElement("canvas1" );


L'élément créé est "canvas" et non "canvas1", on parle ici d'un type d'élément HTML et non de son identification. ;)

 

EDIT : si cela ne résout pas le problème, peut-être que des erreurs sont disponibles dans la console pour identifier plus facilement le hic.


Message édité par MaybeEijOrNot le 02-01-2022 à 21:13:09

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2405450
tetel74
Posté le 03-01-2022 à 08:52:55  profilanswer
 

J'ai modifié ces 2 lignes:
 

Code :
  1. var parent = document.getElementById("canvas" );
  2.          parent.childNodes[0].nodeValue = "";
  3.          var canvasArea1 = document.createElement("canvas" );


 
Pas de résultat
 
N'y a t il pas un conflit entre les 2 signature.js ?

n°2405464
MaybeEijOr​Not
but someone at least
Posté le 03-01-2022 à 12:19:55  profilanswer
 

La première ligne fallait garder ce que tu avais fait, l'id du second canvas sera bien "canvas1". Mais sur la troisième ligne, tu crées un élément HTML de type "canvas".


Message édité par MaybeEijOrNot le 03-01-2022 à 12:20:57

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2405483
tetel74
Posté le 03-01-2022 à 14:08:11  profilanswer
 

Voici les modifs
 

Code :
  1. var Signature1 = (function () {
  2.    var empty = true;
  3.    return {
  4.       //public functions
  5.       capture: function (){
  6.          var parent = document.getElementById("canvas1" );
  7.          parent.childNodes[0].nodeValue = "";
  8.          var canvasArea1 = document.createElement("canvas" );
  9.          canvasArea1.setAttribute("id", "newSignature1" );
  10.          parent.appendChild(canvasArea1);
  11.          var canvas1 = document.getElementById("newSignature1" );
  12.          var context1 = canvas1.getContext("2d" );


 
Pas d'amélioration


Message édité par tetel74 le 03-01-2022 à 14:11:14
n°2405490
tetel74
Posté le 03-01-2022 à 14:46:27  profilanswer
 

Cela fonctionne
 
J'ai débuggé avec la console
 
Je me suis fait un peu piégé par les données de navigation
Le vieux signature1.js resté actif
 
Encore merci pour l'aide

n°2405523
MaybeEijOr​Not
but someone at least
Posté le 03-01-2022 à 20:14:43  profilanswer
 

Au passage, tu n'avais pas besoin de renommer le nom des variables puisque leur portée est limitée à la fonction exécutée.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  Formulaire avec signature sur tablette

 

Sujets relatifs
[HTML] Formulaire fonctionnel sur navigateur mais bugué sur instagram.Probleme signature html
Langage pour développement PC + TabletteProbleme de PHP Formulaire de contact
Formulaire Calcul HTML Javascript Help! [Symfony 3.x] Formulaire dans une popup en include
Formulaire (de merde)Excel 2016 - Inscription données saisie par formulaire
Javascript et formulaire pdfContrôle formulaire : alert suivant oublis de l'utilisateur
Plus de sujets relatifs à : Formulaire avec signature sur tablette


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR