Dynamic form met AJAX en add row functie (Werkt niet zoals ik wil)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark van den Brink

Mark van den Brink

03/01/2017 01:04:33
Quote Anchor link
Beste allemaal,

Momenteel ben ik een feedback systeem aan het maken en nu was ik ergens mee bezig waar ik niet uit kom.
Ik heb een script waarbij in de eerste <select> ik een keuze kan maken uit een categorie, vervolgens in de volgende <select> kan er een vraag worden geselecteerd.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<script type="text/javascript">
function fetch_select(val)
{
 $.ajax({
 type: 'post',
 url: 'haal_vragen.php',
 data: {
  get_option:val
 },
 success: function (response) {
  document.getElementById("new_select").innerHTML=response;
 }
 });
}

</script>

    <td><select onchange="fetch_select(this.value);">
  <option>Selecteer Categorie</option>
  <?php
  
  $select
=mysqli_query($db, "select Categorie from Vragen group by Categorie");
  while($row=mysqli_fetch_array($select))
  {

   echo "<option>".$row['Categorie']."</option>";
  }

 ?>

 </select></td>
    <td><select id="new_select" name="Vraag[]">
 </select></td>


Daarbij de AJAX haal_vragen.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if(isset($_POST['get_option']))
{

include('mysql.inc.php');

 $Categorie = $_POST['get_option'];
 $find=mysqli_query($db, "select Vraag from Vragen where Categorie='$Categorie'");
 while($row=mysqli_fetch_array($find))
 {

  echo "<option>".$row['Vraag']."</option>";
 }

 exit;
}

?>


Dit werkt allemaal perfect, maar nu komt het ik wil dit ook werkend hebben met een addrow functie.


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script type="text/javascript" src="includes/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
function add_row()
{
 $rowno=$("#vragenlijst tr").length;
 $rowno=$rowno+1;
 
  
 
 $("#vragenlijst tr:last").after("<tr id='row"+$rowno+"'><td><select onchange='fetch_select(this.value);' name='Competentie[]'><option>Selecteer competentie</option><option>Interpersoonlijk</option><option>Pedagogisch</option><option>Vakdidactisch</option></select></td><td><input type='text' name='Vraag[]' placeholder='Enter Age'></td><td><input type='text' name='Type[]' placeholder='Enter Job'></td><td><input type='button' value='DELETE' onclick=delete_row('row"+$rowno+"')></td></tr>");
}
function delete_row(rowno)
{
 $('#'+rowno).remove();
}
</script>

  <table id="vragenlijst">
   <tr id="row1">
  
  

    <td><select onchange="fetch_select(this.value);">
  <option>Selecteer categorie/option>
  <?php
  
  $select
=mysqli_query($db, "select Categorie from Vragen group by Categorie");
  while($row=mysqli_fetch_array($select))
  {

   echo "<option>".$row['Categorie']."</option>";
  }

 ?>

 </select></td>
    <td><select id="new_select" name="Vraag[]">
 </select></td>
    <td><input type="text" name="Type[]"></td>
   </tr>
  </table>
  <input type="button" onclick="add_row();" value="ADD ROW">


De script op zichzelf werkt wel. Nu zijn er twee dingen als ik de add row combineer met de select categorie script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<select onchange="fetch_select(this.value);">
  <option>Selecteer Categorie</option>
  <?php
  
  $select
=mysqli_query($db, "select Categorie from Vragen group by Categorie");
  while($row=mysqli_fetch_array($select))
  {

   echo "<option>".$row['Categorie']."</option>";
  }

 ?>

 </select>

In de het volgende te combineren
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$("#vragenlijst tr:last").after("<tr id='row"+$rowno+"'><td><select onchange='fetch_select(this.value);' name='Competentie[]'><option>Selecteer competentie</option><option>Interpersoonlijk</option><option>Pedagogisch</option><option>Vakdidactisch</option></select></td><td><input type='text' name='Vraag[]' placeholder='Enter Age'></td><td><input type='text' name='Type[]' placeholder='Enter Job'></td><td><input type='button' value='DELETE' onclick=delete_row('row"+$rowno+"')></td></tr>");
}


Dan werkt de add row functie niet meer ik denk vanwege de php die erin zit verwerkt.

En de laatste als ik van de eerste een gewone <select> maakt dan pakt de add row hem wel, maar dan past hij alleen de eerste rij aan en uiteraard met hetzelfde probleem als die hierboven lukt dat niet met combineren.

Iemand hier een tip of een script voor? Dan kan ik weer verder, kom er niet uit.


Mijn doel: In de eerste <select> wordt een categorie geselecteerd, in de tweede select worden de vragen uit de database gehaald die bij de categorie horen en dan als laatste dit moet werken met de add row functie =D

