11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je suis en train de réaliser une newsletter avec la possibilité de modifier en ligne mes boutons pour changer l'url et le titre du lien. Quand on clique sur un bouton pour le modifier, une modale s'affiche avec deux champs (input) : un champ pour titre et le second pour l'url. Ces champs récupèrent automatiquement le titre et l'url existant sur le bouton pour pouvoir les éditer. Tous les boutons font appel à la même fenêtre modale, c'est juste le contenu récupéré est qui différent d'un bouton à l'autre. Quand je clique sur le bouton "save" j'aimerais enregistrer la modification en base de données dans une même table mais dans des champs (colonnes table) différents pour chaque bouton. J'utilise la librairie jQuery et PHP pour l'interaction côté serveur.

Mon problème est je n'ai pas réussi à enregistrer mes modifs en base de données. Je ne sais pas comment procéder pour sauvegarder la modif dans la BD à partir d'une seule modale et que chaque bouton soit sauvegarder un champ différent. Merci par avance.


<!-- Partie HTML -->
<div>
     <h4>Item 1</h4>
     <p>Incenderat autem audaces usque ad insaniam homines ad haec, quae  nefariis egere conatibus, Luscus quidam curator urbis subito visus:  eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt  incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.</p>
      <div ><a href="#" class="row-edit" data-type="link">J'en profite</a></div>
</div>
<div>
       <h4>Item 2</h4>
       <p>Incenderat autem audaces usque ad insaniam homines ad haec, quae  nefariis egere conatibus, Luscus quidam curator urbis subito visus:  eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt  incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.</p>
        <div ><a href="#" class="row-edit" data-type="link">Contact</a></div>
</div>
<div>
        <h4>Item 3</h4>
        <p>Splendida porro oculi fugitant vitantque tueri. sol etiam caecat, contra si tendere pergas,propterea quia vis magnast.</p>
         <div ><a href="#" class="row-edit" data-type="link">A propos</a></div>
</div>

