11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Voici mon problème : J'ai une fonction JS qui me permet d'enregistrer différents éléments de ma page avec ensuite un appel AJAX qui m'envoi vers un controller php. Donc dans ma fonction js quand je fais un console.log des données que je veux envoyer à mon php ce sont les bonnes données (console.log juste avant l'appel ajax). Ensuite je les envoie dans mon appel ajax via "data:" en POST et pour les récupérer dans mon php je fais un

isset($_POST['numero_mag'])


Du coup je dois bien récupérer quelque chose parce que je n'ai pas d'erreur du style undefinedindex ....

Le vrai problème est que du coup il va m'enregistrer des données "nulles" en base (ex: 0 pour un numero, chaine vide pour une string...)

Je fais appel à vous pour que vous m'aidiez à comprendre ce qui ne marche pas et si possible m'aider à résoudre ce problème...

Je vous met mon code ci-dessous :

Mon controller PHP qui fait les traitements et qui doit enregistrer mes données en base...

/**
     * @Route("/enregistrerPage",name="enregistrerPage",options={"expose"=true})
     */
    public function enregistrerPageAction(Request $request)
    {
        $user = $this->getUser();
        if ($request->isXmlHttpRequest()) {
          $repository = $this
            ->getDoctrine()
            ->getManager()
            ->getRepository('CompteBundle:element_page');
          $em = $this->getDoctrine()->getManager();
          //$em2 = $this->getDoctrine()->getManager();
 
          $data = $request->request->All();
          $nbr_element = count($data);
          for ($i=0; $i < $nbr_element; $i++) {
            $element = $em->getRepository('CompteBundle:element_page')->find($data['tableau_'.$i]['id_element']);
            $element-> setElementCol($data['tableau_'.$i]['col']);
            $element-> setElementOrdre($data['tableau_'.$i]['ordre']);
            $element-> setElementContenu(trim($data['tableau_'.$i]['contenu']));
            $em->persist($element);
            $em->flush();
          }
          // gestion des inputs
          //$magazine =  $em->getRepository('CompteBundle:Magazines')->findOneBy(['magazineNumero' => $request->query->get('id_mag')]); //array('magazineUser' => $user->getId(),
          $magazine =  $em->getRepository('CompteBundle:Magazines')->find(244);
          $magazine->setmagazineNumero(isset($_POST['numero_mag']));
          $magazine->setmagazinePeriode(isset($_POST['periode_mag']));
          $magazine->setmagazineIntitule(isset($_POST['intitule_mag']));
          $em->persist($magazine);
          $em->flush();
          return new Response('ok');
        }else{
            throw new Exception("Erreur");
        }
    }


Je précise que mon problème se trouve en fait au niveau du $magazine et des lignes qui suivent...

Ma fonction JS/Ajax:

function enregistrerPage(tableaudebord){   // gérer l'enregistrement des inputs ici
  $('#loading').show();
  $('.element_pdf').children('div').attr('contenteditable', 'true');
  $('.img_block').attr('contenteditable', 'false');
  $('.element_pdf').children('.block_choix_new_article').attr('contenteditable', 'false');
  $('.element_pdf').children('.block_choix_new_article').attr('contenteditable', 'false');
  $('.btn_suppr_element').remove();
  //$('.input_pdf').attr('contenteditable', 'true'); // pour les inputs
  var tableau_result = {};
  var i = 0;
  var tableau_input_periode = {}; //tableaux de mes inputs
  var j = 0;
  //, tableau_input_numero, tableau_input_intitule, tableau_input_nom_page
  $('.element_pdf').each(function(){
    var id_element = $(this).data('idelement');
    var ordre = $(this).data('ordre');
    var contenue = $(this).html();
    var col = $(this).data('col');
    tableau_result['tableau_'+i]={"id_element" : $(this).data('idelement'), "ordre" : $(this).data('ordre'), "contenu" : $(this).html(),"col":$(this).data('col')};
    i++;
  });
  var intitule_mag = document.getElementById('intitule_mag').value;
  console.log(intitule_mag);
  var periode_mag = document.getElementById('periode_mag').value;
  console.log(periode_mag);
  var numero_mag = document.getElementById('numero_mag').value;
  console.log(numero_mag);
  //var nom_page = document.getElementById('nom_page').value;
  //console.log(nom_page);
  $.ajax({
        type: 'POST',
        async: false,
        url: Routing.generate('enregistrerPage'),
        data: tableau_result, intitule_mag : intitule_mag, periode_mag : periode_mag, numero_mag : numero_mag, //tableau_result, intitule_mag, periode_mag, numero_mag, //à enlever ,
        success: function(){
          $("#sauvegarde_success").show();
          $('#sauvegarde_success').delay(2500).fadeOut('blind');
          if (tableaudebord!=1) {
            location.reload();
          }
           
        }
  });


Voila en espérant que vous pourrez m'aider...

Merci d'avance Smiley smile
Salut,

Il y a plusieurs choses que je trouve bizarre dans ton code :
- Pourquoi récupères-tu les données par $data d'un côté et $_POST de l'autre ?
- Quand tu fais print_r($data), tu obtiens quoi ?
- Ce que tu passes à setmagazineNumero est le résultat de l'appel à isset(), autrement dit un booléen. Si la valeur apparaît vide, cela signifie que isset renvoie false et donc que $_POST['numero_mag'] n'existe pas.

Concernant la partie JS, je t'avais déjà fait la remarque sur la manière dont tu passes les données : https://forum.alsacreations.com/topic-5-87311-1-Fonction-enregistrerPage-JS.html

En réalité, ton objet ressemble à ça :

{
    type: 'POST',
    async: false,
    url: Routing.generate('enregistrerPage'),
    data: tableau_result,
    intitule_mag : intitule_mag,
    periode_mag : periode_mag,
    numero_mag : numero_mag,
    success: function(){
        ...
    }
}


Donc seule la variable tableau_result est transmise au backend. Pour passer toutes les variables, il faut les mettre dans un tableau ou un objet pour le passer à l'attribut data.
Modifié par Ostara (03 Aug 2020 - 18:21)
Salut Ostara,

Alors justement j'aurais aimé tout récupérer via $data (donc les donnée en js), mais je n'ai pas réussi ... du coup je me suis dit que j'allais faire des formulaires et récupérer les données via le post...

Ensuite oui tu as raison pour le isset() qui renvoie un boolean, je l'ai donc remplacé par !empty()

Après pour les data à envoyé j'ai essayé de les mettre dans un tableau et je ne récupérais rien non plus...

je faisais un truc du style :
data: tableau_result, {intitule_mag : intitule_mag, periode_mag: periode_mag, numero_mag : numero_mag}


Mais bon j'ai réussi à trouver une solution, même si je pense que c'est loin d'être la meilleure...
La voici :
public function enregistrerPageAction(Request $request)
    {
      $em = $this->getDoctrine()->getManager();
      
      if (!empty($_GET['id_mag'])){ //permet de récup l'id du mag et de la page pour ensuite enregistrer
        $idmag = (int) $_GET['id_mag']; //les nouvelles infos dans le bon mag et le rediriger ensuite sur la bonne route
        $idpage = (int) $_GET['id_page'];
        var_dump($idmag);
        var_dump($idpage);
        $magazine =  $em->getRepository('CompteBundle:Magazines')->find($idmag);
      }
      
        
      $user = $this->getUser();
        if ($request->isXmlHttpRequest()) {
          $repository = $this
            ->getDoctrine()
            ->getManager()
            ->getRepository('CompteBundle:element_page');

          $data = $request->request->All();
          $nbr_element = count($data);
          for ($i=0; $i < $nbr_element; $i++) {
            $element = $em->getRepository('CompteBundle:element_page')->find($data['tableau_'.$i]['id_element']);
            $element-> setElementCol($data['tableau_'.$i]['col']);
            $element-> setElementOrdre($data['tableau_'.$i]['ordre']);
            $element-> setElementContenu(trim($data['tableau_'.$i]['contenu']));
            $em->persist($element);
            $em->flush();
          } 
          
          return new Response('ok');
        }else if (!empty($_GET['intitule_mag'])){ //permet d'enregistrer les éléments (1 par 1...)
          $intitule_mag = $_GET['intitule_mag'];
          var_dump($intitule_mag);
          $magazine->setmagazineIntitule($intitule_mag);
          $em->persist($magazine);
          $em->flush();
        } else if (!empty($_GET['periode_mag'])){
              $periode_mag  = $_GET['periode_mag'];
              $intitule = $magazine->getmagazineIntitule(); //récupère l'intitule du mag
              $magazine->setmagazinePeriode(trim($periode_mag, $intitule . "-" )); //trim permet d'enregistrer seulement la période
              $em->persist($magazine);                                 //dans la bdd en soustrayant de la string l'intitule + le "-"
              $em->flush();
            } else if(!empty($_GET['numero_mag'])){
                $numero_mag = $_GET['numero_mag'];
                $magazine->setmagazineNumero($numero_mag);
                $em->persist($magazine);
                $em->flush();
              }
        return $this->redirectToRoute('espacedetravail', array('id_mag' => $idmag, 'id_page' => $idpage)); 
              
        //else {
          //throw new Exception("Erreur");
        //}
    }


et le JS :
function enregistrerPage(tableaudebord){   // gérer l'enregistrement des inputs ici
  $('#loading').show();
  $('.element_pdf').children('div').attr('contenteditable', 'true');
  $('.img_block').attr('contenteditable', 'false');
  $('.element_pdf').children('.block_choix_new_article').attr('contenteditable', 'false');
  $('.element_pdf').children('.block_choix_new_article').attr('contenteditable', 'false');
  $('.btn_suppr_element').remove();
  var tableau_result = {};
  var i = 0;
  $('.element_pdf').each(function(){
    var id_element = $(this).data('idelement');
    var ordre = $(this).data('ordre');
    var contenue = $(this).html();
    var col = $(this).data('col');
    tableau_result['tableau_'+i]={"id_element" : $(this).data('idelement'), "ordre" : $(this).data('ordre'), "contenu" : $(this).html(),"col":$(this).data('col')};
    i++;
  });
  $.ajax({
        type: 'POST',
        async: false,
        url: Routing.generate('enregistrerPage'),
        data: tableau_result,
        success: function(){
          $("#sauvegarde_success").show();
          $('#sauvegarde_success').delay(2500).fadeOut('blind');
          if (tableaudebord!=1) {
            location.reload();
          }
          
        }
  });

}


Autrement dit comme tu peux le voir, je ne gère plus l'enregistrement de l'intitule, période et numéro via le js...

En tt cas merci d'avoir pris du temps pour me répondre Smiley smile
bonne journée
Modifié par leUj (06 Aug 2020 - 10:23)