Met vriendelijke groet,

Mark
Gewijzigd op 03/01/2017 01:25:02 door Mark van den Brink
 
PHP hulp

PHP hulp

28/04/2024 20:33:38
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/01/2017 09:12:58
Quote Anchor link
Mark je geeft zelf al een beetje het probleem aan.
PHP draait op de server, javascript in de browser. Dit gebeurt er dus als iemand een PHP pagina opvraagt in de browser:

- Browser verstuurd verzoek naar webserver
- webserver ziet dat dit verzoek een PHP bestand betreft en start het PHP script
- Het PHP script genereert (in dit geval) een HTML pagina (inclusief alle vragen in de tabel)
- De output of de HTML wordt teruggestuurd naar de browser. (PHP script is beëindigd.)
- De browser leest de HTML en haalt overige benodigde bestanden op waaronder afbeeldingen, css- en javascript bestanden.
- De browser verwerkt de HTML, CSS en toont de pagina
- Het javascript wordt gestart.

Ik neem aan dat de nieuwe vraag die toegevoegd kan worden ook in de database moet komen. Je hebt dan een nieuwe AJAX request nodig die de nieuwe vraag aanlevert bij de webserver. De webserver moet de vraag dan opslaan in de database.

Dan moet de nieuwe vraag nog toegevoegd worden aan de <table>. Dat doe je dan weer met javascript.

Toevoeging op 03/01/2017 09:45:08:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<table id="vragen">
  <tbody>
    <tr>
      <td>Eerste vraag</td>
    </tr>
    <tr>
      <td>Tweede vraag</td>
    </tr>
    <tr>
      <td>Derde vraag</td>
    </tr>
  </tbody>
</table>
<form id="new_question_form" action="" method="post">
  <input type="text" placeholder="Nieuwe vraag" name="new_question">
  <button>Toevoegen</button>
</form>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$( document ).ready(function() {

  // snelheidswinst voor de <input> == slechts 1x zoeken in de DOM
  var newQuestion = $('input[name=new_question]');

  // als er op toevoegen geklikt wordt
  $( "#new_question_form" ).submit(function( event ) {
    
    // HIER JE AJAX REQUEST
    // $.post('server.php', $('#new_question_form').serialize());
        
    // rij toevoegen onderaan in de tabel
    $('#vragen tr:last').after('<tr><td>'+newQuestion.val()+'</td></tr>');
    
    // vraag verwijderen uit de <input>
    newQuestion.val('');
    
    event.preventDefault();
  });

});


http://codepen.io/anon/pen/EZxKKr
Gewijzigd op 03/01/2017 09:18:26 door Frank Nietbelangrijk
 
Mark van den Brink

Mark van den Brink

03/01/2017 09:56:06
Quote Anchor link
Bedankt voor deze informatie, ik heb er vannacht ook nog even over liggen brainstormen. Wat ik ook kan doen is bovenaan mijn pagina mijn opzet [Categorie] -> [Vraag] -> [Type] -> SUBMIT

En dat hij dan met AJAX direct in de DB wordt gezet en er onder wordt weergegeven.

Wat vindt jij van dit idee? (Zo heb ik niet het probleem van de <select> functie)

Bedankt voor het meedenken, ik ga hier zeker mee aan de slag!
Gewijzigd op 03/01/2017 09:58:03 door Mark van den Brink
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/01/2017 10:05:00
Quote Anchor link
Gewoon je pagina laten verversen kan ook maar dat geeft wat minder het "het is echt 1 formulier" gevoel voor de gebruiker.
 
Mark van den Brink

Mark van den Brink

03/01/2017 10:25:10
Quote Anchor link
Dat is waar, maar hoe zie jij de implementatie van de categorie selectie en dan keuze uit voorgeprogrammeerde DB vragen die bij die categorie horen? Hij maakt nu wel nieuwe rijen aan dus dat is goed alleen als ik die implementatie gebruik blijft hij de eerste vraag (rij) wijzigen in plaats van de rij waar je mee bezig bent.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/01/2017 14:46:53
Quote Anchor link
Maar je wilt een rij kunnen toevoegen toch? Of wil je ook een rij kunnen wijzigen?
 
Thomas van den Heuvel

Thomas van den Heuvel

03/01/2017 15:24:40
Quote Anchor link
NB gebruik values in je options die categorie-id's bevatten zodat je hier aan kunt refereren als je vragen bij een categorie(-id) opzoekt. Dit wil je niet doen via een (niet geïndexeerde?) categorienaam. Daarnaast kan dit voor problemen zorgen als je alles aan een categorienaam ophangt en vervolgens de categorienaam wilt aanpassen...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.