<!-- Modale -->
<div class="edit" id="edit-link">
	<div class="edit-box" style="height:310px;">
		<div class="edit-box-title">Edit Link</div>

		<div class="edit-box-content">
			<div class="edit-box-content-text">Title</div>
			<div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input title"/></div>
			<div class="edit-box-content-text">URL:<span>(full address including  http://)</span></div>
 
			<div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input url"/></div>
		</div>
		<div class="edit-box-buttons">
			<div class="edit-box-buttons-save">Save</div>
			<div class="edit-box-buttons-cancel">Cancel</div>
		</div>
	</div>
</div>


// Partie JS
//Edit
function hover_edit(){
	$(".row-edit").hover(
  		function() {
    		        $(this).append('<div class="row-edit-hover"><i class="fa fa-pencil" style="line-height:30px;"></i></div>');
			$(".row-edit-hover").click(function(e) {e.preventDefault()});
			$(".row-edit-hover i").click(function(e) {
			        e.preventDefault();
			        big_parent = $(this).parent().parent();

                                //edit link
	                       if(big_parent.attr("data-type")=='link'){
		                      $("#edit-link .title").val(big_parent.text());
		                      $("#edit-link .url").val(big_parent.attr("href"));
		                      $("#edit-link").fadeIn(500);
		                      $("#edit-link .edit-box").slideDown(500);
	
		                      $("#edit-link .edit-box-buttons-save").click(function() {
	  		                       $(this).parent().parent().parent().fadeOut(500);
	  		                       $(this).parent().parent().slideUp(500);
	   
	    	                               big_parent.text($("#edit-link .title").val());
			                       big_parent.attr("href",$("#edit-link .url").val());
		                      });
	                        }
                         });
                 }, function() {
                        $(this).children(".row-edit-hover").remove();
                 }
        );
}
hover_edit();

Modifié par dinolam (09 Jul 2017 - 23:28)
Ton back-end php doit intéragir avec ta base de données. C'est lui qui va sauvegarder des données comme tu le souhaites.

Tu dois envoyer dans ton jquery les datas que tu veux sauvegarder via une requete ajax.
Je sais qu'on va me dire d'envoyer mes datas que je souhaiterais sauvegarder via une requête ajax. Je sais faire des requêtes ajax mais ce cas de figure est beaucoup plus complexe que les simples requêtes ajax. Relis bien mon énoncé. Merci
Modifié par dinolam (09 Jul 2017 - 23:13)
Bonjour,

Un exemple de ce que tu pourrais faire :
https://codepen.io/anon/pen/gRQgGp

Après c'est à améliorer, par exemple ne pas renvoyer en base les infos si elles n'ont pas changé...

NB : Sinon, je ne suis pas fan des événements dans des événements dans des événements.
Si tu ne sais pas correctement le gérer, tu risques d'avoir des erreurs en liant des événements plusieurs fois sur un élément.
Exemple avec ton code d'origine :
https://codepen.io/anon/pen/BZGWyZ
Si tu cliques sur l'édition et que tu cliques sur sauvegardes, le premier coup, ça va...
Mais recommence plusieurs fois... Smiley biggrin Smiley cligne
dinolam a écrit :
Je sais qu'on va me dire d'envoyer mes datas que je souhaiterais sauvegarder via une requête ajax. Je sais faire des requêtes ajax mais ce cas de figure est beaucoup plus complexe que les simples requêtes ajax. Relis bien mon énoncé. Merci

Même si effectivement, tu as déjà précisé que tu interagissais avec ta base de données, c'est pas un cas de figure beaucoup plus complexe. Si tu récupères tes données avant de les injecter dans ton formulaire, alors c'est facile pour toi d'ajouter l'ID dans un champ caché, et de faire un update SQL sur celui-ci.

Voilà comment je procéderai. En espérant que ça te convienne.
@SolidSnake, @Anymah,

Merci d'avoir pris le temps de me répondre.
Je ferai le test et je vous dirai quoi après.

A+
Re,
J'ai modifié mon code de cette manière mais j'ai une erreur pour l'exemple du bouton 1 :
{"status":false,"msg":"Erreur ! SQLSTATE[42S22]: [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid column name 'url_1', 'url_tritre_1'.","debug":{"requete":"UPDATE tbl_newsletter SET url_1 = :url, url_tritre_1 = :text WHERE newsletter_id = :id ","datas":{":url":"",":text":"",":id":null}}}

console.clear();
(function hover_edit(){
  var big_parent;  
  $(".row-edit").hover(
    function() {
      $(this).append('<span class="row-edit-hover"><i class="fa fa-pencil" style="line-height:30px;"></i></span>');
    }, 
    function() {
      $(this).children(".row-edit-hover").remove();
    }
  )
  $("a").click(function(e) {e.preventDefault()});
  $("body").on('click', ".row-edit-hover i", function(e) {
    e.preventDefault();
    big_parent = $(this).parents('.row-edit');
    //edit link
    if(big_parent.data("type")=='link'){
      $("#edit-link .title").val(big_parent.text());
      $("#edit-link .url").val(big_parent.attr("href"));
      $("#edit-link").fadeIn(500);
      $("#edit-link .edit-box").slideDown(500);
    }
  });
  $("#edit-link .edit-box-buttons-save").click(function() {
    var toSave = {};
    $(this).parents('.edit').fadeOut(500)
      .children().slideUp(500);
    big_parent.text($("#edit-link .title").val());
    big_parent.attr("href",$("#edit-link .url").val());
    toSave = {
      'id'   : big_parent.data('id'),
      'url'  : big_parent.attr('href'),
      'text' : big_parent.text()
    }
    console.info(toSave);
    $.post("page-update_base.php", toSave, function (response) {
	     if(response.status) {
	            $("#msg").removeClass('danger');
	            $("#msg").addClass('success').html(response.msg);
	     } else {
	    $("#msg").removeClass('success');
	            $("#msg").addClass('danger').html(response.msg);
	    }
     }, 'json');
  });
  $("#edit-link .edit-box-buttons-cancel").click(function() {
    $(this).parents('.edit').fadeOut(500)
      .children().slideUp(500);
  });
})();


// page-update_base.php
// include connection file
include_once("db.php");
//récupération "propre" des variable)
$id= isset($_POST['id']) ? $_POST['id'] : "";
$url= isset($_POST['url']) ? $_POST['url'] : "";
$text= isset($_POST['text']) ? $_POST['text'] : "";

if($id == 1){
      //préparation de la requete et des variables
      $sql = "UPDATE tbl_newsletter SET url_1 = :url, titre_url_1 = :text WHERE newsletter_id = :id";
            $datas = array(":url"=>$url, ":text"=>$text, ":id"=>$id);
            //exécution de la requete
            try {
                $req = $db->prepare($sql);
                $req->execute($datas);
                $msg = array(
                    'status'=>true,
                    'msg'=>'Saisie enregistr&eacute;e avec success !',
                    'debug'=>""
                );
            } catch (Exception $e) {
                //erreur dans la requete
                $msg = array(
                    'status'=>false,
                    'msg'=>'Erreur ! '.$e->getMessage(),
                    'debug'=>array("requete"=>$sql, "datas"=>$datas)
                );
            }    
    } else if ($id == 2) {
           //préparation de la requete et des variables
      $sql = "UPDATE tbl_newsletter SET url_2 = :url, titre_url_2 = :text WHERE newsletter_id = :id";
            $datas = array(":url"=>$url, ":text"=>$text, ":id"=>$id);
            //exécution de la requete
            try {
                $req = $db->prepare($sql);
                $req->execute($datas);
                $msg = array(
                    'status'=>true,
                    'msg'=>'Saisie enregistr&eacute;e avec success !',
                    'debug'=>""
                );
            } catch (Exception $e) {
                //erreur dans la requete
                $msg = array(
                    'status'=>false,
                    'msg'=>'Erreur ! '.$e->getMessage(),
                    'debug'=>array("requete"=>$sql, "datas"=>$datas)
                );
            }   
    } else if ($id == 3) {
           //préparation de la requete et des variables
      $sql = "UPDATE tbl_newsletter SET url_3 = :url, titre_url_3 = :text WHERE newsletter_id = :id";
            $datas = array(":url"=>$url, ":text"=>$text, ":id"=>$id);
            //exécution de la requete
            try {
                $req = $db->prepare($sql);
                $req->execute($datas);
                $msg = array(
                    'status'=>true,
                    'msg'=>'Saisie enregistr&eacute;e avec success !',
                    'debug'=>""
                );
            } catch (Exception $e) {
                //erreur dans la requete
                $msg = array(
                    'status'=>false,
                    'msg'=>'Erreur ! '.$e->getMessage(),
                    'debug'=>array("requete"=>$sql, "datas"=>$datas)
                );
            }   
    } else {
        //pas d'ID
        $msg = array(
            'status'=>false,
            'msg'=>"Erreur ! ID de ligne vide !",
            'debug'=>$_POST
        );
    }      
    // send data as json format
    echo json_encode($msg);
}

Modifié par dinolam (12 Jul 2017 - 15:49)
Bonjour,

Ah mais non, tu ne vas pas faire 400 if si tu as 400 liens !

Tout l'intérêt de rajouter un ID, c'est d'avoir une architecture de table de ce style :
???????????????????
? ID ? TEXT ? URL ?
???????????????????
Et de créer (ou mettre à jour) tes lignes par rapport à cet ID.
Modifié par SolidSnake (13 Jul 2017 - 07:53)
Oui tout à fait.
Mais mes colonnes : ID ? TEXT ? URL ? sont sur une ligne dans la même table donc ils ont le même id.
Et le data-id sur les liens est cet id que je récupère dynamiquement. Si je mets un id qui ne correspond pas à celui de la table je ne pourrais pas faire de condition : ? WHERE newsletter_id = :id ? quand j'essaye de mettre à jour.
Et je ne peux pas me permettre de créer une ligne dans la table pour chaque lien, c'est qui va faire 400 lignes par exemple dans la table comme tu le disais.

Merci
dinolam a écrit :
Et je ne peux pas me permettre de créer une ligne dans la table pour chaque lien, c'est qui va faire 400 lignes par exemple dans la table comme tu le disais.

Ben si, ça sert à ça une base de données !? Quel est le problème ?
Je veux faire la même chose pour tous les autres éléments de ma newsletter : images, textes, ...etc. Chaque newsletter à un id que je joigne à son contenu. Je veux faire que de la mise à jour. Le problème est que je rajouterai d'autres modules à la newsletter pour la personnaliser. Ces nouveaux modules seront modifiables aussi.

Si je pars de l'idée de créer une ligne dans la table par lien, pour faire ma mise à jour, il faudrait d'abord récupérer le contenu dynamiquement. On est bien d'accord ?

Comme chaque lien à son id unique, il faudrait faire une requête pour chacun d'eux pour les afficher dans ma newsletter. On est bien d'accord ?

Je ne peux pas faire de boucle puisse mes modules (blocs) n'ont pas la même structure. Je serais obligé de faire par exemple (400 requêtes pour 400 liens) pour que à chaque fois dire : ? WHERE newsletter_id = :id.

En me basant sur cette idée j'ai modifié mon code suivant :

// requêtes sql : affichage du contenu newsletter
// requete 1
$sql1 = 'SELECT * FROM tbl_newsletter WHERE newsletter_id = 1';
$req1 = $db->prepare($sql1);
$req1->execute();
$row1 = $req1->fetch();
// requete 2
$sql2 = 'SELECT * FROM tbl_newsletter WHERE newsletter_id = 2';
$req2 = $db->prepare($sql2);
$req2->execute();
$row2 = $req2->fetch();
// requete 3
$sql3 = 'SELECT * FROM tbl_newsletter WHERE newsletter_id = 3';
$req3 = $db->prepare($sql3);
$req3->execute();
$row3 = $req3->fetch();


<div>
  <h4>Item 1</h4>
  <p>Incenderat autem audaces usque ad insaniam homines ad haec, quae  nefariis egere conatibus, Luscus quidam curator urbis subito visus:  eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt  incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.</p>
  <div ><a href="http://link-j-en-profite" class="row-edit" data-type="link" data-id="<?=$row1['newsletter_id'];?>">J'en profite</a></div>
</div>
<div>
  <h4>Item 2</h4>
  <p>Incenderat autem audaces usque ad insaniam homines ad haec, quae  nefariis egere conatibus, Luscus quidam curator urbis subito visus:  eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt  incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.</p>
  <div ><a href="http://link-contact" class="row-edit" data-type="link" data-id="<?=$row1['newsletter_id'];?>">Contact</a></div>
</div>
<div>
  <h4>Item 3</h4>
  <p>Splendida porro oculi fugitant vitantque tueri. sol etiam caecat, contra si tendere pergas,propterea quia vis magnast.</p>
  <div ><a href="http://link-a-propos" class="row-edit" data-type="link" data-id="<?=$row1['newsletter_id'];?>">A propos</a></div>
</div>
<!-- Modale -->
<div class="edit" id="edit-link">
  <div class="edit-box" style="">
    <div class="edit-box-title">Edit Link</div>
    <div class="edit-box-content">
      <div class="edit-box-content-text">Title</div>
      <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input title"/></div>
      <div class="edit-box-content-text">URL:<span>(full address including   http://)</span></div>
 

      <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input url"/></div>
    </div>
    <div class="edit-box-buttons">
      <div class="edit-box-buttons-save">Save</div>
      <div class="edit-box-buttons-cancel">Cancel</div>
    </div>
  </div>
</div>


// include connection file
include_once("db.php");
//récupération "propre" des variable)
$id= isset($_POST['id']) ? $_POST['id'] : "";
$url= isset($_POST['url']) ? $_POST['url'] : "";
$text= isset($_POST['text']) ? $_POST['text'] : "";

if($id){
      //préparation de la requete et des variables
      $sql = "UPDATE tbl_newsletter SET url = :url, titre_url = :text WHERE newsletter_id = :id";
            $datas = array(":url"=>$url, ":text"=>$text, ":id"=>$id);
            //exécution de la requete
            try {
                $req = $db->prepare($sql);
                $req->execute($datas);
                $msg = array(
                    'status'=>true,
                    'msg'=>'Saisie enregistr&eacute;e avec success !',
                    'debug'=>""
                );
            } catch (Exception $e) {
                //erreur dans la requete
                $msg = array(
                    'status'=>false,
                    'msg'=>'Erreur ! '.$e->getMessage(),
                    'debug'=>array("requete"=>$sql, "datas"=>$datas)
                );
            }    
    }  else {
        //pas d'ID
        $msg = array(
            'status'=>false,
            'msg'=>"Erreur ! ID de ligne vide !",
            'debug'=>$_POST
        );
    }      
    // send data as json format
    echo json_encode($msg);
}

Le code js ne change pas par rapport au précédent.
Modifié par dinolam (13 Jul 2017 - 14:05)
Bonjour @SolidSnake,

J'ai réussi à enregistrer certains éléments mais mon problème maintenant c'est au niveau de la sauvegarde des titres et des titres des liens. Puisque c'est une même variable pour les éléments texte :
$text = isset($_POST['text']) ? $_POST['text'] : "";
j'ai un champ vide après sauvegarde. La console m'affiche ceci :
{"status":true,"msg":"Saisie enregistrée avec success !","debug":{"requete":"UPDATE newsletter
SET titre = :text WHERE newsletter_id = :id","datas":{":text":"",":id":"11"}}}

Merci pour ton aide.

Cordialement,